- From: Franz J. Hauck <fjh@cs.vu.nl>
- Date: Thu, 15 Feb 1996 12:09:10 +0100
- To: Shel Kaphan <sjk@amazon.com>
- Cc: "David W. Morris" <dwm@shell.portal.com>, Larry Masinter <masinter@parc.xerox.com>, http-wg%cuckoo.hpl.hp.com@hplb.hpl.hp.com
Shel Kaphan wrote: > David W. Morris writes: > > On Wed, 14 Feb 1996, Shel Kaphan wrote: > > > One problem is clock skew. If only last modified dates are used in > > > such requests, there is no issue with clock skew, because the only > > > clock in question is the origin server's. If the I-M-S date in the > > > request is constructed by the requestor, then any difference between its > > > clock and the server's clock may make the server do the wrong thing. > > > Whether this matters or not is application dependent. This is one of the > > > reasons I tend to prefer the "opaque validator" approach. Let's look at this. The I-M-S date (ims) constructed by a requester could be in three different intervals with respect to a Last-Modified time (lm) got from a former request: ims < lm In this case the consistency of a GET request is always given, but the I-M-S header does not improve efficiency, if it was not computed using an old modification time. ims = lm This is the vanilla case. Everything works fine. lm < ims The document may have been modified in the time interval [lm, ims) and the output will be inconsistent from the requester's point of view, if there was a modification and the requester does *not* know about it. Obviously, the critical case is the last one. It is also obvious that a Date header's time (d) has always the property lm <= d (1) for a particular request message, which means that the document was not modified in the time interval (lm, d]. If we compose a document from several parts with their own Last-Modified and Date headers (lm1, lm2 ..., d1, d2 ...), then we can compute the following Last-Modified date (lm) for the compound document: lm= min( d, d1, d2, ..., max( lm1, lm2, ...) ) with d equals the current time on the composing server. This trivially holds equation (1) and ensures that a subsequent request for the same document using lm as a I-M-S date (ims) will hold the following condition for all parts: ims <= di for i of {1,2,...} As the part i was not modified before di the client *knows* that there was no modification in the interval [lmi, ims)!! And that even holds when the clocks go years off!!! Of course, there is no improvement of using I-M-S headers in this case because we tend to fall in the ims<lm case (mentioned above), but the documents are always consistent. If we assume that the clocks are almost synchronized the I-M-S date almost always fullfils the following condition: lmi <= ims which produces the desired efficiency improvement on 304 responses. I addmit that there can be theoretical cases which cause problems: - A document is modified twice within a second (on a UNIX machine) and the server returns the first version. - A document is modified exactly at the time the document was returned by a server. This may be the reason for introducing opaque validators, but it cannot be the reason to change the I-M-S header treatment in the way it was proposed on the issue list. Nevertheless, these race conditions are unlikely to occur. > I didn't think I was suggesting invalidating existing implementations > (they can take care of that for themselves!), [...] The proposal on the issue list does exactly this. > The kind of case that seems likely to break is a client with a clock > that's relatively out of whack (say, 5 minutes off, like the Mac I'm > writing this on), an application that depends for correctness on > clients always validating documents, and client software that > (for some reason) is doing unspeakable things to construct I-M-S dates > based on its own clock, thereby causing the application to appear to > be broken. I think, I have shown that this is *not* true. -- Franz
Received on Thursday, 15 February 1996 03:12:57 UTC