People have sometimes asked me what is the difference between regular disk devices and raw ones in BSD systems; as an example, take /dev/fd0a and its corresponding /dev/rfd0a. The thing is that I wasn't able to answer them correctly because I didn't know how they really differed. However, while reading The Design and Implementation of the 4.4BSD Operating System during past month, I found the explanation. So here goes a clarification:
Raw devices are provided for direct access to the device they represent. On the first hand, this means that the data transferred to/from them does not pass through the system caches. On the other hand, the data is copied directly from the device driver into the user buffer, without previously passing through an intermediate kernel area.
As the kernel does not do buffering nor caching, the user must allocate buffers whose size matches the expectations of the underlying device. For example, if you were to read data from a floppy disk, your buffer's size could need to be a multiple of 512 bytes (the sector size), and all reads and writes could need to use that length for their transfers. Given this, these devices are used by programs which need direct access to devices and can't afford the consistency problems that intermediate caches could bring in (e.g., fsck(8) or newfs(8)). Note that they need deep knowledge of the underlying hardware.
As you can imagine, regular devices are the opposite of raw ones. The system has buffers to transfer data to/from them and caches this data as appropriate to avoid unnecessary requests to the device. When the user works with them, he can request data transfers of any size (which do no need to match the block size), because the system will do all necessary steps to provide him with the data he really asked for.