- From: Roberto Peon <grmocg@gmail.com>
- Date: Fri, 3 May 2013 18:49:57 -0700
- To: James M Snell <jasnell@gmail.com>
- Cc: William Chan (陈智昌) <willchan@chromium.org>, Martin Thomson <martin.thomson@gmail.com>, HTTP Working Group <ietf-http-wg@w3.org>
- Message-ID: <CAP+FsNf6p1fK_MH2P4vZTpt_CFWttDagY1nVdPvsdXm3tp_XuA@mail.gmail.com>
Hey, you're the one worried about the size of the compressor state (which would be ~4 or 8k)! :) Headers are sometimes larger individually, and the upper limit to the size of this state is the sum of 10s to 100s of these. I think that, pragmatically, since there is a framing-layer solution which ensures that one must not store headers for longer that necessary, and which is semantic-layer agnostic, it is a decent bet. Any approach other than declaring it as unidirectional (or equivalent) either requires the caching of much state, or a NACK from the remote side. That isn't to say that Martin's approach doesn't have appeal. I want to like it, but unless we are to have unlimited streams in some limbo state, it would require a NACK, else I won't be able to correlate sets of headers on a stream and the NACK both requires more machinery at both ends, and consumes more bytes on the wire. -=R On Fri, May 3, 2013 at 6:19 PM, James M Snell <jasnell@gmail.com> wrote: > Ok.. going back over the thread in detail and over the spec again, one > approach to addressing the overall concern here (and hopefully bring a > bit more rigor to the overall design) is to redefine the stream states > slightly along the same lines already suggested by Martin. Each > endpoint would maintain its own view of the current activity state of > every stream in a session, however, the state would only reflect the > actions taken by the peer endpoint. There are five possible activity > states: > > Unused > The peer endpoint has not reserved or used the stream in any way. > > Open > The endpoint has received frames on the stream from the peer, none > of which are type RST_STREAM or have the FINAL flag set. > > Closed > The endpoint has received an RST_STREAM frame, or any frame with the > FINAL flag set from the peer > > Reserved-Open > The peer has reserved the stream identifier for future use but > frames have not yet been received on that stream. The receiving > endpoint is expected to send its own frames on the same stream. > > Reserved-Closed > The peer has reserved the stream identifier for future use but > frames have not yet been received on that stream. The receiving > endpoint is not expected to send its own frames on the same stream. > > MAX_CONCURRENT_STREAMS == The number of streams in the Open state the > endpoint will permit the peer to initiate at any given time. Once that > limit is reached, the receiving endpoint will likely begin rejecting > new streams using RST_STREAM. In other words, right now, > MAX_CONCURRENT_STREAMS is defined in terms of what the sending > endpoint must not do. This changes the definition to an indication of > what the receiving endpoint will do once a particular threshold is > reached. Any endpoint that wants to be able to keep creating streams > must be diligent about sending FINAL frames, etc. > > As for the Request-Response bounding issue, that's really an HTTP > semantic layer notion. I'm not fully convinced we really need to > handle that issue in the framing layer at all. > > > On Fri, May 3, 2013 at 2:20 PM, Roberto Peon <grmocg@gmail.com> wrote: > > The biggest rub in Martin's suggestion is that, as a stream initiator, I > no > > longer know for how long I should keep the original "request" headers > > around. > > I view that as an annoying problem (I want every response to be > attributable > > to a request). > > > > I also think it is a bit confusing-- how would it be used in cases where > > I've sent all my data on what I thought was a unidirectional stream, and > > then receive bytes from the other side on that stream. That'd be... > weird. > > > > With the unidirectional bit (or similar declaration of half-closed > > start-state), I now know (by fiat, essentially) that I will not receive a > > response on that stream ID, and so I don't need to keep the "request" > > headers around after I've finished pushing the stream. Logging > accomplished. > > > > > > I think this is an easy issue to solve by reinstating the unidirectional > bit > > (for now). It is certainly minimal work to have servers which do server > push > > set that bit. > > > > To Will's point, I agree that an "ENHANCE YOUR CALM" code seems > redundant. > > In my case I believe it redundant because the remote side has already > > received my settings frame, or is sending without having known it (i.e. > > within the initial RTT), and will be receiving the SETTINGS frame before > it > > could process this new code anyway (assuming I'm following spec and > sending > > SETTINGS immediately upon session establishment). > > -=R > > > > > > > > > > > > On Fri, May 3, 2013 at 11:28 AM, William Chan (陈智昌) < > willchan@chromium.org> > > wrote: > >> > >> I guess I kinda think that we're worrying too much about this corner of > >> the spec. I don't view it as a big deal in practice. The problem > described > >> happens when MAX_CONCURRENT_STREAMS is too low to allow enough > parallelism > >> per roundtrip. I would advise people to simply increase their > >> MAX_CONCURRENT_STREAMS in that case. I kinda think this is only > problematic > >> when we have very high latencies and devices that can't handle high > >> parallelism, like an interplanetary refrigerator that speaks HTTP/2 for > some > >> reason. <shrug> > >> > >> I am unsure how to feel about a ENHANCE YOUR CALM code as it's not well > >> defined. I don't mind RST_STREAMs on exceeding limits, like the initial > >> MAX_CONCURRENT_STREAMS, since they're usually the result of a race (the > >> possible initial SETTINGS frame race) and we won't have to keep > continually > >> sending RST_STREAMs to rate limit appropriately. > >> > >> > >> On Fri, May 3, 2013 at 3:02 PM, James M Snell <jasnell@gmail.com> > wrote: > >>> > >>> The impact on client-to-server initiated streams is another reason why > >>> I suggested the credit-based approach and why it would likely be good > >>> to have an RST_STREAM "ENHANCE YOUR CALM" error code [1]. If the > >>> client misbehaves and sends too much too quickly, we have flow > >>> control, settings, rst_stream and goaway options to deal with it. > >>> > >>> [1] > >>> > http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Server_Error > >>> > >>> On Fri, May 3, 2013 at 10:34 AM, William Chan (陈智昌) > >>> <willchan@chromium.org> wrote: > >>> > As I understand the proposal, which I believe ties into the issue > James > >>> > raised at the beginning here, the goal is to be able to open and > close > >>> > a > >>> > directional stream without an ACK, which I am nervous about as I said > >>> > above > >>> > without much detail. Concretely speaking, a HTTP GET is a > >>> > HEADERS+PRIORITY > >>> > frame with a FINAL flag or an extra DATA frame with FINAL flag. This > >>> > means > >>> > that the request effectively never gets counted against the > directional > >>> > stream limit, as controlled by the receiver which sends a > >>> > MAX_CONCURRENT_STREAMS setting, since it open and closes the > direction > >>> > in > >>> > the same frame (or closes in the subsequent empty DATA frame). > >>> > > >>> > > >>> > On Fri, May 3, 2013 at 1:52 PM, Martin Thomson > >>> > <martin.thomson@gmail.com> > >>> > wrote: > >>> >> > >>> >> On 3 May 2013 09:44, William Chan (陈智昌) <willchan@chromium.org> > wrote: > >>> >> > I'd like server folks to chime in, but doing this makes me feel a > >>> >> > bit > >>> >> > nervous. I feel this effectively disables the directional > concurrent > >>> >> > streams > >>> >> > limit. The bidirectional full-close essentially acts like an ACK, > so > >>> >> > removing it might result in an unbounded number of streams. > >>> >> > >>> >> I think that I know what you mean here, but can you try to expand a > >>> >> little? Do you refer to the possible gap between close on the > >>> >> initiating direction and the first frame on the responding > direction; > >>> >> a gap that might cause the stream to escape accounting? I think > that > >>> >> is a tractable problem - any unbounded-ness is under the control of > >>> >> the initiating peer. > >>> > > >>> > > >> > >> > > >
Received on Saturday, 4 May 2013 01:50:26 UTC