- From: Mark Watson <watsonm@netflix.com>
- Date: Wed, 4 Dec 2013 11:32:59 -0800
- To: William Chan (陈智昌) <willchan@chromium.org>
- Cc: Roberto Peon <grmocg@gmail.com>, HTTP Working Group <ietf-http-wg@w3.org>
- Message-ID: <CAEnTvdDamwN-vxQ79jAcTaNpVhtDb6ErAekb-tmKTDcszL8m3w@mail.gmail.com>
On Wed, Dec 4, 2013 at 9:53 AM, William Chan (陈智昌) <willchan@chromium.org>wrote: > On Wed, Dec 4, 2013 at 9:37 AM, Roberto Peon <grmocg@gmail.com> wrote: > >> >> >> >> On Wed, Dec 4, 2013 at 9:29 AM, Mark Watson <watsonm@netflix.com> wrote: >> >>> Thanks for all the rapid responses. >>> >>> - yes, it was the phrase "sender-advised" that confused me in the >>> definition of PRIORITY. It's not clear that the receiver of a stream can >>> request a change to its priority, but I understand from the responses below >>> that it's intended this is allowed >>> >> >> Yup. The mechanism we have today is not very efficient and requires >> implementation datastructure gymnastics, though, thus current work. >> >> >>> - modification of the request would indeed be something new at the >>> HTTP layer. But then this is HTTP2.0 ;-) The use-case I am thinking of is >>> to modify the Range, for example if the resource is somehow progressively >>> encoded and the client decides it only needs the lower layers. How would >>> this differ from canceling the old request and making a new one ? The >>> difference is admittedly minor unless the RTT is large: One could cancel >>> the old request, wait for any remaining data to arrive (one RTT) then send >>> the new request (another RTT). Or one could take a guess at where the old >>> request will finish and send both cancellation and new request at the same >>> time. But then depending on how good, or bad, your guess is you either have >>> duplicate data transfer or a gap. I accept the point some real world data >>> is necessary to motivate this use-case. >>> >>> I have one follow-up question: IIUC, the notion of priority is 'soft' - >>> that is, the server can choose to return response data out of priority >>> order. How would you implement 'hard' priority, that is, where response >>> data must be returned in priority order, or, I guess, can only be >>> out-of-order if there is no data available to send from higher-priority >>> responses ? >>> >> > If you don't want to pay a speed hit due to unused bandwidth (no data > available from higher priority sources), you must allow out of order. > > >> I'd have the client make requests with zero stream-flow-control window >> size and open up the windows in whatever order/way I saw fit. >> In most cases, this is probably a losing proposition, latency-wise, but >> it can be done. >> There are certainly valid and interesting usecases for using this >> mechanism to limit the amount of resources used when doing prefetching, for >> instance. >> > > Yeah, Roberto's right here, but just to emphasize...you lose much of the > gain of using HTTP/2 in the first place if you don't allow out of > (priority) order responses. And I would argue that an interoperable HTTP/2 > implementation should NOT do this. Because the performance loss here is so > substantial, that were this to become more commonplace, this would > incentivize clients to switch back to multiple connections to get parallel > downloads. > > PS: You may also get suboptimal prioritization the more you eagerly _push_ > into lower level queues rather than lazily _pull_ from higher level queues. > For example, once you push into the kernel socket buffer, the application > can't reorder HTTP/2 frames in that buffer, even though there may be time > left to do so before the bytes get emitted on the wire. There are some > computational tradeoffs due to more context switches, but the later you > delay the actual commit of an HTTP/2 frame to the network, the better > prioritization you get. > My use-case is for streaming video, where the request corresponds to chunks of video that are sequential in time. I never want later video data to be sent if there was earlier video data available that could have been sent instead, so I want the priority to be strictly respected by the server in that sense. Am I right that the spec currently would allow but not require a server to behave that way ? ...Mark > > >> >> -=R >> >> >> >>> >>> ...Mark >>> >>> >>> >>> On Wed, Dec 4, 2013 at 9:05 AM, Roberto Peon <grmocg@gmail.com> wrote: >>> >>>> Look for the thread entitled: >>>> >>>> Restarting the discussion on HTTP/2 stream priorities >>>> >>>> (started on Oct 28) >>>> >>>> for further details about how we'd like to see priority changed. >>>> >>>> >>>> >>>> On Wed, Dec 4, 2013 at 8:49 AM, Roberto Peon <grmocg@gmail.com> wrote: >>>> >>>>> >>>>> >>>>> >>>>> On Wed, Dec 4, 2013 at 8:31 AM, Mark Watson <watsonm@netflix.com>wrote: >>>>> >>>>>> Hi everyone, >>>>>> >>>>>> I recently reviewed the HTTP 2.0 draft. There are three things I >>>>>> expected to see that weren't immediately obvious how to achieve. Apologies >>>>>> if there have already been long discussions on these - feel free to point >>>>>> me at the archives if that is the case. >>>>>> >>>>>> (1) Canceling an HTTP request (e.g. if the client decides it no >>>>>> longer needs a requested resource). This is a pain to do with HTTP1.x, >>>>>> requiring the connection to be closed, losing all pipelined requests and >>>>>> incurring a new TCP connection establishment delay. I assume one could >>>>>> close a stream in HTTP2.0, canceling all requests on that stream. Does this >>>>>> mean that for individual control of HTTP requests one must ensure each >>>>>> response is on its own stream ? How does the client ensure that ? >>>>>> >>>>>> A stream is a single request for HTTP/2. >>>>> Cancelling the stream cancels a request. >>>>> >>>>> >>>>>> (2) Receiver modification of stream priority. The client may have >>>>>> (changing) opinions about the relative priority of resources. The >>>>>> specification allows a sender of a stream to set its priority, but I didn't >>>>>> immediately see how the receiver could request priority changes. [Flow >>>>>> control seems to be a slightly different thing]. >>>>>> >>>>>> >>>>> This is an open issue and is being worked on. >>>>> >>>>> >>>>>> (3) Modification of HTTP requests. The client may wish to change some >>>>>> fields of an HTTP request. Actually the only one I can think of right now >>>>>> is Range. For example of the client decides it does not need the whole of >>>>>> the originally requested range it would be more efficient to modify the >>>>>> Range than to wait until the required data is received and cancel the >>>>>> request. >>>>>> >>>>>> >>>>> I do't think we've heard about this as a compelling usecase for anyone >>>>> yet. Why would this be significantly better than cancelling the previous >>>>> request and sending another? >>>>> >>>>> -=R >>>>> >>>>> Thanks in advance for any pointers on these. If they are new features >>>>>> requiring more detailed use-cases I can provide those. >>>>>> ...Mark >>>>>> >>>>> >>>>> >>>> >>> >> >
Received on Wednesday, 4 December 2013 19:33:27 UTC