draft-ietf-httpbis-http2 feedback

Julian Reschke <julian.reschke@gmx.de> Wed, 31 July 2013 09:52 UTC

Return-Path: <ietf-http-wg-request@listhub.w3.org>
X-Original-To: ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com
Delivered-To: ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 908A121F9E5B for <ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com>; Wed, 31 Jul 2013 02:52:36 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -9.598
X-Spam-Level:
X-Spam-Status: No, score=-9.598 tagged_above=-999 required=5 tests=[AWL=-1.002, BAYES_00=-2.599, RCVD_IN_DNSWL_HI=-8, TRACKER_ID=2.003]
Received: from mail.ietf.org ([12.22.58.30]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id pdwZ918L4dRQ for <ietfarch-httpbisa-archive-bis2Juki@ietfa.amsl.com>; Wed, 31 Jul 2013 02:52:29 -0700 (PDT)
Received: from frink.w3.org (frink.w3.org [128.30.52.56]) by ietfa.amsl.com (Postfix) with ESMTP id 4A17121E8088 for <httpbisa-archive-bis2Juki@lists.ietf.org>; Wed, 31 Jul 2013 02:52:28 -0700 (PDT)
Received: from lists by frink.w3.org with local (Exim 4.72) (envelope-from <ietf-http-wg-request@listhub.w3.org>) id 1V4T4E-0008Or-Ne for ietf-http-wg-dist@listhub.w3.org; Wed, 31 Jul 2013 09:51:38 +0000
Resent-Date: Wed, 31 Jul 2013 09:51:38 +0000
Resent-Message-Id: <E1V4T4E-0008Or-Ne@frink.w3.org>
Received: from lisa.w3.org ([128.30.52.41]) by frink.w3.org with esmtp (Exim 4.72) (envelope-from <julian.reschke@gmx.de>) id 1V4T43-0008N4-Ha for ietf-http-wg@listhub.w3.org; Wed, 31 Jul 2013 09:51:27 +0000
Received: from mout.gmx.net ([212.227.15.19]) by lisa.w3.org with esmtp (Exim 4.72) (envelope-from <julian.reschke@gmx.de>) id 1V4T42-0007X6-DQ for ietf-http-wg@w3.org; Wed, 31 Jul 2013 09:51:27 +0000
Received: from [192.168.43.245] ([89.204.137.53]) by mail.gmx.com (mrgmx103) with ESMTPSA (Nemesis) id 0MX19U-1UaiLE2Unk-00Vv1y for <ietf-http-wg@w3.org>; Wed, 31 Jul 2013 11:51:00 +0200
Message-ID: <51F8DA31.20903@gmx.de>
Date: Wed, 31 Jul 2013 11:34:41 +0200
From: Julian Reschke <julian.reschke@gmx.de>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20130620 Thunderbird/17.0.7
MIME-Version: 1.0
To: HTTP Working Group <ietf-http-wg@w3.org>
Content-Type: text/plain; charset="ISO-8859-1"; format="flowed"
Content-Transfer-Encoding: 7bit
X-Provags-ID: V03:K0:Xm1xxNOQhB3Ak4fqk1MNfVWypifUBCFd9VU7o8fWZkyyroanQkd 6uWGJ66Rg+V7FTqx3F+/qtg4B5pXz+o1LUeYZCb9TJA9NxN9UuMdNdRIusHpDURlQS9YIf2 EpAgxCOLHeCLq5bbt2VBAg+d+86obBZGeyZ9Iuxw5+maMvo+KrszOZj/jRYdtXavV73vBEG 3emgA4lq1nWYNGel85u9Q==
Received-SPF: pass client-ip=212.227.15.19; envelope-from=julian.reschke@gmx.de; helo=mout.gmx.net
X-W3C-Hub-Spam-Status: No, score=-2.1
X-W3C-Hub-Spam-Report: AWL=-3.234, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_PASS=-0.001, TRACKER_ID=1.102
X-W3C-Scan-Sig: lisa.w3.org 1V4T42-0007X6-DQ fdbd04c5decbdb8b558fdea0db7b1c97
X-Original-To: ietf-http-wg@w3.org
Subject: draft-ietf-httpbis-http2 feedback
Archived-At: <http://www.w3.org/mid/51F8DA31.20903@gmx.de>
Resent-From: ietf-http-wg@w3.org
X-Mailing-List: <ietf-http-wg@w3.org> archive/latest/19010
X-Loop: ietf-http-wg@w3.org
Resent-Sender: ietf-http-wg-request@w3.org
Precedence: list
List-Id: <ietf-http-wg.w3.org>
List-Help: <http://www.w3.org/Mail/>
List-Post: <mailto:ietf-http-wg@w3.org>
List-Unsubscribe: <mailto:ietf-http-wg-request@w3.org?subject=unsubscribe>

Questions:

In 4.1:

"Type:
     The 8-bit type of the frame. The frame type determines how the 
remainder of the frame header and payload are interpreted. 
Implementations MUST ignore unsupported and unrecognized frame types."

Maybe s/unrecognized frame types/frames of unsupported or unrecognized 
types/?

(It's the frame that is ignored, right?)


6.3

"The PRIORITY frame (type=0x2) specifies the sender-advised priority of 
a stream. It can be sent at any time for an existing stream. This 
enables reprioritisation of existing streams."

Can it interleave HEADERS frames?

6.8

"Endpoints MAY append opaque data to the payload of any GOAWAY frame. 
Additional debug data is intended for diagnostic purposes only and 
carries no semantic value. Debug data MUST NOT be persistently stored, 
since it could contain sensitive information."

Does this include loggers / trace tools??? If they don't store the 
information, how can it be used for debugging?


6.9.4 Ending Flow Control

"Flow control cannot be enabled again once disabled."

I assume there's a reason for that. Maybe it's worth explaining?


8.1 HTTP Request/Response Exchange

Why are method names being lowercased??????


8.1.2 Request Header Fields

"All header field names MUST be lowercased, and the definitions of all 
header field names defined by HTTP/1.1 are updated to be all lowercase."

I don't understand the second part of the sentence.

"All HTTP Requests that include a body SHOULD include the 
"content-length" header field."

Why? If I don't know the size upfront and leave it out, am I violating a 
requirement here? (I believe this is "SHOULD/MUST if known upfront").


8.1.3 Response Header Fields

Dropping the reason-phrase might break a few edge cases; is this worth 
it????


8.2

Is it a good idea to completely rule out pushed responses to methods != GET?


Editorial:

Throughout: I really dislike the use of "zero or more". But maybe it's 
just me :-)


"1.1 Document Organization

The HTTP/2.0 Specification is split into three parts: starting HTTP/2.0 
(Section 3), which covers how a HTTP/2.0 connection is initiated; a 
framing layer (Section 4), which multiplexes a single TCP connection 
into independent frames of various types; and an HTTP layer (Section 8), 
which specifies the mechanism for expressing HTTP interactions using the 
framing layer. While some of the framing layer concepts are isolated 
from HTTP, building a generic framing layer has not been a goal. The 
framing layer is tailored to the needs of the HTTP protocol and server 
push."

So we have forward references to Sections 3, 4 and 8. But not 5, 6, or 7?


"2.3 HTTP Semantics

HTTP/2.0 defines how HTTP requests and responses are mapped to streams 
(see Section 8) and introduces a new interaction model, server push 
(Section 8.2)."

The first reference probably should point to Section 8.1.


"3.5 Connection Header

Upon establishment of a TCP connection and determination that HTTP/2.0 
will be used by both peers, each endpoint MUST send a connection header 
as a final confirmation and to establish the initial settings for the 
HTTP/2.0 connection.

The client connection header is a sequence of 24 octets, which in hex 
notation are:

505249202a20485454502f322e300d0a0d0a534d0d0a0d0a

(the string PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n) followed by a SETTINGS 
frame (Section 6.5). "

I believe it would be clearer if we said:

"3.5 Connection Header

Upon establishment of a TCP connection and determination that HTTP/2.0 
will be used by both peers, each endpoint MUST send a connection header 
as a final confirmation and to establish the initial settings for the 
HTTP/2.0 connection.

The client connection header is a sequence of 24 octets, which in hex 
notation are:

	505249202a20485454502f322e300d0a0d0a534d0d0a0d0a

This happens to be the HTTP message

   PRI * HTTP/2.0
   SM

This octet sequence is followed by a SETTINGS frame (Section 6.5)."


"4.1 Frame Header

All frames begin with an 8-octet header followed by a payload of between 
0 and 65,535 octets.

   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |         Length (16)           |   Type (8)    |   Flags (8)   |
  +-+-------------+---------------+-------------------------------+
  |R|                 Stream Identifier (31)                      |
  +-+-------------------------------------------------------------+
  |                   Frame Payload (0...)                      ...
  +---------------------------------------------------------------+"

I found it confusing that the section is called "Frame Header" but then 
defines the format of the complete frame.

Maybe:

"4.1 Frame Format

All frames begin with an 8-octet header followed by a payload of between 
0 and 65,535 octets.

   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |         Length (16)           |   Type (8)    |   Flags (8)   |
  +-+-------------+---------------+-------------------------------+
  |R|                 Stream Identifier (31)                      |
  +-+-------------------------------------------------------------+
  +---------------------------------------------------------------+
  |                   Frame Payload (0...)                      ...
  +---------------------------------------------------------------+"


5.1

Maybe prefix the diagram with a list of states and their abbreviations.


5.2.2

"Deployments with constrained resources (for example, memory) MAY employ 
flow control to limit the amount of memory a peer can consume. Note, 
however, that this can lead to suboptimal use of available network 
resources if flow control is enabled without knowledge of the 
bandwidth-delay product (see [RFC1323])."

s/MAY/can/


6.2

"The HEADERS frame (type=0x1) carries name-value pairs. The HEADERS is 
used to open a stream (Section 5.1). Any number of HEADERS frames can be 
sent on an existing stream at any time."

s/The HEADERS is used/It is used/

"PRIORITY (0x8):
     Bit 4 being set indicates that the first four octets of this frame 
contain a single reserved bit and a 31-bit priority; see Section 5.3. If 
this bit is not set, the four bytes do not appear and the frame only 
contains a header block fragment."

May rename PRIORITY to HAS_PRIORITY then?


6.5.2 Defined Settings

Is there a reason for the numerical constants being 4..7..10?


6.8

"On streams with lower or equal numbered identifiers that were not 
closed completely prior to the connection being closed, re-attempting 
requests, transactions, or any protocol activity is not possible (with 
the exception of idempotent actions like HTTP GET, PUT, or DELETE). Any 
protocol activity that uses higher numbered streams can be safely 
retried using a new connection."

Add a ref to definition of idempotent.


8.2

s/PUSH_PROMSE/PUSH_PROMISE/


IANA Considerations

Should either list the things to be registered, or reference them by 
section #.



Best regards, Julian