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: 
One important difference between cache and buffer is: 

Buffer is a part of the primary memory. They are structures present and accessed from the primary memory (RAM). 

On the other hand, cache is a separate physical memory in a computer's memory hierarchy. 

Buffer is also sometimes called as - Buffer cache. This name stresses on the fact that the use of buffer is similar to that of cache, i.e. to store data. while the difference lies in the context of its usage. 

Buffers are used for temporarily storing data, while the data is moved from one object to another. 
EX: when a video is moved from the Internet onto our PC for the display buffers are used to store the frames of the video which would be displayed next. ( THIS INCREASES THE QoS, AS THE VIDEO WOULD RUN SMOOTHLY AFTER A SUCCESSFUL BUFFERING PROCESS.) 
EX: another example is the scenario when we write data onto our files. The newly written data is not copied to the secondary memory instantaneously. The changes made are stored in the buffer and then according to the designed policy, the changes are reflected back to the file in the secondary memory (hard disk).

Caches on the other hand are used between the primary memory and processors, to bridge the gap between the speed of execution of RAM and the processor. Also the most frequently accessed data is stored in the cache to reduce the access to RAM.
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.