- From: Kari Hurtta <hurtta-ietf@elmme-mailer.org>
- Date: Sat, 23 Mar 2019 09:24:34 +0200 (EET)
- To: HTTP Working Group <ietf-http-wg@w3.org>
- CC: Martin Thomson <mt@lowentropy.net>
> I have a few fairly basic questions about the goals of the draft. > > Why do you need to use both :protocol and a setting? Isn't SETTINGS_ENABLE_CONNECT_PROTOCOL > plus the new values for :protocol enough? RFC 8441: Bootstrapping WebSockets with HTTP/2 SETTINGS_ENABLE_CONNECT_PROTOCOL SETTINGS seems do that partially: https://tools.ietf.org/html/rfc8441#section-3 | The new parameter name is SETTINGS_ENABLE_CONNECT_PROTOCOL. The | value of the parameter MUST be 0 or 1. | Upon receipt of SETTINGS_ENABLE_CONNECT_PROTOCOL with a value of 1, a | client MAY use the Extended CONNECT as defined in this document when * creating new streams. Receipt of this parameter by a server does not * have any impact. | Using a SETTINGS parameter to opt into an otherwise incompatible | protocol change is a use of "Extending HTTP/2" defined by Section 5.5 | of [RFC7540]. Specifically, the addition a new pseudo-header field, | ":protocol", and the change in meaning of the :authority pseudo- | header field in Section 4 require opt-in negotiation. Specially it seems work on case :protocol=bytestream when client is initializing this. ( :protocol=datagram is another thing ) https://tools.ietf.org/html/draft-kinnear-httpbis-http2-transport-01#section-2 | As described in Section 5.5 of [RFC7540], SETTINGS parameters allow | endpoints to negotiate use of protocol extensions that would | otherwise generate protocol errors. Use of the CONNECT method | extension defined in [RFC6455] requires the | SETTINGS_ENABLE_CONNECT_PROTOCOL parameter to be received by a client | prior to its use. SETTINGS_ENABLE_CONNECT_PROTOCOL is on RFC 8441 it is NOT on RFC 6455: The WebSocket Protocol | After receiving both SETTINGS_ENABLE_CONNECT_PROTOCOL and | SETTINGS_ENABLE_BIDIRECTIONAL_CONNECT, either endpoint of an HTTP/2 | connection can send a request in HEADERS frames to establish a byte | stream or datagram tunnel via the extended CONNECT method. | Similarly, either endpoint may be required to respond to an incoming | CONNECT request seeking to establish such a tunnel. So I guess that server push on HTTP/2 is allowed to open :protocol=bytestream when SETTINGS_ENABLE_BIDIRECTIONAL_CONNECT=1 is sent by client > How does a :protocol of bytestream differ from a plan CONNECT? Different semantic of :authority https://tools.ietf.org/html/rfc7540#section-8.3 > A proxy that supports CONNECT establishes a TCP connection [TCP] to > the server identified in the ":authority" pseudo-header field. Once > this connection is successfully established, the proxy sends a > HEADERS frame containing a 2xx series status code to the client, as > defined in [RFC7231], Section 4.3.6. So plain CONNECT is different. https://tools.ietf.org/html/rfc8441#section-4 | o On requests bearing the :protocol pseudo-header field, the | :authority pseudo-header field is interpreted according to | Section 8.1.2.3 of [RFC7540] instead of Section 8.3 of that | document. In particular, the server MUST NOT create a tunnel to | the host indicated by the :authority as it would with a CONNECT | method request that was not modified by this extension. So in summary :protocol=bytestream does not freate TCP connection to the server identified in the ":authority" pseudo-header field. I think that this is the difference. > What is the point of a :protocol of datagram? Seems that :protocol=datagram implies that "packect boundaries" are preserved. That seems to be the difference between :protocol=datagram and :protocol=bytestream ( :protocol=bytestream is like SOCK_STREAM on socket() but :protocol=datagram looks like SOCK_SEQPACKET on socket() -- not actually SOCK_DGRAM which is "connectionless, unreliable messages". So perhaps it should be :protocol=seqpacket instead ? ) So that one HTTP/2 DATA frame is one "packet" and is preserved to application (so that frame boundaries are not removed by HTTP/2 stack). Was that intended meaning of :protocol=datagram and only difference between :protocol=bytestream and :protocol=datagram (I suggest :protocol=seqpacket ☺ ) https://tools.ietf.org/html/draft-kinnear-httpbis-http2-transport-01#section-4 | If the application negotiated the "datagram" protocol, individual | DATA frames are considered complete messages on the stream. | Implementations SHOULD preserve these message boundaries when | delivering data to the application. This prevents applications from | needing to insert another level of framing to delineate message | boundaries while transmitting datagram messages over HTTP/2 streams. | Additionally, if an application is forwarding messages received over | a "datagram" stream, the contents of each DATA frame should be sent | in individual datagrams where possible. So looks like SETTINGS_ENABLE_CONNECT_PROTOCOL=1 from server :protocol=datagram from client is not enough for negation of this. Is now SETTINGS_ENABLE_BIDIRECTIONAL_CONNECT=1 from other end (from server if client is using :protocol=datagram) that what guarantees that :protocol=datagram preserves message boundaries ? This is not vey well spelled on SETTINGS_ENABLE_BIDIRECTIONAL_CONNECT text. And also name does not imply that. Got I that correct? / Kari Hurtta
Received on Saturday, 23 March 2019 07:25:05 UTC