Clarification on HTTP/QUIC Unidirectional Streams

Samuel Hurst <samuelh@rd.bbc.co.uk> Wed, 17 October 2018 16:23 UTC

Return-Path: <samuelh@rd.bbc.co.uk>
X-Original-To: quic@ietfa.amsl.com
Delivered-To: quic@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 35543130DEF for <quic@ietfa.amsl.com>; Wed, 17 Oct 2018 09:23:41 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -4.201
X-Spam-Level:
X-Spam-Status: No, score=-4.201 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id LUyYoUUrneV5 for <quic@ietfa.amsl.com>; Wed, 17 Oct 2018 09:23:39 -0700 (PDT)
Received: from gateh.kw.bbc.co.uk (gateh.kw.bbc.co.uk [132.185.132.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 17EA9130DEC for <quic@ietf.org>; Wed, 17 Oct 2018 09:23:38 -0700 (PDT)
Received: from mailhub1.rd.bbc.co.uk ([172.29.120.129]) by gateh.kw.bbc.co.uk (8.14.5+Sun/8.13.6) with ESMTP id w9HGNaLD010373 for <quic@ietf.org>; Wed, 17 Oct 2018 17:23:36 +0100 (BST)
Received: from rd015072.rd.bbc.co.uk ([172.29.91.136]:35036) by mailhub1.rd.bbc.co.uk with esmtp (Exim 4.84_2) (envelope-from <samuelh@rd.bbc.co.uk>) id 1gCobg-00089i-DK for quic@ietf.org; Wed, 17 Oct 2018 17:23:36 +0100
From: Samuel Hurst <samuelh@rd.bbc.co.uk>
Subject: Clarification on HTTP/QUIC Unidirectional Streams
To: IETF QUIC WG <quic@ietf.org>
Message-ID: <272107b2-8136-48cc-f429-efcea1231d78@rd.bbc.co.uk>
Date: Wed, 17 Oct 2018 17:23:36 +0100
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"; format="flowed"
Content-Language: en-GB
Content-Transfer-Encoding: 7bit
Archived-At: <https://mailarchive.ietf.org/arch/msg/quic/assCVGvT2Cl7wPk_zFeOrVI9UP4>
X-BeenThere: quic@ietf.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Main mailing list of the IETF QUIC working group <quic.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/quic>, <mailto:quic-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/quic/>
List-Post: <mailto:quic@ietf.org>
List-Help: <mailto:quic-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/quic>, <mailto:quic-request@ietf.org?subject=subscribe>
X-List-Received-Date: Wed, 17 Oct 2018 16:23:41 -0000

Hi All,


Apologies if this question has been asked before, but I'd just like to 
check that my understanding of something is correct and searching back 
through the list has not answered my question.

Given that HTTP/QUIC requires each peer in a connection to open a 
unidirectional control stream when a connection begins, I think it's 
safe to assume that streams 2 and 3 will be the control streams.

Now, a client will make a request on Stream 0, which will include some 
QPACK HEADERS, and the odds are that some of those headers will be poked 
into the dynamic table (I'm thinking of the User-Agent as a prime 
candidate for this).

However, as I understand it, QPACK requires two unidirectional control 
streams for the encode (type 'H') and decode (type 'h'). And this is per 
encode-decode pair, so there will be another pair of unidirectional 
control streams for the encode and decode of the server's response headers.

So in my head, the current state of streams in use is thus:

Stream 0 - Client Request
Stream 2 - Client Control Stream
Stream 3 - Server Control Stream
Stream 6 - Client Headers QPACK Encoder Stream
Stream 7 - Client Headers QPACK Decoder Stream
Stream 10 - Server Headers QPACK Decoder Stream
Stream 11 - Server Headers QPACK Encoder Stream

So, if as part of the request made in stream 0, the server decides to 
send a PUSH_PROMISE frame, and then once acknowledged by the client the 
server begins the server push immediately, is is a safe assumption to 
make that the first server push stream will be on stream 15?

I also don't think there's anything to stop a server from sending a 
PUSH_PROMISE frame before it's even sent a HEADERS frame back for the 
initial request, so in that case would the server push end up on stream 
11, the server headers encoder stream ends up on stream 15 and the 
decoder stream stays on stream 10?

I'm just trying to get it into my head exactly what the expected lay of 
the land will be during a running HTTP/QUIC session. It's been a while 
since I last looked at the QUIC drafts and I'm jumping ahead through 
several revisions so it's possible that I've missed something.


Best Regards,
Sam