Expires and max-age headers should eliminate the need to even send a HTTP request.
On the post page of this site, I am seeing max-age=0 on the smileys, which means it has to revalidate every time. If you allow caching, it should be faster. The BBC icons seem to be cached though. Not sure what's up with that.
Request headers:
GET /smileys/default/cheesy.gif HTTP/1.1
Host: www.elkarte.net
Connection: keep-alive
Cache-Control: max-age=0
Accept: image/webp,*/*;q=0.8
If-Modified-Since: Thu, 17 Oct 2013 22:04:05 GMT
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36
Referer: http://www.elkarte.net/index.php?action=post;board=1.0
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: (you don't need that)
Response headers:
HTTP/1.1 304 Not Modified
Server: nginx
Date: Wed, 11 Dec 2013 16:52:00 GMT
Last-Modified: Thu, 17 Oct 2013 22:04:05 GMT
Connection: keep-alive
Keep-Alive: timeout=300
Expires: Wed, 08 Jan 2014 16:52:00 GMT
Cache-Control: max-age=2419200
Pragma: public
Cache-Control: public, must-revalidate, proxy-revalidate
Edit: I did a hard refresh to update all of my cache headers. Looks like smileys are working like the normal BBC icons and everything is caching without additional HTTP requests. Good job.