- From: Jeffrey Mogul <mogul@pa.dec.com>
- Date: Mon, 20 May 96 17:06:13 MDT
- To: Koen Holtman <koen@win.tue.nl>
- Cc: http-wg%cuckoo.hpl.hp.com@hplb.hpl.hp.com, mogul@pa.dec.com
apparent_age = max(0, now - date_value);
^^^
corrected_received_age = max(apparent_age, age_value);
response_delay = now - request_time;
^^^
corrected_initial_age = corrected_received_age + response_delay;
resident_time = now - response_time;
^^^
current_age = corrected_initial_age + resident_time;
the first two `now' values denote the time of receipt of the response
by the proxy. The last `now' denotes the time at which the response
is served by the proxy from its own cache memory.
A fix is to replace the first two `now's by `response-time'.
You're right. I had written these formulae with an expectation that
they would be computed "as soon as needed" (i.e., at different
values of 'now'), but since I failed to specify when each computation
is supposed to be done (and, in fact, that's not necessary to
specify), it makes sense to do that change.
Note that a client can usually tell if a response is firsthand by
comparing the Date to its local request-time, and hoping that the
clocks are not badly skewed.
This is misleading, there is a much easier way to know this, though it
only works if there is a 1.1 cache in the chain:
Note that a client can tell if a response is firsthand by
checking if it contains an Age header. Firsthand responses never
contain an Age header.
By the way, I can't find any clear reference to this important
function of the Age header anywhere in the draft. I'll post a
separate note about this.
There's a logical error here. While it is indeed true that
if the response includes Age, then it is not firsthand
it is NOT true that
if the response does not include Age, then it is firsthand
unless *the first* cache in the chain is an HTTP/1.1 (or higher) cache.
And since HTTP/1.0 caches do not implement the Via header, it's
probably not possible to reliably use the absence of an Age header
to decide if a response is definitely firsthand.
Of course, clock comparisons are also potentially flakey. So I
guess the best we can do here is to say that a client can detect
non-firsthand responses in some cases, but not all cases, by looking
for an Age header or a large difference between Date and request_time.
I dare to predict that most 1.1 caches will in many cases use not use
the correction
corrected_received_age = max(now - date_value, age_value)
but will use
corrected_received_age = age_value
instead because the max( ) correction would often, because of clock
skew, needlessly decrease the freshness lifetime left without there
being any need for this from a general correctness standpoint.
"Needless" is a slippery concept here. Decreasing the freshness
lifetime can never turn a semantically transparent response into
a non-transparent one, but failing to decrease the freshness lifetime
can do so. If one views the server's specified expiration time
as an upper bound on the allowable freshness (rather than a lower
bound, which makes little sense) then the protocol design has to
be conservative here.
There are techniques that work much more reliably and efficiently.
For example, the proxy could do a single HEAD request directly to the
origin server, and use the Date header in the response to calculate a
pessimistic value for the time difference between the origin server
clock and its own clock. Using this difference, the cache could make
very good age corrections for subsequent responses from a 1.0 cache
for resources on that origin server.
I'm reluctant to encourage this in the specification, both because
it gets us into the business of designing a clock synchronization
protocol (which is much harder than it might seem), and because
it encourages the use of extra messages (which is contrary to the
basic purpose of caching).
-Jeff
Received on Monday, 20 May 1996 17:15:23 UTC