- From: Alek Storm <alek.storm@gmail.com>
- Date: Sun, 13 Apr 2014 16:49:14 -0700
- To: "ietf-http-wg@w3.org" <ietf-http-wg@w3.org>
- Message-ID: <CAMNEcwt0ZdVz=sqW92iQAPFS_z+kW4aXDU0MiLDJ5=hccNYiGQ@mail.gmail.com>
Hi all, I have a radical suggestion for the SETTINGS frame: rather than serializing it as a sequence of (id, value) pairs, where id and value are 8- and 32-bit integers, respectively, use a header block, as in HEADERS/PUSH_PROMISE/ CONTINUATION. This offers the following benefits: - Extensibility: By allowing setting names to be arbitrary strings, users can introduce custom settings without worrying about collisions in a 255-element namespace, and without having to maintain some sort of registry. - Expressiveness: String values allow complex settings to be encoded - this has been widely, and successfully, used in HTTP headers (e.g. the Link header <http://tools.ietf.org/html/rfc5988#section-5.5> and the cache-control headers <http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9> ). - Simplicity: Making SETTINGS values more expressive would allow the new ALTSVC frame to become a setting, rather than a separate frame, since it confers only fire-and-forget connection-level metadata. In fact, it could follow the format of the Alt-Svc HTTP header<http://tools.ietf.org/html/draft-ietf-httpbis-alt-svc-01#section-3>. Other extensions to the protocol can be added the same way, just as Alt-Svc was added to HTTP/1.1 - in contrast, "extension" frame types are a non-starter, since implementations are required to error out when receiving an unrecognized frame type. There is also a semantic argument to be made: just as HEADERS frames express request/response-level metadata, SETTINGS frames express connection-level metadata (in fact, HTTP/1.1, which lacks the latter mechanism, has made use of header fields on individual requests to express properties about the connection as a whole, e.g. Alt-Svc and the hop-by-hop headers, like Connection and Upgrade). Adding header-table-size, enable-push, max-concurrent-streams, and initial-window-size to the initial static HPACK table (or even maintaining a separate compression context and static table) should allow us to achieve a final SETTINGS frame size comparable to the current serialization format. I've been contributing to hyper <https://github.com/lukasa/hyper>, a Python client implementation, lately, and I'd be happy to give this proposal a whirl in a branch and report back with before-and-after benchmarks. Apologies if the above has been proposed before - I wasn't able to find anything in a search of the archives, but I may have missed something. Best, Alek
Received on Sunday, 13 April 2014 23:49:43 UTC