1. A method implemented at least in part by a computer, the method comprising: receiving, at a client, a request for data that is located on a remote server; sending a first request for at least one signature that represents the data to the remote server; in response to sending the first request, receiving at least a first signature and a second signature from the remote server, wherein the first signature and the second signature each represents a portion of the data; determining, based at least on the first signature obtained from the remote server, if a first portion of data is cached in a peer cache; when it is determined that the first portion of data is cached in the peer cache, sending a second request for the first portion of data to the peer cache; determining, based at least on the second signature obtained from the remote server, if a second portion of data is cached in the peer cache; and when it is determined that the second portion of data is not cached in the peer cache: sending a third request for the second portion of data to the remote server; storing the second portion of data in a local cache of the client; making the second portion of data available to one or more requesting devices; and sending the second portion of data from the client to at least one of the one or more requesting devices in response to receiving a request for the second portion of data.