Question: Is saying a cache is a special kind of buffer correct? They both perform similar functions, but is there some underlying difference that I am missing?

Answer: 
It would be more accurate to say that a cache is a particular usage pattern of a buffer, that implies multiple uses of the same data. Most uses of "buffer" imply that the data will be drained or discarded after a single use (although this isn't necessarily the case), whereas "cache" implies that the data will be reused multiple times. Caching also often implies that the data is stored as it is also being simultaneously used, although this isn't necessarily the case (as in pre-fetching and the like), whereas buffering implies that the data is being stored up for later use.

There is certainly a large overlap in both implementation and usage, however.
Common thing: both are intermediary data storage components (software or hardware) between computation and "main" storage.

To me difference is the following:

Buffer:

* Handles **sequential** access to data (e.g. reading/writing data from file or socket)
* **Enables** interface between computation and main storage, **adapts** to each other the different data transfer patterns of a data producer and a data consumer. E.g. computation writes small chuncks of data, but disk drive can accept only pieces of data of a specific size. So the buffer accumulates small pieces as the input and regroup them into bigger pieces of the output.
* So it is like a **Adapter** design pattern. It joins two interacting components that cannot interoperate directly.
* Examples: disk buffer, BufferedReader in Java language, duffering in computer graphics.

Cache:

* Handles **random** access to data (e.g. CPU cache caches lines of mememory that located non necessary sequentially).
* **Optimizes** access to the main storage, makes it faster. E.g. CPU cache avoid accesses to memory thus making CPU commands faster.
* It is like a **Decorator** design pattern. It joins (often transparently) two interacting components that could in principle interoperate directly , but it makes the interaction faster.
* Examples: CPU cache, page cache, web proxy, browser cache.