- From: 陈智昌 <willchan@chromium.org>
- Date: Tue, 8 Jul 2014 17:37:56 -0700
- To: Mike Belshe <mike@belshe.com>
- Cc: Greg Wilkins <gregw@intalio.com>, HTTP Working Group <ietf-http-wg@w3.org>
- Message-ID: <CAA4WUYjY2c4RZLaDbXkA3NZXAYRWC45qt2GcFx0ypH2o4T=NqQ@mail.gmail.com>
On Tue, Jul 8, 2014 at 5:36 PM, William Chan (陈智昌) <willchan@chromium.org> wrote: > On Tue, Jul 8, 2014 at 3:09 PM, Mike Belshe <mike@belshe.com> wrote: > >> Thanks, Greg. >> >> I believe your proposal is preferable to what we have today in H2. >> >> >> On Mon, Jul 7, 2014 at 8:14 PM, Greg Wilkins <gregw@intalio.com> wrote: >> >>> >>> Mike, >>> >>> I think the settings are needed with the ability to send larger frame >>> sizes. If I understand the feedback from SPDY correctly, the larger frame >>> sizes there were some endpoints that were lazy with their frame sizes and >>> sent overly large ones that hurt multiplexing. >>> >> >> OK - thanks for clarifying. I don't recall any such learning from SPDY. >> It certainly wasn't learning while I was at Google. >> > > Yes, Patrick identified these issues after you stopped working on SPDY. > Clarification: Patrick identified actual abuses live in the wild. Not theoretical. We indeed talked about the theoretical issue back when you were still at Google. > > >> >> BTW, some history: >> * SPDY originally used large frames too - 24bits - and let you use it as >> you wished. Some people worried that these large frame sizes would be >> abused someday and felt compelled to shrink them. But, as far as I know, >> those arguments were only theoretical. The fact is that you're really only >> going to hurt yourself; and 'you' is the server. Proxies are a different >> story. >> >> * SPDY's final field sizes were not arbitrary - they were an evolution >> based on lessons of what is valuable and what works. Initially all headers >> were limited to 16k-ish. This was because we didn't "like" large headers. >> But, when put to practice there are edge cases which needed to be dealt >> with, and some apps out there, wisely or not, use ridiculously sized >> headers. It just happens. Increasing the size was always preferable >> because: >> a) we learned that the constraint itself wasn't very valuable and >> didn't make anything materially better. >> b) there were edge cases where the constraint just didn't work, and >> the solutions were worse than the initial problem. >> >> >> >>> >>> The intention of the proposal is to allow large frame sizes IF NEEDED, >>> but to use the settings to constrain implementations to the 16KB that has >>> been selected as a reasonable one-size-fits-all for todays traffic. The >>> settings can then be adjusted without needing to rev the spec or deploy >>> extensions as experience is gained, traffic changes, networks change >>> etc. It may well be that they are adjusted down initially as much as >>> they are adjusted up. >>> >> >>> So I don't see it as a compromise - it is simply moving the limit that >>> must exist from being a fixed capability of the framing layer to be an >>> explicitly managed parameter of the protocol. >>> >>> >> Ok. I don't see any real need for these either. They may introduce new >> oddities if someone goes crazy with them. I'd lean toward not adding these >> if possible. >> >> Mike >> >> >> >> >> >> >>> cheers >>> >>> >>> >>> >>> >>> On 8 July 2014 10:07, Mike Belshe <mike@belshe.com> wrote: >>> >>>> >>>> >>>> >>>> On Mon, Jul 7, 2014 at 12:50 AM, Greg Wilkins <gregw@intalio.com> >>>> wrote: >>>> >>>>> >>>>> https://github.com/http2/http2-spec/pull/548 >>>>> >>>>> Background >>>>> >>>>> The HTTP2 protocol has a requirement to be able to transport large >>>>> headers, that exceed the payload size of a single frame at the current 16KB >>>>> maximum size. >>>>> >>>>> To address this requirement, the current draft (13) includes the >>>>> CONTINUATION frames, 0 or more of which may be sent after a HEADERS or >>>>> PUSH_PROMISE frame to contain the large headers. There has been significant >>>>> criticism of the CONTINUATION design, including: >>>>> >>>>> - >>>>> >>>>> The total length of a HEADERS+CONTINUATION* sequence is not known >>>>> until the last frame in the sequence is processed. A receiver that wishes >>>>> to reject streams headers larger than a specific limit may have to process >>>>> many frames and hold the results in memory before it discovers the header >>>>> is too large. >>>>> - >>>>> >>>>> The size of header that an endpoint is prepared to receive is not >>>>> known in advance. The only way a sender can know if a header too large is >>>>> by attempting to send it and receiving an error in response. Error handling >>>>> of headers may be difficult for an endpoint to handle efficiently and can >>>>> result in the closure of the entire connection. >>>>> - >>>>> >>>>> The END_STREAM flag is not present on the CONTINUATION frame, thus >>>>> it is possible for a stream to send CONTINUATION frames after a HEADERS >>>>> frame that has the END_STREAM flag set. This is confusing and increases the >>>>> complexity of the state machine required to process streams. It is highly >>>>> desirable that a set END_STREAM flag truly indicates the last non control >>>>> frame of a stream. >>>>> - >>>>> >>>>> There is a significant discontinuity in the code path required to >>>>> process headers. Headers up to an indeterminate size (roughly 20-something >>>>> KB) can be handled in a single frame. Headers that exceed this size must be >>>>> handled in multiple frames of different types with different frame flags >>>>> and stream control logic. Because the vast majority of headers sent >>>>> (>99.99%) are below this indeterminate size, implementations will have a >>>>> code path that is seldom executed and probably insufficiently tested. This >>>>> invites poor and/or partial and/or incorrect implementation. >>>>> - >>>>> >>>>> Because of the HPACK compression algorithm, a sequence of >>>>> HEADERS+CONTINUATIONS frames may not be interleaved with any other frame. >>>>> This effectively makes the sequence a single large frame. Because of the >>>>> simplicity of description and implementation it is proposed that it would >>>>> be far simpler to meet the requirement of large headers by supporting large >>>>> frames. >>>>> >>>>> This proposal has been prepared as it is possible to meet the >>>>> requirements of CONTINUATIONS without the complications and criticisms >>>>> above. >>>>> >>>>> This proposal addresses the issue of sending/receiving large HTTP >>>>> headers without giving endpoints and intermediaries unlimited resource >>>>> commitments nor unknown limits >>>>> >>>>> Additional Frame Size Issues Addressed >>>>> >>>>> The current draft (13) has maximum frame size of 16KB, which is an >>>>> arbitrary value that has been selected on the basis of experience to >>>>> provide a reasonable compromise between the efficiency of transmitting data >>>>> vs the quality of service for multiplexed channels. >>>>> >>>>> Whilst this educated guess may be near optimal for today's networks >>>>> and traffic, it is entirely possible that some current and/or future >>>>> networks may require a different value to achieve an optimal balance. There >>>>> have already been proposals [1] put to the WG to reduce the frame size to >>>>> optimise multiplexing , as well as discussion that high capacity, low >>>>> latency networks can achieve satisfactory multiplexing quality of service >>>>> with large frame sizes. >>>>> >>>>> This proposal addresses the issue that a fixed frame size does not >>>>> allow tuning multiplexing performance based on current/future experience. >>>>> >>>>> It has also been noted that 16KB is near the middle of the peak of the >>>>> current HTTP Object size histogram [2], so that a small change in the frame >>>>> size may have a significant impact on the number of HTTP messages that can >>>>> be sent in a single frame, without significant impacts on QoS. The HTTP >>>>> Object size histogram has changed significantly over time and is expected >>>>> to continue to do so. >>>>> >>>>> This proposal addresses the issue of tuning the frame size based on >>>>> experience of actual payload sizes. >>>>> >>>>> There have also been issues raised that a 16KB frame size does not >>>>> allow efficient data transfer [3] even when the end points are aware that >>>>> only a single stream is likely to be required for the imminent future, or >>>>> that a particular stream is of high priority. >>>>> >>>>> This proposal addresses the issue of tuning the frame size for >>>>> transport efficiency for specific streams in specific situations. >>>>> >>>>> Large Frame Header Proposal >>>>> >>>>> This proposal is to alter the core http2 protocol to address the >>>>> issues identified above by supporting a variable length maximum frame size >>>>> controlled by peer limits. >>>>> >>>>> This proposal increases the length field in the frame header to 31 >>>>> bits, to match the maximum flow control window size. However, >>>>> implementations will not be able to use the full frame size without >>>>> explicit consent from peers using newly defined SETTINGS or an optional >>>>> WINDOW_UPDATE field. >>>>> Frame Size Settings >>>>> >>>>> Two settings parameters are proposed: SETTINGS_HEADER_FRAME_SIZE for >>>>> the maximum header size and SETTINGS_FRAME_SIZE for all other frames. >>>>> >>>>> The SETTINGS_HEADER_FRAME_SIZE parameter supports the current >>>>> behaviour where large headers can be sent without changing the frame size >>>>> allowed for other frame types. ie A large header size limit can be set >>>>> without affecting the multiplexing efficiency of DATA frames. >>>>> >>>>> The SETTINGS_FRAME_SIZE applies to all other frames including DATA >>>>> frames and any other frame that may be defined by an extension. The use of >>>>> this parameter is intended to tune/optimise the connection for the general >>>>> case of multiple streams over the specific connection. >>>>> >>>> >>>> Greg - >>>> >>>> Overall, great writeup. Thank you. >>>> >>>> Clarifying question: are you bundling these settings parameters >>>> because you think we need them? Or simply as a compromise? If you had to >>>> choose between a larger frame size and no settings change vs the current >>>> frame size, which would you find simpler? >>>> >>>> Thanks, >>>> Mike >>>> >>>> >>>> >>>> >>>> >>>> >>>>> Frame Size Updates >>>>> >>>>> To handle the issue of efficiently sending large data when an end >>>>> point is prepared to risk multiplexing efficiency, this proposal allows a >>>>> Max Frame Size to be applied to a specific stream as an optional field in a >>>>> WINDOW_UPDATE frame. >>>>> >>>>> By including a variable frame size in the flow control mechanism this >>>>> proposal allows the decision to increase the frame size to be deferred >>>>> until more knowledge about the specific situation are known and limited to >>>>> the stream that will benefit from the increased size. >>>>> >>>>> Consider the example of a server that has commenced sending a large >>>>> content to a client. The server may initially send 4 x 16KB frames to >>>>> consume the default stream flow control window, at which time it must wait >>>>> for the client to send a WINDOW_UPDATE frame before continuing. When >>>>> generating the WINDOW_UPDATE frame, the client may have knowledge of: >>>>> >>>>> - The content-length header - so it knows that the amount of data >>>>> expected is large or is perhaps just slightly larger than a single frame. >>>>> - The content-type header - so it knows if the content has high >>>>> priority in rendering the current page, or if the content is likely to >>>>> include references to other resources which may need to be multiplexed. >>>>> - How many other streams are currently open and/or reserved - so >>>>> it knows if multiplexing is actually required. >>>>> - How many other requests are pending - so it knows if new >>>>> multiplexed stream could soon be opened. >>>>> - An approximate rough measure of the network latency and >>>>> throughput - This can be derived from the timing of the receipt of the >>>>> first few data frames and used to estimate the impact on QoS of any change >>>>> to the maximum frame size. >>>>> >>>>> The client can use this knowledge to make an informed decision as to >>>>> the benefit of changing the allowed max frame size against any risk to >>>>> multiplexing QoS. It can make several choices: >>>>> >>>>> - >>>>> >>>>> No change. It can just not adjust the frame size, either because >>>>> it is too hard to consider or that there are too many other streams, or >>>>> that the content is video that needs to be received slowly. In any of these >>>>> cases the max frame size can be left unchanged and the protocol continues >>>>> as it currently does. >>>>> - >>>>> >>>>> Large frame. If the stream is the only expected stream or of >>>>> sufficiently high priortiy, then the window and frame size can be set to >>>>> allow as much of the remaining data as possible to be sent in a single >>>>> frame. >>>>> - >>>>> >>>>> Medium frame. The client can momentarily trade some QoS (for an >>>>> estimated duration) by increasing the frame size to something >16KB and < >>>>> content-length >>>>> - >>>>> >>>>> Sufficient frame. If the remaining content is only a small >>>>> increment over the current SETTING_FRAME_SIZE, the Max Frame Size can be >>>>> increased to receive the remaining content in a single frame without any >>>>> significant QoS impact. >>>>> >>>>> Minimal Compliance >>>>> >>>>> A minimally compliant implementation MUST handle the >>>>> SETTING_FRAME_SIZE and SETTINGS_HEADER_SIZE and ensure that no frame sent >>>>> exceeds the applicable limit. However no implementation is required to send >>>>> frames at or near these limits when set above the default 16KB. >>>>> >>>>> There is no requirement for an implementation to send or to handle the >>>>> Max Frame Size in a WINDOW_UPDATE and it is allowable for it to be ignored >>>>> if received. >>>>> Anticipated Feedback >>>>> >>>>> *It is too late in the process to change the framing layer and to do >>>>> so after so much discussion is an implicit fail of the WG* >>>>> >>>>> To not consider issues and proposal brought to the WG would be a fail >>>>> of the process. This proposal is based on all the hard work to date done by >>>>> the WG and contributors to identify issues and test solutions. >>>>> >>>>> *These issues can be handled in extensions.* >>>>> >>>>> Optimising data transfers for large content could possibly be done in >>>>> an extension, however: >>>>> >>>>> - It is not yet clear if extensions will be a viable way to >>>>> enhance the http2 protocol. There are significant hurdle to overcome to >>>>> deploy extensions. >>>>> - Many of the issues are aimed at complexity and tuning of the >>>>> core protocol, and these cannot be addressed in an extension. >>>>> - It is asymmetric to support large headers with one mechanism and >>>>> large data with another. >>>>> >>>>> >>>>> >>>>> *The proposed header costs 2 extra bytes per frame* >>>>> >>>>> There is a small data cost to adopt this proposal, however this is >>>>> mitigated as: >>>>> >>>>> - The proposal may be able to reduce the number of frames needed >>>>> for some content, thus saving 8 bytes. Whilst not likely to be a 25% frame >>>>> saving required to break even, it will still reduce cost to below 2 bytes. >>>>> - There are options to have variable length headers or optional >>>>> extended headers that will preserve the semantics of this proposal and keep >>>>> an 8 byte header for small frames. If the 2 byte cost is considered >>>>> prohibitive, then these alterations can be considered. >>>>> >>>>> >>>>> >>>>> *The header is 10 bytes long and not 32bit word aligned.* >>>>> >>>>> Frames sent after arbitrary data will not be word aligned anyway. If >>>>> alignment is important, then padding could changed to be part of the base >>>>> frame format, 2 header bytes used for a padding length (giving an aligned >>>>> 12 byte header) and all frames padded to a word boundary. >>>>> >>>>> *31 bits is also an arbitrary length* >>>>> >>>>> It is true that a 31 bit large frame length is also an arbitrary limit >>>>> to the size of a frame. However, it is believed that 31 bits is >>>>> sufficiently large to efficiently handle almost all conceivable present and >>>>> future use cases. It would be possible to implement an unlimited size >>>>> length field, but this would also need changes to the flow control >>>>> mechanism, which currently also has a 31 bit maximum size. >>>>> >>>>> *It does not support unlimited response headers* >>>>> >>>>> A SETTINGS_HEADER_FRAME_SIZE of 2^31-1 is effectively unlimited for >>>>> all foreseeable response headers. >>>>> >>>>> >>>>> *This was tried with SPDY and rejected* >>>>> >>>>> SPDY did not have the settings to allow peers to set limits on the max >>>>> frame size. This proposal will not change to default behaviour of http2 >>>>> with regards to frame size. >>>>> >>>>> >>>>> *Intermediaries will destroy multiplexing by setting frame size to >>>>> 2^31-1* >>>>> >>>>> Large frames require the participation of both sender and receiver. A >>>>> receiver may advise that it is willing to accept large frames, but a sender >>>>> is under no obligation to send them. Thus intermediaries nor any end point >>>>> can unilaterally change multiplexing QoS. >>>>> >>>>> >>>>> *Cannot be hardware accelerated.* >>>>> >>>>> Hardware acceleration is not part of the WG brief to support, nor is >>>>> it clear that this proposal is any less suitable than others for hardware >>>>> acceleration. >>>>> Contributors >>>>> >>>>> This proposal was prepare by: >>>>> >>>>> - Amos Jeffries squid3@treenet.co.nz >>>>> - Greg Wilkins gregw@intalio.com >>>>> - Jason Greene jgreene@redhat.com >>>>> - Keith Morgan K.Morgan@iaea.org >>>>> - Poul-Henning Kamp phk@phk.freebsd.dk >>>>> >>>>> [1] >>>>> http://lists.w3.org/Archives/Public/ietf-http-wg/2013AprJun/0926.html >>>>> [2] http://httparchive.org/interesting.php >>>>> [3] >>>>> http://lists.w3.org/Archives/Public/ietf-http-wg/2014AprJun/1664.html >>>>> >>>>> >>>>> -- >>>>> Greg Wilkins <gregw@intalio.com> >>>>> http://eclipse.org/jetty HTTP, SPDY, Websocket server and client that >>>>> scales >>>>> http://www.webtide.com advice and support for jetty and cometd. >>>>> >>>> >>>> >>> >>> >>> -- >>> Greg Wilkins <gregw@intalio.com> >>> http://eclipse.org/jetty HTTP, SPDY, Websocket server and client that >>> scales >>> http://www.webtide.com advice and support for jetty and cometd. >>> >> >> >
Received on Wednesday, 9 July 2014 00:38:25 UTC