- From: Jeffrey Mogul <mogul@pa.dec.com>
- Date: Tue, 05 Sep 95 15:41:08 MDT
- To: Shel Kaphan <sjk@amazon.com>
- Cc: http wg discussion <http-wg%cuckoo.hpl.hp.com@hplb.hpl.hp.com>
The http analog for that would be headers and/or HTML tags of some kind that indicate other documents that should be fetched whenever a given document is fetched because of the high probability that these other documents will be viewed whenever the first one is viewed. This doesn't strictly require keepalive, but it interacts well with it, as prefetch would be much cheaper to implement using it. In fact, for sufficiently small documents it would be statistically cheaper to prefetch, in one TCP connection, some documents that go unread than to set up and tear down TCP connections for every document that is read. Sorry if this is too speculative for this group -- just thought it was an interesting idea. I don't think it's too speculative. In fact, we've been (slowly) working out the details of a similar proposal, and it should be possible to fit it into HTTP 1.x (x >= 2), since it does not require incompatible protocol changes. I'd suggest that we not discuss it much until 1.1 is (nearly) done, but here's a summary. For a longer description, see Venkata Padmanabhan's MS thesis, http://www.cs.berkeley.edu/~padmanab/papers/masters-tr.ps The original idea was inspired by a paper at the June 1994 USENIX, by James Griffioen and Randy Appleton, which described a predictive prefetching scheme for use in a file system. Concept #1: the server can observe request patterns from individual clients and maintain a database of conditional probabilities: for example, if a given client retrieves URL X, what is the probability that within its next M retrievals, it will ask for URL Y? (Conceptually, this is a big square array, but it's probably quite sparse for small values of M, and so it is best represented as a graph.) Clearly, X and Y would have to come from the same server (because the server cannot observe other retrievals). Example: if a client retrieves, say, http://www.yahoo.com/, there's a good chance (say, 0.4) that the next request from that client to that server will be for http://www.yahoo.com/images/main.gif, since that is an inlined image in the document. The probability is less than 1.0, because the client may well have main.gif in its cache. Another link with high probability, say 0.3 (I'm making up these numbers!) is http://search.yahoo.com/bin/search, and the remaining links on that page probably have fairly low probabilities. Since the server sees requests *after* any client or proxy caches, the probabilities it constructs are "correct" for use by caching clients. Summary of concept #1: Based on behavior of all previous clients, the server can predict the next-fetch behavior of the current client. Only servers can observe enough different clients to build a useful probability table. Concept #2: the decision of whether or not to prefetch should belong to the client. The client will probably have many of the high-probability objects, such as logos and backgrounds, in its cache, and so we should not waste network time pre-fetching potentially cached objects. The client also is the only thing that knows whether the user is sitting and thinking (i.e., time for a prefetch) or has already chosen another link (don't slow things down with a prefetch). Summary of concept #2: Only the client can decide whether prefetching is worth doing. Concept #3: since the server makes the predictions and the client acts on predictions, the protocol must provide a way for the predictions to get from server to client. So, here's a rough sketch of the proposal: (1) *after* sending an HTTP response, the server then sends some number of predictions, ech consisting of: (URL, probability, cache-validator, length-estimate) The length-estimate field allows a client with a slow link to decide whether it is worth prefetching. The cache-validator can be used to avoid fetching objects that have not been updated since they were cached. (2) The client goes through the list of received predictions, tosses out the ones it has in its cache, and also the ones whose probability is below a user-settable threshold or whose length is too large. If the user has not made another click, the client software sends a "PREFETCH" request, which looks and works exactly like a "GET" except for one thing: if the user wakes up and asks for a URL (other than one being prefetched), the client software immediately aborts the prefetch in progress (this probably requires the use of the TCP Urgent-pointer mechanism, as in Telnet) and then GETs the URL the user really wants. This means that the prefetching mechanism should never add much latency, although it may soak up a lot of otherwise unused bandwidth. The server can adjust the amount of prefetch traffic it receives by changing the threshold for the predictions it sends to the clients. A busy server would only transmit predictions with probability > 0.999 (say); a bored server might send predictions with probability > 0.1 (say). Sorry if this is too speculative for this group. -Jeff
Received on Tuesday, 5 September 1995 15:58:11 UTC