Re: Implementation Notes on Server Push

Martin Thomson <> Tue, 14 May 2013 23:59 UTC

Return-Path: <>
Received: from localhost (localhost []) by (Postfix) with ESMTP id 7C39D21F8F11 for <>; Tue, 14 May 2013 16:59:48 -0700 (PDT)
X-Virus-Scanned: amavisd-new at
X-Spam-Flag: NO
X-Spam-Score: -10.599
X-Spam-Status: No, score=-10.599 tagged_above=-999 required=5 tests=[BAYES_00=-2.599, RCVD_IN_DNSWL_HI=-8]
Received: from ([]) by localhost ( []) (amavisd-new, port 10024) with ESMTP id jxIMW4ELs8G5 for <>; Tue, 14 May 2013 16:59:42 -0700 (PDT)
Received: from ( []) by (Postfix) with ESMTP id D790621F8F15 for <>; Tue, 14 May 2013 16:59:41 -0700 (PDT)
Received: from lists by with local (Exim 4.72) (envelope-from <>) id 1UcP6i-0005J6-Tk for; Tue, 14 May 2013 23:58:12 +0000
Resent-Date: Tue, 14 May 2013 23:58:12 +0000
Resent-Message-Id: <>
Received: from ([]) by with esmtp (Exim 4.72) (envelope-from <>) id 1UcP6W-0005HT-DJ for; Tue, 14 May 2013 23:58:00 +0000
Received: from ([]) by with esmtps (TLS1.0:RSA_ARCFOUR_SHA1:16) (Exim 4.72) (envelope-from <>) id 1UcP6U-00061f-Dy for; Tue, 14 May 2013 23:58:00 +0000
Received: by with SMTP id q58so1025151wes.36 for <>; Tue, 14 May 2013 16:57:32 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=dcRnuZrKrt5gE7bOfzqZr96j4dbCc9BMkAunA5TNCMs=; b=VM5yjWeY22aaa1eshnQO/gTFonfWj3xBLo5wCm5gtqLfDGwJMPq1c0L1tjGFtDtDmq rpoWVdDK8rh0Ah+mwnG0Ddwj8OPpl5xjKsuYIGWCsxxEwJNgLpdm8ghOcVX6g+mRsNBe ly26I2hz9S1GvhT/4vgNQSRekqcRUNhGnd4x9KO6LNkTa657Rc3P+tMtDM17LIOHW4oH GA2tPwQDLmNNY09GvPwM2Z0qEpNOzj0BadyQb8CovqLra2Xtpha7GWcaBzHcI830f3ke 9EkuUACJ5fXHSTe0QuP+6ENooxKcRpYGbFvP9zN4WcQlspmAdZVODjRK2GQSHWvs9p+K EsVw==
MIME-Version: 1.0
X-Received: by with SMTP id sd4mr407667wjb.54.1368575852334; Tue, 14 May 2013 16:57:32 -0700 (PDT)
Received: by with HTTP; Tue, 14 May 2013 16:57:32 -0700 (PDT)
In-Reply-To: <>
References: <>
Date: Tue, 14 May 2013 16:57:32 -0700
Message-ID: <>
From: Martin Thomson <>
To: Patrick McManus <>
Cc: HTTP Working Group <>
Content-Type: text/plain; charset=UTF-8
Received-SPF: pass client-ip=;;
X-W3C-Hub-Spam-Status: No, score=-3.5
X-W3C-Hub-Spam-Report: AWL=-2.667, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7, SPF_PASS=-0.001
X-W3C-Scan-Sig: 1UcP6U-00061f-Dy 238bb20e31c9c056c55663a24dd48b08
Subject: Re: Implementation Notes on Server Push
Archived-At: <>
X-Mailing-List: <> archive/latest/17995
Precedence: list
List-Id: <>
List-Help: <>
List-Post: <>
List-Unsubscribe: <>

Great feedback.

On 14 May 2013 12:14, Patrick McManus <> wrote:
> 304's seem to be a common cause of wasted pushed streams. I would see
> servers respond with a 304 for index.html and still push 200 responses for
> a.css and b.js when in a non-push world that would have been either 1 or 3
> 304's. Maybe we should have a rule that you can only push to an assoc-stream
> of 2xx ?

I don't know if outright prohibition is necessary.  It might be that
a.css has changed, but index.html hasn't.  But I consider that
unlikely in the general case.  A word of caution seems appropriate.

> There is language in the spec that if the client resets a stream that it
> implicitly resets any associated streams too. That was complicated to
> implement and pretty much broke my stream state model internally - while
> researching it it appears that mod_spdy and chrome don't implement it at
> all. The spec has an editorial note about removing that feature and I favor
> that removal.

I added that text, so I tend to agree. :)

> I found flow control for pushed streams immensely helpful. It lets the
> client bound how much data can be pushed before there is a local GET matched
> up with that. Relatedly, I changed my default SETTINGS window size from a
> ~infinite value to be a smaller push-apropos value and then pipelined a
> window update with each odd SYN_STREAM to make pulled streams ~infinite
> again while preserving the smaller limit for push and this worked fine with
> all existing servers to my pleasant surprise. That seems to mean at least
> the spdy/3 windowing mechanism is simple enough for people to get right.

That's interesting.  Do you believe that it would be worthwhile
splitting the initial window size setting in two?  One for streams I
initiate, one for streams you initiate?  That would save you a window
update on every new stream.

> As with other parts of the spec, I was faced in some implementations with
> some very large data frames (90+KB) from servers when testing. Such frames
> are impervious to CANCEL or any mechanism we might use to change priorities
> driven by the client :(..  HTTP2 is doing the right thing by creating a
> smallish max frame size.

Small is good, but how small is small enough?