Re: Some thoughts on server push and client pull

* Google is working on efforts to seriously deploy SPDY server push on our
properties. I can't comment further on timeline, but I hope to provide data
to guide our discussions, so let's not axe it just yet.
* To my knowledge, Amazon is using it in their Silk browser. A proxy that
uses server push is a fascinating use case, and it'd be cool to get data on
that first.

On Wed, Jun 6, 2012 at 6:47 PM, Mike Belshe <mike@belshe.com> wrote:

> I agree.
>
> Perhaps another reason for dropping push at this point may be that I don't
> know of any efforts to seriously deploy it.  If no implementors are willing
> to speak up that they plan to use it, deploy it, measure it, and report
> results on their findings, then it is a good time to drop it altogether and
> focus on the other parts of the protocol instead.
>
> Mike
>
>
> On Wed, Jun 6, 2012 at 6:30 PM, Gabriel Montenegro <
> Gabriel.Montenegro@microsoft.com> wrote:
>
>>  Hi folks,****
>>
>> ** **
>>
>> Amongst some collegues, we've been thinking about server push in HTTP 2.0
>> and have some ideas we'd like to share as a way to promote discussion on
>> this subject****
>>
>> ** **
>>
>> 1. Overview****
>>
>> Server Push is an interesting idea that could provide some performance
>> gains for HTTP 2.0 clients, however we don’t believe it is core the HTTP
>> 2.0 protocol. Server Push could result in servers sending unnecessary data
>> to the client, introduces potential delays to avoid race conditions and is
>> mostly relevant for browser applications. A less complex alternative that
>> addresses some of these drawbacks while better aligning with legacy HTTP,
>> “Smart Client Pull”, is proposed below. ****
>>
>> ** **
>>
>> ** **
>>
>> 2. Issues with current Server Push in SPDY****
>>
>> ** **
>>
>> We don't envision Server push as part of the base HTTP 2.0 protocol, but
>> see it as a potentially interesting extension, as long as there is some way
>> for the client to exert some control over when and how it is used. One
>> fundamental requirement is for clients to be able to control “Server Push”
>> behavior via a new opt-in <name TBD> header.  Servers MUST NOT push
>> unrequested data to the client, unless the top level page request <name
>> TBD> header is set to allow “Server Push”.****
>>
>> ** **
>>
>> Server Push does not require any validation prior to pushing data to the
>> client, which could result in the server sending unnecessary data to
>> clients that have some of the pushed resources stored in their cache.****
>>
>> ** **
>>
>> Furthermore, "Server Push" introduces a race condition in which a client
>> could start a new request for data that the server is in the process of
>> pushing, effectively causing the same resource to be downloaded twice. SPDY
>> addresses the race condition by not sending any data (headers are OK) for
>> the top level page, until all of the SYN_STREAM for the dependencies it
>> will push are sent:****
>>
>> ** **
>>
>> "To minimize race conditions with the client, the SYN_STREAM for the
>> pushed resources MUST be sent prior to sending any content which could
>> allow the client to discover the pushed resource and request it."****
>>
>> ** **
>>
>> We agree that SPDY's proposal is a good way to mitigate the race
>> condition in Server Push without introducing significant complexity.
>> Unfortunately mitigating the race condition in this manner prevents the
>> server from sending data for the top level page. This could result in
>> user-visible delays.  Whether or not the user will see a delay will depend
>> on what messages (how many and how large) the server is pushing to the
>> client.****
>>
>> ** **
>>
>> 3. Smart Client Pull alternative to Server Push****
>>
>> ** **
>>
>> We would like to propose an alternative to Server Push for discussion.
>> This alternative is closely aligned with existing standards and could even
>> work for HTTP 1.1.****
>>
>> ** **
>>
>> When a server receives an HTTP request for a top level page, the server
>> will generate a list of resources needed to fully load the top level page.
>> The server will send the optimal pre-fetch list to the client, via LINK
>> headers, with a "prefetch" link relation type (defined in HTML5 per
>> http://www.iana.org/assignments/link-relations/link-relations.xml). ****
>>
>> ****
>>
>> The server SHOULD also include the corresponding cache validators for
>> each resource in the pre-fetch list. An extension to the “prefetch” link
>> relation type will be needed to allow cache validator data.****
>>
>> ** **
>>
>> When a client receives data for a top level page, it will begin
>> processing the top level page response, while simultaneously pre-fetching
>> resources in the pre-fetch list that are not in the client cache or that
>> are cached but invalid, as indicated by the cache validators included in
>> the pre-fetch list. Servers SHOULD only include resources that block
>> loading of the top level page in the optimal pre-fetch list.****
>>
>> ** **
>>
>> This eliminates the need to block data for the top level request until
>> all SYN_STREAM for pushed dependencies are sent, in order to avoid the race
>> condition. The client would pre-fetch the resources in the optimal
>> pre-fetch list, which introduces an extra RTT.  We should gather data to
>> determine how much more significant this RTT is, when compared to the
>> complexity of implementing server push and some of the benefits obtained by
>> multiplexing new connections for the dependency resources.****
>>
>> ** **
>>
>> Clients will control “Smart Client Pull” behavior via a new opt-in <name
>> TBD> header. Servers MUST NOT push LINK header and associated cache
>> validator data to clients, unless the top level page request <name TBD>
>> header is set to allow “Smart Client Pull”. ****
>>
>> ** **
>>
>> 4. Other alternatives ****
>>
>> ** **
>>
>> These are other client-driven alternatives to “Server Push”. However we
>> need to capture additional data to determine the impact and cost of each:
>> ****
>>
>> ** **
>>
>> a.            Bundling of HTTP resources: Administrators can package
>> static server side resources needed to download a webpage as a single
>> entity. A client would download all static dependencies by issuing a single
>> HTTP request. However, this could result in the client receiving data which
>> it already had in its cache.****
>>
>> ** **
>>
>> b.            Combination of Smart Client Pull and Bundling of HTTP
>> resources (a).****
>>
>> ** **
>>
>> 5.            Recommendation:****
>>
>> ** **
>>
>> “Server Push” should not be a part of the core HTTP2.0 spec for the
>> following reasons:****
>>
>> ** **
>>
>> - “Server Push” is not core to defining the HTTP 2.0 transport.****
>>
>> ** **
>>
>> - “Server Push” without optimizations can result in unnecessary data
>> being sent to the client.****
>>
>> ** **
>>
>> - “Server Push” even with optimizations, introduces delays to avoid race
>> conditions that are not present in other solutions.****
>>
>> ** **
>>
>> - “Server Push” is relevant primarily for browser applications and not
>> for more general use cases.****
>>
>> ** **
>>
>> 6.            Areas for further discussion: ****
>>
>> ** **
>>
>> - How to send the “prefetch" list and its corresponding cache-validators
>> in an efficient manner. These resources are URLs, which can be really long,
>> causing us to transmit a additional data when using Smart Client Pull.***
>> *
>>
>> ** **
>>
>> - Validation of cached resources included in the prefetch list will
>> require additional CPU cycles.  However, it is no different from cache
>> validation currently performed on cache resources. The tradeoff here is CPU
>> load in order to avoid unnecessary download of resources already in the
>> client’s cache.****
>>
>> ** **
>>
>> - Compare “Smart Server Hints” and “Bundling” to determine the impact of
>> the features in isolation and combined.****
>>
>
>

Received on Thursday, 7 June 2012 16:44:04 UTC