- From: Mark Nottingham <mnot@mnot.net>
- Date: Tue, 9 Mar 2010 20:22:43 +1100
- To: HTTP Working Group <ietf-http-wg@w3.org>
- Cc: "Julian F. Reschke" <julian.reschke@gmx.de>
Agreed. Julian, since you did the patch, could you update? Cheers, On 09/03/2010, at 6:56 AM, David Morris wrote: > > > On Tue, 9 Mar 2010, Adrien de Croy wrote: > >> >> I'd suggest removing the word "local" in all cases referring to time. >> >> Since all date/times are in UTC (absolute time), the word local may >> potentially confuse implementors into using a local time (non UTC time) which >> breaks things like apparent_age. > > Removal doesn't seem like the right solution ... we need to clarify that > we me the time as known to the local system. > > Perhaps replace: "local time" with "UTC time known to the local system" > > Or some other phrasing which removes the ambiguity. > > Dave Morris > >> >> Regards >> >> Adrien >> >> Mark Nottingham wrote: >>> We haven't heard back from Alex, and the other issue I mentioned didn't seem >>> to get enough support to move on. So, I suggest we do the conservative >>> thing: >>> >>> Current text: >>> >>>> age_value - Age header field-value received with the response >>>> date_value - Date header field-value received with the response >>>> request_time - local time when the cache made the request >>>> resulting in the stored response >>>> response_time - local time when the cache received the response >>>> now - current local time >>>> apparent_age = max(0, response_time - date_value); >>>> corrected_received_age = max(apparent_age, age_value); >>>> response_delay = response_time - request_time; >>>> corrected_initial_age = corrected_received_age + response_delay; >>>> resident_time = now - response_time; >>>> current_age = corrected_initial_age + resident_time; >>>> >>> >>> Replacement text: >>> >>>> age_value - Age header field-value received with the response; >>>> 0 if not available. >>>> date_value - Date header field-value received with the response; >>>> see [ref] for requirements regarding >>>> responses >>>> without a date_value. >>>> request_time - local time when the cache made the request >>>> resulting in the stored response >>>> response_time - local time when the cache received the response >>>> now - current local time >>>> apparent_age = max(0, response_time - date_value); >>>> response_delay = response_time - request_time; >>>> corrected_initial_age = max(apparent_age, age_value + response_delay) >>>> resident_time = now - response_time; >>>> current_age = corrected_initial_age + resident_time; >>>> >>> >>> Comments? >>> >>> >>> >>> On 14/10/2009, at 8:31 PM, Mark Nottingham wrote: >>> >>> >>>> Hi Alex, >>>> >>>> We put this on the HTTPbis issues list a while ago >>>> <http://trac.tools.ietf.org/wg/httpbis/trac/ticket/29>, and I've discussed >>>> it with a few folks F2F, but AFAICT it hasn't been discussed on-list. >>>> >>>> In a nutshell, I think you're correct that there's a problem here, but >>>> your proposal: >>>> >>>> >>>>> creation_time = min(date_value, request_time - age_value); >>>>> current_age = now - creation_time; >>>>> >>>> has a few (small-ish) issues. >>>> >>>> 1) The corrected_received_age's subtraction of the date_value from now has >>>> the (intended, I assume) effect of accounting for upstream HTTP/1.0 caches >>>> that don't append an Age header. Your proposal doesn't do this. >>>> >>>> This is already being diccussed on-list (see recent thread "cache >>>> freshness / age calcs"), and may go away anyway. Your input there would be >>>> appreciated. >>>> >>>> 2) The behaviour when date_value isn't present isn't specified; we could >>>> address this in prose, but it would be awkward. >>>> >>>> This could probably be worked around by either specifying a slightly more >>>> complex formula, or specifying that when the Date header isn't present, a >>>> completely separate (and presumably much simpler) formula is to be used. >>>> >>>> Cheers, >>>> >>>> >>>> >>>> On 31/08/2002, at 2:59 AM, Alex Rousskov wrote: >>>> >>>> >>>>> Hi there, >>>>> >>>>> We are testing a couple of RFC 2616 MUSTs related to >>>>> current_age calculation. Many proxies violate a subset of test cases >>>>> that includes an artificial proxy-to-server delay. Looking at the >>>>> results, I think that the proxies are doing the "right thing" and the >>>>> RFC has a problem. >>>>> >>>>> I will start with a specific example when current_age formula >>>>> from the RFC yields a way-too-conservative and unnatural result (100% >>>>> error). I will then describe the problem and suggest a fix. >>>>> >>>>> I understand that a way-too-conservative age does not lead to >>>>> stale documents being returned. However, if we want proxies to be >>>>> compliant, we may want to fix/mention the problem in the errata or >>>>> elsewhere. Otherwise, the more problems like that are left unaddressed >>>>> (ignored), the more difficult it would be to convince implementors to >>>>> pay attention to the RFC. >>>>> >>>>> Perhaps I got it all wrong, please check! >>>>> >>>>> >>>>> A simple example >>>>> ---------------- >>>>> >>>>> Here is a real and simple example that detected the problem with the >>>>> original current_age formula from "13.2.3 Age Calculations". The >>>>> absolute values of timestamps below ("0" and "7") have no >>>>> significance. >>>>> >>>>> time event >>>>> ---- ------------------------------------------------------------ >>>>> 0.0 client request generated >>>>> 0.0 client request reached the proxy, it is a MISS >>>>> 0.0 proxy request to origin server is generated >>>>> 0.0 proxy request reached the origin server >>>>> 0.0 server response generated with Date correctly set to 0, no Age >>>>> header >>>>> -- a network delay of 7 seconds -- >>>>> 7.0 server response reached the proxy >>>>> 7.0 proxy cached the response >>>>> 7.0 proxy forwarded the response >>>>> 7.0 the response reached the client >>>>> 7.0 another client request for the same URL generated >>>>> 7.0 client request reached the proxy, it is a HIT >>>>> 7.0 proxy must compute Age header value, see math below >>>>> >>>>> Following RFC 2616: >>>>> >>>>> age_value = 0 (the cached response has no Age header) >>>>> date_value = 0 (the cached response has Date set to 0) >>>>> request_time = 0 (the proxy generated request at time 0) >>>>> response_time = 7 (the proxy received response at time 7) >>>>> now = 7 (the current time is 7) >>>>> >>>>> apparent_age = max(0, response_time - date_value) = 7 >>>>> corrected_received_age = max(apparent_age, age_value) = 7 >>>>> response_delay = response_time - request_time = 7 >>>>> corrected_initial_age = corrected_received_age + response_delay = 14 >>>>> resident_time = now - response_time = 0 >>>>> current_age = corrected_initial_age + resident_time = 14 >>>>> >>>>> The true age is, of course, 7 and not 14. The above formulas just double >>>>> true >>>>> current age in the case of a network delay between the proxy and the >>>>> origin >>>>> server. The fixed formula (see below for the discussion) does not: >>>>> >>>>> current_age = now - min(date_value, request_time - age_value) = >>>>> = 7 - max(0, 0 - 0) = 7 >>>>> >>>>> N.B. If the proxy computes Age header for misses and uses that as >>>>> age_value when serving hits, the formulas yield the same result. >>>>> >>>>> >>>>> The Problem >>>>> ----------- >>>>> >>>>> RFC 2616 says: >>>>> >>>>> Because the request that resulted in the returned Age value must have >>>>> been initiated prior to that Age value's generation, we can correct >>>>> for delays imposed by the network by recording the time at which the >>>>> request was initiated. Then, when an Age value is received, it MUST >>>>> be interpreted relative to the time the request was initiated... >>>>> So, we compute: >>>>> >>>>> corrected_initial_age = corrected_received_age >>>>> + (now - request_time) >>>>> >>>>> I suspect the formula does not match the true intent of the RFC >>>>> authors. I believe that corrected_initial_age formula counts >>>>> server-to-client delays twice. It does that because the >>>>> corrected_received_age component already accounts for one >>>>> server-to-client delay. Here is an annotated definition from the RFC: >>>>> >>>>> corrected_received_age = max( >>>>> now - date_value, # trust the clock (includes server-to-client >>>>> delay!) >>>>> age_value) # all-HTTP/1.1 paths (no server-to-client delay) >>>>> >>>>> I think it is possible to fix the corrected_initial_age formula to >>>>> match the intent (note this is the *initial* not *received* age): >>>>> >>>>> corrected_initial_age = max( >>>>> now - date_value, # trust the clock (includes delays) >>>>> age_value + now - request_time) # trust Age, add network delays >>>>> >>>>> There is no need for corrected_received_age. >>>>> >>>>> >>>>> Moreover, it looks ALL the formulas computing current_age go away with >>>>> the above new corrected_initial_age definition as long as "now" is >>>>> still defined as "the current time" (i.e., the time when current_age >>>>> is calculated): >>>>> >>>>> current_age = corrected_initial_age >>>>> >>>>> So, we end up with a single formula for all cases and all times: >>>>> >>>>> current_age = max(now - date_value, age_value + now - request_time) = >>>>> = now - min(date_value, request_time - age_value) >>>>> >>>>> It even has a clear physical meaning -- the min() part is the >>>>> conservative >>>>> estimate of object creation time. We could rewrite for clarity: >>>>> >>>>> creation_time = min(date_value, request_time - age_value); >>>>> current_age = now - creation_time; >>>>> >>>>> >>>>> Am I missing something important here? If I am right, and the current >>>>> formulas count server-to-client delays twice, is it worth mentioning >>>>> in the errata or elsewhere as a bug? Or should we insist that >>>>> implementations use current_age calculation from the RFC anyway? >>>>> >>>>> Thank you, >>>>> >>>>> Alex. >>>>> >>>>> -- >>>>> | HTTP performance - Web Polygraph benchmark >>>>> www.measurement-factory.com | HTTP compliance+ - Co-Advisor test suite >>>>> | all of the above - PolyBox appliance >>>>> >>>>> >>>> -- >>>> Mark Nottingham http://www.mnot.net/ >>>> >>>> >>>> >>> >>> >>> -- >>> Mark Nottingham http://www.mnot.net/ >>> >>> >>> >> >> -- >> Adrien de Croy - WinGate Proxy Server - http://www.wingate.com >> > -- Mark Nottingham http://www.mnot.net/
Received on Tuesday, 9 March 2010 09:23:18 UTC