- From: Willy Tarreau <w@1wt.eu>
- Date: Tue, 7 Oct 2014 08:16:50 +0200
- To: Mark Nottingham <mnot@mnot.net>
- Cc: Greg Wilkins <gregw@intalio.com>, Shigeki Ohtsu <ohtsu@iij.ad.jp>, HTTP Working Group <ietf-http-wg@w3.org>
On Tue, Oct 07, 2014 at 04:54:01PM +1100, Mark Nottingham wrote: > Willy, if you have a concrete proposal that you think can can strong > consensus, please make it ASAP. Stopping the work to do research on whether a > change is necessary isn't appropriate at this point in the work; that train > left the station a while ago. I have proposed two directions in July and was told it was already too late. I'm sorry for not having accurate details anymore in my mind 3 months later, but that was the first one : http://article.gmane.org/gmane.ietf.http-wg/23155 " I'm noticing that we need only 4 bits to send any possible static header+value (assuming we swap accept-charset and accept-encoding), since all other values are empty and will never be used as-is but as litterals. So I think that based on your suggestion to split indexing of static and dynamic, I'm suspecting we could systematically split indexes between static and dynamic in opcodes. Indeed, some index fields are already small (6+ for litterals and 4+ for litterals not indexed/never indexed), so having the static first will force one extra byte for all dynamic headers. However, stealing one bit in unused value ranges could help make that situation better. Something along these lines seems possible (please forgive me for errors, I'm encoding as I write) : 11 XXXXXX => send 6+indexed header from *dynamic* table as-is (0xC0 reserved) 10 01XXXX => send 4+indexed header from *static* table as-is (0x80 reserved) 00 00XXXX => send 4+indexed *dynamic* header without indexing (unchanged) 10 00XXXX => send 4+indexed *static* header without indexing 10 1XXXXX => send litteral based on *dynamic* header table (0=new name or reserved) 01 XXXXXX => send litteral based on *static* header table (0=new name) The idea is that even when we have few bits to encode the index, we're not forced to add an extra byte to encode the values from the other table, whatever table we pick first as first. " The second one was much simpler and Greg seems to favor it as well : http://article.gmane.org/gmane.ietf.http-wg/23201 " If at least we had the ability to encode both static table and most recent dynamic entries with a single index, I would feel better. For example you can have another approach : - positive indexes = static table index - negative indexes = - dynamic table index You encode (index + 10), so that you can encode up to the last 10 emitted fields, and you can encode up to 54 static headers in a single byte (it's just a matter of proper sorting but it's already reasonably clean). I think you get the idea. " Greg proposed to run some tests. I really think the second one is *very* easy to test in a sane environment, and represents a very small change. It ensures that commonly used fields do not need an extra byte, that recently indexed headers do not need an extra byte either, and that only old indexed headers or rarely used static headers need one. Right now I think that some of the static header fields might be less common than a number of the ones that are found in the indexed table, precisely because if they're in the indexed table, they're being used! Regards, Willy
Received on Tuesday, 7 October 2014 06:17:21 UTC