draft-ietf-httpbis-http2-10.txt | draft-ietf-httpbis-http2-11.txt | |||
---|---|---|---|---|
HTTPbis Working Group M. Belshe | HTTPbis Working Group M. Belshe | |||
Internet-Draft Twist | Internet-Draft Twist | |||
Intended status: Standards Track R. Peon | Intended status: Standards Track R. Peon | |||
Expires: August 17, 2014 Google, Inc | Expires: October 5, 2014 Google, Inc | |||
M. Thomson, Ed. | M. Thomson, Ed. | |||
Mozilla | Mozilla | |||
February 13, 2014 | April 3, 2014 | |||
Hypertext Transfer Protocol version 2 | Hypertext Transfer Protocol version 2 | |||
draft-ietf-httpbis-http2-10 | draft-ietf-httpbis-http2-11 | |||
Abstract | Abstract | |||
This specification describes an optimized expression of the syntax of | This specification describes an optimized expression of the syntax of | |||
the Hypertext Transfer Protocol (HTTP). HTTP/2 enables a more | the Hypertext Transfer Protocol (HTTP). HTTP/2 enables a more | |||
efficient use of network resources and a reduced perception of | efficient use of network resources and a reduced perception of | |||
latency by introducing header field compression and allowing multiple | latency by introducing header field compression and allowing multiple | |||
concurrent messages on the same connection. It also introduces | concurrent messages on the same connection. It also introduces | |||
unsolicited push of representations from servers to clients. | unsolicited push of representations from servers to clients. | |||
This document is an alternative to, but does not obsolete, the | This document is an alternative to, but does not obsolete, the | |||
HTTP/1.1 message syntax. HTTP's existing semantics remain unchanged. | HTTP/1.1 message syntax. HTTP's existing semantics remain unchanged. | |||
Editorial Note (To be removed by RFC Editor) | Editorial Note (To be removed by RFC Editor) | |||
Discussion of this draft takes place on the HTTPBIS working group | Discussion of this draft takes place on the HTTPBIS working group | |||
mailing list (ietf-http-wg@w3.org), which is archived at | mailing list (ietf-http-wg@w3.org), which is archived at | |||
<http://lists.w3.org/Archives/Public/ietf-http-wg/>. | <http://lists.w3.org/Archives/Public/ietf-http-wg/>. | |||
Working Group information and related documents can be found at | Working Group information can be found at | |||
<http://tools.ietf.org/wg/httpbis/> (Wiki) and | <http://tools.ietf.org/wg/httpbis/>; that specific to HTTP/2 are at | |||
<https://github.com/http2/http2-spec> (source code and issues | <http://http2.github.io/>. | |||
tracker). | ||||
The changes in this draft are summarized in Appendix A. | The changes in this draft are summarized in Appendix A. | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at http://datatracker.ietf.org/drafts/current/. | Drafts is at http://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on August 17, 2014. | This Internet-Draft will expire on October 5, 2014. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2014 IETF Trust and the persons identified as the | Copyright (c) 2014 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(http://trustee.ietf.org/license-info) in effect on the date of | (http://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 5 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
1.1. Document Organization . . . . . . . . . . . . . . . . . . 5 | 2. HTTP/2 Protocol Overview . . . . . . . . . . . . . . . . . . . 5 | |||
1.2. Conventions and Terminology . . . . . . . . . . . . . . . 6 | 2.1. Document Organization . . . . . . . . . . . . . . . . . . 6 | |||
2. HTTP/2 Protocol Overview . . . . . . . . . . . . . . . . . . . 7 | 2.2. Conventions and Terminology . . . . . . . . . . . . . . . 7 | |||
2.1. HTTP Frames . . . . . . . . . . . . . . . . . . . . . . . 7 | 3. Starting HTTP/2 . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
2.2. HTTP Multiplexing . . . . . . . . . . . . . . . . . . . . 7 | ||||
2.3. HTTP Semantics . . . . . . . . . . . . . . . . . . . . . . 7 | ||||
3. Starting HTTP/2 . . . . . . . . . . . . . . . . . . . . . . . 7 | ||||
3.1. HTTP/2 Version Identification . . . . . . . . . . . . . . 8 | 3.1. HTTP/2 Version Identification . . . . . . . . . . . . . . 8 | |||
3.2. Starting HTTP/2 for "http" URIs . . . . . . . . . . . . . 9 | 3.2. Starting HTTP/2 for "http" URIs . . . . . . . . . . . . . 9 | |||
3.2.1. HTTP2-Settings Header Field . . . . . . . . . . . . . 10 | 3.2.1. HTTP2-Settings Header Field . . . . . . . . . . . . . 10 | |||
3.3. Starting HTTP/2 for "https" URIs . . . . . . . . . . . . . 11 | 3.3. Starting HTTP/2 for "https" URIs . . . . . . . . . . . . . 11 | |||
3.4. Starting HTTP/2 with Prior Knowledge . . . . . . . . . . . 11 | 3.4. Starting HTTP/2 with Prior Knowledge . . . . . . . . . . . 11 | |||
3.5. HTTP/2 Connection Header . . . . . . . . . . . . . . . . . 11 | 3.5. HTTP/2 Connection Preface . . . . . . . . . . . . . . . . 11 | |||
4. HTTP Frames . . . . . . . . . . . . . . . . . . . . . . . . . 12 | 4. HTTP Frames . . . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
4.1. Frame Format . . . . . . . . . . . . . . . . . . . . . . . 12 | 4.1. Frame Format . . . . . . . . . . . . . . . . . . . . . . . 12 | |||
4.2. Frame Size . . . . . . . . . . . . . . . . . . . . . . . . 13 | 4.2. Frame Size . . . . . . . . . . . . . . . . . . . . . . . . 14 | |||
4.3. Header Compression and Decompression . . . . . . . . . . . 14 | 4.3. Header Compression and Decompression . . . . . . . . . . . 14 | |||
5. Streams and Multiplexing . . . . . . . . . . . . . . . . . . . 15 | 5. Streams and Multiplexing . . . . . . . . . . . . . . . . . . . 15 | |||
5.1. Stream States . . . . . . . . . . . . . . . . . . . . . . 15 | 5.1. Stream States . . . . . . . . . . . . . . . . . . . . . . 16 | |||
5.1.1. Stream Identifiers . . . . . . . . . . . . . . . . . . 20 | 5.1.1. Stream Identifiers . . . . . . . . . . . . . . . . . . 20 | |||
5.1.2. Stream Concurrency . . . . . . . . . . . . . . . . . . 20 | 5.1.2. Stream Concurrency . . . . . . . . . . . . . . . . . . 20 | |||
5.2. Flow Control . . . . . . . . . . . . . . . . . . . . . . . 21 | 5.2. Flow Control . . . . . . . . . . . . . . . . . . . . . . . 21 | |||
5.2.1. Flow Control Principles . . . . . . . . . . . . . . . 21 | 5.2.1. Flow Control Principles . . . . . . . . . . . . . . . 21 | |||
5.2.2. Appropriate Use of Flow Control . . . . . . . . . . . 22 | 5.2.2. Appropriate Use of Flow Control . . . . . . . . . . . 22 | |||
5.3. Stream priority . . . . . . . . . . . . . . . . . . . . . 23 | ||||
5.3.1. Priority Groups and Weighting . . . . . . . . . . . . 23 | ||||
5.3.2. Stream Dependencies . . . . . . . . . . . . . . . . . 24 | ||||
5.3.3. Reprioritization . . . . . . . . . . . . . . . . . . . 25 | ||||
5.3.4. Prioritization State Management . . . . . . . . . . . 25 | ||||
5.3.5. Default Priorities . . . . . . . . . . . . . . . . . . 26 | ||||
5.4. Error Handling . . . . . . . . . . . . . . . . . . . . . . 26 | ||||
5.4.1. Connection Error Handling . . . . . . . . . . . . . . 27 | ||||
5.4.2. Stream Error Handling . . . . . . . . . . . . . . . . 27 | ||||
5.4.3. Connection Termination . . . . . . . . . . . . . . . . 28 | ||||
6. Frame Definitions . . . . . . . . . . . . . . . . . . . . . . 28 | ||||
6.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 | ||||
6.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . . . 30 | ||||
6.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . . . . 32 | ||||
6.4. RST_STREAM . . . . . . . . . . . . . . . . . . . . . . . . 34 | ||||
6.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . . . . 35 | ||||
6.5.1. SETTINGS Format . . . . . . . . . . . . . . . . . . . 36 | ||||
6.5.2. Defined SETTINGS Parameters . . . . . . . . . . . . . 36 | ||||
6.5.3. Settings Synchronization . . . . . . . . . . . . . . . 37 | ||||
6.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . . . . 37 | ||||
6.7. PING . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 | ||||
6.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . . . . 41 | ||||
6.9. WINDOW_UPDATE . . . . . . . . . . . . . . . . . . . . . . 43 | ||||
6.9.1. The Flow Control Window . . . . . . . . . . . . . . . 44 | ||||
6.9.2. Initial Flow Control Window Size . . . . . . . . . . . 45 | ||||
6.9.3. Reducing the Stream Window Size . . . . . . . . . . . 46 | ||||
6.10. CONTINUATION . . . . . . . . . . . . . . . . . . . . . . . 46 | ||||
6.11. ALTSVC . . . . . . . . . . . . . . . . . . . . . . . . . . 47 | ||||
7. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 49 | ||||
8. HTTP Message Exchanges . . . . . . . . . . . . . . . . . . . . 50 | ||||
8.1. HTTP Request/Response Exchange . . . . . . . . . . . . . . 51 | ||||
8.1.1. Informational Responses . . . . . . . . . . . . . . . 52 | ||||
8.1.2. Examples . . . . . . . . . . . . . . . . . . . . . . . 53 | ||||
8.1.3. HTTP Header Fields . . . . . . . . . . . . . . . . . . 55 | ||||
8.1.4. Request Reliability Mechanisms in HTTP/2 . . . . . . . 59 | ||||
8.2. Server Push . . . . . . . . . . . . . . . . . . . . . . . 60 | ||||
8.2.1. Push Requests . . . . . . . . . . . . . . . . . . . . 60 | ||||
8.2.2. Push Responses . . . . . . . . . . . . . . . . . . . . 61 | ||||
8.3. The CONNECT Method . . . . . . . . . . . . . . . . . . . . 62 | ||||
9. Additional HTTP Requirements/Considerations . . . . . . . . . 63 | ||||
9.1. Connection Management . . . . . . . . . . . . . . . . . . 63 | ||||
9.2. Use of TLS Features . . . . . . . . . . . . . . . . . . . 64 | ||||
9.3. GZip Content-Encoding . . . . . . . . . . . . . . . . . . 65 | ||||
10. Security Considerations . . . . . . . . . . . . . . . . . . . 65 | ||||
10.1. Server Authority . . . . . . . . . . . . . . . . . . . . . 65 | ||||
10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . . 66 | ||||
10.3. Intermediary Encapsulation Attacks . . . . . . . . . . . . 66 | ||||
10.4. Cacheability of Pushed Responses . . . . . . . . . . . . . 67 | ||||
10.5. Denial of Service Considerations . . . . . . . . . . . . . 67 | ||||
10.6. Use of Compression . . . . . . . . . . . . . . . . . . . . 68 | ||||
10.7. Use of Padding . . . . . . . . . . . . . . . . . . . . . . 68 | ||||
10.8. Privacy Considerations . . . . . . . . . . . . . . . . . . 69 | ||||
5.3. Stream priority . . . . . . . . . . . . . . . . . . . . . 22 | 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 69 | |||
5.4. Error Handling . . . . . . . . . . . . . . . . . . . . . . 23 | 11.1. Registration of HTTP/2 Identification String . . . . . . . 70 | |||
5.4.1. Connection Error Handling . . . . . . . . . . . . . . 23 | 11.2. Error Code Registry . . . . . . . . . . . . . . . . . . . 70 | |||
5.4.2. Stream Error Handling . . . . . . . . . . . . . . . . 24 | 11.3. HTTP2-Settings Header Field Registration . . . . . . . . . 71 | |||
5.4.3. Connection Termination . . . . . . . . . . . . . . . . 24 | 11.4. PRI Method Registration . . . . . . . . . . . . . . . . . 71 | |||
6. Frame Definitions . . . . . . . . . . . . . . . . . . . . . . 24 | 12. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 71 | |||
6.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 | 13. References . . . . . . . . . . . . . . . . . . . . . . . . . . 72 | |||
6.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . . . 27 | 13.1. Normative References . . . . . . . . . . . . . . . . . . . 72 | |||
6.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . . . . 29 | 13.2. Informative References . . . . . . . . . . . . . . . . . . 74 | |||
6.4. RST_STREAM . . . . . . . . . . . . . . . . . . . . . . . . 29 | ||||
6.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . . . . 30 | ||||
6.5.1. Setting Format . . . . . . . . . . . . . . . . . . . . 31 | ||||
6.5.2. Defined Settings . . . . . . . . . . . . . . . . . . . 32 | ||||
6.5.3. Settings Synchronization . . . . . . . . . . . . . . . 33 | ||||
6.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . . . . 33 | ||||
6.7. PING . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 | ||||
6.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . . . . 35 | ||||
6.9. WINDOW_UPDATE . . . . . . . . . . . . . . . . . . . . . . 38 | ||||
6.9.1. The Flow Control Window . . . . . . . . . . . . . . . 39 | ||||
6.9.2. Initial Flow Control Window Size . . . . . . . . . . . 40 | ||||
6.9.3. Reducing the Stream Window Size . . . . . . . . . . . 40 | ||||
6.10. CONTINUATION . . . . . . . . . . . . . . . . . . . . . . . 41 | ||||
7. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 42 | ||||
8. HTTP Message Exchanges . . . . . . . . . . . . . . . . . . . . 44 | ||||
8.1. HTTP Request/Response Exchange . . . . . . . . . . . . . . 44 | ||||
8.1.1. Informational Responses . . . . . . . . . . . . . . . 45 | ||||
8.1.2. Examples . . . . . . . . . . . . . . . . . . . . . . . 46 | ||||
8.1.3. HTTP Header Fields . . . . . . . . . . . . . . . . . . 48 | ||||
8.1.4. Request Reliability Mechanisms in HTTP/2 . . . . . . . 51 | ||||
8.2. Server Push . . . . . . . . . . . . . . . . . . . . . . . 52 | ||||
8.2.1. Push Requests . . . . . . . . . . . . . . . . . . . . 53 | ||||
8.2.2. Push Responses . . . . . . . . . . . . . . . . . . . . 54 | ||||
8.3. The CONNECT Method . . . . . . . . . . . . . . . . . . . . 54 | ||||
9. Additional HTTP Requirements/Considerations . . . . . . . . . 56 | ||||
9.1. Connection Management . . . . . . . . . . . . . . . . . . 56 | ||||
9.2. Use of TLS Features . . . . . . . . . . . . . . . . . . . 56 | ||||
9.3. GZip Content-Encoding . . . . . . . . . . . . . . . . . . 57 | ||||
10. Security Considerations . . . . . . . . . . . . . . . . . . . 57 | ||||
10.1. Server Authority and Same-Origin . . . . . . . . . . . . . 57 | ||||
10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . . 58 | ||||
10.3. Intermediary Encapsulation Attacks . . . . . . . . . . . . 58 | ||||
10.4. Cacheability of Pushed Resources . . . . . . . . . . . . . 58 | ||||
10.5. Denial of Service Considerations . . . . . . . . . . . . . 59 | ||||
10.6. Use of Padding . . . . . . . . . . . . . . . . . . . . . . 60 | ||||
11. Privacy Considerations . . . . . . . . . . . . . . . . . . . . 60 | ||||
12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 60 | ||||
12.1. Registration of HTTP/2 Identification String . . . . . . . 61 | ||||
12.2. Error Code Registry . . . . . . . . . . . . . . . . . . . 61 | ||||
12.3. HTTP2-Settings Header Field Registration . . . . . . . . . 62 | ||||
12.4. PRI Method Registration . . . . . . . . . . . . . . . . . 62 | ||||
13. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 62 | ||||
14. References . . . . . . . . . . . . . . . . . . . . . . . . . . 63 | ||||
14.1. Normative References . . . . . . . . . . . . . . . . . . . 63 | ||||
14.2. Informative References . . . . . . . . . . . . . . . . . . 65 | ||||
Appendix A. Change Log (to be removed by RFC Editor before | Appendix A. Change Log (to be removed by RFC Editor before | |||
publication) . . . . . . . . . . . . . . . . . . . . 65 | publication) . . . . . . . . . . . . . . . . . . . . 74 | |||
A.1. Since draft-ietf-httpbis-http2-09 . . . . . . . . . . . . 65 | A.1. Since draft-ietf-httpbis-http2-10 . . . . . . . . . . . . 74 | |||
A.2. Since draft-ietf-httpbis-http2-08 . . . . . . . . . . . . 66 | A.2. Since draft-ietf-httpbis-http2-09 . . . . . . . . . . . . 75 | |||
A.3. Since draft-ietf-httpbis-http2-07 . . . . . . . . . . . . 66 | A.3. Since draft-ietf-httpbis-http2-08 . . . . . . . . . . . . 75 | |||
A.4. Since draft-ietf-httpbis-http2-06 . . . . . . . . . . . . 66 | A.4. Since draft-ietf-httpbis-http2-07 . . . . . . . . . . . . 75 | |||
A.5. Since draft-ietf-httpbis-http2-05 . . . . . . . . . . . . 66 | A.5. Since draft-ietf-httpbis-http2-06 . . . . . . . . . . . . 75 | |||
A.6. Since draft-ietf-httpbis-http2-04 . . . . . . . . . . . . 67 | A.6. Since draft-ietf-httpbis-http2-05 . . . . . . . . . . . . 76 | |||
A.7. Since draft-ietf-httpbis-http2-03 . . . . . . . . . . . . 67 | A.7. Since draft-ietf-httpbis-http2-04 . . . . . . . . . . . . 76 | |||
A.8. Since draft-ietf-httpbis-http2-02 . . . . . . . . . . . . 67 | A.8. Since draft-ietf-httpbis-http2-03 . . . . . . . . . . . . 76 | |||
A.9. Since draft-ietf-httpbis-http2-01 . . . . . . . . . . . . 68 | A.9. Since draft-ietf-httpbis-http2-02 . . . . . . . . . . . . 77 | |||
A.10. Since draft-ietf-httpbis-http2-00 . . . . . . . . . . . . 68 | A.10. Since draft-ietf-httpbis-http2-01 . . . . . . . . . . . . 77 | |||
A.11. Since draft-mbelshe-httpbis-spdy-00 . . . . . . . . . . . 69 | A.11. Since draft-ietf-httpbis-http2-00 . . . . . . . . . . . . 78 | |||
A.12. Since draft-mbelshe-httpbis-spdy-00 . . . . . . . . . . . 78 | ||||
1. Introduction | 1. Introduction | |||
The Hypertext Transfer Protocol (HTTP) is a wildly successful | The Hypertext Transfer Protocol (HTTP) is a wildly successful | |||
protocol. However, the HTTP/1.1 message format ([HTTP-p1], Section | protocol. However, the HTTP/1.1 message format ([HTTP-p1], Section | |||
3) is optimized for implementation simplicity and accessibility, not | 3) was designed to be implemented with the tools at hand in the | |||
application performance. As such it has several characteristics that | 1990s, not modern Web application performance. As such it has | |||
have a negative overall effect on application performance. | several characteristics that have a negative overall effect on | |||
application performance today. | ||||
In particular, HTTP/1.0 only allows one request to be outstanding at | In particular, HTTP/1.0 only allows one request to be outstanding at | |||
a time on a given connection. HTTP/1.1 pipelining only partially | a time on a given connection. HTTP/1.1 pipelining only partially | |||
addressed request concurrency and suffers from head-of-line blocking. | addressed request concurrency and suffers from head-of-line blocking. | |||
Therefore, clients that need to make many requests typically use | Therefore, clients that need to make many requests typically use | |||
multiple connections to a server in order to reduce latency. | multiple connections to a server in order to reduce latency. | |||
Furthermore, HTTP/1.1 header fields are often repetitive and verbose, | Furthermore, HTTP/1.1 header fields are often repetitive and verbose, | |||
which, in addition to generating more or larger network packets, can | which, in addition to generating more or larger network packets, can | |||
cause the small initial TCP congestion window to quickly fill. This | cause the small initial TCP congestion window to quickly fill. This | |||
skipping to change at page 5, line 33 | skipping to change at page 5, line 34 | |||
single new TCP connection. | single new TCP connection. | |||
This document addresses these issues by defining an optimized mapping | This document addresses these issues by defining an optimized mapping | |||
of HTTP's semantics to an underlying connection. Specifically, it | of HTTP's semantics to an underlying connection. Specifically, it | |||
allows interleaving of request and response messages on the same | allows interleaving of request and response messages on the same | |||
connection and uses an efficient coding for HTTP header fields. It | connection and uses an efficient coding for HTTP header fields. It | |||
also allows prioritization of requests, letting more important | also allows prioritization of requests, letting more important | |||
requests complete more quickly, further improving performance. | requests complete more quickly, further improving performance. | |||
The resulting protocol is designed to be more friendly to the | The resulting protocol is designed to be more friendly to the | |||
network, because fewer TCP connections can be used, in comparison to | network, because fewer TCP connections can be used in comparison to | |||
HTTP/1.x. This means less competition with other flows, and longer- | HTTP/1.x. This means less competition with other flows, and longer- | |||
lived connections, which in turn leads to better utilization of | lived connections, which in turn leads to better utilization of | |||
available network capacity. | available network capacity. | |||
Finally, this encapsulation also enables more scalable processing of | Finally, this encapsulation also enables more scalable processing of | |||
messages through use of binary message framing. | messages through use of binary message framing. | |||
1.1. Document Organization | 2. HTTP/2 Protocol Overview | |||
HTTP/2 provides an optimized transport for HTTP semantics. HTTP/2 | ||||
supports all of the core features of HTTP/1.1, but aims to be more | ||||
efficient in several ways. | ||||
The basic protocol unit in HTTP/2 is a frame (Section 4.1). Each | ||||
frame has a different type and purpose. For example, HEADERS and | ||||
DATA frames form the basis of HTTP requests and responses | ||||
(Section 8.1); other frame types like SETTINGS, WINDOW_UPDATE, and | ||||
PUSH_PROMISE are used in support of other HTTP/2 features. | ||||
Multiplexing of requests is achieved by having each HTTP request- | ||||
response exchanged assigned to a single stream (Section 5). Streams | ||||
are largely independent of each other, so a blocked or stalled | ||||
request does not prevent progress on other requests. | ||||
Flow control and prioritization ensure that it is possible to | ||||
properly use multiplexed streams. Flow control (Section 5.2) helps | ||||
to ensure that only data that can be used by a receiver is | ||||
transmitted. Prioritization (Section 5.3) ensures that limited | ||||
resources can be directed to the most important requests first. | ||||
HTTP/2 adds a new interaction mode, whereby a server can push | ||||
responses to a client (Section 8.2). Server push allows a server to | ||||
speculatively send a client data that the server anticipates the | ||||
client will need, trading off some network usage against a potential | ||||
latency gain. The server does this by synthesizing a request, which | ||||
it sends as a PUSH_PROMISE frame. The server is then able to send a | ||||
response to the synthetic request on an separate stream. | ||||
Frames that contain HTTP header fields are compressed (Section 4.3). | ||||
HTTP requests can be highly redundant, so compression can reduce the | ||||
size of requests and responses significantly. | ||||
HTTP/2 also supports HTTP Alternative Services (see [ALT-SVC]) using | ||||
the ALTSVC frame type (Section 6.11), to allow servers more control | ||||
over traffic to them. | ||||
2.1. Document Organization | ||||
The HTTP/2 specification is split into four parts: | The HTTP/2 specification is split into four parts: | |||
o Starting HTTP/2 (Section 3) covers how a HTTP/2 connection is | o Starting HTTP/2 (Section 3) covers how an HTTP/2 connection is | |||
initiated. | initiated. | |||
o The framing (Section 4) and streams (Section 5) layers describe | o The framing (Section 4) and streams (Section 5) layers describe | |||
the way HTTP/2 frames are structured and formed into multiplexed | the way HTTP/2 frames are structured and formed into multiplexed | |||
streams. | streams. | |||
o Frame (Section 6) and error (Section 7) definitions include | o Frame (Section 6) and error (Section 7) definitions include | |||
details of the frame and error types used in HTTP/2. | details of the frame and error types used in HTTP/2. | |||
o HTTP mappings (Section 8) and additional requirements (Section 9) | o HTTP mappings (Section 8) and additional requirements (Section 9) | |||
describe how HTTP semantics are expressed using the mechanisms | describe how HTTP semantics are expressed using frames and | |||
defined. | streams. | |||
While some of the frame and stream layer concepts are isolated from | While some of the frame and stream layer concepts are isolated from | |||
HTTP, the intent is not to define a completely generic framing layer. | HTTP, the intent is not to define a completely generic framing layer. | |||
The framing and streams layers are tailored to the needs of the HTTP | The framing and streams layers are tailored to the needs of the HTTP | |||
protocol and server push. | protocol and server push. | |||
1.2. Conventions and Terminology | 2.2. Conventions and Terminology | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | |||
document are to be interpreted as described in RFC 2119 [RFC2119]. | document are to be interpreted as described in RFC 2119 [RFC2119]. | |||
All numeric values are in network byte order. Values are unsigned | All numeric values are in network byte order. Values are unsigned | |||
unless otherwise indicated. Literal values are provided in decimal | unless otherwise indicated. Literal values are provided in decimal | |||
or hexadecimal as appropriate. Hexadecimal literals are prefixed | or hexadecimal as appropriate. Hexadecimal literals are prefixed | |||
with "0x" to distinguish them from decimal literals. | with "0x" to distinguish them from decimal literals. | |||
skipping to change at page 6, line 43 | skipping to change at page 7, line 32 | |||
connection error: An error that affects the entire HTTP/2 | connection error: An error that affects the entire HTTP/2 | |||
connection. | connection. | |||
endpoint: Either the client or server of the connection. | endpoint: Either the client or server of the connection. | |||
frame: The smallest unit of communication within an HTTP/2 | frame: The smallest unit of communication within an HTTP/2 | |||
connection, consisting of a header and a variable-length sequence | connection, consisting of a header and a variable-length sequence | |||
of bytes structured according to the frame type. | of bytes structured according to the frame type. | |||
intermediary: A "proxy", "gateway" or other intermediary as defined | ||||
in Section 2.3 of [HTTP-p1]. | ||||
peer: An endpoint. When discussing a particular endpoint, "peer" | peer: An endpoint. When discussing a particular endpoint, "peer" | |||
refers to the endpoint that is remote to the primary subject of | refers to the endpoint that is remote to the primary subject of | |||
discussion. | discussion. | |||
receiver: An endpoint that is receiving frames. | receiver: An endpoint that is receiving frames. | |||
sender: An endpoint that is transmitting frames. | sender: An endpoint that is transmitting frames. | |||
server: The endpoint which did not initiate the HTTP/2 connection. | server: The endpoint which did not initiate the HTTP/2 connection. | |||
stream: A bi-directional flow of frames across a virtual channel | stream: A bi-directional flow of frames across a virtual channel | |||
within the HTTP/2 connection. | within the HTTP/2 connection. | |||
stream error: An error on the individual HTTP/2 stream. | stream error: An error on the individual HTTP/2 stream. | |||
2. HTTP/2 Protocol Overview | 3. Starting HTTP/2 | |||
HTTP/2 provides an optimized transport for HTTP semantics. | ||||
An HTTP/2 connection is an application level protocol running on top | An HTTP/2 connection is an application level protocol running on top | |||
of a TCP connection ([TCP]). The client is the TCP connection | of a TCP connection ([TCP]). The client is the TCP connection | |||
initiator. | initiator. | |||
This document describes the HTTP/2 protocol using a logical structure | ||||
that is formed of three parts: framing, streams, and application | ||||
mapping. This structure is provided primarily as an aid to | ||||
specification, implementations are free to diverge from this | ||||
structure as necessary. | ||||
2.1. HTTP Frames | ||||
HTTP/2 provides an efficient serialization of HTTP semantics. HTTP | ||||
requests and responses are encoded into length-prefixed frames (see | ||||
Section 4.1). | ||||
HTTP header fields are compressed into a series of frames that | ||||
contain header block fragments (see Section 4.3). | ||||
2.2. HTTP Multiplexing | ||||
HTTP/2 provides the ability to multiplex HTTP requests and responses | ||||
over a single connection. Multiple requests or responses can be sent | ||||
concurrently on a connection using streams (Section 5). In order to | ||||
maintain independent streams, flow control and prioritization are | ||||
necessary. | ||||
2.3. HTTP Semantics | ||||
HTTP/2 defines how HTTP requests and responses are mapped to streams | ||||
(see Section 8.1) and introduces a new interaction model, server push | ||||
(Section 8.2). | ||||
3. Starting HTTP/2 | ||||
HTTP/2 uses the same "http" and "https" URI schemes used by HTTP/1.1. | HTTP/2 uses the same "http" and "https" URI schemes used by HTTP/1.1. | |||
HTTP/2 shares the same default port numbers: 80 for "http" URIs and | HTTP/2 shares the same default port numbers: 80 for "http" URIs and | |||
443 for "https" URIs. As a result, implementations processing | 443 for "https" URIs. As a result, implementations processing | |||
requests for target resource URIs like "http://example.org/foo" or | requests for target resource URIs like "http://example.org/foo" or | |||
"https://example.com/bar" are required to first discover whether the | "https://example.com/bar" are required to first discover whether the | |||
upstream server (the immediate peer to which the client wishes to | upstream server (the immediate peer to which the client wishes to | |||
establish a connection) supports HTTP/2. | establish a connection) supports HTTP/2. | |||
The means by which support for HTTP/2 is determined is different for | The means by which support for HTTP/2 is determined is different for | |||
"http" and "https" URIs. Discovery for "http" URIs is described in | "http" and "https" URIs. Discovery for "http" URIs is described in | |||
Section 3.2. Discovery for "https" URIs is described in Section 3.3. | Section 3.2. Discovery for "https" URIs is described in Section 3.3. | |||
3.1. HTTP/2 Version Identification | 3.1. HTTP/2 Version Identification | |||
The protocol defined in this document is identified using the string | The protocol defined in this document has two identifiers. | |||
"h2". This identification is used in the HTTP/1.1 Upgrade header | ||||
field, in the TLS application layer protocol negotiation extension | ||||
[TLSALPN] field, and other places where protocol identification is | ||||
required. | ||||
Negotiating "h2" implies the use of the transport, security, framing | o The string "h2" identifies the protocol where HTTP/2 uses TLS | |||
and message semantics described in this document. | [TLS12]. This identifier is used in the TLS application layer | |||
protocol negotiation extension [TLSALPN] field and any place that | ||||
HTTP/2 over TLS is identified. | ||||
[[anchor6: Editor's Note: please remove the remainder of this section | When serialised into an ALPN protocol identifier (which is a | |||
prior to the publication of a final version of this document.]] | sequence of octets), the HTTP/2 protocol identifier string is | |||
encoded using UTF-8 [UTF-8]. | ||||
o The string "h2c" identifies the protocol where HTTP/2 is run over | ||||
cleartext TCP. This identifier is used in the HTTP/1.1 Upgrade | ||||
header field and any place that HTTP/2 over TCP is identified. | ||||
Negotiating "h2" or "h2c" implies the use of the transport, security, | ||||
framing and message semantics described in this document. | ||||
[[anchor3: RFC Editor's Note: please remove the remainder of this | ||||
section prior to the publication of a final version of this | ||||
document.]] | ||||
Only implementations of the final, published RFC can identify | Only implementations of the final, published RFC can identify | |||
themselves as "h2". Until such an RFC exists, implementations MUST | themselves as "h2" or "h2c". Until such an RFC exists, | |||
NOT identify themselves using "h2". | implementations MUST NOT identify themselves using these strings. | |||
Examples and text throughout the rest of this document use "h2" as a | Examples and text throughout the rest of this document use "h2" as a | |||
matter of editorial convenience only. Implementations of draft | matter of editorial convenience only. Implementations of draft | |||
versions MUST NOT identify using this string. | versions MUST NOT identify using this string. | |||
Implementations of draft versions of the protocol MUST add the string | Implementations of draft versions of the protocol MUST add the string | |||
"-" and the corresponding draft number to the identifier. For | "-" and the corresponding draft number to the identifier. For | |||
example, draft-ietf-httpbis-http2-09 is identified using the string | example, draft-ietf-httpbis-http2-11 over TLS is identified using the | |||
"h2-09". | string "h2-11". | |||
Non-compatible experiments that are based on these draft versions | Non-compatible experiments that are based on these draft versions | |||
MUST append the string "-" and a experiment name to the identifier. | MUST append the string "-" and an experiment name to the identifier. | |||
For example, an experimental implementation of packet mood-based | For example, an experimental implementation of packet mood-based | |||
encoding based on draft-ietf-httpbis-http2-09 might identify itself | encoding based on draft-ietf-httpbis-http2-09 might identify itself | |||
as "h2-09-emo". Note that any label MUST conform to the "token" | as "h2-09-emo". Note that any label MUST conform to the "token" | |||
syntax defined in Section 3.2.6 of [HTTP-p1]. Experimenters are | syntax defined in Section 3.2.6 of [HTTP-p1]. Experimenters are | |||
encouraged to coordinate their experiments on the ietf-http-wg@w3.org | encouraged to coordinate their experiments on the ietf-http-wg@w3.org | |||
mailing list. | mailing list. | |||
3.2. Starting HTTP/2 for "http" URIs | 3.2. Starting HTTP/2 for "http" URIs | |||
A client that makes a request to an "http" URI without prior | A client that makes a request to an "http" URI without prior | |||
knowledge about support for HTTP/2 uses the HTTP Upgrade mechanism | knowledge about support for HTTP/2 uses the HTTP Upgrade mechanism | |||
(Section 6.7 of [HTTP-p1]). The client makes an HTTP/1.1 request | (Section 6.7 of [HTTP-p1]). The client makes an HTTP/1.1 request | |||
that includes an Upgrade header field identifying HTTP/2 with the h2 | that includes an Upgrade header field identifying HTTP/2 with the | |||
token. The HTTP/1.1 request MUST include exactly one HTTP2-Settings | "h2c" token. The HTTP/1.1 request MUST include exactly one HTTP2- | |||
(Section 3.2.1) header field. | Settings (Section 3.2.1) header field. | |||
For example: | For example: | |||
GET /default.htm HTTP/1.1 | GET /default.htm HTTP/1.1 | |||
Host: server.example.com | Host: server.example.com | |||
Connection: Upgrade, HTTP2-Settings | Connection: Upgrade, HTTP2-Settings | |||
Upgrade: h2 | Upgrade: h2c | |||
HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload> | HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload> | |||
Requests that contain an entity body MUST be sent in their entirety | Requests that contain an entity body MUST be sent in their entirety | |||
before the client can send HTTP/2 frames. This means that a large | before the client can send HTTP/2 frames. This means that a large | |||
request entity can block the use of the connection until it is | request entity can block the use of the connection until it is | |||
completely sent. | completely sent. | |||
If concurrency of an initial request with subsequent requests is | If concurrency of an initial request with subsequent requests is | |||
important, a small request can be used to perform the upgrade to | important, a small request can be used to perform the upgrade to | |||
HTTP/2, at the cost of an additional round-trip. | HTTP/2, at the cost of an additional round-trip. | |||
skipping to change at page 10, line 7 | skipping to change at page 10, line 25 | |||
Upgrade. | Upgrade. | |||
HTTP/1.1 101 Switching Protocols | HTTP/1.1 101 Switching Protocols | |||
Connection: Upgrade | Connection: Upgrade | |||
Upgrade: h2 | Upgrade: h2 | |||
[ HTTP/2 connection ... | [ HTTP/2 connection ... | |||
The first HTTP/2 frame sent by the server is a SETTINGS frame | The first HTTP/2 frame sent by the server is a SETTINGS frame | |||
(Section 6.5). Upon receiving the 101 response, the client sends a | (Section 6.5). Upon receiving the 101 response, the client sends a | |||
connection header (Section 3.5), which includes a SETTINGS frame. | connection preface (Section 3.5), which includes a SETTINGS frame. | |||
The HTTP/1.1 request that is sent prior to upgrade is assigned stream | The HTTP/1.1 request that is sent prior to upgrade is assigned stream | |||
identifier 1 and is assigned the highest possible priority. Stream 1 | identifier 1 and is assigned default priority values (Section 5.3.5). | |||
is implicitly half closed from the client toward the server, since | Stream 1 is implicitly half closed from the client toward the server, | |||
the request is completed as an HTTP/1.1 request. After commencing | since the request is completed as an HTTP/1.1 request. After | |||
the HTTP/2 connection, stream 1 is used for the response. | commencing the HTTP/2 connection, stream 1 is used for the response. | |||
3.2.1. HTTP2-Settings Header Field | 3.2.1. HTTP2-Settings Header Field | |||
A request that upgrades from HTTP/1.1 to HTTP/2 MUST include exactly | A request that upgrades from HTTP/1.1 to HTTP/2 MUST include exactly | |||
one "HTTP2-Settings" header field. The "HTTP2-Settings" header field | one "HTTP2-Settings" header field. The "HTTP2-Settings" header field | |||
is a hop-by-hop header field that includes settings that govern the | is a hop-by-hop header field that includes parameters that govern the | |||
HTTP/2 connection, provided in anticipation of the server accepting | HTTP/2 connection, provided in anticipation of the server accepting | |||
the request to upgrade. A server MUST reject an attempt to upgrade | the request to upgrade. A server MUST reject an attempt to upgrade | |||
if this header field is not present. | if this header field is not present. | |||
HTTP2-Settings = token68 | HTTP2-Settings = token68 | |||
The content of the "HTTP2-Settings" header field is the payload of a | The content of the "HTTP2-Settings" header field is the payload of a | |||
SETTINGS frame (Section 6.5), encoded as a base64url string (that is, | SETTINGS frame (Section 6.5), encoded as a base64url string (that is, | |||
the URL- and filename-safe Base64 encoding described in Section 5 of | the URL- and filename-safe Base64 encoding described in Section 5 of | |||
[RFC4648], with any trailing '=' characters omitted). The ABNF | [RFC4648], with any trailing '=' characters omitted). The ABNF | |||
[RFC5234] production for "token68" is defined in Section 2.1 of | [RFC5234] production for "token68" is defined in Section 2.1 of | |||
[HTTP-p7]. | [HTTP-p7]. | |||
The client MUST include values for the following settings | ||||
(Section 6.5.1): | ||||
o SETTINGS_MAX_CONCURRENT_STREAMS | ||||
o SETTINGS_INITIAL_WINDOW_SIZE | ||||
As a hop-by-hop header field, the "Connection" header field MUST | As a hop-by-hop header field, the "Connection" header field MUST | |||
include a value of "HTTP2-Settings" in addition to "Upgrade" when | include a value of "HTTP2-Settings" in addition to "Upgrade" when | |||
upgrading to HTTP/2. | upgrading to HTTP/2. | |||
A server decodes and interprets these values as it would any other | A server decodes and interprets these values as it would any other | |||
SETTINGS frame. Acknowledgement of the settings (Section 6.5.3) is | SETTINGS frame. Acknowledgement of the SETTINGS parameters | |||
not necessary, since a 101 response serves as implicit | (Section 6.5.3) is not necessary, since a 101 response serves as | |||
acknowledgment. Providing these values in the Upgrade request | implicit acknowledgment. Providing these values in the Upgrade | |||
ensures that the protocol does not require default values for the | request ensures that the protocol does not require default values for | |||
above settings, and gives a client an opportunity to provide other | the above SETTINGS parameters, and gives a client an opportunity to | |||
settings prior to receiving any frames from the server. | provide other parameters prior to receiving any frames from the | |||
server. | ||||
3.3. Starting HTTP/2 for "https" URIs | 3.3. Starting HTTP/2 for "https" URIs | |||
A client that makes a request to an "https" URI without prior | A client that makes a request to an "https" URI without prior | |||
knowledge about support for HTTP/2 uses TLS [TLS12] with the | knowledge about support for HTTP/2 uses TLS [TLS12] with the | |||
application layer protocol negotiation extension [TLSALPN]. | application layer protocol negotiation extension [TLSALPN]. | |||
Once TLS negotiation is complete, both the client and the server send | Once TLS negotiation is complete, both the client and the server send | |||
a connection header (Section 3.5). | a connection preface (Section 3.5). | |||
3.4. Starting HTTP/2 with Prior Knowledge | 3.4. Starting HTTP/2 with Prior Knowledge | |||
A client can learn that a particular server supports HTTP/2 by other | A client can learn that a particular server supports HTTP/2 by other | |||
means. For example, [AltSvc] describes a mechanism for advertising | means. For example, [ALT-SVC] describes a mechanism for advertising | |||
this capability in an HTTP header field. A client MAY immediately | this capability in an HTTP header field; the ALTSVC frame | |||
send HTTP/2 frames to a server that is known to support HTTP/2, after | (Section 6.11) describes a similar mechanism in HTTP/2. | |||
the connection header (Section 3.5). A server can identify such a | ||||
connection by the use of the "PRI" method in the connection header. | A client MAY immediately send HTTP/2 frames to a server that is known | |||
This only affects the resolution of "http" URIs; servers supporting | to support HTTP/2, after the connection preface (Section 3.5). A | |||
HTTP/2 are required to support protocol negotiation in TLS [TLSALPN] | server can identify such a connection by the use of the "PRI" method | |||
for "https" URIs. | in the connection preface. This only affects the resolution of | |||
"http" URIs; servers supporting HTTP/2 are required to support | ||||
protocol negotiation in TLS [TLSALPN] for "https" URIs. | ||||
Prior support for HTTP/2 is not a strong signal that a given server | Prior support for HTTP/2 is not a strong signal that a given server | |||
will support HTTP/2 for future connections. It is possible for | will support HTTP/2 for future connections. It is possible for | |||
server configurations to change or for configurations to differ | server configurations to change; for configurations to differ between | |||
between instances in clustered server. Interception proxies (a.k.a. | instances in clustered server; or network conditions to change. | |||
"transparent" proxies) are another source of variability. | ||||
3.5. HTTP/2 Connection Header | 3.5. HTTP/2 Connection Preface | |||
Upon establishment of a TCP connection and determination that HTTP/2 | Upon establishment of a TCP connection and determination that HTTP/2 | |||
will be used by both peers, each endpoint MUST send a connection | will be used by both peers, each endpoint MUST send a connection | |||
header as a final confirmation and to establish the initial settings | preface as a final confirmation and to establish the initial SETTINGS | |||
for the HTTP/2 connection. | parameters for the HTTP/2 connection. | |||
The client connection header starts with a sequence of 24 octets, | The client connection preface starts with a sequence of 24 octets, | |||
which in hex notation are: | which in hex notation are: | |||
505249202a20485454502f322e300d0a0d0a534d0d0a0d0a | 0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a | |||
(the string "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"). This sequence is | (the string "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"). This sequence is | |||
followed by a SETTINGS frame (Section 6.5). The client sends the | followed by a SETTINGS frame (Section 6.5). The SETTINGS frame MAY | |||
client connection header immediately upon receipt of a 101 Switching | be empty. The client sends the client connection preface immediately | |||
Protocols response (indicating a successful upgrade), or as the first | upon receipt of a 101 Switching Protocols response (indicating a | |||
application data octets of a TLS connection. If starting an HTTP/2 | successful upgrade), or as the first application data octets of a TLS | |||
connection with prior knowledge of server support for the protocol, | connection. If starting an HTTP/2 connection with prior knowledge of | |||
the client connection header is sent upon connection establishment. | server support for the protocol, the client connection preface is | |||
sent upon connection establishment. | ||||
The client connection header is selected so that a large | The client connection preface is selected so that a large | |||
proportion of HTTP/1.1 or HTTP/1.0 servers and intermediaries do | proportion of HTTP/1.1 or HTTP/1.0 servers and intermediaries do | |||
not attempt to process further frames. Note that this does not | not attempt to process further frames. Note that this does not | |||
address the concerns raised in [TALKING]. | address the concerns raised in [TALKING]. | |||
The server connection header consists of just a SETTINGS frame | The server connection preface consists of a potentially empty | |||
(Section 6.5) that MUST be the first frame the server sends in the | SETTINGS frame (Section 6.5) that MUST be the first frame the server | |||
HTTP/2 connection. | sends in the HTTP/2 connection. | |||
To avoid unnecessary latency, clients are permitted to send | To avoid unnecessary latency, clients are permitted to send | |||
additional frames to the server immediately after sending the client | additional frames to the server immediately after sending the client | |||
connection header, without waiting to receive the server connection | connection preface, without waiting to receive the server connection | |||
header. It is important to note, however, that the server connection | preface. It is important to note, however, that the server | |||
header SETTINGS frame might include parameters that necessarily alter | connection preface SETTINGS frame might include parameters that | |||
how a client is expected to communicate with the server. Upon | necessarily alter how a client is expected to communicate with the | |||
receiving the SETTINGS frame, the client is expected to honor any | server. Upon receiving the SETTINGS frame, the client is expected to | |||
parameters established. | honor any parameters established. | |||
Clients and servers MUST terminate the TCP connection if either peer | Clients and servers MUST terminate the TCP connection if either peer | |||
does not begin with a valid connection header. A GOAWAY frame | does not begin with a valid connection preface. A GOAWAY frame | |||
(Section 6.8) MAY be omitted if it is clear that the peer is not | (Section 6.8) MAY be omitted if it is clear that the peer is not | |||
using HTTP/2. | using HTTP/2. | |||
4. HTTP Frames | 4. HTTP Frames | |||
Once the HTTP/2 connection is established, endpoints can begin | Once the HTTP/2 connection is established, endpoints can begin | |||
exchanging frames. | exchanging frames. | |||
4.1. Frame Format | 4.1. Frame Format | |||
skipping to change at page 13, line 16 | skipping to change at page 13, line 30 | |||
and the bits MUST remain unset (0) when sending and MUST be | and the bits MUST remain unset (0) when sending and MUST be | |||
ignored when receiving. | ignored when receiving. | |||
Length: The length of the frame payload expressed as an unsigned 14- | Length: The length of the frame payload expressed as an unsigned 14- | |||
bit integer. The 8 octets of the frame header are not included in | bit integer. The 8 octets of the frame header are not included in | |||
this value. | this value. | |||
Type: The 8-bit type of the frame. The frame type determines how | Type: The 8-bit type of the frame. The frame type determines how | |||
the remainder of the frame header and payload are interpreted. | the remainder of the frame header and payload are interpreted. | |||
Implementations MUST treat the receipt of an unknown frame type | Implementations MUST treat the receipt of an unknown frame type | |||
(any frame type not defined in this document) as a connection | (any frame types not defined in this document) as a connection | |||
error (Section 5.4.1) of type PROTOCOL_ERROR. | error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
Flags: An 8-bit field reserved for frame-type specific boolean | Flags: An 8-bit field reserved for frame-type specific boolean | |||
flags. | flags. | |||
Flags are assigned semantics specific to the indicated frame type. | Flags are assigned semantics specific to the indicated frame type. | |||
Flags that have no defined semantics for a particular frame type | Flags that have no defined semantics for a particular frame type | |||
MUST be ignored, and MUST be left unset (0) when sending. | MUST be ignored, and MUST be left unset (0) when sending. | |||
R: A reserved 1-bit field. The semantics of this bit are undefined | R: A reserved 1-bit field. The semantics of this bit are undefined | |||
skipping to change at page 13, line 40 | skipping to change at page 14, line 8 | |||
Stream Identifier: A 31-bit stream identifier (see Section 5.1.1). | Stream Identifier: A 31-bit stream identifier (see Section 5.1.1). | |||
The value 0 is reserved for frames that are associated with the | The value 0 is reserved for frames that are associated with the | |||
connection as a whole as opposed to an individual stream. | connection as a whole as opposed to an individual stream. | |||
The structure and content of the frame payload is dependent entirely | The structure and content of the frame payload is dependent entirely | |||
on the frame type. | on the frame type. | |||
4.2. Frame Size | 4.2. Frame Size | |||
The maximum size of a frame payload varies by frame type. The | The maximum size of a frame payload varies by frame type. The | |||
absolute maximum size of a frame is 2^14-1 (16,383) octets. All | absolute maximum size of a frame payload is 2^14-1 (16,383) octets, | |||
meaning that the maximum frame size is 16,391 octets. All | ||||
implementations SHOULD be capable of receiving and minimally | implementations SHOULD be capable of receiving and minimally | |||
processing frames up to this maximum size. | processing frames up to this maximum size. | |||
Certain frame types, such as PING (see Section 6.7), impose | Certain frame types, such as PING (see Section 6.7), impose | |||
additional limits on the amount of payload data allowed. Likewise, | additional limits on the amount of payload data allowed. Likewise, | |||
additional size limits can be set by specific application uses (see | additional size limits can be set by specific application uses (see | |||
Section 9). | Section 9). | |||
If a frame size exceeds any defined limit, or is too small to contain | If a frame size exceeds any defined limit, or is too small to contain | |||
mandatory frame data, the endpoint MUST send a FRAME_SIZE_ERROR | mandatory frame data, the endpoint MUST send a FRAME_SIZE_ERROR | |||
error. A frame size error in a frame that affects connection-level | error. A frame size error in a frame that could alter the state of | |||
state MUST be treated as a connection error (Section 5.4.1). | the entire connection MUST be treated as a connection error | |||
(Section 5.4.1); this includes any frame carrying a header block | ||||
(Section 4.3) (that is, HEADERS, PUSH_PROMISE, and CONTINUATION), | ||||
SETTINGS, and any WINDOW_UPDATE frame with a stream identifier of 0. | ||||
4.3. Header Compression and Decompression | 4.3. Header Compression and Decompression | |||
A header field in HTTP/2 is a name-value pair with one or more | A header field in HTTP/2 is a name-value pair with one or more | |||
associated values. They are used within HTTP request and response | associated values. They are used within HTTP request and response | |||
messages as well as server push operations (see Section 8.2). | messages as well as server push operations (see Section 8.2). | |||
Header sets are collections of zero or more header fields. When | Header sets are collections of zero or more header fields. When | |||
transmitted over a connection, a header set is serialized into a | transmitted over a connection, a header set is serialized into a | |||
header block using HTTP Header Compression [COMPRESSION]. The | header block using HTTP Header Compression [COMPRESSION]. The | |||
serialized header block is then divided into one or more octet | serialized header block is then divided into one or more octet | |||
sequences, called header block fragments, and transmitted within the | sequences, called header block fragments, and transmitted within the | |||
payload of HEADERS (Section 6.2), PUSH_PROMISE (Section 6.6) or | payload of HEADERS (Section 6.2), PUSH_PROMISE (Section 6.6) or | |||
CONTINUATION (Section 6.10) frames. | CONTINUATION (Section 6.10) frames. | |||
HTTP Header Compression does not preserve the relative ordering of | HTTP Header Compression does not preserve the relative ordering of | |||
header fields. Header fields with multiple values are encoded into a | header fields. Header fields with multiple values are encoded into a | |||
single header field using a special delimiter, see Section 8.1.3.3. | single header field using a special delimiter; see Section 8.1.3.3. | |||
The Cookie header field [COOKIE] is treated specially by the HTTP | The Cookie header field [COOKIE] is treated specially by the HTTP | |||
mapping, see Section 8.1.3.4. | mapping; see Section 8.1.3.4. | |||
A receiving endpoint reassembles the header block by concatenating | A receiving endpoint reassembles the header block by concatenating | |||
the individual fragments, then decompresses the block to reconstruct | its fragments, then decompresses the block to reconstruct the header | |||
the header set. | set. | |||
A complete header block consists of either: | A complete header block consists of either: | |||
o a single HEADERS or PUSH_PROMISE frame each respectively with the | o a single HEADERS or PUSH_PROMISE frame, with the END_HEADERS flag | |||
END_HEADERS or END_PUSH_PROMISE flag set, or | set, or | |||
o a HEADERS or PUSH_PROMISE frame with the END_HEADERS or | o a HEADERS or PUSH_PROMISE frame with the END_HEADERS flag cleared | |||
END_PUSH_PROMISE flag cleared and one or more CONTINUATION frames, | and one or more CONTINUATION frames, where the last CONTINUATION | |||
where the last CONTINUATION frame has the END_HEADERS flag set. | frame has the END_HEADERS flag set. | |||
Header blocks MUST be transmitted as a contiguous sequence of frames, | Header compression is stateful, using a single compression context | |||
with no interleaved frames of any other type, or from any other | for the entire connection. Each header block is processed as a | |||
stream. The last frame in a sequence of HEADERS or CONTINUATION | discrete unit. Header blocks MUST be transmitted as a contiguous | |||
frames MUST have the END_HEADERS flag set. The last frame in a | sequence of frames, with no interleaved frames of any other type or | |||
sequence of PUSH_PROMISE or CONTINUATION frames MUST have the | from any other stream. The last frame in a sequence of HEADERS or | |||
END_PUSH_PROMISE or END_HEADERS flag set (respectively). | CONTINUATION frames MUST have the END_HEADERS flag set. The last | |||
frame in a sequence of PUSH_PROMISE or CONTINUATION frames MUST have | ||||
the END_HEADERS flag set. | ||||
Header block fragments can only be sent as the payload of HEADERS, | Header block fragments can only be sent as the payload of HEADERS, | |||
PUSH_PROMISE or CONTINUATION frames. HEADERS, PUSH_PROMISE and | PUSH_PROMISE or CONTINUATION frames, because these frames carry data | |||
CONTINUATION frames carry data that can modify the compression | that can modify the compression context maintained by a receiver. An | |||
context maintained by a receiver. An endpoint receiving HEADERS, | endpoint receiving HEADERS, PUSH_PROMISE or CONTINUATION frames MUST | |||
PUSH_PROMISE or CONTINUATION frames MUST reassemble header blocks and | reassemble header blocks and perform decompression even if the frames | |||
perform decompression even if the frames are to be discarded. A | are to be discarded. A receiver MUST terminate the connection with a | |||
receiver MUST terminate the connection with a connection error | connection error (Section 5.4.1) of type COMPRESSION_ERROR if it does | |||
(Section 5.4.1) of type COMPRESSION_ERROR, if it does not decompress | not decompress a header block. | |||
a header block. | ||||
5. Streams and Multiplexing | 5. Streams and Multiplexing | |||
A "stream" is an independent, bi-directional sequence of HEADERS and | A "stream" is an independent, bi-directional sequence of frames | |||
DATA frames exchanged between the client and server within an HTTP/2 | exchanged between the client and server within an HTTP/2 connection. | |||
connection. Streams have several important characteristics: | Streams have several important characteristics: | |||
o A single HTTP/2 connection can contain multiple concurrently open | o A single HTTP/2 connection can contain multiple concurrently open | |||
streams, with either endpoint interleaving frames from multiple | streams, with either endpoint interleaving frames from multiple | |||
streams. | streams. | |||
o Streams can be established and used unilaterally or shared by | o Streams can be established and used unilaterally or shared by | |||
either the client or server. | either the client or server. | |||
o Streams can be closed by either endpoint. | o Streams can be closed by either endpoint. | |||
o The order in which frames are sent within a stream is significant. | o The order in which frames are sent within a stream is significant. | |||
Recipients process frames in the order they are received. | Recipients process frames in the order they are received. | |||
o Streams are identified by an integer. Stream identifiers are | o Streams are identified by an integer. Stream identifiers are | |||
assigned to streams by the initiating endpoint. | assigned to streams by the endpoint initiating the stream. | |||
5.1. Stream States | 5.1. Stream States | |||
The lifecycle of a stream is shown in Figure 1. | The lifecycle of a stream is shown in Figure 1. | |||
+--------+ | +--------+ | |||
PP | | PP | PP | | PP | |||
,--------| idle |--------. | ,--------| idle |--------. | |||
/ | | \ | / | | \ | |||
v +--------+ v | v +--------+ v | |||
skipping to change at page 16, line 31 | skipping to change at page 16, line 35 | |||
| | closed | | R | closed | | | | | closed | | R | closed | | | |||
| | (remote) | | | (local) | | | | | (remote) | | | (local) | | | |||
| +----------+ | +----------+ | | | +----------+ | +----------+ | | |||
| | v | | | | | v | | | |||
| | ES / R +--------+ ES / R | | | | | ES / R +--------+ ES / R | | | |||
| `----------->| |<-----------' | | | `----------->| |<-----------' | | |||
| R | closed | R | | | R | closed | R | | |||
`-------------------->| |<--------------------' | `-------------------->| |<--------------------' | |||
+--------+ | +--------+ | |||
H: HEADERS frame (with implied CONTINUATIONs) | ||||
PP: PUSH_PROMISE frame (with implied CONTINUATIONs) | ||||
ES: END_STREAM flag | ||||
R: RST_STREAM frame | ||||
Figure 1: Stream States | Figure 1: Stream States | |||
Both endpoints have a subjective view of the state of a stream that | Both endpoints have a subjective view of the state of a stream that | |||
could be different when frames are in transit. Endpoints do not | could be different when frames are in transit. Endpoints do not | |||
coordinate the creation of streams, they are created unilaterally by | coordinate the creation of streams; they are created unilaterally by | |||
either endpoint. The negative consequences of a mismatch in states | either endpoint. The negative consequences of a mismatch in states | |||
are limited to the "closed" state after sending RST_STREAM, where | are limited to the "closed" state after sending RST_STREAM, where | |||
frames might be received for some time after closing. | frames might be received for some time after closing. | |||
Streams have the following states: | Streams have the following states: | |||
idle: | idle: | |||
All streams start in the "idle" state. In this state, no frames | All streams start in the "idle" state. In this state, no frames | |||
have been exchanged. | have been exchanged. | |||
skipping to change at page 17, line 27 | skipping to change at page 17, line 38 | |||
stream that was initiated by the remote peer (see Section 8.2). | stream that was initiated by the remote peer (see Section 8.2). | |||
In this state, only the following transitions are possible: | In this state, only the following transitions are possible: | |||
* The endpoint can send a HEADERS frame. This causes the stream | * The endpoint can send a HEADERS frame. This causes the stream | |||
to open in a "half closed (remote)" state. | to open in a "half closed (remote)" state. | |||
* Either endpoint can send a RST_STREAM frame to cause the stream | * Either endpoint can send a RST_STREAM frame to cause the stream | |||
to become "closed". This releases the stream reservation. | to become "closed". This releases the stream reservation. | |||
An endpoint MUST NOT send frames other than than HEADERS or | An endpoint MUST NOT send frames other than HEADERS or RST_STREAM | |||
RST_STREAM in this state. | in this state. | |||
A PRIORITY frame MAY be received in this state. Receiving any | A PRIORITY frame MAY be received in this state. Receiving any | |||
frame other than RST_STREAM, or PRIORITY MUST be treated as a | frames other than RST_STREAM, or PRIORITY MUST be treated as a | |||
connection error (Section 5.4.1) of type PROTOCOL_ERROR. | connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
reserved (remote): | reserved (remote): | |||
A stream in the "reserved (remote)" state has been reserved by a | A stream in the "reserved (remote)" state has been reserved by a | |||
remote peer. | remote peer. | |||
In this state, only the following transitions are possible: | In this state, only the following transitions are possible: | |||
* Receiving a HEADERS frame causes the stream to transition to | * Receiving a HEADERS frame causes the stream to transition to | |||
"half closed (local)". | "half closed (local)". | |||
skipping to change at page 18, line 47 | skipping to change at page 19, line 11 | |||
A stream that is "half closed (remote)" is no longer being used by | A stream that is "half closed (remote)" is no longer being used by | |||
the peer to send frames. In this state, an endpoint is no longer | the peer to send frames. In this state, an endpoint is no longer | |||
obligated to maintain a receiver flow control window if it | obligated to maintain a receiver flow control window if it | |||
performs flow control. | performs flow control. | |||
If an endpoint receives additional frames for a stream that is in | If an endpoint receives additional frames for a stream that is in | |||
this state, other than CONTINUATION frames, it MUST respond with a | this state, other than CONTINUATION frames, it MUST respond with a | |||
stream error (Section 5.4.2) of type STREAM_CLOSED. | stream error (Section 5.4.2) of type STREAM_CLOSED. | |||
A stream can transition from this state to "closed" by sending a | A stream can transition from this state to "closed" by sending a | |||
frame that contains a END_STREAM flag, or when either peer sends a | frame that contains an END_STREAM flag, or when either peer sends | |||
RST_STREAM frame. | a RST_STREAM frame. | |||
closed: | closed: | |||
The "closed" state is the terminal state. | The "closed" state is the terminal state. | |||
An endpoint MUST NOT send frames on a closed stream. An endpoint | An endpoint MUST NOT send frames on a closed stream. An endpoint | |||
that receives any frame after receiving a RST_STREAM MUST treat | that receives any frame after receiving a RST_STREAM MUST treat | |||
that as a stream error (Section 5.4.2) of type STREAM_CLOSED. | that as a stream error (Section 5.4.2) of type STREAM_CLOSED. | |||
Similarly, an endpoint that receives any frame after receiving a | Similarly, an endpoint that receives any frames after receiving a | |||
DATA frame with the END_STREAM flag set, or any frame except a | DATA frame with the END_STREAM flag set, or any frames except a | |||
CONTINUATION frame after receiving a HEADERS frame with a | CONTINUATION frame after receiving a HEADERS frame with an | |||
END_STREAM flag set MUST treat that as a stream error | END_STREAM flag set MUST treat that as a stream error | |||
(Section 5.4.2) of type STREAM_CLOSED. | (Section 5.4.2) of type STREAM_CLOSED. | |||
WINDOW_UPDATE, PRIORITY, or RST_STREAM frames can be received in | WINDOW_UPDATE, PRIORITY, or RST_STREAM frames can be received in | |||
this state for a short period after a DATA or HEADERS frame | this state for a short period after a DATA or HEADERS frame | |||
containing an END_STREAM flag is sent. Until the remote peer | containing an END_STREAM flag is sent. Until the remote peer | |||
receives and processes the frame bearing the END_STREAM flag, it | receives and processes the frame bearing the END_STREAM flag, it | |||
might send frame of any of these types. Endpoints MUST ignore | might send frame of any of these types. Endpoints MUST ignore | |||
WINDOW_UPDATE, PRIORITY, or RST_STREAM frames received in this | WINDOW_UPDATE, PRIORITY, or RST_STREAM frames received in this | |||
state, though endpoints MAY choose to treat frames that arrive a | state, though endpoints MAY choose to treat frames that arrive a | |||
skipping to change at page 20, line 14 | skipping to change at page 20, line 21 | |||
5.1.1. Stream Identifiers | 5.1.1. Stream Identifiers | |||
Streams are identified with an unsigned 31-bit integer. Streams | Streams are identified with an unsigned 31-bit integer. Streams | |||
initiated by a client MUST use odd-numbered stream identifiers; those | initiated by a client MUST use odd-numbered stream identifiers; those | |||
initiated by the server MUST use even-numbered stream identifiers. A | initiated by the server MUST use even-numbered stream identifiers. A | |||
stream identifier of zero (0x0) is used for connection control | stream identifier of zero (0x0) is used for connection control | |||
messages; the stream identifier zero MUST NOT be used to establish a | messages; the stream identifier zero MUST NOT be used to establish a | |||
new stream. | new stream. | |||
A stream identifier of one (0x1) is used to respond to the HTTP/1.1 | HTTP/1.1 requests that are upgraded to HTTP/2 (see Section 3.2) are | |||
request which was specified during Upgrade (see Section 3.2). After | responded to with a stream identifier of one (0x1). After the | |||
the upgrade completes, stream 0x1 is "half closed (local)" to the | upgrade completes, stream 0x1 is "half closed (local)" to the client. | |||
client. Therefore, stream 0x1 cannot be selected as a new stream | Therefore, stream 0x1 cannot be selected as a new stream identifier | |||
identifier by a client that upgrades from HTTP/1.1. | by a client that upgrades from HTTP/1.1. | |||
The identifier of a newly established stream MUST be numerically | The identifier of a newly established stream MUST be numerically | |||
greater than all streams that the initiating endpoint has opened or | greater than all streams that the initiating endpoint has opened or | |||
reserved. This governs streams that are opened using a HEADERS frame | reserved. This governs streams that are opened using a HEADERS frame | |||
and streams that are reserved using PUSH_PROMISE. An endpoint that | and streams that are reserved using PUSH_PROMISE. An endpoint that | |||
receives an unexpected stream identifier MUST respond with a | receives an unexpected stream identifier MUST respond with a | |||
connection error (Section 5.4.1) of type PROTOCOL_ERROR. | connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
The first use of a new stream identifier implicitly closes all | The first use of a new stream identifier implicitly closes all | |||
streams in the "idle" state that might have been initiated by that | streams in the "idle" state that might have been initiated by that | |||
skipping to change at page 21, line 7 | skipping to change at page 21, line 15 | |||
can initiate, and servers specify the maximum number of concurrent | can initiate, and servers specify the maximum number of concurrent | |||
streams the client can initiate. Endpoints MUST NOT exceed the limit | streams the client can initiate. Endpoints MUST NOT exceed the limit | |||
set by their peer. | set by their peer. | |||
Streams that are in the "open" state, or either of the "half closed" | Streams that are in the "open" state, or either of the "half closed" | |||
states count toward the maximum number of streams that an endpoint is | states count toward the maximum number of streams that an endpoint is | |||
permitted to open. Streams in any of these three states count toward | permitted to open. Streams in any of these three states count toward | |||
the limit advertised in the SETTINGS_MAX_CONCURRENT_STREAMS setting | the limit advertised in the SETTINGS_MAX_CONCURRENT_STREAMS setting | |||
(see Section 6.5.2). | (see Section 6.5.2). | |||
Streams in either of the "reserved" states do not count as open, even | An endpoint that receives a HEADERS frame that causes their | |||
if a small amount of application state is retained to ensure that the | advertised concurrent stream limit to be exceeded MUST treat this as | |||
promised stream can be successfully used. | a stream error (Section 5.4.2). | |||
Streams in either of the "reserved" states do not count as open. | ||||
5.2. Flow Control | 5.2. Flow Control | |||
Using streams for multiplexing introduces contention over use of the | Using streams for multiplexing introduces contention over use of the | |||
TCP connection, resulting in blocked streams. A flow control scheme | TCP connection, resulting in blocked streams. A flow control scheme | |||
ensures that streams on the same connection do not destructively | ensures that streams on the same connection do not destructively | |||
interfere with each other. Flow control is used for both individual | interfere with each other. Flow control is used for both individual | |||
streams and for the connection as a whole. | streams and for the connection as a whole. | |||
HTTP/2 provides for flow control through use of the WINDOW_UPDATE | HTTP/2 provides for flow control through use of the WINDOW_UPDATE | |||
skipping to change at page 22, line 29 | skipping to change at page 22, line 39 | |||
5.2.2. Appropriate Use of Flow Control | 5.2.2. Appropriate Use of Flow Control | |||
Flow control is defined to protect endpoints that are operating under | Flow control is defined to protect endpoints that are operating under | |||
resource constraints. For example, a proxy needs to share memory | resource constraints. For example, a proxy needs to share memory | |||
between many connections, and also might have a slow upstream | between many connections, and also might have a slow upstream | |||
connection and a fast downstream one. Flow control addresses cases | connection and a fast downstream one. Flow control addresses cases | |||
where the receiver is unable process data on one stream, yet wants to | where the receiver is unable process data on one stream, yet wants to | |||
continue to process other streams in the same connection. | continue to process other streams in the same connection. | |||
Deployments that do not require this capability can advertise a flow | Deployments that do not require this capability can advertise a flow | |||
control of the maximum size, incrementing the available space when | control window of the maximum size, incrementing the available space | |||
new data is received. Sending data is always subject to the flow | when new data is received. Sending data is always subject to the | |||
control window advertised by the receiver. | flow control window advertised by the receiver. | |||
Deployments with constrained resources (for example, memory) MAY | Deployments with constrained resources (for example, memory) MAY | |||
employ flow control to limit the amount of memory a peer can consume. | employ flow control to limit the amount of memory a peer can consume. | |||
Note, however, that this can lead to suboptimal use of available | Note, however, that this can lead to suboptimal use of available | |||
network resources if flow control is enabled without knowledge of the | network resources if flow control is enabled without knowledge of the | |||
bandwidth-delay product (see [RFC1323]). | bandwidth-delay product (see [RFC1323]). | |||
Even with full awareness of the current bandwidth-delay product, | Even with full awareness of the current bandwidth-delay product, | |||
implementation of flow control can be difficult. When using flow | implementation of flow control can be difficult. When using flow | |||
control, the receiver MUST read from the TCP receive buffer in a | control, the receiver MUST read from the TCP receive buffer in a | |||
timely fashion. Failure to do so could lead to a deadlock when | timely fashion. Failure to do so could lead to a deadlock when | |||
critical frames, such as WINDOW_UPDATE, are not available to HTTP/2. | critical frames, such as WINDOW_UPDATE, are not available to HTTP/2. | |||
However, flow control can ensure that constrained resources are | However, flow control can ensure that constrained resources are | |||
protected without any reduction in connection utilization. | protected without any reduction in connection utilization. | |||
5.3. Stream priority | 5.3. Stream priority | |||
The endpoint establishing a new stream can assign a priority for the | A client can assign a priority for a new stream by including | |||
stream. Priority is represented as an unsigned 31-bit integer. 0 | prioritization information in the HEADERS frame (Section 6.2) that | |||
represents the highest priority and 2^31-1 represents the lowest | opens the stream. For an existing stream, the PRIORITY frame | |||
priority. | (Section 6.3) can be used to change the priority. | |||
The purpose of this value is to allow an endpoint to express the | The purpose of prioritization is to allow an endpoint to express how | |||
relative priority of a stream. An endpoint can use this information | it would prefer its peer allocate resources when managing concurrent | |||
to preferentially allocate resources to a stream. Within HTTP/2, | streams. Most importantly, priority can be used to select streams | |||
priority can be used to select streams for transmitting frames when | for transmitting frames when there is limited capacity for sending. | |||
there is limited capacity for sending. For instance, an endpoint | ||||
might enqueue frames for all concurrently active streams. As | ||||
transmission capacity becomes available, frames from higher priority | ||||
streams might be sent before lower priority streams. | ||||
Explicitly setting the priority for a stream does not guarantee any | Each stream is prioritized into a group. Each group is identified | |||
particular processing or transmission order for the stream relative | using an identifier that is selected by the client. Each group is | |||
to any other stream. Nor is there any mechanism provided by which | assigned a relative weight, a number that is used to determine the | |||
the initiator of a stream can force or require a receiving endpoint | relative proportion of available resources that are assigned to that | |||
to process concurrent streams in a particular order. | group. | |||
Unless explicitly specified in the HEADERS frame (Section 6.2) during | Within a priority group, streams can also be marked as being | |||
stream creation, the default stream priority is 2^30. | dependent on the completion of other streams. | |||
Pushed streams (Section 8.2) have a lower priority than their | Explicitly setting the priority for a stream is input to a | |||
associated stream. The promised stream inherits the priority value | prioritization process. It does not guarantee any particular | |||
of the associated stream plus one, up to a maximum of 2^31-1. | processing or transmission order for the stream relative to any other | |||
stream. An endpoint cannot force a peer to process concurrent | ||||
streams in a particular order using priority. Expressing priority is | ||||
therefore only ever a suggestion. | ||||
Prioritization information can be specified explicitly for streams as | ||||
they are created using the HEADERS frame, or changed using the | ||||
PRIORITY frame. Providing prioritization information is optional, so | ||||
default values are used if no explicit indicator is provided | ||||
(Section 5.3.5). | ||||
Explicit prioritization information can be provided for a stream to | ||||
either allocate the stream to a priority group (Section 5.3.1), or to | ||||
create a dependency on another stream (Section 5.3.2). | ||||
5.3.1. Priority Groups and Weighting | ||||
All streams are assigned a priority group. Each priority group is | ||||
allocated a 31-bit identifier and an integer weight between 1 to 256 | ||||
(inclusive). | ||||
Specifying a priority group and weight for a stream causes the stream | ||||
to be assigned to the identified priority group and for the weight | ||||
for the group to be changed to the new value. | ||||
Resources are divided proportionally between priority groups based on | ||||
their weight. For example, a priority group with weight 4 ideally | ||||
receives one third of the resources allocated to a stream with weight | ||||
12. | ||||
5.3.2. Stream Dependencies | ||||
Each stream can be given an explicit dependency on another stream. | ||||
Including a dependency expresses a preference to allocate resources | ||||
to the identified stream rather than to the dependent stream. | ||||
A stream that is dependent on another stream becomes part of the | ||||
priority group of the stream it depends on. It belongs to the same | ||||
dependency tree as the stream it depends on. | ||||
A stream that is assigned directly to a priority group is not | ||||
dependent on any other stream. It is the root of a dependency tree | ||||
inside its priority group. | ||||
When assigning a dependency on another stream, by default, the stream | ||||
is added as a new dependency of the stream it depends on. For | ||||
example, if streams B and C are dependent on stream A, and if stream | ||||
D is created with a dependency on stream A, this results in a | ||||
dependency order of A followed by B, C, and D. | ||||
A A | ||||
/ \ ==> /|\ | ||||
B C B D C | ||||
Example of Default Dependency Creation | ||||
An exclusive flag allows for the insertion of a new level of | ||||
dependencies. The exclusive flag causes the stream to become the | ||||
sole dependency of the stream it depends on, causing other | ||||
dependencies to become dependencies of the stream. In the previous | ||||
example, if stream D is created with an exclusive dependency on | ||||
stream A, this results in a dependency order of A followed by D | ||||
followed by B and C. | ||||
A | ||||
A | | ||||
/ \ ==> D | ||||
B C / \ | ||||
B C | ||||
Example of Exclusive Dependency Creation | ||||
Streams are ordered into several dependency trees within their | ||||
priority group. Each dependency tree within a priority group SHOULD | ||||
be allocated the same amount of resources. | ||||
Inside a dependency tree, a dependent stream SHOULD only be allocated | ||||
resources if the streams that it depends on are either closed, or it | ||||
is not possible to make progress on them. | ||||
Streams with the same dependencies SHOULD be allocated the same | ||||
amount of resources. Thus, if streams B and C depend on stream A, | ||||
and if no progress can be made on A, streams B and C are given an | ||||
equal share of resources. | ||||
A stream MUST NOT depend on itself. An endpoint MAY either treat | ||||
this as a stream error (Section 5.4.2) of type PROTOCOL_ERROR, or | ||||
assign default priority values (Section 5.3.5) to the stream. | ||||
5.3.3. Reprioritization | ||||
Stream priorities are changed using the PRIORITY frame. Setting a | ||||
priority group and weight causes a stream to become part of the | ||||
identified group, and not dependent on any other stream. Setting a | ||||
dependency causes a stream to become dependent on the identified | ||||
stream, which can cause the reprioritized stream to move to a new | ||||
priority group. | ||||
All streams that are dependent on a reprioritized stream move with | ||||
it. Setting a dependency with the exclusive flag for a reprioritized | ||||
stream moves all the dependencies of the stream it depends on to | ||||
become dependencies of the reprioritized stream. | ||||
5.3.4. Prioritization State Management | ||||
When a stream is closed, its dependencies can be moved to become | ||||
dependent on the stream the closed stream depends on, if any, or to | ||||
become new dependency tree roots otherwise. | ||||
It is possible for a stream to become closed while prioritization | ||||
information that creates a dependency on that stream is in transit. | ||||
If a stream identified in a dependency has been closed and any | ||||
associated priority information destroyed then the dependent stream | ||||
is instead assigned a default priority. This potentially creates | ||||
suboptimal prioritization, since the stream can be given an effective | ||||
priority that is higher than expressed by a peer. | ||||
To avoid this problem, endpoints SHOULD maintain prioritization state | ||||
for closed streams for a period after streams close. This could | ||||
create an large state burden for an endpoint, so this state MAY be | ||||
limited. The amount of additional state an endpoint maintains could | ||||
be dependent on load; under high load, prioritization state can be | ||||
discarded to limit resource commitments. In extreme cases, an | ||||
endpoint could even discard prioritization state for active or | ||||
reserved streams. | ||||
An endpoint SHOULD retain stream prioritization state for at least | ||||
one round trip, though maintaining state over longer periods reduces | ||||
the chance that default values have to be assigned to streams. An | ||||
endpoint MAY apply a fixed upper limit on the number of closed | ||||
streams for which prioritization state is tracked to limit state | ||||
exposure. If a fixed limit is applied, endpoints SHOULD maintain | ||||
state for at least as many streams as allowed by their setting for | ||||
SETTINGS_MAX_CONCURRENT_STREAMS. | ||||
An endpoint receiving a PRIORITY frame that changes the priority of a | ||||
closed stream SHOULD alter the weight of the priority group, or the | ||||
dependencies of the streams that depend on it, if it has retained | ||||
enough state to do so. | ||||
Priority group information is part of the priority state of a stream. | ||||
Priority groups that contain only closed streams can be assigned a | ||||
weight of zero. | ||||
The number of priority groups cannot exceed the number of non-closed | ||||
streams. This includes streams in the "reserved" state. Priority | ||||
state size for peer-initiated streams is limited by the value of | ||||
SETTINGS_MAX_CONCURRENT_STREAMS. Reserved streams do not count | ||||
toward the concurrent stream limit of either peer, but only the | ||||
endpoint that creates the reservation needs to maintain priority | ||||
information. Thus, the total amount of priority state for non-closed | ||||
streams can be limited by an endpoint. | ||||
5.3.5. Default Priorities | ||||
Providing priority information is optional. Streams are assigned to | ||||
a priority group with an identifier equal to the stream identifier | ||||
and a weight of 16. | ||||
Pushed streams (Section 8.2) initially depend on their associated | ||||
stream. | ||||
5.4. Error Handling | 5.4. Error Handling | |||
HTTP/2 framing permits two classes of error: | HTTP/2 framing permits two classes of error: | |||
o An error condition that renders the entire connection unusable is | o An error condition that renders the entire connection unusable is | |||
a connection error. | a connection error. | |||
o An error in an individual stream is a stream error. | o An error in an individual stream is a stream error. | |||
A list of error codes is included in Section 7. | A list of error codes is included in Section 7. | |||
5.4.1. Connection Error Handling | 5.4.1. Connection Error Handling | |||
A connection error is any error which prevents further processing of | A connection error is any error which prevents further processing of | |||
the framing layer or which corrupts any connection state. | the framing layer, or which corrupts any connection state. | |||
An endpoint that encounters a connection error SHOULD first send a | An endpoint that encounters a connection error SHOULD first send a | |||
GOAWAY frame (Section 6.8) with the stream identifier of the last | GOAWAY frame (Section 6.8) with the stream identifier of the last | |||
stream that it successfully received from its peer. The GOAWAY frame | stream that it successfully received from its peer. The GOAWAY frame | |||
includes an error code that indicates why the connection is | includes an error code that indicates why the connection is | |||
terminating. After sending the GOAWAY frame, the endpoint MUST close | terminating. After sending the GOAWAY frame, the endpoint MUST close | |||
the TCP connection. | the TCP connection. | |||
It is possible that the GOAWAY will not be reliably received by the | It is possible that the GOAWAY will not be reliably received by the | |||
receiving endpoint. In the event of a connection error, GOAWAY only | receiving endpoint. In the event of a connection error, GOAWAY only | |||
skipping to change at page 24, line 40 | skipping to change at page 28, line 14 | |||
frames if it receives frames on a closed stream after more than a | frames if it receives frames on a closed stream after more than a | |||
round-trip time. This behavior is permitted to deal with misbehaving | round-trip time. This behavior is permitted to deal with misbehaving | |||
implementations. | implementations. | |||
An endpoint MUST NOT send a RST_STREAM in response to an RST_STREAM | An endpoint MUST NOT send a RST_STREAM in response to an RST_STREAM | |||
frame, to avoid looping. | frame, to avoid looping. | |||
5.4.3. Connection Termination | 5.4.3. Connection Termination | |||
If the TCP connection is torn down while streams remain in open or | If the TCP connection is torn down while streams remain in open or | |||
half closed states, then the endpoint MUST assume that the stream was | half closed states, then the endpoint MUST assume that those streams | |||
abnormally interrupted and could be incomplete. | were abnormally interrupted and could be incomplete. | |||
6. Frame Definitions | 6. Frame Definitions | |||
This specification defines a number of frame types, each identified | This specification defines a number of frame types, each identified | |||
by a unique 8-bit type code. Each frame type serves a distinct | by a unique 8-bit type code. Each frame type serves a distinct | |||
purpose either in the establishment and management of the connection | purpose either in the establishment and management of the connection | |||
as a whole, or of individual streams. | as a whole, or of individual streams. | |||
The transmission of specific frame types can alter the state of a | The transmission of specific frame types can alter the state of a | |||
connection. If endpoints fail to maintain a synchronized view of the | connection. If endpoints fail to maintain a synchronized view of the | |||
connection state, successful communication within the connection will | connection state, successful communication within the connection will | |||
no longer be possible. Therefore, it is important that endpoints | no longer be possible. Therefore, it is important that endpoints | |||
have a shared comprehension of how the state is affected by the use | have a shared comprehension of how the state is affected by the use | |||
any given frame. Accordingly, while it is expected that new frame | any given frame. | |||
types will be introduced by extensions to this protocol, only frames | ||||
defined by this document are permitted to alter the connection state. | ||||
6.1. DATA | 6.1. DATA | |||
DATA frames (type=0x0) convey arbitrary, variable-length sequences of | DATA frames (type=0x0) convey arbitrary, variable-length sequences of | |||
octets associated with a stream. One or more DATA frames are used, | octets associated with a stream. One or more DATA frames are used, | |||
for instance, to carry HTTP request or response payloads. | for instance, to carry HTTP request or response payloads. | |||
DATA frames MAY also contain arbitrary padding. Padding can be added | DATA frames MAY also contain arbitrary padding. Padding can be added | |||
to DATA frames to hide the size of messages. | to DATA frames to hide the size of messages. | |||
0 1 2 3 | 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 | 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 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| [Pad High(8)] | [Pad Low (8)] | Data (*) . | | Pad High? (8) | Pad Low? (8) | | |||
+---------------+---------------+-------------------------------+ | +---------------+---------------+-------------------------------+ | |||
. Data (*) ... | | Data (*) ... | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| Padding (*) ... | | Padding (*) ... | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
DATA Frame Payload | DATA Frame Payload | |||
The DATA frame contains the following fields: | The DATA frame contains the following fields: | |||
Pad High: An 8-bit field containing an amount of padding in units of | Pad High: An 8-bit field containing an amount of padding in units of | |||
256 octets. This field is optional and is only present if the | 256 octets. This field is optional and is only present if the | |||
skipping to change at page 26, line 17 | skipping to change at page 29, line 37 | |||
END_STREAM (0x1): Bit 1 being set indicates that this frame is the | END_STREAM (0x1): Bit 1 being set indicates that this frame is the | |||
last that the endpoint will send for the identified stream. | last that the endpoint will send for the identified stream. | |||
Setting this flag causes the stream to enter one of the "half | Setting this flag causes the stream to enter one of the "half | |||
closed" states or the "closed" state (Section 5.1). | closed" states or the "closed" state (Section 5.1). | |||
END_SEGMENT (0x2): Bit 2 being set indicates that this frame is the | END_SEGMENT (0x2): Bit 2 being set indicates that this frame is the | |||
last for the current segment. Intermediaries MUST NOT coalesce | last for the current segment. Intermediaries MUST NOT coalesce | |||
frames across a segment boundary and MUST preserve segment | frames across a segment boundary and MUST preserve segment | |||
boundaries when forwarding frames. | boundaries when forwarding frames. | |||
PAD_LOW (0x10): Bit 5 being set indicates that the Pad Low field is | PAD_LOW (0x08): Bit 4 being set indicates that the Pad Low field is | |||
present. | present. | |||
PAD_HIGH (0x20): Bit 6 being set indicates that the Pad High field | PAD_HIGH (0x10): Bit 5 being set indicates that the Pad High field | |||
is present. This bit MUST NOT be set unless the PAD_LOW flag is | is present. This bit MUST NOT be set unless the PAD_LOW flag is | |||
also set. Endpoints that receive a frame with PAD_HIGH set and | also set. Endpoints that receive a frame with PAD_HIGH set and | |||
PAD_LOW cleared MUST treat this as a connection error | PAD_LOW cleared MUST treat this as a connection error | |||
(Section 5.4.1) of type PROTOCOL_ERROR. | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
DATA frames MUST be associated with a stream. If a DATA frame is | DATA frames MUST be associated with a stream. If a DATA frame is | |||
received whose stream identifier field is 0x0, the recipient MUST | received whose stream identifier field is 0x0, the recipient MUST | |||
respond with a connection error (Section 5.4.1) of type | respond with a connection error (Section 5.4.1) of type | |||
PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
DATA frames are subject to flow control and can only be sent when a | DATA frames are subject to flow control and can only be sent when a | |||
stream is in the "open" or "half closed (remote)" states. Padding is | stream is in the "open" or "half closed (remote)" states. Padding is | |||
not excluded from flow control. If a DATA frame is received whose | included in flow control. If a DATA frame is received whose stream | |||
stream is not in "open" or "half closed (local)" state, the recipient | is not in "open" or "half closed (local)" state, the recipient MUST | |||
MUST respond with a stream error (Section 5.4.2) of type | respond with a stream error (Section 5.4.2) of type STREAM_CLOSED. | |||
STREAM_CLOSED. | ||||
The total number of padding octets is determined by multiplying the | The total number of padding octets is determined by multiplying the | |||
value of the Pad High field by 256 and adding the value of the Pad | value of the Pad High field by 256 and adding the value of the Pad | |||
Low field. Both Pad High and Pad Low fields assume a value of zero | Low field. Both Pad High and Pad Low fields assume a value of zero | |||
if absent. If the length of the padding is greater than the length | if absent. If the length of the padding is greater than the length | |||
of the remainder of the frame payload, the recipient MUST treat this | of the remainder of the frame payload, the recipient MUST treat this | |||
as a connection error (Section 5.4.1) of type PROTOCOL_ERROR. | as a connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
Note: A frame can be increased in size by one octet by including a | Note: A frame can be increased in size by one octet by including a | |||
Pad Low field with a value of zero. | Pad Low field with a value of zero. | |||
Use of padding is a security feature; as such, its use demands some | Use of padding is a security feature; as such, its use demands some | |||
care, see Section 10.6. | care, see Section 10.7. | |||
6.2. HEADERS | 6.2. HEADERS | |||
The HEADERS frame (type=0x1) carries name-value pairs. It is used to | The HEADERS frame (type=0x1) carries name-value pairs. It is used to | |||
open a stream (Section 5.1). HEADERS frames can be sent on a stream | open a stream (Section 5.1). HEADERS frames can be sent on a stream | |||
in the "open" or "half closed (remote)" states. | in the "open" or "half closed (remote)" states. | |||
0 1 2 3 | 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 | 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 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| [Pad High(8)] | [Pad Low (8)] |X| [Priority (31)] ... | | Pad High? (8) | Pad Low? (8) | | |||
+---------------+---------------+-+-----------------------------+ | +-+-------------+---------------+-------------------------------+ | |||
...[Priority] | Header Block Fragment (*) ... | |R| Priority Group Identifier? (31) | | |||
+-------------------------------+-------------------------------+ | +-+-------------+-----------------------------------------------+ | |||
| Weight? (8) | | ||||
+-+-------------+-----------------------------------------------+ | ||||
|E| Stream Dependency? (31) | | ||||
+-+-------------------------------------------------------------+ | ||||
| Header Block Fragment (*) ... | | Header Block Fragment (*) ... | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| Padding (*) ... | | Padding (*) ... | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
HEADERS Frame Payload | HEADERS Frame Payload | |||
The HEADERS frame payload has the following fields: | The HEADERS frame payload has the following fields: | |||
Pad High: Padding size high bits. This field is only present if the | Pad High: Padding size high bits. This field is only present if the | |||
PAD_HIGH flag is set. | PAD_HIGH flag is set. | |||
Pad Low: Padding size low bits. This field is only present if the | Pad Low: Padding size low bits. This field is only present if the | |||
PAD_LOW flag is set. | PAD_LOW flag is set. | |||
X: A single reserved bit. This field is optional and is only present | R: A single reserved bit. This field is optional and is only present | |||
if the PRIORITY flag is set. | if the PRIORITY_GROUP flag is set. | |||
Priority: Prioritization information for the stream, see | Priority Group Identifier: A 31-bit identifier for a priority group, | |||
see Section 5.3. This field is optional and is only present if | ||||
the PRIORITY_GROUP flag is set. | ||||
Weight: An 8-bit weight for the identified priority group, see | ||||
Section 5.3. This field is optional and is only present if the | Section 5.3. This field is optional and is only present if the | |||
PRIORITY flag is set. | PRIORITY_GROUP flag is set. | |||
E: A single bit flag indicates that the stream dependency is | ||||
exclusive, see Section 5.3. This field is optional and is only | ||||
present if the PRIORITY_DEPENDENCY flag is set. | ||||
Stream Dependency: A 31-bit stream identifier for the stream that | ||||
this stream depends on, see Section 5.3. This field is optional | ||||
and is only present if the PRIORITY_DEPENDENCY flag is set. | ||||
Header Block Fragment: A header block fragment (Section 4.3). | Header Block Fragment: A header block fragment (Section 4.3). | |||
Padding: Padding octets. | Padding: Padding octets. | |||
The HEADERS frame defines the following flags: | The HEADERS frame defines the following flags: | |||
END_STREAM (0x1): Bit 1 being set indicates that the header block | END_STREAM (0x1): Bit 1 being set indicates that the header block | |||
(Section 4.3) is the last that the endpoint will send for the | (Section 4.3) is the last that the endpoint will send for the | |||
identified stream. Setting this flag causes the stream to enter | identified stream. Setting this flag causes the stream to enter | |||
skipping to change at page 28, line 21 | skipping to change at page 32, line 8 | |||
END_HEADERS (0x4): Bit 3 being set indicates that this frame | END_HEADERS (0x4): Bit 3 being set indicates that this frame | |||
contains an entire header block (Section 4.3) and is not followed | contains an entire header block (Section 4.3) and is not followed | |||
by any CONTINUATION frames. | by any CONTINUATION frames. | |||
A HEADERS frame without the END_HEADERS flag set MUST be followed | A HEADERS frame without the END_HEADERS flag set MUST be followed | |||
by a CONTINUATION frame for the same stream. A receiver MUST | by a CONTINUATION frame for the same stream. A receiver MUST | |||
treat the receipt of any other type of frame or a frame on a | treat the receipt of any other type of frame or a frame on a | |||
different stream as a connection error (Section 5.4.1) of type | different stream as a connection error (Section 5.4.1) of type | |||
PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
PRIORITY (0x8): Bit 4 being set indicates that the first four octets | PAD_LOW (0x8): Bit 4 being set indicates that the Pad Low field is | |||
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. | ||||
PAD_LOW (0x10): Bit 5 being set indicates that the Pad Low field is | ||||
present. | present. | |||
PAD_HIGH (0x20): Bit 6 being set indicates that the Pad High field | PAD_HIGH (0x10): Bit 5 being set indicates that the Pad High field | |||
is present. This bit MUST NOT be set unless the PAD_LOW flag is | is present. This bit MUST NOT be set unless the PAD_LOW flag is | |||
also set. Endpoints that receive a frame with PAD_HIGH set and | also set. Endpoints that receive a frame with PAD_HIGH set and | |||
PAD_LOW cleared MUST treat this as a connection error | PAD_LOW cleared MUST treat this as a connection error | |||
(Section 5.4.1) of type PROTOCOL_ERROR. | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
PRIORITY_GROUP (0x20): Bit 6 being set indicates that the Priority | ||||
Group Identifier and Weight fields are present; see Section 5.3. | ||||
PRIORITY_DEPENDENCY (0x40): Bit 7 being set indicates that the | ||||
Exclusive Flag (E) and Stream Dependency fields are present; see | ||||
Section 5.3. | ||||
The payload of a HEADERS frame contains a header block fragment | The payload of a HEADERS frame contains a header block fragment | |||
(Section 4.3). A header block that does not fit within a HEADERS | (Section 4.3). A header block that does not fit within a HEADERS | |||
frame is continued in a CONTINUATION frame (Section 6.10). | frame is continued in a CONTINUATION frame (Section 6.10). | |||
HEADERS frames MUST be associated with a stream. If a HEADERS frame | HEADERS frames MUST be associated with a stream. If a HEADERS frame | |||
is received whose stream identifier field is 0x0, the recipient MUST | is received whose stream identifier field is 0x0, the recipient MUST | |||
respond with a connection error (Section 5.4.1) of type | respond with a connection error (Section 5.4.1) of type | |||
PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
A HEADERS frame MUST NOT have both the PRIORITY_GROUP and | ||||
PRIORITY_DEPENDENCY flags set. Receipt of a HEADERS frame with both | ||||
these flags set MUST be treated as a stream error (Section 5.4.2) of | ||||
type PROTOCOL_ERROR. | ||||
The HEADERS frame changes the connection state as described in | The HEADERS frame changes the connection state as described in | |||
Section 4.3. | Section 4.3. | |||
The HEADERS frame includes optional padding. Padding fields and | The HEADERS frame includes optional padding. Padding fields and | |||
flags are identical to those defined for DATA frames (Section 6.1). | flags are identical to those defined for DATA frames (Section 6.1). | |||
6.3. PRIORITY | 6.3. PRIORITY | |||
The PRIORITY frame (type=0x2) specifies the sender-advised priority | The PRIORITY frame (type=0x2) specifies the sender-advised priority | |||
of a stream. It can be sent at any time for an existing stream. | of a stream (Section 5.3). It can be sent at any time for an | |||
This enables reprioritisation of existing streams. | existing stream. This enables reprioritisation of existing streams. | |||
0 1 2 3 | 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 | 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 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
|X| Priority (31) | | |R| Priority Group Identifier? (31) | | |||
+-+-------------+-----------------------------------------------+ | ||||
| Weight? (8) | | ||||
+-+-------------+-----------------------------------------------+ | ||||
|E| Stream Dependency? (31) | | ||||
+-+-------------------------------------------------------------+ | +-+-------------------------------------------------------------+ | |||
PRIORITY Frame Payload | PRIORITY Frame Payload | |||
The payload of a PRIORITY frame contains a single reserved bit and a | The payload of a PRIORITY frame contains the following fields: | |||
31-bit priority. | ||||
The PRIORITY frame does not define any flags. | R: A single reserved bit. This field is optional and is only present | |||
if the PRIORITY_GROUP flag is set. | ||||
Priority Group Identifier: A 31-bit identifier for a priority group, | ||||
see Section 5.3. This field is optional and is only present if | ||||
the PRIORITY_GROUP flag is set. | ||||
Weight: An 8-bit weight for the identified priority group, see | ||||
Section 5.3. This field is optional and is only present if the | ||||
PRIORITY_GROUP flag is set. | ||||
E: A single bit flag indicates that the stream dependency is | ||||
exclusive, see Section 5.3. This field is optional and is only | ||||
present if the PRIORITY_DEPENDENCY flag is set. | ||||
Stream Dependency: A 31-bit stream identifier for the stream that | ||||
this stream depends on, see Section 5.3. This field is optional | ||||
and is only present if the PRIORITY_DEPENDENCY flag is set. | ||||
The PRIORITY frame defines the following flags: | ||||
PRIORITY_GROUP (0x20): Bit 6 being set indicates that the Priority | ||||
Group Identifier and Weight fields are present; see Section 5.3. | ||||
PRIORITY_DEPENDENCY (0x40): Bit 7 being set indicates that the | ||||
Exclusive Flag (E) and Stream Dependency fields are present; see | ||||
Section 5.3. | ||||
A PRIORITY frame MUST have exactly one of the PRIORITY_GROUP and | ||||
PRIORITY_DEPENDENCY flags set. Receipt of a PRIORITY frame with | ||||
either none or both these flags set MUST be treated as a stream error | ||||
(Section 5.4.2) of type PROTOCOL_ERROR. | ||||
The PRIORITY frame is associated with an existing stream. If a | The PRIORITY frame is associated with an existing stream. If a | |||
PRIORITY frame is received with a stream identifier of 0x0, the | PRIORITY frame is received with a stream identifier of 0x0, the | |||
recipient MUST respond with a connection error (Section 5.4.1) of | recipient MUST respond with a connection error (Section 5.4.1) of | |||
type PROTOCOL_ERROR. | type PROTOCOL_ERROR. | |||
The PRIORITY frame can be sent on a stream in any of the "reserved | The PRIORITY frame can be sent on a stream in any of the "reserved | |||
(remote)", "open", "half-closed (local)", or "half closed (remote)" | (remote)", "open", "half-closed (local)", or "half closed (remote)" | |||
states, though it cannot be sent between consecutive frames that | states, though it cannot be sent between consecutive frames that | |||
comprise a single header block (Section 4.3). Note that this frame | comprise a single header block (Section 4.3). Note that this frame | |||
skipping to change at page 30, line 32 | skipping to change at page 35, line 12 | |||
treat this as a connection error (Section 5.4.1) of type | treat this as a connection error (Section 5.4.1) of type | |||
PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
RST_STREAM frames MUST NOT be sent for a stream in the "idle" state. | RST_STREAM frames MUST NOT be sent for a stream in the "idle" state. | |||
If a RST_STREAM frame identifying an idle stream is received, the | If a RST_STREAM frame identifying an idle stream is received, the | |||
recipient MUST treat this as a connection error (Section 5.4.1) of | recipient MUST treat this as a connection error (Section 5.4.1) of | |||
type PROTOCOL_ERROR. | type PROTOCOL_ERROR. | |||
6.5. SETTINGS | 6.5. SETTINGS | |||
The SETTINGS frame (type=0x4) conveys configuration parameters that | The SETTINGS frame (type=0x4) conveys configuration parameters (such | |||
affect how endpoints communicate. The parameters are either | as preferences and constraints on peer behavior) that affect how | |||
constraints on peer behavior or preferences. | endpoints communicate, and is also used to acknowledge the receipt of | |||
those parameters. Individually, a SETTINGS parameter can also be | ||||
referred to as a "setting". | ||||
Settings are not negotiated. Settings describe characteristics of | SETTINGS parameters are not negotiated; they describe characteristics | |||
the sending peer, which are used by the receiving peer. Different | of the sending peer, which are used by the receiving peer. Different | |||
values for the same setting can be advertised by each peer. For | values for the same parameter can be advertised by each peer. For | |||
example, a client might set a high initial flow control window, | example, a client might set a high initial flow control window, | |||
whereas a server might set a lower value to conserve resources. | whereas a server might set a lower value to conserve resources. | |||
SETTINGS frames MUST be sent at the start of a connection, and MAY be | A SETTINGS frame MUST be sent by both endpoints at the start of a | |||
sent at any other time by either endpoint over the lifetime of the | connection, and MAY be sent at any other time by either endpoint over | |||
connection. | the lifetime of the connection. Implementations MUST support all of | |||
the parameters defined by this specification. | ||||
Implementations MUST support all of the settings defined by this | ||||
specification and MAY support additional settings defined by | ||||
extensions to this protocol. Unsupported or unrecognized settings | ||||
MUST be ignored. New settings MUST NOT be defined or implemented in | ||||
a way that requires endpoints to understand them in order to | ||||
communicate successfully. | ||||
Each setting in a SETTINGS frame replaces the existing value for that | Each parameter in a SETTINGS frame replaces any existing value for | |||
setting. Settings are processed in the order in which they appear, | that parameter. Parameters are processed in the order in which they | |||
and a receiver of a SETTINGS frame does not need to maintain any | appear, and a receiver of a SETTINGS frame does not need to maintain | |||
state other than the current value of settings. Therefore, the value | any state other than the current value of its parameters. Therefore, | |||
of a setting is the last value that is seen by a receiver. This | the value of a SETTINGS parameter is the last value that is seen by a | |||
permits the inclusion of the same settings multiple times in the same | receiver. | |||
SETTINGS frame, though doing so does nothing other than waste | ||||
connection capacity. | ||||
The SETTINGS frame defines the following flag: | SETTINGS parameters are acknowledged by the receiving peer. To | |||
enable this, the SETTINGS frame defines the following flag: | ||||
ACK (0x1): Bit 1 being set indicates that this frame acknowledges | ACK (0x1): Bit 1 being set indicates that this frame acknowledges | |||
receipt and application of the peer's SETTINGS frame. When this | receipt and application of the peer's SETTINGS frame. When this | |||
bit is set, the payload of the SETTINGS frame MUST be empty. | bit is set, the payload of the SETTINGS frame MUST be empty. | |||
Receipt of a SETTINGS frame with the ACK flag set and a length | Receipt of a SETTINGS frame with the ACK flag set and a length | |||
field value other than 0 MUST be treated as a connection error | field value other than 0 MUST be treated as a connection error | |||
(Section 5.4.1) of type FRAME_SIZE_ERROR. For more info, see | (Section 5.4.1) of type FRAME_SIZE_ERROR. For more info, see | |||
Settings Synchronization (Section 6.5.3). | Settings Synchronization (Section 6.5.3). | |||
SETTINGS frames always apply to a connection, never a single stream. | SETTINGS frames always apply to a connection, never a single stream. | |||
The stream identifier for a settings frame MUST be zero. If an | The stream identifier for a SETTINGS frame MUST be zero. If an | |||
endpoint receives a SETTINGS frame whose stream identifier field is | endpoint receives a SETTINGS frame whose stream identifier field is | |||
anything other than 0x0, the endpoint MUST respond with a connection | anything other than 0x0, the endpoint MUST respond with a connection | |||
error (Section 5.4.1) of type PROTOCOL_ERROR. | error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
The SETTINGS frame affects connection state. A badly formed or | The SETTINGS frame affects connection state. A badly formed or | |||
incomplete SETTINGS frame MUST be treated as a connection error | incomplete SETTINGS frame MUST be treated as a connection error | |||
(Section 5.4.1) of type PROTOCOL_ERROR. | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
6.5.1. Setting Format | 6.5.1. SETTINGS Format | |||
The payload of a SETTINGS frame consists of zero or more settings. | The payload of a SETTINGS frame consists of zero or more parameters, | |||
Each setting consists of an unsigned 8-bit setting identifier, and an | each consisting of an unsigned 8-bit identifier and an unsigned 32- | |||
unsigned 32-bit value. | bit value. | |||
0 1 2 3 | 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 | 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 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
|Identifier (8) | Value (32) ... | | Identifier (8)| | |||
+---------------+-----------------------------------------------+ | +---------------+-----------------------------------------------+ | |||
...Value | | | Value (32) | | |||
+---------------+ | +---------------------------------------------------------------+ | |||
Setting Format | Setting Format | |||
6.5.2. Defined Settings | 6.5.2. Defined SETTINGS Parameters | |||
The following settings are defined: | The following parameters are defined: | |||
SETTINGS_HEADER_TABLE_SIZE (1): Allows the sender to inform the | SETTINGS_HEADER_TABLE_SIZE (1): Allows the sender to inform the | |||
remote endpoint of the size of the header compression table used | remote endpoint of the size of the header compression table used | |||
to decode header blocks. The encoder can reduce this size by | to decode header blocks. The encoder can reduce this size by | |||
using signalling specific to the header compression format inside | using signaling specific to the header compression format inside a | |||
a header block. The initial value is 4,096 bytes. | header block. The initial value is 4,096 bytes. | |||
SETTINGS_ENABLE_PUSH (2): This setting can be use to disable server | SETTINGS_ENABLE_PUSH (2): This setting can be use to disable server | |||
push (Section 8.2). An endpoint MUST NOT send a PUSH_PROMISE | push (Section 8.2). An endpoint MUST NOT send a PUSH_PROMISE | |||
frame if it receives this setting set to a value of 0. An | frame if it receives this parameter set to a value of 0. An | |||
endpoint that has set this setting to 0 and had it acknowledged | endpoint that has both set this parameter to 0 and had it | |||
MUST treat the receipt of a PUSH_PROMISE frame as a connection | acknowledged MUST treat the receipt of a PUSH_PROMISE frame as a | |||
error (Section 5.4.1) of type PROTOCOL_ERROR. | connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
The initial value is 1, which indicates that push is permitted. | The initial value is 1, which indicates that push is permitted. | |||
Any value other than 0 or 1 MUST be treated as a connection error | Any value other than 0 or 1 MUST be treated as a connection error | |||
(Section 5.4.1) of type PROTOCOL_ERROR. | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
SETTINGS_MAX_CONCURRENT_STREAMS (3): Indicates the maximum number of | SETTINGS_MAX_CONCURRENT_STREAMS (3): Indicates the maximum number of | |||
concurrent streams that the sender will allow. This limit is | concurrent streams that the sender will allow. This limit is | |||
directional: it applies to the number of streams that the sender | directional: it applies to the number of streams that the sender | |||
permits the receiver to create. Initially there is no limit to | permits the receiver to create. Initially there is no limit to | |||
this value. It is recommended that this value be no smaller than | this value. It is recommended that this value be no smaller than | |||
100, so as to not unnecessarily limit parallelism. | 100, so as to not unnecessarily limit parallelism. | |||
A value of 0 for SETTINGS_MAX_CONCURRENT_STREAMS SHOULD NOT be | A value of 0 for SETTINGS_MAX_CONCURRENT_STREAMS SHOULD NOT be | |||
treated as special by endpoints. A zero value does prevent the | treated as special by endpoints. A zero value does prevent the | |||
creation of new streams, however this can also happen for any | creation of new streams, however this can also happen for any | |||
limit that is exhausted with active streams. Servers SHOULD only | limit that is exhausted with active streams. Servers SHOULD only | |||
set a zero value for short durations; if a server does not wish to | set a zero value for short durations; if a server does not wish to | |||
accept requests, closing the connection could be preferable. | accept requests, closing the connection could be preferable. | |||
SETTINGS_INITIAL_WINDOW_SIZE (4): Indicates the sender's initial | SETTINGS_INITIAL_WINDOW_SIZE (4): Indicates the sender's initial | |||
window size (in bytes) for stream level flow control. | window size (in bytes) for stream level flow control. The initial | |||
value is 65,535. | ||||
This settings affects the window size of all streams, including | This setting affects the window size of all streams, including | |||
existing streams, see Section 6.9.2. | existing streams, see Section 6.9.2. | |||
Values above the maximum flow control window size of 2^31 - 1 MUST | Values above the maximum flow control window size of 2^31 - 1 MUST | |||
be treated as a connection error (Section 5.4.1) of type | be treated as a connection error (Section 5.4.1) of type | |||
FLOW_CONTROL_ERROR. | FLOW_CONTROL_ERROR. | |||
An endpoint that receives a SETTINGS frame with any other setting | An endpoint that receives a SETTINGS frame with any other identifier | |||
identifier MUST treat this as a connection error (Section 5.4.1) of | MUST treat this as a connection error (Section 5.4.1) of type | |||
type PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
6.5.3. Settings Synchronization | 6.5.3. Settings Synchronization | |||
Most values in SETTINGS benefit from or require an understanding of | Most values in SETTINGS benefit from or require an understanding of | |||
when the peer has received and applied the changed setting values. | when the peer has received and applied the changed the communicated | |||
In order to provide such synchronization timepoints, the recipient of | parameter values. In order to provide such synchronization | |||
a SETTINGS frame in which the ACK flag is not set MUST apply the | timepoints, the recipient of a SETTINGS frame in which the ACK flag | |||
updated settings as soon as possible upon receipt. | is not set MUST apply the updated parameters as soon as possible upon | |||
receipt. | ||||
The values in the SETTINGS frame MUST be applied in the order they | The values in the SETTINGS frame MUST be applied in the order they | |||
appear, with no other frame processing between values. Once all | appear, with no other frame processing between values. Once all | |||
values have been applied, the recipient MUST immediately emit a | values have been applied, the recipient MUST immediately emit a | |||
SETTINGS frame with the ACK flag set. The sender of altered settings | SETTINGS frame with the ACK flag set. Upon receiving a SETTINGS | |||
applies changes upon receiving a SETTINGS frame with the ACK flag | frame with the ACK flag set, the sender of the altered parameters can | |||
set. | rely upon their application. | |||
If the sender of a SETTINGS frame does not receive an acknowledgement | If the sender of a SETTINGS frame does not receive an acknowledgement | |||
within a reasonable amount of time, it MAY issue a connection error | within a reasonable amount of time, it MAY issue a connection error | |||
(Section 5.4.1) of type SETTINGS_TIMEOUT. | (Section 5.4.1) of type SETTINGS_TIMEOUT. | |||
6.6. PUSH_PROMISE | 6.6. PUSH_PROMISE | |||
The PUSH_PROMISE frame (type=0x5) is used to notify the peer endpoint | The PUSH_PROMISE frame (type=0x5) is used to notify the peer endpoint | |||
in advance of streams the sender intends to initiate. The | in advance of streams the sender intends to initiate. The | |||
PUSH_PROMISE frame includes the unsigned 31-bit identifier of the | PUSH_PROMISE frame includes the unsigned 31-bit identifier of the | |||
stream the endpoint plans to create along with a set of headers that | stream the endpoint plans to create along with a set of headers that | |||
provide additional context for the stream. Section 8.2 contains a | provide additional context for the stream. Section 8.2 contains a | |||
thorough description of the use of PUSH_PROMISE frames. | thorough description of the use of PUSH_PROMISE frames. | |||
PUSH_PROMISE MUST NOT be sent if the SETTINGS_ENABLE_PUSH setting of | PUSH_PROMISE MUST NOT be sent if the SETTINGS_ENABLE_PUSH setting of | |||
the peer endpoint is set to 0. | the peer endpoint is set to 0. | |||
0 1 2 3 | 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 | 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 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
|X| Promised-Stream-ID (31) | | | Pad High? (8) | Pad Low? (8) | | |||
+-+-------------------------------------------------------------+ | +-+-------------+---------------+-------------------------------+ | |||
| Header Block Fragment (*) ... | |R| Promised Stream ID (31) | | |||
+-+-----------------------------+-------------------------------+ | ||||
| Header Block Fragment (*) ... | ||||
+---------------------------------------------------------------+ | ||||
| Padding (*) ... | ||||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
PUSH_PROMISE Payload Format | PUSH_PROMISE Payload Format | |||
The payload of a PUSH_PROMISE includes a "Promised-Stream-ID". This | The PUSH_PROMISE frame payload has the following fields: | |||
unsigned 31-bit integer identifies the stream the endpoint intends to | ||||
start sending frames for. The promised stream identifier MUST be a | ||||
valid choice for the next stream sent by the sender (see new stream | ||||
identifier (Section 5.1.1)). | ||||
Following the "Promised-Stream-ID" is a header block fragment | Pad High: Padding size high bits. This field is only present if the | |||
(Section 4.3). | PAD_HIGH flag is set. | |||
PUSH_PROMISE frames MUST be associated with an existing, peer- | Pad Low: Padding size low bits. This field is only present if the | |||
initiated stream. If the stream identifier field specifies the value | PAD_LOW flag is set. | |||
0x0, a recipient MUST respond with a connection error (Section 5.4.1) | ||||
of type PROTOCOL_ERROR. | R: A single reserved bit. | |||
Promised Stream ID: This unsigned 31-bit integer identifies the | ||||
stream the endpoint intends to start sending frames for. The | ||||
promised stream identifier MUST be a valid choice for the next | ||||
stream sent by the sender (see new stream identifier | ||||
(Section 5.1.1)). | ||||
Header Block Fragment: A header block fragment (Section 4.3) | ||||
containing request header fields. | ||||
Padding: Padding octets. | ||||
The PUSH_PROMISE frame defines the following flags: | The PUSH_PROMISE frame defines the following flags: | |||
END_PUSH_PROMISE (0x4): Bit 3 being set indicates that this frame | END_HEADERS (0x4): Bit 3 being set indicates that this frame | |||
contains an entire header block (Section 4.3) and is not followed | contains an entire header block (Section 4.3) and is not followed | |||
by any CONTINUATION frames. | by any CONTINUATION frames. | |||
A PUSH_PROMISE frame without the END_PUSH_PROMISE flag set MUST be | A PUSH_PROMISE frame without the END_HEADERS flag set MUST be | |||
followed by a CONTINUATION frame for the same stream. A receiver | followed by a CONTINUATION frame for the same stream. A receiver | |||
MUST treat the receipt of any other type of frame or a frame on a | MUST treat the receipt of any other type of frame or a frame on a | |||
different stream as a connection error (Section 5.4.1) of type | different stream as a connection error (Section 5.4.1) of type | |||
PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
PAD_LOW (0x8): Bit 4 being set indicates that the Pad Low field is | ||||
present. | ||||
PAD_HIGH (0x10): Bit 5 being set indicates that the Pad High field | ||||
is present. This bit MUST NOT be set unless the PAD_LOW flag is | ||||
also set. Endpoints that receive a frame with PAD_HIGH set and | ||||
PAD_LOW cleared MUST treat this as a connection error | ||||
(Section 5.4.1) of type PROTOCOL_ERROR. | ||||
PUSH_PROMISE frames MUST be associated with an existing, peer- | ||||
initiated stream. The stream identifier of a PUSH_PROMISE frame | ||||
indicates the stream it is associated with. If the stream identifier | ||||
field specifies the value 0x0, a recipient MUST respond with a | ||||
connection error (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
Promised streams are not required to be used in order promised. The | Promised streams are not required to be used in order promised. The | |||
PUSH_PROMISE only reserves stream identifiers for later use. | PUSH_PROMISE only reserves stream identifiers for later use. | |||
Recipients of PUSH_PROMISE frames can choose to reject promised | Recipients of PUSH_PROMISE frames can choose to reject promised | |||
streams by returning a RST_STREAM referencing the promised stream | streams by returning a RST_STREAM referencing the promised stream | |||
identifier back to the sender of the PUSH_PROMISE. | identifier back to the sender of the PUSH_PROMISE. | |||
The PUSH_PROMISE frame modifies the connection state as defined in | The PUSH_PROMISE frame modifies the connection state as defined in | |||
Section 4.3. | Section 4.3. | |||
A PUSH_PROMISE frame modifies the connection state in two ways. The | A PUSH_PROMISE frame modifies the connection state in two ways. The | |||
inclusion of a header block (Section 4.3) potentially modifies the | inclusion of a header block (Section 4.3) potentially modifies the | |||
compression state. PUSH_PROMISE also reserves a stream for later | state maintained for header compression. PUSH_PROMISE also reserves | |||
use, causing the promised stream to enter the "reserved" state. A | a stream for later use, causing the promised stream to enter the | |||
sender MUST NOT send a PUSH_PROMISE on a stream unless that stream is | "reserved" state. A sender MUST NOT send a PUSH_PROMISE on a stream | |||
either "open" or "half closed (remote)"; the sender MUST ensure that | unless that stream is either "open" or "half closed (remote)"; the | |||
the promised stream is a valid choice for a new stream identifier | sender MUST ensure that the promised stream is a valid choice for a | |||
(Section 5.1.1) (that is, the promised stream MUST be in the "idle" | new stream identifier (Section 5.1.1) (that is, the promised stream | |||
state). | MUST be in the "idle" state). | |||
Since PUSH_PROMISE reserves a stream, ignoring a PUSH_PROMISE frame | Since PUSH_PROMISE reserves a stream, ignoring a PUSH_PROMISE frame | |||
causes the stream state to become indeterminate. A receiver MUST | causes the stream state to become indeterminate. A receiver MUST | |||
treat the receipt of a PUSH_PROMISE on a stream that is neither | treat the receipt of a PUSH_PROMISE on a stream that is neither | |||
"open" nor "half-closed (local)" as a connection error | "open" nor "half-closed (local)" as a connection error | |||
(Section 5.4.1) of type PROTOCOL_ERROR. Similarly, a receiver MUST | (Section 5.4.1) of type PROTOCOL_ERROR. Similarly, a receiver MUST | |||
treat the receipt of a PUSH_PROMISE that promises an illegal stream | treat the receipt of a PUSH_PROMISE that promises an illegal stream | |||
identifier (Section 5.1.1) (that is, an identifier for a stream that | identifier (Section 5.1.1) (that is, an identifier for a stream that | |||
is not currently in the "idle" state) as a connection error | is not currently in the "idle" state) as a connection error | |||
(Section 5.4.1) of type PROTOCOL_ERROR. | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
The PUSH_PROMISE frame includes optional padding. Padding fields and | ||||
flags are identical to those defined for DATA frames (Section 6.1). | ||||
6.7. PING | 6.7. PING | |||
The PING frame (type=0x6) is a mechanism for measuring a minimal | The PING frame (type=0x6) is a mechanism for measuring a minimal | |||
round-trip time from the sender, as well as determining whether an | round-trip time from the sender, as well as determining whether an | |||
idle connection is still functional. PING frames can be sent from | idle connection is still functional. PING frames can be sent from | |||
any endpoint. | any endpoint. | |||
0 1 2 3 | 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 | 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 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
skipping to change at page 36, line 31 | skipping to change at page 41, line 39 | |||
partially processed or not. For example, if an HTTP client sends a | partially processed or not. For example, if an HTTP client sends a | |||
POST at the same time that a server closes a connection, the client | POST at the same time that a server closes a connection, the client | |||
cannot know if the server started to process that POST request if the | cannot know if the server started to process that POST request if the | |||
server does not send a GOAWAY frame to indicate where it stopped | server does not send a GOAWAY frame to indicate where it stopped | |||
working. An endpoint might choose to close a connection without | working. An endpoint might choose to close a connection without | |||
sending GOAWAY for misbehaving peers. | sending GOAWAY for misbehaving peers. | |||
After sending a GOAWAY frame, the sender can discard frames for new | After sending a GOAWAY frame, the sender can discard frames for new | |||
streams. However, any frames that alter connection state cannot be | streams. However, any frames that alter connection state cannot be | |||
completely ignored. For instance, HEADERS, PUSH_PROMISE and | completely ignored. For instance, HEADERS, PUSH_PROMISE and | |||
CONTINUATION frames MUST be minimally processed to ensure a | CONTINUATION frames MUST be minimally processed to ensure the state | |||
consistent compression state (see Section 4.3); similarly DATA frames | maintained for header compression is consistent (see Section 4.3); | |||
MUST be counted toward the connection flow control window. | similarly DATA frames MUST be counted toward the connection flow | |||
control window. | ||||
0 1 2 3 | 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 | 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 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
|X| Last-Stream-ID (31) | | |R| Last-Stream-ID (31) | | |||
+-+-------------------------------------------------------------+ | +-+-------------------------------------------------------------+ | |||
| Error Code (32) | | | Error Code (32) | | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| Additional Debug Data (*) | | | Additional Debug Data (*) | | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
GOAWAY Payload Format | GOAWAY Payload Format | |||
The GOAWAY frame does not define any flags. | The GOAWAY frame does not define any flags. | |||
The GOAWAY frame applies to the connection, not a specific stream. | The GOAWAY frame applies to the connection, not a specific stream. | |||
An endpoint MUST treat a GOAWAY frame with a stream identifier other | An endpoint MUST treat a GOAWAY frame with a stream identifier other | |||
than 0x0 as a connection error (Section 5.4.1) of type | than 0x0 as a connection error (Section 5.4.1) of type | |||
PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
The last stream identifier in the GOAWAY frame contains the highest | The last stream identifier in the GOAWAY frame contains the highest | |||
skipping to change at page 37, line 8 | skipping to change at page 42, line 15 | |||
The GOAWAY frame does not define any flags. | The GOAWAY frame does not define any flags. | |||
The GOAWAY frame applies to the connection, not a specific stream. | The GOAWAY frame applies to the connection, not a specific stream. | |||
An endpoint MUST treat a GOAWAY frame with a stream identifier other | An endpoint MUST treat a GOAWAY frame with a stream identifier other | |||
than 0x0 as a connection error (Section 5.4.1) of type | than 0x0 as a connection error (Section 5.4.1) of type | |||
PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
The last stream identifier in the GOAWAY frame contains the highest | The last stream identifier in the GOAWAY frame contains the highest | |||
numbered stream identifier for which the sender of the GOAWAY frame | numbered stream identifier for which the sender of the GOAWAY frame | |||
has received frames on and might have taken some action on. All | has received frames and might have taken some action on. All streams | |||
streams up to and including the identified stream might have been | up to and including the identified stream might have been processed | |||
processed in some way. The last stream identifier is set to 0 if no | in some way. The last stream identifier is set to 0 if no streams | |||
streams were processed. | were processed. | |||
Note: In this case, "processed" means that some data from the | Note: In this case, "processed" means that some data from the | |||
stream was passed to some higher layer of software that might have | stream was passed to some higher layer of software that might have | |||
taken some action as a result. | taken some action as a result. | |||
If a connection terminates without a GOAWAY frame, this value is | If a connection terminates without a GOAWAY frame, this value is | |||
effectively the highest stream identifier. | effectively the highest stream identifier. | |||
On streams with lower or equal numbered identifiers that were not | On streams with lower or equal numbered identifiers that were not | |||
closed completely prior to the connection being closed, re-attempting | closed completely prior to the connection being closed, re-attempting | |||
skipping to change at page 37, line 45 | skipping to change at page 43, line 4 | |||
If an endpoint maintains the connection and continues to exchange | If an endpoint maintains the connection and continues to exchange | |||
frames, ignored frames MUST be counted toward flow control limits | frames, ignored frames MUST be counted toward flow control limits | |||
(Section 5.2) or update header compression state (Section 4.3). | (Section 5.2) or update header compression state (Section 4.3). | |||
Otherwise, flow control or header compression state can become | Otherwise, flow control or header compression state can become | |||
unsynchronized. | unsynchronized. | |||
The GOAWAY frame also contains a 32-bit error code (Section 7) that | The GOAWAY frame also contains a 32-bit error code (Section 7) that | |||
contains the reason for closing the connection. | contains the reason for closing the connection. | |||
Endpoints MAY append opaque data to the payload of any GOAWAY frame. | Endpoints MAY append opaque data to the payload of any GOAWAY frame. | |||
Additional debug data is intended for diagnostic purposes only and | Additional debug data is intended for diagnostic purposes only and | |||
carries no semantic value. Debug information could contain security- | carries no semantic value. Debug information could contain security- | |||
or privacy-sensitive data. Logged or otherwise persistently stored | or privacy-sensitive data. Logged or otherwise persistently stored | |||
debug data MUST have adequate safeguards to prevent unauthorized | debug data MUST have adequate safeguards to prevent unauthorized | |||
access. | access. | |||
6.9. WINDOW_UPDATE | 6.9. WINDOW_UPDATE | |||
The WINDOW_UPDATE frame (type=0x8) is used to implement flow control. | The WINDOW_UPDATE frame (type=0x8) is used to implement flow control; | |||
see Section 5.2 for an overview. | ||||
Flow control operates at two levels: on each individual stream and on | Flow control operates at two levels: on each individual stream and on | |||
the entire connection. | the entire connection. | |||
Both types of flow control are hop by hop; that is, only between the | Both types of flow control are hop-by-hop; that is, only between the | |||
two endpoints. Intermediaries do not forward WINDOW_UPDATE frames | two endpoints. Intermediaries do not forward WINDOW_UPDATE frames | |||
between dependent connections. However, throttling of data transfer | between dependent connections. However, throttling of data transfer | |||
by any receiver can indirectly cause the propagation of flow control | by any receiver can indirectly cause the propagation of flow control | |||
information toward the original sender. | information toward the original sender. | |||
Flow control only applies to frames that are identified as being | Flow control only applies to frames that are identified as being | |||
subject to flow control. Of the frame types defined in this | subject to flow control. Of the frame types defined in this | |||
document, this includes only DATA frame. Frames that are exempt from | document, this includes only DATA frame. Frames that are exempt from | |||
flow control MUST be accepted and processed, unless the receiver is | flow control MUST be accepted and processed, unless the receiver is | |||
unable to assign resources to handling the frame. A receiver MAY | unable to assign resources to handling the frame. A receiver MAY | |||
respond with a stream error (Section 5.4.2) or connection error | respond with a stream error (Section 5.4.2) or connection error | |||
(Section 5.4.1) of type FLOW_CONTROL_ERROR if it is unable accept a | (Section 5.4.1) of type FLOW_CONTROL_ERROR if it is unable accept a | |||
frame. | frame. | |||
0 1 2 3 | 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 | 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 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
|X| Window Size Increment (31) | | |R| Window Size Increment (31) | | |||
+-+-------------------------------------------------------------+ | +-+-------------------------------------------------------------+ | |||
WINDOW_UPDATE Payload Format | WINDOW_UPDATE Payload Format | |||
The payload of a WINDOW_UPDATE frame is one reserved bit, plus an | The payload of a WINDOW_UPDATE frame is one reserved bit, plus an | |||
unsigned 31-bit integer indicating the number of bytes that the | unsigned 31-bit integer indicating the number of bytes that the | |||
sender can transmit in addition to the existing flow control window. | sender can transmit in addition to the existing flow control window. | |||
The legal range for the increment to the flow control window is 1 to | The legal range for the increment to the flow control window is 1 to | |||
2^31 - 1 (0x7fffffff) bytes. | 2^31 - 1 (0x7fffffff) bytes. | |||
skipping to change at page 40, line 8 | skipping to change at page 45, line 15 | |||
sends a RST_STREAM with the error code of FLOW_CONTROL_ERROR code; | sends a RST_STREAM with the error code of FLOW_CONTROL_ERROR code; | |||
for the connection, a GOAWAY frame with a FLOW_CONTROL_ERROR code. | for the connection, a GOAWAY frame with a FLOW_CONTROL_ERROR code. | |||
Flow controlled frames from the sender and WINDOW_UPDATE frames from | Flow controlled frames from the sender and WINDOW_UPDATE frames from | |||
the receiver are completely asynchronous with respect to each other. | the receiver are completely asynchronous with respect to each other. | |||
This property allows a receiver to aggressively update the window | This property allows a receiver to aggressively update the window | |||
size kept by the sender to prevent streams from stalling. | size kept by the sender to prevent streams from stalling. | |||
6.9.2. Initial Flow Control Window Size | 6.9.2. Initial Flow Control Window Size | |||
When a HTTP/2 connection is first established, new streams are | When an HTTP/2 connection is first established, new streams are | |||
created with an initial flow control window size of 65,535 bytes. | created with an initial flow control window size of 65,535 bytes. | |||
The connection flow control window is 65,535 bytes. Both endpoints | The connection flow control window is 65,535 bytes. Both endpoints | |||
can adjust the initial window size for new streams by including a | can adjust the initial window size for new streams by including a | |||
value for SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS frame that | value for SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS frame that | |||
forms part of the connection header. | forms part of the connection preface. The connection flow control | |||
window initial size cannot be changed. | ||||
Prior to receiving a SETTINGS frame that sets a value for | Prior to receiving a SETTINGS frame that sets a value for | |||
SETTINGS_INITIAL_WINDOW_SIZE, an endpoint can only use the default | SETTINGS_INITIAL_WINDOW_SIZE, an endpoint can only use the default | |||
initial window size when sending flow controlled frames. Similarly, | initial window size when sending flow controlled frames. Similarly, | |||
the connection flow control window is set to the default initial | the connection flow control window is set to the default initial | |||
window size until a WINDOW_UPDATE frame is received. | window size until a WINDOW_UPDATE frame is received. | |||
A SETTINGS frame can alter the initial flow control window size for | A SETTINGS frame can alter the initial flow control window size for | |||
all current streams. When the value of SETTINGS_INITIAL_WINDOW_SIZE | all current streams. When the value of SETTINGS_INITIAL_WINDOW_SIZE | |||
changes, a receiver MUST adjust the size of all stream flow control | changes, a receiver MUST adjust the size of all stream flow control | |||
skipping to change at page 41, line 5 | skipping to change at page 46, line 13 | |||
window to being positive, after which the client can resume sending. | window to being positive, after which the client can resume sending. | |||
6.9.3. Reducing the Stream Window Size | 6.9.3. Reducing the Stream Window Size | |||
A receiver that wishes to use a smaller flow control window than the | A receiver that wishes to use a smaller flow control window than the | |||
current size can send a new SETTINGS frame. However, the receiver | current size can send a new SETTINGS frame. However, the receiver | |||
MUST be prepared to receive data that exceeds this window size, since | MUST be prepared to receive data that exceeds this window size, since | |||
the sender might send data that exceeds the lower limit prior to | the sender might send data that exceeds the lower limit prior to | |||
processing the SETTINGS frame. | processing the SETTINGS frame. | |||
A receiver has two options for handling streams that exceed flow | After sending a SETTINGS frame that reduces the initial flow control | |||
control limits: | window size, a receiver has two options for handling streams that | |||
exceed flow control limits: | ||||
1. The receiver can immediately send RST_STREAM with | 1. The receiver can immediately send RST_STREAM with | |||
FLOW_CONTROL_ERROR error code for the affected streams. | FLOW_CONTROL_ERROR error code for the affected streams. | |||
2. The receiver can accept the streams and tolerate the resulting | 2. The receiver can accept the streams and tolerate the resulting | |||
head of line blocking, sending WINDOW_UPDATE frames as it | head of line blocking, sending WINDOW_UPDATE frames as it | |||
consumes data. | consumes data. | |||
If a receiver decides to accept streams, both sides MUST recompute | ||||
the available flow control window based on the initial window size | ||||
sent in the SETTINGS. | ||||
6.10. CONTINUATION | 6.10. CONTINUATION | |||
The CONTINUATION frame (type=0x9) is used to continue a sequence of | The CONTINUATION frame (type=0x9) is used to continue a sequence of | |||
header block fragments (Section 4.3). Any number of CONTINUATION | header block fragments (Section 4.3). Any number of CONTINUATION | |||
frames can be sent on an existing stream, as long as the preceding | frames can be sent on an existing stream, as long as the preceding | |||
frame on the same stream is one of HEADERS, PUSH_PROMISE or | frame is on the same stream and is a HEADERS, PUSH_PROMISE or | |||
CONTINUATION without the END_HEADERS or END_PUSH_PROMISE flag set. | CONTINUATION frame without the END_HEADERS flag set. | |||
0 1 2 3 | 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 | 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 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| [Pad High(8)] | [Pad Low (8)] | Header Block Fragment (*) . | | Pad High? (8) | Pad Low? (8) | | |||
+---------------+---------------+-------------------------------+ | +---------------+---------------+-------------------------------+ | |||
| Header Block Fragment (*) ... | | Header Block Fragment (*) ... | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| Padding (*) ... | | Padding (*) ... | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
CONTINUATION Frame Payload | CONTINUATION Frame Payload | |||
The CONTINUATION frame payload has the following fields: | The CONTINUATION frame payload has the following fields: | |||
skipping to change at page 42, line 13 | skipping to change at page 47, line 19 | |||
The CONTINUATION frame defines the following flags: | The CONTINUATION frame defines the following flags: | |||
END_HEADERS (0x4): Bit 3 being set indicates that this frame ends a | END_HEADERS (0x4): Bit 3 being set indicates that this frame ends a | |||
header block (Section 4.3). | header block (Section 4.3). | |||
If the END_HEADERS bit is not set, this frame MUST be followed by | If the END_HEADERS bit is not set, this frame MUST be followed by | |||
another CONTINUATION frame. A receiver MUST treat the receipt of | another CONTINUATION frame. A receiver MUST treat the receipt of | |||
any other type of frame or a frame on a different stream as a | any other type of frame or a frame on a different stream as a | |||
connection error (Section 5.4.1) of type PROTOCOL_ERROR. | connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
PAD_LOW (0x10): Bit 5 being set indicates that the Pad Low field is | PAD_LOW (0x8): Bit 4 being set indicates that the Pad Low field is | |||
present. | present. | |||
PAD_HIGH (0x20): Bit 6 being set indicates that the Pad High field | PAD_HIGH (0x10): Bit 5 being set indicates that the Pad High field | |||
is present. This bit MUST NOT be set unless the PAD_LOW flag is | is present. This bit MUST NOT be set unless the PAD_LOW flag is | |||
also set. Endpoints that receive a frame with PAD_HIGH set and | also set. Endpoints that receive a frame with PAD_HIGH set and | |||
PAD_LOW cleared MUST treat this as a connection error | PAD_LOW cleared MUST treat this as a connection error | |||
(Section 5.4.1) of type PROTOCOL_ERROR. | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
The payload of a CONTINUATION frame contains a header block fragment | The payload of a CONTINUATION frame contains a header block fragment | |||
(Section 4.3). | (Section 4.3). | |||
The CONTINUATION frame changes the connection state as defined in | The CONTINUATION frame changes the connection state as defined in | |||
Section 4.3. | Section 4.3. | |||
skipping to change at page 42, line 41 | skipping to change at page 47, line 47 | |||
type PROTOCOL_ERROR. | type PROTOCOL_ERROR. | |||
A CONTINUATION frame MUST be preceded by a HEADERS, PUSH_PROMISE or | A CONTINUATION frame MUST be preceded by a HEADERS, PUSH_PROMISE or | |||
CONTINUATION frame without the END_HEADERS flag set. A recipient | CONTINUATION frame without the END_HEADERS flag set. A recipient | |||
that observes violation of this rule MUST respond with a connection | that observes violation of this rule MUST respond with a connection | |||
error (Section 5.4.1) of type PROTOCOL_ERROR. | error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
The CONTINUATION frame includes optional padding. Padding fields and | The CONTINUATION frame includes optional padding. Padding fields and | |||
flags are identical to those defined for DATA frames (Section 6.1). | flags are identical to those defined for DATA frames (Section 6.1). | |||
6.11. ALTSVC | ||||
The ALTSVC frame (type=0xA) advertises the availability of an | ||||
alternative service to the client. It can be sent at any time for an | ||||
existing client-initiated stream or stream 0, and is intended to | ||||
allow servers to load balance or otherwise segment traffic; see | ||||
[ALT-SVC] for details (in particular, Section 2.4, which outlines | ||||
client handling of alternative services). | ||||
An ALTSVC frame on a client-initiated stream indicates that the | ||||
conveyed alternative service is associated with the origin of that | ||||
stream. | ||||
An ALTSVC frame on stream 0 indicates that the conveyed alternative | ||||
service is associated with the origin contained in the Origin field | ||||
of the frame. An association with an origin that the client does not | ||||
consider authoritative for the current connection MUST be ignored. | ||||
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 | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Max-Age (32) | | ||||
+-------------------------------+----------------+--------------+ | ||||
| Port (16) | Reserved (8) | PID_LEN (8) | | ||||
+-------------------------------+----------------+--------------+ | ||||
| Protocol-ID (*) | | ||||
+---------------+-----------------------------------------------+ | ||||
| HOST_LEN (8) | Host (*) ... | ||||
+---------------+-----------------------------------------------+ | ||||
| Origin? (*) ... | ||||
+---------------------------------------------------------------+ | ||||
The ALTSVC frame contains the following fields: | ||||
Max-Age: An unsigned, 32-bit integer indicating the freshness | ||||
lifetime of the alternative service association, as per [ALT-SVC], | ||||
Section 2.2. | ||||
Port: An unsigned, 16-bit integer indicating the port that the | ||||
alternative service is available upon. | ||||
Reserved: For future use. Senders MUST set these bits to '0', and | ||||
recipients MUST ignore them. | ||||
PID_LEN: An unsigned, 8-bit integer indicating the length, in | ||||
octets, of the PROTOCOL-ID field. | ||||
Protocol-ID: A sequence of bytes (length determined by PID_LEN) | ||||
containing the ALPN protocol identifier of the alternative | ||||
service. | ||||
HOST_LEN: An unsigned, 8-bit integer indicating the length, in | ||||
octets, of the Host field. | ||||
Host: A sequence of characters (length determined by HOST_LEN) | ||||
containing an ASCII string indicating the host that the | ||||
alternative service is available upon. An internationalized | ||||
domain name [IDNA] MUST be expressed using A-labels. | ||||
Origin: An optional sequence of characters (length determined by | ||||
subtracting the length of all preceding fields from the frame | ||||
length) containing ASCII serialisation of an origin ([RFC6454], | ||||
Section 6.2) that the alternate service is applicable to. | ||||
The ALTSVC frame does not define any flags. | ||||
The ALTSVC frame is intended for receipt by clients; a server that | ||||
receives an ALTSVC frame MUST treat it as a connection error of type | ||||
PROTOCOL_ERROR. | ||||
The ALTSVC frame is processed hop-by-hop. An intermediary MUST NOT | ||||
forward ALTSVC frames, though it can use the information contained in | ||||
ALTSVC frames in forming new ALTSVC frames to send to its own | ||||
clients. | ||||
7. Error Codes | 7. Error Codes | |||
Error codes are 32-bit fields that are used in RST_STREAM and GOAWAY | Error codes are 32-bit fields that are used in RST_STREAM and GOAWAY | |||
frames to convey the reasons for the stream or connection error. | frames to convey the reasons for the stream or connection error. | |||
Error codes share a common code space. Some error codes only apply | Error codes share a common code space. Some error codes only apply | |||
to specific conditions and have no defined semantics in certain frame | to specific conditions and have no defined semantics in certain frame | |||
types. | types. | |||
The following error codes are defined: | The following error codes are defined: | |||
skipping to change at page 44, line 7 | skipping to change at page 50, line 41 | |||
ENHANCE_YOUR_CALM (11): The endpoint detected that its peer is | ENHANCE_YOUR_CALM (11): The endpoint detected that its peer is | |||
exhibiting a behavior over a given amount of time that has caused | exhibiting a behavior over a given amount of time that has caused | |||
it to refuse to process further frames. | it to refuse to process further frames. | |||
INADEQUATE_SECURITY (12): The underlying transport has properties | INADEQUATE_SECURITY (12): The underlying transport has properties | |||
that do not meet the minimum requirements imposed by this document | that do not meet the minimum requirements imposed by this document | |||
(see Section 9.2) or the endpoint. | (see Section 9.2) or the endpoint. | |||
8. HTTP Message Exchanges | 8. HTTP Message Exchanges | |||
HTTP/2 is intended to be as compatible as possible with current web- | HTTP/2 is intended to be as compatible as possible with current uses | |||
based applications. This means that, from the perspective of the | of HTTP. This means that, from the perspective of the server and | |||
server business logic or application API, the features of HTTP are | client applications, the features of the protocol are unchanged. To | |||
unchanged. To achieve this, all of the application request and | achieve this, all request and response semantics are preserved, | |||
response header semantics are preserved, although the syntax of | although the syntax of conveying those semantics has changed. | |||
conveying those semantics has changed. Thus, the rules from HTTP/1.1 | ||||
([HTTP-p1], [HTTP-p2], [HTTP-p4], [HTTP-p5], [HTTP-p6], and | Thus, the specification and requirements of HTTP/1.1 Semantics and | |||
[HTTP-p7]) apply with the changes in the sections below. | Content [HTTP-p2], Conditional Requests [HTTP-p4], Range Requests | |||
[HTTP-p5], Caching [HTTP-p6] and Authentication [HTTP-p7] are | ||||
applicable to HTTP/2. Selected portions of HTTP/1.1 Message Syntax | ||||
and Routing [HTTP-p1], such as the HTTP and HTTPS URI schemes, are | ||||
also applicable in HTTP/2, but the expression of those semantics for | ||||
this protocol are defined in the sections below. | ||||
8.1. HTTP Request/Response Exchange | 8.1. HTTP Request/Response Exchange | |||
A client sends an HTTP request on a new stream, using a previously | A client sends an HTTP request on a new stream, using a previously | |||
unused stream identifier (Section 5.1.1). A server sends an HTTP | unused stream identifier (Section 5.1.1). A server sends an HTTP | |||
response on the same stream as the request. | response on the same stream as the request. | |||
An HTTP request or response each consist of: | An HTTP message (request or response) consists of: | |||
1. a HEADERS frame; | ||||
2. one contiguous sequence of zero or more CONTINUATION frames; | 1. one HEADERS frame, followed by zero or more CONTINUATION frames | |||
(containing the message headers; see [HTTP-p1], Section 3.2), and | ||||
3. zero or more DATA frames; and | 2. zero or more DATA frames (containing the message payload; see | |||
[HTTP-p1], Section 3.3), and | ||||
4. optionally, a contiguous sequence that starts with a HEADERS | 3. optionally, one HEADERS frame, followed by zero or more | |||
frame, followed by zero or more CONTINUATION frames. | CONTINUATION frames (containing the trailer-part, if present; see | |||
[HTTP-p1], Section 4.1.2). | ||||
The last frame in the sequence bears an END_STREAM flag, though a | The last frame in the sequence bears an END_STREAM flag, though a | |||
HEADERS frame bearing the END_STREAM flag can be followed by | HEADERS frame bearing the END_STREAM flag can be followed by | |||
CONTINUATION frames that carry any remaining portions of the header | CONTINUATION frames that carry any remaining portions of the header | |||
block. | block. | |||
Other frames MAY be interspersed with these frames, but those frames | Other frames (from any stream) MUST NOT occur between either HEADERS | |||
do not carry HTTP semantics. In particular, HEADERS frames (and any | frame and the following CONTINUATION frames (if present), nor between | |||
CONTINUATION frames that follow) other than the first and optional | CONTINUATION frames. | |||
last frames in this sequence do not carry HTTP semantics. | ||||
Otherwise, frames MAY be interspersed on the stream between these | ||||
frames, but those frames do not carry HTTP semantics. In particular, | ||||
HEADERS frames (and any CONTINUATION frames that follow) other than | ||||
the first and optional last frames in this sequence do not carry HTTP | ||||
semantics. | ||||
Trailing header fields are carried in a header block that also | Trailing header fields are carried in a header block that also | |||
terminates the stream. That is, a sequence starting with a HEADERS | terminates the stream. That is, a sequence starting with a HEADERS | |||
frame, followed by zero or more CONTINUATION frames, where the | frame, followed by zero or more CONTINUATION frames, where the | |||
HEADERS frame bears an END_STREAM flag. Header blocks after the | HEADERS frame bears an END_STREAM flag. Header blocks after the | |||
first that do not terminate the stream are not part of an HTTP | first that do not terminate the stream are not part of an HTTP | |||
request or response. | request or response. | |||
An HTTP request/response exchange fully consumes a single stream. A | An HTTP request/response exchange fully consumes a single stream. A | |||
request starts with the HEADERS frame that puts the stream into an | request starts with the HEADERS frame that puts the stream into an | |||
skipping to change at page 45, line 14 | skipping to change at page 52, line 11 | |||
the stream to become "half closed" for the client. A response starts | the stream to become "half closed" for the client. A response starts | |||
with a HEADERS frame and ends with a frame bearing END_STREAM, | with a HEADERS frame and ends with a frame bearing END_STREAM, | |||
optionally followed by CONTINUATION frames, which places the stream | optionally followed by CONTINUATION frames, which places the stream | |||
in the "closed" state. | in the "closed" state. | |||
8.1.1. Informational Responses | 8.1.1. Informational Responses | |||
The 1xx series of HTTP response status codes ([HTTP-p2], Section 6.2) | The 1xx series of HTTP response status codes ([HTTP-p2], Section 6.2) | |||
are not supported in HTTP/2. | are not supported in HTTP/2. | |||
The most common use case for 1xx is using a Expect header field with | The most common use case for 1xx is using an Expect header field with | |||
a "100-continue" token (colloquially, "Expect/continue") to indicate | a "100-continue" token (colloquially, "Expect/continue") to indicate | |||
that the client expects a 100 (Continue) non-final response status | that the client expects a 100 (Continue) non-final response status | |||
code, receipt of which indicates that the client should continue | code, receipt of which indicates that the client should continue | |||
sending the request body if it has not already done so. | sending the request body if it has not already done so. | |||
Typically, Expect/continue is used by clients wishing to avoid | Typically, Expect/continue is used by clients wishing to avoid | |||
sending a large amount of data in a request body, only to have the | sending a large amount of data in a request body, only to have the | |||
request rejected by the origin server. | request rejected by the origin server (thus leaving the connection | |||
potentially unusable). | ||||
HTTP/2 does not enable the Expect/continue mechanism; if the server | HTTP/2 does not enable the Expect/continue mechanism; if the server | |||
sends a final status code to reject the request, it can do so without | sends a final status code to reject the request, it can do so without | |||
making the underlying connection unusable. | making the underlying connection unusable. | |||
Note that this means HTTP/2 clients sending requests with bodies may | Note that this means HTTP/2 clients sending requests with bodies may | |||
waste at least one round trip of sent data when the request is | waste at least one round trip of sent data when the request is | |||
rejected. This can be mitigated by restricting the amount of data | rejected. This can be mitigated by restricting the amount of data | |||
sent for the first round trip by bandwidth-constrained clients, in | sent for the first round trip by bandwidth-constrained clients, in | |||
anticipation of a final status code. | anticipation of a final status code. | |||
Other defined 1xx status codes are not applicable to HTTP/2; the | Other defined 1xx status codes are not applicable to HTTP/2. For | |||
semantics of 101 (Switching Protocols) is better expressed using a | example, the semantics of 101 (Switching Protocols) aren't suitable | |||
distinct frame type, since they apply to the entire connection, not | to a multiplexed protocol. Likewise, 102 (Processing) is no longer | |||
just one stream. Likewise, 102 (Processing) is no longer necessary, | necessary, because HTTP/2 has a separate means of keeping the | |||
because HTTP/2 has a separate means of keeping the connection alive. | connection alive. | |||
This difference between protocol versions necessitates special | This difference between protocol versions necessitates special | |||
handling by intermediaries that translate between them: | handling by intermediaries that translate between them: | |||
o An intermediary that gateways HTTP/1.1 to HTTP/2 MUST generate a | o An intermediary that gateways HTTP/1.1 to HTTP/2 MUST generate a | |||
100 (Continue) response if a received request includes and Expect | 100 (Continue) response if a received request includes and Expect | |||
header field with a "100-continue" token ([HTTP-p2], Section | header field with a "100-continue" token ([HTTP-p2], Section | |||
5.1.1), unless it can immediately generate a final status code. | 5.1.1), unless it can immediately generate a final status code. | |||
It MUST NOT forward the "100-continue" expectation in the request | It MUST NOT forward the "100-continue" expectation in the request | |||
header fields. | header fields. | |||
skipping to change at page 46, line 16 | skipping to change at page 53, line 14 | |||
o An intermediary that gateways HTTP/2 to HTTP/1.1 MUST discard all | o An intermediary that gateways HTTP/2 to HTTP/1.1 MUST discard all | |||
other 1xx informational responses. | other 1xx informational responses. | |||
8.1.2. Examples | 8.1.2. Examples | |||
This section shows HTTP/1.1 requests and responses, with | This section shows HTTP/1.1 requests and responses, with | |||
illustrations of equivalent HTTP/2 requests and responses. | illustrations of equivalent HTTP/2 requests and responses. | |||
An HTTP GET request includes request header fields and no body and is | An HTTP GET request includes request header fields and no body and is | |||
therefore transmitted as a single contiguous sequence of HEADERS and | therefore transmitted as a single HEADERS frame, followed by zero or | |||
CONTINUATION frames containing the serialized block of request header | more CONTINUATION frames containing the serialized block of request | |||
fields. The last HEADERS frame in the sequence has both the | header fields. The last HEADERS frame in the sequence has both the | |||
END_HEADERS and END_STREAM flags set: | END_HEADERS and END_STREAM flags set: | |||
GET /resource HTTP/1.1 HEADERS | GET /resource HTTP/1.1 HEADERS | |||
Host: example.org ==> + END_STREAM | Host: example.org ==> + END_STREAM | |||
Accept: image/jpeg + END_HEADERS | Accept: image/jpeg + END_HEADERS | |||
:method = GET | :method = GET | |||
:scheme = https | :scheme = https | |||
:authority = example.org | :path = /resource | |||
:path = /resource | host = example.org | |||
accept = image/jpeg | accept = image/jpeg | |||
Similarly, a response that includes only response header fields is | Similarly, a response that includes only response header fields is | |||
transmitted as a sequence of HEADERS frames containing the serialized | transmitted as a HEADERS frame (again, followed by zero or more | |||
block of response header fields. The last HEADERS frame in the | CONTINUATION frames) containing the serialized block of response | |||
sequence has both the END_HEADERS and END_STREAM flag set: | header fields. The last HEADERS frame in the sequence has both the | |||
END_HEADERS and END_STREAM flag set: | ||||
HTTP/1.1 304 Not Modified HEADERS | HTTP/1.1 304 Not Modified HEADERS | |||
ETag: "xyzzy" ===> + END_STREAM | ETag: "xyzzy" ==> + END_STREAM | |||
Expires: Thu, 23 Jan ... + END_HEADERS | Expires: Thu, 23 Jan ... + END_HEADERS | |||
:status = 304 | :status = 304 | |||
etag: "xyzzy" | etag: "xyzzy" | |||
expires: Thu, 23 Jan ... | expires: Thu, 23 Jan ... | |||
An HTTP POST request that includes request header fields and payload | An HTTP POST request that includes request header fields and payload | |||
data is transmitted as one HEADERS frame, followed by zero or more | data is transmitted as one HEADERS frame, followed by zero or more | |||
CONTINUATION frames containing the request header fields, followed by | CONTINUATION frames containing the request header fields, followed by | |||
one or more DATA frames, with the last CONTINUATION (or HEADERS) | one or more DATA frames, with the last CONTINUATION (or HEADERS) | |||
frame having the END_HEADERS flag set and the final DATA frame having | frame having the END_HEADERS flag set and the final DATA frame having | |||
the END_STREAM flag set: | the END_STREAM flag set: | |||
POST /resource HTTP/1.1 HEADERS | POST /resource HTTP/1.1 HEADERS | |||
Host: example.org ==> - END_STREAM | Host: example.org ==> - END_STREAM | |||
Content-Type: image/jpeg + END_HEADERS | Content-Type: image/jpeg + END_HEADERS | |||
Content-Length: 123 :method = POST | Content-Length: 123 :method = POST | |||
:scheme = https | :scheme = https | |||
{binary data} :authority = example.org | {binary data} :path = /resource | |||
:path = /resource | :authority = example.org | |||
content-type = image/jpeg | content-type = image/jpeg | |||
content-length = 123 | content-length = 123 | |||
DATA | DATA | |||
+ END_STREAM | + END_STREAM | |||
{binary data} | {binary data} | |||
A response that includes header fields and payload data is | A response that includes header fields and payload data is | |||
transmitted as a HEADERS frame, followed by zero or more CONTINUATION | transmitted as a HEADERS frame, followed by zero or more CONTINUATION | |||
frames, followed by one or more DATA frames, with the last DATA frame | frames, followed by one or more DATA frames, with the last DATA frame | |||
in the sequence having the END_STREAM flag set: | in the sequence having the END_STREAM flag set: | |||
HTTP/1.1 200 OK HEADERS | HTTP/1.1 200 OK HEADERS | |||
Content-Type: image/jpeg ==> - END_STREAM | Content-Type: image/jpeg ==> - END_STREAM | |||
Content-Length: 123 + END_HEADERS | Content-Length: 123 + END_HEADERS | |||
:status = 200 | :status = 200 | |||
{binary data} content-type = image/jpeg | {binary data} content-type = image/jpeg | |||
content-length = 123 | content-length = 123 | |||
DATA | DATA | |||
+ END_STREAM | + END_STREAM | |||
{binary data} | {binary data} | |||
Trailing header fields are sent as a header block after both the | Trailing header fields are sent as a header block after both the | |||
request or response header block and all the DATA frames have been | request or response header block and all the DATA frames have been | |||
sent. The sequence of HEADERS/CONTINUATION frames that bears the | sent. The sequence of HEADERS/CONTINUATION frames that bears the | |||
trailers includes a terminal frame that has both END_HEADERS and | trailers includes a terminal frame that has both END_HEADERS and | |||
END_STREAM flags set. | END_STREAM flags set. | |||
HTTP/1.1 200 OK HEADERS | HTTP/1.1 200 OK HEADERS | |||
Content-Type: image/jpeg ===> - END_STREAM | Content-Type: image/jpeg ==> - END_STREAM | |||
Transfer-Encoding: chunked + END_HEADERS | Transfer-Encoding: chunked + END_HEADERS | |||
TE: trailers :status = 200 | Trailer: Foo :status = 200 | |||
content-length = 123 | content-length = 123 | |||
123 content-type = image/jpeg | 123 content-type = image/jpeg | |||
{binary data} | {binary data} trailer = Foo | |||
0 DATA | 0 | |||
Foo: bar - END_STREAM | Foo: bar DATA | |||
{binary data} | - END_STREAM | |||
{binary data} | ||||
HEADERS | HEADERS | |||
+ END_STREAM | + END_STREAM | |||
+ END_HEADERS | + END_HEADERS | |||
foo: bar | foo: bar | |||
8.1.3. HTTP Header Fields | 8.1.3. HTTP Header Fields | |||
HTTP/2 request and response header fields carry information as a | HTTP header fields carry information as a series of key-value pairs. | |||
series of key-value pairs. This includes the target URI for the | For a listing of registered HTTP headers, see the Message Header | |||
request, the status code for the response, as well as HTTP header | Field Registry maintained at | |||
fields. | <http://www.iana.org/assignments/message-headers>. | |||
HTTP header field names are strings of ASCII characters that are | While HTTP/1.x used the message start-line (see [HTTP-p1], Section | |||
compared in a case-insensitive fashion. Header field names MUST be | 3.1) to convey the target URI and method of the request, and the | |||
converted to lowercase prior to their encoding in HTTP/2. A request | status code for the response, HTTP/2 uses special pseudo-headers | |||
or response containing uppercase header field names MUST be treated | beginning with ":" for these tasks. | |||
as malformed (Section 8.1.3.5). | ||||
Just as in HTTP/1.x, header field names are strings of ASCII | ||||
characters that are compared in a case-insensitive fashion. However, | ||||
header field names MUST be converted to lowercase prior to their | ||||
encoding in HTTP/2. A request or response containing uppercase | ||||
header field names MUST be treated as malformed (Section 8.1.3.5). | ||||
HTTP/2 does not use the Connection header field to indicate "hop-by- | HTTP/2 does not use the Connection header field to indicate "hop-by- | |||
hop" header fields; in this protocol, connection-specific metadata is | hop" header fields; in this protocol, connection-specific metadata is | |||
conveyed by other means. As such, a HTTP/2 message containing | conveyed by other means. As such, a HTTP/2 message containing | |||
Connection MUST be treated as malformed (Section 8.1.3.5). | Connection MUST be treated as malformed (Section 8.1.3.5). | |||
This means that an intermediary transforming a HTTP/1.x message to | This means that an intermediary transforming an HTTP/1.x message to | |||
HTTP/2 will need to remove any header fields nominated by the | HTTP/2 will need to remove any header fields nominated by the | |||
Connection header field, along with the Connection header field | Connection header field, along with the Connection header field | |||
itself. Such intermediaries SHOULD also remove other connection- | itself. Such intermediaries SHOULD also remove other connection- | |||
specific header fields, such as Keep-Alive, Proxy-Connection, | specific header fields, such as Keep-Alive, Proxy-Connection, | |||
Transfer-Encoding and Upgrade, even if they are not nominated by | Transfer-Encoding and Upgrade, even if they are not nominated by | |||
Connection. | Connection. | |||
One exception to this is the TE header field, which MAY be present in | One exception to this is the TE header field, which MAY be present in | |||
a HTTP/2 request, but when it is MUST NOT contain any value other | an HTTP/2 request, but when it is MUST NOT contain any value other | |||
than "trailers". | than "trailers". | |||
Note: HTTP/2 purposefully does not support upgrade to another | Note: HTTP/2 purposefully does not support upgrade to another | |||
protocol. The handshake methods described in Section 3 are | protocol. The handshake methods described in Section 3 are | |||
believed sufficient to negotiate the use of alternative protocols. | believed sufficient to negotiate the use of alternative protocols. | |||
8.1.3.1. Request Header Fields | 8.1.3.1. Request Header Fields | |||
HTTP/2 defines a number of header fields starting with a colon ':' | HTTP/2 defines a number of header fields starting with a colon ':' | |||
character that carry information about the request target: | character that carry information about the request target: | |||
o The ":method" header field includes the HTTP method ([HTTP-p2], | o The ":method" header field includes the HTTP method ([HTTP-p2], | |||
Section 4). | Section 4). | |||
o The ":scheme" header field includes the scheme portion of the | o The ":scheme" header field includes the scheme portion of the | |||
target URI ([RFC3986], Section 3.1). | target URI ([RFC3986], Section 3.1). | |||
":scheme" is not restricted to "http" and "https" schemed URIs. A | ||||
proxy or gateway can translate requests for non-HTTP schemes, | ||||
enabling the use of HTTP to interact with non-HTTP services. | ||||
o The ":authority" header field includes the authority portion of | o The ":authority" header field includes the authority portion of | |||
the target URI ([RFC3986], Section 3.2). The authority MUST NOT | the target URI ([RFC3986], Section 3.2). The authority MUST NOT | |||
include the deprecated "userinfo" subcomponent for "http:" or | include the deprecated "userinfo" subcomponent for "http" or | |||
"https:" URIs. | "https" schemed URIs. | |||
To ensure that the HTTP/1.1 request line can be reproduced | To ensure that the HTTP/1.1 request line can be reproduced | |||
accurately, this header field MUST be omitted when translating | accurately, this header field MUST be omitted when translating | |||
from an HTTP/1.1 request that has a request target in origin or | from an HTTP/1.1 request that has a request target in origin or | |||
asterisk form (see [HTTP-p1], Section 5.3). Clients that generate | asterisk form (see [HTTP-p1], Section 5.3). Clients that generate | |||
HTTP/2 requests directly SHOULD instead omit the "Host" header | HTTP/2 requests directly SHOULD instead omit the "Host" header | |||
field. An intermediary that converts a request to HTTP/1.1 MUST | field. An intermediary that converts an HTTP/2 request to | |||
create a "Host" header field if one is not present in a request by | HTTP/1.1 MUST create a "Host" header field if one is not present | |||
copying the value of the ":authority" header field. | in a request by copying the value of the ":authority" header | |||
field. | ||||
o The ":path" header field includes the path and query parts of the | o The ":path" header field includes the path and query parts of the | |||
target URI (the "path-absolute" production from [RFC3986] and | target URI (the "path-absolute" production from [RFC3986] and | |||
optionally a '?' character followed by the "query" production, see | optionally a '?' character followed by the "query" production, see | |||
[RFC3986], Section 3.3 and [RFC3986], Section 3.4). This field | [RFC3986], Section 3.3 and [RFC3986], Section 3.4). This field | |||
MUST NOT be empty; URIs that do not contain a path component MUST | MUST NOT be empty; URIs that do not contain a path component MUST | |||
include a value of '/', unless the request is an OPTIONS request | include a value of '/', unless the request is an OPTIONS request | |||
in asterisk form, in which case the ":path" header field MUST | in asterisk form, in which case the ":path" header field MUST | |||
include '*'. | include '*'. | |||
skipping to change at page 50, line 22 | skipping to change at page 57, line 31 | |||
status code field (see [HTTP-p2], Section 6). This header field MUST | status code field (see [HTTP-p2], Section 6). This header field MUST | |||
be included in all responses, otherwise the response is malformed | be included in all responses, otherwise the response is malformed | |||
(Section 8.1.3.5). | (Section 8.1.3.5). | |||
HTTP/2 does not define a way to carry the version or reason phrase | HTTP/2 does not define a way to carry the version or reason phrase | |||
that is included in an HTTP/1.1 status line. | that is included in an HTTP/1.1 status line. | |||
8.1.3.3. Header Field Ordering | 8.1.3.3. Header Field Ordering | |||
HTTP Header Compression [COMPRESSION] does not preserve the order of | HTTP Header Compression [COMPRESSION] does not preserve the order of | |||
header fields. The relative order of header fields with different | header fields, because the relative order of header fields with | |||
names is not important. However, the same header field can be | different names is not important. However, the same header field can | |||
repeated to form a comma-separated list (see [HTTP-p1], Section | be repeated to form a list (see [HTTP-p1], Section 3.2.2), where the | |||
3.2.2), where the relative order of header field values is | relative order of header field values is significant. This | |||
significant. This repetition can occur either as a single header | repetition can occur either as a single header field with a comma- | |||
field with a comma-separated list of values, or as several header | separated list of values, or as several header fields with a single | |||
fields with a single value, or any combination thereof. | value, or any combination thereof. Therefore, in the latter case, | |||
ordering needs to be preserved before compression takes place. | ||||
To preserve the order of a comma-separated list, the ordered values | To preserve the order of multiple occurrences of a header field with | |||
for a single header field name appearing in different header fields | the same name, its ordered values are concatenated into a single | |||
are concatenated into a single value. A zero-valued octet (0x0) is | value using a zero-valued octet (0x0) to delimit them. | |||
used to delimit multiple values. | ||||
After decompression, header fields that have values containing zero | After decompression, header fields that have values containing zero | |||
octets (0x0) MUST be split into multiple header fields before being | octets (0x0) MUST be split into multiple header fields before being | |||
processed. | processed. | |||
For example, the following HTTP/1.x header block: | ||||
Content-Type: text/html | ||||
Cache-Control: max-age=60, private | ||||
Cache-Control: must-revalidate | ||||
contains three Cache-Control directives; two in the first Cache- | ||||
Control header field, and the last one in the second Cache-Control | ||||
field. Before compression, they would need to be converted to a form | ||||
similar to this (with 0x0 represented as "\0"): | ||||
cache-control: max-age=60, private\0must-revalidate | ||||
content-type: text/html | ||||
Note here that the ordering between Content-Type and Cache-Control is | ||||
not preserved, but the relative ordering of the Cache-Control | ||||
directives -- as well as the fact that the first two were comma- | ||||
separated, while the last was on a different line -- is. | ||||
Header fields containing multiple values MUST be concatenated into a | Header fields containing multiple values MUST be concatenated into a | |||
single value unless the ordering of that header field is known to be | single value unless the ordering of that header field is known to be | |||
not significant. | insignificant. | |||
The special case of "set-cookie" - which does not form a comma- | The special case of "set-cookie" - which does not form a comma- | |||
separated list, but can have multiple values - does not depend on | separated list, but can have multiple values - does not depend on | |||
ordering. The "set-cookie" header field MAY be encoded as multiple | ordering. The "set-cookie" header field MAY be encoded as multiple | |||
header field values, or as a single concatenated value. | header field values, or as a single concatenated value. | |||
8.1.3.4. Compressing the Cookie Header Field | 8.1.3.4. Compressing the Cookie Header Field | |||
The Cookie header field [COOKIE] can carry a significant amount of | The Cookie header field [COOKIE] can carry a significant amount of | |||
redundant data. | redundant data. | |||
skipping to change at page 51, line 22 | skipping to change at page 59, line 5 | |||
To allow for better compression efficiency, the Cookie header field | To allow for better compression efficiency, the Cookie header field | |||
MAY be split into separate header fields, each with one or more | MAY be split into separate header fields, each with one or more | |||
cookie-pairs. If there are multiple Cookie header fields after | cookie-pairs. If there are multiple Cookie header fields after | |||
decompression, these MUST be concatenated into a single octet string | decompression, these MUST be concatenated into a single octet string | |||
using the two octet delimiter of 0x3B, 0x20 (the ASCII string "; "). | using the two octet delimiter of 0x3B, 0x20 (the ASCII string "; "). | |||
The Cookie header field MAY be split using a zero octet (0x0), as | The Cookie header field MAY be split using a zero octet (0x0), as | |||
defined in Section 8.1.3.3. When decoding, zero octets MUST be | defined in Section 8.1.3.3. When decoding, zero octets MUST be | |||
replaced with the cookie delimiter ("; "). | replaced with the cookie delimiter ("; "). | |||
8.1.3.5. Malformed Requests and Responses | 8.1.3.5. Malformed Messages | |||
A malformed request or response is one that uses a valid sequence of | A malformed request or response is one that uses a valid sequence of | |||
HTTP/2 frames, but is otherwise invalid due to the presence of | HTTP/2 frames, but is otherwise invalid due to the presence of | |||
prohibited header fields, the absence of mandatory header fields, or | prohibited header fields, the absence of mandatory header fields, or | |||
the inclusion of uppercase header field names. | the inclusion of uppercase header field names. | |||
A request or response that includes an entity body can include a | A request or response that includes an entity body can include a | |||
"content-length" header field. A request or response is also | "content-length" header field. A request or response is also | |||
malformed if the value of a "content-length" header field does not | malformed if the value of a "content-length" header field does not | |||
equal the sum of the DATA frame payload lengths that form the body. | equal the sum of the DATA frame payload lengths that form the body. | |||
Intermediaries that process HTTP requests or responses (i.e., all | Intermediaries that process HTTP requests or responses (i.e., all | |||
intermediaries other than those acting as tunnels) MUST NOT forward a | intermediaries other than those acting as tunnels) MUST NOT forward a | |||
malformed request or response. | malformed request or response. | |||
Implementations that detect malformed requests or responses need to | Implementations that detect malformed requests or responses need to | |||
ensure that the stream ends. For malformed requests, a server MAY | ensure that the stream ends. For malformed requests, a server MAY | |||
send an HTTP response prior to closing or resetting the stream. | send an HTTP response prior to closing or resetting the stream. | |||
Clients MUST NOT accept a malformed response. | Clients MUST NOT accept a malformed response. Note that these | |||
requirements are intended to protect against several types of common | ||||
attacks against HTTP; they are deliberately strict, because being | ||||
permissive can expose implementations to these vulnerabilites. | ||||
8.1.4. Request Reliability Mechanisms in HTTP/2 | 8.1.4. Request Reliability Mechanisms in HTTP/2 | |||
In HTTP/1.1, an HTTP client is unable to retry a non-idempotent | In HTTP/1.1, an HTTP client is unable to retry a non-idempotent | |||
request when an error occurs, because there is no means to determine | request when an error occurs, because there is no means to determine | |||
the nature of the error. It is possible that some server processing | the nature of the error. It is possible that some server processing | |||
occurred prior to the error, which could result in undesirable | occurred prior to the error, which could result in undesirable | |||
effects if the request were reattempted. | effects if the request were reattempted. | |||
HTTP/2 provides two mechanisms for providing a guarantee to a client | HTTP/2 provides two mechanisms for providing a guarantee to a client | |||
skipping to change at page 52, line 14 | skipping to change at page 59, line 49 | |||
o The GOAWAY frame indicates the highest stream number that might | o The GOAWAY frame indicates the highest stream number that might | |||
have been processed. Requests on streams with higher numbers are | have been processed. Requests on streams with higher numbers are | |||
therefore guaranteed to be safe to retry. | therefore guaranteed to be safe to retry. | |||
o The REFUSED_STREAM error code can be included in a RST_STREAM | o The REFUSED_STREAM error code can be included in a RST_STREAM | |||
frame to indicate that the stream is being closed prior to any | frame to indicate that the stream is being closed prior to any | |||
processing having occurred. Any request that was sent on the | processing having occurred. Any request that was sent on the | |||
reset stream can be safely retried. | reset stream can be safely retried. | |||
Clients MUST NOT treat requests that have not been processed as | Requests that have not been processed have not failed; clients MAY | |||
having failed. Clients MAY automatically retry these requests, | automatically retry them, even those with non-idempotent methods. | |||
including those with non-idempotent methods. | ||||
A server MUST NOT indicate that a stream has not been processed | A server MUST NOT indicate that a stream has not been processed | |||
unless it can guarantee that fact. If frames that are on a stream | unless it can guarantee that fact. If frames that are on a stream | |||
are passed to the application layer for any stream, then | are passed to the application layer for any stream, then | |||
REFUSED_STREAM MUST NOT be used for that stream, and a GOAWAY frame | REFUSED_STREAM MUST NOT be used for that stream, and a GOAWAY frame | |||
MUST include a stream identifier that is greater than or equal to the | MUST include a stream identifier that is greater than or equal to the | |||
given stream identifier. | given stream identifier. | |||
In addition to these mechanisms, the PING frame provides a way for a | In addition to these mechanisms, the PING frame provides a way for a | |||
client to easily test a connection. Connections that remain idle can | client to easily test a connection. Connections that remain idle can | |||
become broken as some middleboxes (for instance, network address | become broken as some middleboxes (for instance, network address | |||
translators, or load balancers) silently discard connection bindings. | translators, or load balancers) silently discard connection bindings. | |||
The PING frame allows a client to safely test whether a connection is | The PING frame allows a client to safely test whether a connection is | |||
still active without sending a request. | still active without sending a request. | |||
8.2. Server Push | 8.2. Server Push | |||
HTTP/2 enables a server to pre-emptively send (or "push") multiple | HTTP/2 enables a server to pre-emptively send (or "push") one or more | |||
associated resources to a client in response to a single request. | associated responses to a client in response to a single request. | |||
This feature becomes particularly helpful when the server knows the | This feature becomes particularly helpful when the server knows the | |||
client will need to have those resources available in order to fully | client will need to have those responses available in order to fully | |||
process the originally requested resource. | process the response to the original request. | |||
Pushing additional resources is optional, and is negotiated only | Pushing additional responses is optional, and is negotiated between | |||
between individual endpoints. The SETTINGS_ENABLE_PUSH setting can | individual endpoints. The SETTINGS_ENABLE_PUSH setting can be set to | |||
be set to 0 to indicate that server push is disabled. Even if | 0 to indicate that server push is disabled. | |||
enabled, an intermediary could receive pushed resources from the | ||||
server but could choose not to forward those on to the client. How | ||||
to make use of the pushed resources is up to that intermediary. | ||||
Equally, the intermediary might choose to push additional resources | ||||
to the client, without any action taken by the server. | ||||
A client cannot push resources. Clients and servers MUST operate as | Because pushing responses is effectively hop-by-hop, an intermediary | |||
though the server has disabled PUSH_PROMISE by setting the | could receive pushed responses from the server and choose not to | |||
SETTINGS_ENABLE_PUSH to 0. As a consequence, servers MUST treat the | forward those on to the client. In other words, how to make use of | |||
receipt of a PUSH_PROMISE frame as a connection error | the pushed responses is up to that intermediary. Equally, the | |||
(Section 5.4.1). Clients MUST reject any attempt to change this | intermediary might choose to push additional responses to the client, | |||
setting by treating the message as a connection error (Section 5.4.1) | without any action taken by the server. | |||
of type PROTOCOL_ERROR. | ||||
A server can only push requests that are safe (see [HTTP-p2], Section | A client cannot push. Thus, servers MUST treat the receipt of a | |||
4.2.1), cacheable (see [HTTP-p6], Section 3) and do not include a | PUSH_PROMISE frame as a connection error (Section 5.4.1). Clients | |||
request body. | MUST reject any attempt to change the SETTINGS_ENABLE_PUSH setting to | |||
a value other than "0" by treating the message as a connection error | ||||
(Section 5.4.1) of type PROTOCOL_ERROR. | ||||
A server can only push responses that are cacheable (see [HTTP-p6], | ||||
Section 3); promised requests MUST be safe (see [HTTP-p2], Section | ||||
4.2.1) and MUST NOT include a request body. | ||||
8.2.1. Push Requests | 8.2.1. Push Requests | |||
Server push is semantically equivalent to a server responding to a | Server push is semantically equivalent to a server responding to a | |||
request. The PUSH_PROMISE frame, or frames, sent by the server | request; however, in this case that request is also sent by the | |||
includes a header block that contains a complete set of request | server, as a PUSH_PROMISE frame. | |||
header fields that the server attributes to the request. It is not | ||||
possible to push a response to a request that includes a request | ||||
body. | ||||
Pushed resources are always associated with an explicit request from | The PUSH_PROMISE frame includes a header block that contains a | |||
a client. The PUSH_PROMISE frames sent by the server are sent on the | complete set of request header fields that the server attributes to | |||
stream created for the original request. The PUSH_PROMISE frame | the request. It is not possible to push a response to a request that | |||
includes a promised stream identifier, chosen from the stream | includes a request body. | |||
identifiers available to the server (see Section 5.1.1). | ||||
Pushed responses are always associated with an explicit request from | ||||
the client. The PUSH_PROMISE frames sent by the server are sent on | ||||
that explicit request's stream. The PUSH_PROMISE frame also includes | ||||
a promised stream identifier, chosen from the stream identifiers | ||||
available to the server (see Section 5.1.1). | ||||
The header fields in PUSH_PROMISE and any subsequent CONTINUATION | The header fields in PUSH_PROMISE and any subsequent CONTINUATION | |||
frames MUST be a valid and complete set of request header fields | frames MUST be a valid and complete set of request header fields | |||
(Section 8.1.3.1). The server MUST include a method in the ":method" | (Section 8.1.3.1). The server MUST include a method in the ":method" | |||
header field that is safe and cacheable. If a client receives a | header field that is safe and cacheable. If a client receives a | |||
PUSH_PROMISE that does not include a complete and valid set of header | PUSH_PROMISE that does not include a complete and valid set of header | |||
fields, or the ":method" header field identifies a method that is not | fields, or the ":method" header field identifies a method that is not | |||
safe, it MUST respond with a stream error (Section 5.4.2) of type | safe, it MUST respond with a stream error (Section 5.4.2) of type | |||
PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
The server SHOULD send PUSH_PROMISE (Section 6.6) frames prior to | The server SHOULD send PUSH_PROMISE (Section 6.6) frames prior to | |||
sending any frames that reference the promised resources. This | sending any frames that reference the promised responses. This | |||
avoids a race where clients issue requests for resources prior to | avoids a race where clients issue requests prior to receiving any | |||
receiving any PUSH_PROMISE frames. | PUSH_PROMISE frames. | |||
For example, if the server receives a request for a document | For example, if the server receives a request for a document | |||
containing embedded links to multiple image files, and the server | containing embedded links to multiple image files, and the server | |||
chooses to push those additional images to the client, sending push | chooses to push those additional images to the client, sending push | |||
promises before the DATA frames that contain the image links ensures | promises before the DATA frames that contain the image links ensures | |||
that the client is able to see the promises before discovering the | that the client is able to see the promises before discovering | |||
resources. Similarly, if the server pushes resources referenced by | embedded links. Similarly, if the server pushes responses referenced | |||
the header block (for instance, in Link header fields), sending the | by the header block (for instance, in Link header fields), sending | |||
push promises before sending the header block ensures that clients do | the push promises before sending the header block ensures that | |||
not request those resources. | clients do not request them. | |||
PUSH_PROMISE frames MUST NOT be sent by the client. PUSH_PROMISE | PUSH_PROMISE frames MUST NOT be sent by the client. PUSH_PROMISE | |||
frames can be sent by the server on any stream that was opened by the | frames can be sent by the server on any stream that was opened by the | |||
client. They MUST be sent on a stream that is in either the "open" | client. They MUST be sent on a stream that is in either the "open" | |||
or "half closed (remote)" state to the server. PUSH_PROMISE frames | or "half closed (remote)" state to the server. PUSH_PROMISE frames | |||
are interspersed with the frames that comprise a response, though | are interspersed with the frames that comprise a response, though | |||
they cannot be interspersed with HEADERS and CONTINUATION frames that | they cannot be interspersed with HEADERS and CONTINUATION frames that | |||
comprise a single header block. | comprise a single header block. | |||
8.2.2. Push Responses | 8.2.2. Push Responses | |||
After sending the PUSH_PROMISE frame, the server can begin delivering | After sending the PUSH_PROMISE frame, the server can begin delivering | |||
the pushed resource as a response (Section 8.1.3.2) on a server- | the pushed response as a response (Section 8.1.3.2) on a server- | |||
initiated stream that uses the promised stream identifier. The | initiated stream that uses the promised stream identifier. The | |||
server uses this stream to transmit an HTTP response, using the same | server uses this stream to transmit an HTTP response, using the same | |||
sequence of frames as defined in Section 8.1. This stream becomes | sequence of frames as defined in Section 8.1. This stream becomes | |||
"half closed" to the client (Section 5.1) after the initial HEADERS | "half closed" to the client (Section 5.1) after the initial HEADERS | |||
frame is sent. | frame is sent. | |||
Once a client receives a PUSH_PROMISE frame and chooses to accept the | Once a client receives a PUSH_PROMISE frame and chooses to accept the | |||
pushed resource, the client SHOULD NOT issue any requests for the | pushed response, the client SHOULD NOT issue any requests for the | |||
promised resource until after the promised stream has closed. | promised response until after the promised stream has closed. | |||
If the client determines, for any reason, that it does not wish to | If the client determines, for any reason, that it does not wish to | |||
receive the pushed resource from the server, or if the server takes | receive the pushed response from the server, or if the server takes | |||
too long to begin sending the promised resource, the client can send | too long to begin sending the promised response, the client can send | |||
an RST_STREAM frame, using either the CANCEL or REFUSED_STREAM codes, | an RST_STREAM frame, using either the CANCEL or REFUSED_STREAM codes, | |||
and referencing the pushed stream's identifier. | and referencing the pushed stream's identifier. | |||
A client can use the SETTINGS_MAX_CONCURRENT_STREAMS setting to limit | A client can use the SETTINGS_MAX_CONCURRENT_STREAMS setting to limit | |||
the number of resources that can be concurrently pushed by a server. | the number of responses that can be concurrently pushed by a server. | |||
Advertising a SETTINGS_MAX_CONCURRENT_STREAMS value of zero disables | Advertising a SETTINGS_MAX_CONCURRENT_STREAMS value of zero disables | |||
server push by preventing the server from creating the necessary | server push by preventing the server from creating the necessary | |||
streams. This does not prohibit a server from sending PUSH_PROMISE | streams. This does not prohibit a server from sending PUSH_PROMISE | |||
frames; clients need to reset any promised streams that are not | frames; clients need to reset any promised streams that are not | |||
wanted. | wanted. | |||
Clients receiving a pushed response MUST validate that the server is | Clients receiving a pushed response MUST validate that the server is | |||
authorized to push the resource using the same-origin policy | authorized to provide the response, see Section 10.1. For example, | |||
([RFC6454], Section 3). For example, a HTTP/2 connection to | an server that offers a certificate for only the "example.com" DNS-ID | |||
"example.com" is generally [[anchor15: Ed: weaselly use of | or Common Name is not permitted to push a response for | |||
"generally", needs better definition]] not permitted to push a | "https://www.example.org/doc". | |||
response for "www.example.org". | ||||
8.3. The CONNECT Method | 8.3. The CONNECT Method | |||
The HTTP pseudo-method CONNECT ([HTTP-p2], Section 4.3.6) is used to | In HTTP/1.x, the pseudo-method CONNECT ([HTTP-p2], Section 4.3.6) is | |||
convert an HTTP/1.1 connection into a tunnel to a remote host. | used to convert an HTTP connection into a tunnel to a remote host. | |||
CONNECT is primarily used with HTTP proxies to establish a TLS | CONNECT is primarily used with HTTP proxies to establish a TLS | |||
session with a server for the purposes of interacting with "https" | session with an origin server for the purposes of interacting with | |||
resources. | "https" resources. | |||
In HTTP/2, the CONNECT method is used to establish a tunnel over a | In HTTP/2, the CONNECT method is used to establish a tunnel over a | |||
single HTTP/2 stream to a remote host. The HTTP header field mapping | single HTTP/2 stream to a remote host, for similar purposes. The | |||
works as mostly as defined in Request Header Fields | HTTP header field mapping works as mostly as defined in Request | |||
(Section 8.1.3.1), with a few differences. Specifically: | Header Fields (Section 8.1.3.1), with a few differences. | |||
Specifically: | ||||
o The ":method" header field is set to "CONNECT". | o The ":method" header field is set to "CONNECT". | |||
o The ":scheme" and ":path" header fields MUST be omitted. | o The ":scheme" and ":path" header fields MUST be omitted. | |||
o The ":authority" header field contains the host and port to | o The ":authority" header field contains the host and port to | |||
connect to (equivalent to the authority-form of the request-target | connect to (equivalent to the authority-form of the request-target | |||
of CONNECT requests, see [HTTP-p1], Section 5.3). | of CONNECT requests, see [HTTP-p1], Section 5.3). | |||
A proxy that supports CONNECT, establishes a TCP connection [TCP] to | A proxy that supports CONNECT establishes a TCP connection [TCP] to | |||
the server identified in the ":authority" header field. Once this | the server identified in the ":authority" header field. Once this | |||
connection is successfully established, the proxy sends a HEADERS | connection is successfully established, the proxy sends a HEADERS | |||
frame containing a 2xx series status code, as defined in [HTTP-p2], | frame containing a 2xx series status code to the client, as defined | |||
Section 4.3.6. | in [HTTP-p2], Section 4.3.6. | |||
After the initial HEADERS frame sent by each peer, all subsequent | After the initial HEADERS frame sent by each peer, all subsequent | |||
DATA frames correspond to data sent on the TCP connection. The | DATA frames correspond to data sent on the TCP connection. The | |||
payload of any DATA frames sent by the client are transmitted by the | payload of any DATA frames sent by the client are transmitted by the | |||
proxy to the TCP server; data received from the TCP server is | proxy to the TCP server; data received from the TCP server is | |||
assembled into DATA frames by the proxy. Frame types other than DATA | assembled into DATA frames by the proxy. Frame types other than DATA | |||
or stream management frames (RST_STREAM, WINDOW_UPDATE, and PRIORITY) | or stream management frames (RST_STREAM, WINDOW_UPDATE, and PRIORITY) | |||
MUST NOT be sent on a connected stream, and MUST be treated as a | MUST NOT be sent on a connected stream, and MUST be treated as a | |||
stream error (Section 5.4.2) if received. | stream error (Section 5.4.2) if received. | |||
skipping to change at page 56, line 20 | skipping to change at page 64, line 7 | |||
9.1. Connection Management | 9.1. Connection Management | |||
HTTP/2 connections are persistent. For best performance, it is | HTTP/2 connections are persistent. For best performance, it is | |||
expected clients will not close connections until it is determined | expected clients will not close connections until it is determined | |||
that no further communication with a server is necessary (for | that no further communication with a server is necessary (for | |||
example, when a user navigates away from a particular web page), or | example, when a user navigates away from a particular web page), or | |||
until the server closes the connection. | until the server closes the connection. | |||
Clients SHOULD NOT open more than one HTTP/2 connection to a given | Clients SHOULD NOT open more than one HTTP/2 connection to a given | |||
origin ([RFC6454]) concurrently. A client can create additional | destination, where a destination is the IP address and port that is | |||
connections as replacements, either to replace connections that are | derived from a URI, a selected alternative service [ALT-SVC], or a | |||
near to exhausting the available stream identifiers (Section 5.1.1), | configured proxy. A client can create additional connections as | |||
or to replace connections that have encountered errors | replacements, either to replace connections that are near to | |||
(Section 5.4.1). | exhausting the available stream identifier space (Section 5.1.1), or | |||
to replace connections that have encountered errors (Section 5.4.1). | ||||
Clients MAY use a single connection for more than one origin when | A client MAY open multiple connections to the same IP address and TCP | |||
each origin's hostname resolves to the same IP address, and they | port using different Server Name Indication [TLS-EXT] values or to | |||
share the same port. For "https" scheme origins, the server's | provide different TLS client certificates, but SHOULD avoid creating | |||
certificate MUST be valid for each origin's hostname. The | multiple connections with the same configuration. [[anchor15: Need | |||
considerations in RFC 6125 [RFC6125] for verification of identity | more text on how client certificates relate here, see issue #363.]] | |||
apply. | ||||
Clients MAY use a single server connection to send requests for URIs | ||||
with multiple different authority components as long as the server is | ||||
authoritative (Section 10.1). | ||||
Servers are encouraged to maintain open connections for as long as | Servers are encouraged to maintain open connections for as long as | |||
possible, but are permitted to terminate idle connections if | possible, but are permitted to terminate idle connections if | |||
necessary. When either endpoint chooses to close the transport-level | necessary. When either endpoint chooses to close the transport-level | |||
TCP connection, the terminating endpoint SHOULD first send a GOAWAY | TCP connection, the terminating endpoint SHOULD first send a GOAWAY | |||
(Section 6.8) frame so that both endpoints can reliably determine | (Section 6.8) frame so that both endpoints can reliably determine | |||
whether previously sent frames have been processed and gracefully | whether previously sent frames have been processed and gracefully | |||
complete or terminate any necessary remaining tasks. | complete or terminate any necessary remaining tasks. | |||
9.2. Use of TLS Features | 9.2. Use of TLS Features | |||
skipping to change at page 57, line 9 | skipping to change at page 64, line 49 | |||
[TLS-EXT] extension to TLS. HTTP/2 clients MUST indicate the target | [TLS-EXT] extension to TLS. HTTP/2 clients MUST indicate the target | |||
domain name when negotiating TLS. | domain name when negotiating TLS. | |||
The TLS implementation MUST disable compression. TLS compression can | The TLS implementation MUST disable compression. TLS compression can | |||
lead to the exposure of information that would not otherwise be | lead to the exposure of information that would not otherwise be | |||
revealed [RFC3749]. Generic compression is unnecessary since HTTP/2 | revealed [RFC3749]. Generic compression is unnecessary since HTTP/2 | |||
provides compression features that are more aware of context and | provides compression features that are more aware of context and | |||
therefore likely to be more appropriate for use for performance, | therefore likely to be more appropriate for use for performance, | |||
security or other reasons. | security or other reasons. | |||
Implementations MUST negotiate ephemeral cipher suites (DHE or ECDHE) | Implementations MUST negotiate - and therefore use - ephemeral cipher | |||
with a minimum size of 2048 bits (DHE) or security level of 128 bits | suites, such as ephemeral Diffie-Hellman (DHE) or the elliptic curve | |||
(ECDHE). Clients MUST accept DHE sizes of up to 4096 bits. | variant (ECDHE) with a minimum size of 2048 bits (DHE) or security | |||
level of 128 bits (ECDHE). Clients MUST accept DHE sizes of up to | ||||
4096 bits. | ||||
Implementations are encouraged not to negotiate TLS cipher suites | ||||
with known vulnerabilities, such as [RC4]. | ||||
An implementation that negotiates a TLS connection that does not meet | An implementation that negotiates a TLS connection that does not meet | |||
the requirements in this section, or any policy-based constraints, | the requirements in this section, or any policy-based constraints, | |||
SHOULD NOT negotiate HTTP/2. Removing HTTP/2 protocols from | SHOULD NOT negotiate HTTP/2. Removing HTTP/2 protocols from | |||
consideration could result in the removal of all protocols from the | consideration could result in the removal of all protocols from the | |||
set of protocols offered by the client. This causes protocol | set of protocols offered by the client. This causes protocol | |||
negotiation failure, as described in Section 3.2 of [TLSALPN]. | negotiation failure, as described in Section 3.2 of [TLSALPN]. | |||
Due to implementation limitations, it might not be possible to fail | Due to implementation limitations, it might not be possible to fail | |||
TLS negotiation based on all of these requirements. An endpoint MUST | TLS negotiation based on all of these requirements. An endpoint MUST | |||
terminate a HTTP/2 connection that is opened on a TLS session that | terminate an HTTP/2 connection that is opened on a TLS session that | |||
does not meet these minimum requirements with a connection error | does not meet these minimum requirements with a connection error | |||
(Section 5.4.1) of type INADEQUATE_SECURITY. | (Section 5.4.1) of type INADEQUATE_SECURITY. | |||
Implementations are encouraged not to negotiate TLS cipher suites | ||||
with known vulnerabilities, such as [RC4]. | ||||
9.3. GZip Content-Encoding | 9.3. GZip Content-Encoding | |||
Clients MUST support gzip compression for HTTP response bodies. | Clients MUST support gzip compression for HTTP response bodies. | |||
Regardless of the value of the accept-encoding header field, a server | Regardless of the value of the accept-encoding header field, a server | |||
MAY send responses with gzip or deflate encoding. A compressed | MAY send responses with gzip encoding. A compressed response MUST | |||
response MUST still bear an appropriate content-encoding header | still bear an appropriate content-encoding header field. | |||
field. | ||||
10. Security Considerations | This effectively changes the implicit value of the Accept-Encoding | |||
header field ([HTTP-p2], Section 5.3.4) from "identity" to "identity, | ||||
gzip", however gzip encoding cannot be suppressed by including | ||||
";q=0". Intermediaries that perform translation from HTTP/2 to | ||||
HTTP/1.1 MUST decompress payloads unless the request includes an | ||||
Accept-Encoding value that includes "gzip". | ||||
10.1. Server Authority and Same-Origin | 10. Security Considerations | |||
This specification uses the same-origin policy ([RFC6454], Section 3) | 10.1. Server Authority | |||
to determine whether an origin server is permitted to provide | ||||
content. | ||||
A server that is contacted using TLS is authenticated based on the | A client is only able to accept HTTP/2 responses from servers that | |||
certificate that it offers in the TLS handshake (see [RFC2818], | are authoritative for those resources. This is particularly | |||
Section 3). A server is considered authoritative for an "https" | important for server push (Section 8.2), where the client validates | |||
resource if it has been successfully authenticated for the domain | the PUSH_PROMISE before accepting the response. | |||
part of the origin of the resource that it is providing. | ||||
A server is considered authoritative for an "http" resource if the | HTTP/2 relies on the HTTP/1.1 definition of authority for determining | |||
connection is established to a resolved IP address for the domain in | whether a server is authoritative in providing a given response, see | |||
the origin of the resource. | [HTTP-p1], Section 9.1). This relies on local name resolution for | |||
the "http" URI scheme, and the offered server identity for the | ||||
"https" scheme (see [RFC2818], Section 3). | ||||
A client MUST NOT use, in any way, resources provided by a server | A client MUST NOT use, in any way, resources provided by a server | |||
that is not authoritative for those resources. | that is not authoritative for those resources. | |||
10.2. Cross-Protocol Attacks | 10.2. Cross-Protocol Attacks | |||
When using TLS, we believe that HTTP/2 introduces no new cross- | In a cross-protocol attack, an attacker causes a client to initiate a | |||
protocol attacks. TLS encrypts the contents of all transmission | transaction in one protocol toward a server that understands a | |||
(except the handshake itself), making it difficult for attackers to | different protocol. An attacker might be able to cause the | |||
control the data which could be used in a cross-protocol attack. | transaction to appear as valid transaction in the second protocol. | |||
[[anchor19: Issue: This is no longer true]] | In combination with the capabilities of the web context, this can be | |||
used to interact with poorly protected servers in private networks. | ||||
Completing a TLS handshake with an ALPN identifier for HTTP/2 can be | ||||
considered sufficient. ALPN provides a positive indication that a | ||||
server is willing to proceed with HTTP/2, which prevents attacks on | ||||
other TLS-based protocols. | ||||
The encryption in TLS makes it difficult for attackers to control the | ||||
data which could be used in a cross-protocol attack on a cleartext | ||||
protocol. | ||||
The cleartext version of HTTP/2 has minimal protection against cross- | ||||
protocol attacks. The connection preface (Section 3.5) contains a | ||||
string that is designed to confuse HTTP/1.1 servers, but no special | ||||
protection is offered for other protocols. A server that is willing | ||||
to ignore parts of an HTTP/1.1 request containing an Upgrade header | ||||
field could be exposed to a cross-protocol attack. | ||||
10.3. Intermediary Encapsulation Attacks | 10.3. Intermediary Encapsulation Attacks | |||
HTTP/2 header field names and values are encoded as sequences of | HTTP/2 header field names and values are encoded as sequences of | |||
octets with a length prefix. This enables HTTP/2 to carry any string | octets with a length prefix. This enables HTTP/2 to carry any string | |||
of octets as the name or value of a header field. An intermediary | of octets as the name or value of a header field. An intermediary | |||
that translates HTTP/2 requests or responses into HTTP/1.1 directly | that translates HTTP/2 requests or responses into HTTP/1.1 directly | |||
could permit the creation of corrupted HTTP/1.1 messages. An | could permit the creation of corrupted HTTP/1.1 messages. An | |||
attacker might exploit this behavior to cause the intermediary to | attacker might exploit this behavior to cause the intermediary to | |||
create HTTP/1.1 messages with illegal header fields, extra header | create HTTP/1.1 messages with illegal header fields, extra header | |||
fields, or even new messages that are entirely falsified. | fields, or even new messages that are entirely falsified. | |||
An intermediary that performs translation into HTTP/1.1 cannot alter | Header field names or values that contain characters not permitted by | |||
the semantics of requests or responses. In particular, header field | HTTP/1.1, including carriage return (U+000D) or line feed (U+000A) | |||
names or values that contain characters not permitted by HTTP/1.1, | MUST NOT be translated verbatim by an intermediary, as stipulated in | |||
including carriage return (U+000D) or line feed (U+000A) MUST NOT be | [HTTP-p1], Section 3.2.4. | |||
translated verbatim, as stipulated in [HTTP-p1], Section 3.2.4. | ||||
Translation from HTTP/1.x to HTTP/2 does not produce the same | Translation from HTTP/1.x to HTTP/2 does not produce the same | |||
opportunity to an attacker. Intermediaries that perform translation | opportunity to an attacker. Intermediaries that perform translation | |||
to HTTP/2 MUST remove any instances of the "obs-fold" production from | to HTTP/2 MUST remove any instances of the "obs-fold" production from | |||
header field values. | header field values. | |||
10.4. Cacheability of Pushed Resources | 10.4. Cacheability of Pushed Responses | |||
Pushed resources are responses without an explicit request from the | Pushed responses do not have an explicit request from the client; the | |||
client. Request header fields are provided by the server in the | request is provided by the server in the PUSH_PROMISE frame. | |||
PUSH_PROMISE frame. These header fields are provided so that | ||||
existing HTTP semantics can be applied. | ||||
Caching resources that are pushed is possible based on the guidance | Caching responses that are pushed is possible based on the guidance | |||
provided by the origin server in the Cache-Control header field. | provided by the origin server in the Cache-Control header field. | |||
However, this can cause issues if a single server hosts more than one | However, this can cause issues if a single server hosts more than one | |||
tenant. For example, a server might offer multiple users each a | tenant. For example, a server might offer multiple users each a | |||
small portion of its URI space. | small portion of its URI space. | |||
Where multiple tenants share space on the same server, that server | Where multiple tenants share space on the same server, that server | |||
MUST ensure that tenants are not able to push representations of | MUST ensure that tenants are not able to push representations of | |||
resources that they do not have authority over. Failure to enforce | resources that they do not have authority over. Failure to enforce | |||
this would allow a tenant to provide a representation that would be | this would allow a tenant to provide a representation that would be | |||
served out of cache, overriding the actual representation that the | served out of cache, overriding the actual representation that the | |||
authoritative tenant provides. | authoritative tenant provides. | |||
Pushed resources for which an origin server is not authoritative are | Pushed responses for which an origin server is not authoritative (see | |||
never cached or used. | Section 10.1) are never cached or used. | |||
10.5. Denial of Service Considerations | 10.5. Denial of Service Considerations | |||
An HTTP/2 connection can demand a greater commitment of resources to | An HTTP/2 connection can demand a greater commitment of resources to | |||
operate than a HTTP/1.1 connection. The use of header compression | operate than a HTTP/1.1 connection. The use of header compression | |||
and flow control depend on a commitment of resources for storing a | and flow control depend on a commitment of resources for storing a | |||
greater amount of state. Settings for these features ensure that | greater amount of state. Settings for these features ensure that | |||
memory commitments for these features are strictly bounded. | memory commitments for these features are strictly bounded. | |||
Processing capacity cannot be guarded in the same fashion. | Processing capacity cannot be guarded in the same fashion. | |||
The SETTINGS frame can be abused to cause a peer to expend additional | The SETTINGS frame can be abused to cause a peer to expend additional | |||
processing time. This might be done by pointlessly changing | processing time. This might be done by pointlessly changing SETTINGS | |||
settings, setting multiple undefined settings, or changing the same | parameters, setting multiple undefined parameters, or changing the | |||
setting multiple times in the same frame. Similarly, WINDOW_UPDATE | same setting multiple times in the same frame. WINDOW_UPDATE or | |||
or PRIORITY frames can be abused to cause an unnecessary waste of | PRIORITY frames can be abused to cause an unnecessary waste of | |||
resources. | resources. A server might erroneously issue ALTSVC frames for | |||
origins on which it cannot be authoritative to generate excess work | ||||
for clients. | ||||
Large numbers of small or empty frames can be abused to cause a peer | Large numbers of small or empty frames can be abused to cause a peer | |||
to expend time processing frame headers. Note however that some uses | to expend time processing frame headers. Note however that some uses | |||
are entirely legitimate, such as the sending of an empty DATA frame | are entirely legitimate, such as the sending of an empty DATA frame | |||
to end a stream. | to end a stream. | |||
Header compression also offers some opportunities to waste processing | Header compression also offers some opportunities to waste processing | |||
resources, see [COMPRESSION] for more details on potential abuses. | resources; see [COMPRESSION] for more details on potential abuses. | |||
Limits in settings cannot be reduced instantaneously, which leaves an | Limits in SETTINGS parameters cannot be reduced instantaneously, | |||
endpoint exposed to behavior from a peer that could exceed the new | which leaves an endpoint exposed to behavior from a peer that could | |||
limits. In particular, immediately after establishing a connection, | exceed the new limits. In particular, immediately after establishing | |||
limits set by a server are not known to clients and could be exceeded | a connection, limits set by a server are not known to clients and | |||
without being an obvious protocol violation. | could be exceeded without being an obvious protocol violation. | |||
In all these cases, there are legitimate reasons to use these | All these features - i.e., SETTINGS changes, small frames, header | |||
protocol mechanisms. These features become a burden only when they | compression - have legitimate uses. These features become a burden | |||
are used unnecessarily or to excess. | only when they are used unnecessarily or to excess. | |||
An endpoint that doesn't monitor this behavior exposes itself to a | An endpoint that doesn't monitor this behavior exposes itself to a | |||
risk of denial of service attack. Implementations SHOULD track the | risk of denial of service attack. Implementations SHOULD track the | |||
use of these features and set limits on their use. An endpoint MAY | use of these features and set limits on their use. An endpoint MAY | |||
treat activity that is suspicious as a connection error | treat activity that is suspicious as a connection error | |||
(Section 5.4.1) of type ENHANCE_YOUR_CALM. | (Section 5.4.1) of type ENHANCE_YOUR_CALM. | |||
10.6. Use of Padding | 10.6. Use of Compression | |||
HTTP/2 enables greater use of compression for both header fields | ||||
(Section 4.3) and response bodies (Section 9.3). Compression can | ||||
allow an attacker to recover secret data when it is compressed in the | ||||
same context as data under attacker control. | ||||
There are demonstrable attacks on compression that exploit the | ||||
characteristics of the web (e.g., [BREACH]). The attacker induces | ||||
multiple requests containing varying plaintext, observing the length | ||||
of the resulting ciphertext in each, which reveals a shorter length | ||||
when a guess about the secret is correct. | ||||
Implementations communicating on a secure channel MUST NOT compress | ||||
content that includes both confidential and attacker-controlled data | ||||
unless separate compression dictionaries are used for each source of | ||||
data. Compression MUST NOT be used if the source of data cannot be | ||||
reliably determined. | ||||
Further considerations regarding the compression of header fields are | ||||
described in [COMPRESSION]. | ||||
10.7. Use of Padding | ||||
Padding within HTTP/2 is not intended as a replacement for general | Padding within HTTP/2 is not intended as a replacement for general | |||
purpose padding, such as might be provided by TLS [TLS12]. Redundant | purpose padding, such as might be provided by TLS [TLS12]. Redundant | |||
padding could even be counterproductive. Correct application can | padding could even be counterproductive. Correct application can | |||
depend on having specific knowledge of the data that is being padded. | depend on having specific knowledge of the data that is being padded. | |||
To mitigate attacks that rely on compression, disabling compression | To mitigate attacks that rely on compression, disabling compression | |||
might be preferable to padding as a countermeasure. | might be preferable to padding as a countermeasure. | |||
Padding can be used to obscure the exact size of frame content. | Padding can be used to obscure the exact size of frame content, and | |||
Padding is provided to mitigate specific attacks within HTTP. For | is provided to mitigate specific attacks within HTTP. For example, | |||
example, attacks where compressed content includes both attacker- | attacks where compressed content includes both attacker-controlled | |||
controlled plaintext and secret data (see for example, [BREACH]). | plaintext and secret data (see for example, [BREACH]). | |||
Use of padding can result in less protection than might seem | Use of padding can result in less protection than might seem | |||
immediately obvious. At best, padding only makes it more difficult | immediately obvious. At best, padding only makes it more difficult | |||
for an attacker to infer length information by increasing the number | for an attacker to infer length information by increasing the number | |||
of frames an attacker has to observe. Incorrectly implemented | of frames an attacker has to observe. Incorrectly implemented | |||
padding schemes can be easily defeated. In particular, randomized | padding schemes can be easily defeated. In particular, randomized | |||
padding with a predictable distribution provides very little | padding with a predictable distribution provides very little | |||
protection; or padding payloads to a fixed size exposes information | protection; or padding payloads to a fixed size exposes information | |||
as payload sizes cross the fixed size boundary, which could be | as payload sizes cross the fixed size boundary, which could be | |||
possible if an attacker can control plaintext. | possible if an attacker can control plaintext. | |||
Intermediaries SHOULD NOT remove padding; though an intermediary | Intermediaries SHOULD NOT remove padding, though an intermediary MAY | |||
could remove padding and add differing amounts if the intent is to | remove padding and add differing amounts if the intent is to improve | |||
improve the protections padding affords. | the protections padding affords. | |||
11. Privacy Considerations | 10.8. Privacy Considerations | |||
HTTP/2 aims to keep connections open longer between clients and | Several characteristics of HTTP/2 provide an observer an opportunity | |||
servers in order to reduce the latency when a user makes a request. | to correlate actions of a single client or server over time. This | |||
The maintenance of these connections over time could be used to | includes the value of settings, the manner in which flow control | |||
expose private information. For example, a user using a browser | windows are managed, the way priorities are allocated to streams, | |||
hours after the previous user stopped using that browser may be able | timing of reactions to stimulus, and handling of any optional | |||
to learn about what the previous user was doing. This is a problem | features. | |||
with HTTP in its current form as well, however the short lived | ||||
connections make it less of a risk. | ||||
12. IANA Considerations | As far as this creates observable differences in behavior, they could | |||
be used as a basis for fingerprinting a specific client, as defined | ||||
in <http://www.w3.org/TR/html5/introduction.html#fingerprint>. | ||||
11. IANA Considerations | ||||
A string for identifying HTTP/2 is entered into the "Application | A string for identifying HTTP/2 is entered into the "Application | |||
Layer Protocol Negotiation (ALPN) Protocol IDs" registry established | Layer Protocol Negotiation (ALPN) Protocol IDs" registry established | |||
in [TLSALPN]. | in [TLSALPN]. | |||
This document establishes registries for error codes. This new | This document establishes a registry for error codes. This new | |||
registry is entered into a new "Hypertext Transfer Protocol (HTTP) 2 | registry is entered into a new "Hypertext Transfer Protocol (HTTP) 2 | |||
Parameters" section. | Parameters" section. | |||
This document registers the "HTTP2-Settings" header field for use in | This document registers the "HTTP2-Settings" header field for use in | |||
HTTP. | HTTP. | |||
This document registers the "PRI" method for use in HTTP, to avoid | This document registers the "PRI" method for use in HTTP, to avoid | |||
collisions with the connection header (Section 3.5). | collisions with the connection preface (Section 3.5). | |||
12.1. Registration of HTTP/2 Identification String | 11.1. Registration of HTTP/2 Identification String | |||
This document creates a registration for the identification of HTTP/2 | This document creates two registrations for the identification of | |||
in the "Application Layer Protocol Negotiation (ALPN) Protocol IDs" | HTTP/2 in the "Application Layer Protocol Negotiation (ALPN) Protocol | |||
registry established in [TLSALPN]. | IDs" registry established in [TLSALPN]. | |||
Protocol: HTTP/2 | The "h2" string identifies HTTP/2 when used over TLS: | |||
Protocol: HTTP/2 over TLS | ||||
Identification Sequence: 0x68 0x32 ("h2") | Identification Sequence: 0x68 0x32 ("h2") | |||
Specification: This document (RFCXXXX) | Specification: This document (RFCXXXX) | |||
12.2. Error Code Registry | The "h2c" string identifies HTTP/2 when used over cleartext TCP: | |||
Protocol: HTTP/2 over TCP | ||||
Identification Sequence: 0x68 0x32 0x63 ("h2c") | ||||
Specification: This document (RFCXXXX) | ||||
11.2. Error Code Registry | ||||
This document establishes a registry for HTTP/2 error codes. The | This document establishes a registry for HTTP/2 error codes. The | |||
"HTTP/2 Error Code" registry manages a 32-bit space. The "HTTP/2 | "HTTP/2 Error Code" registry manages a 32-bit space. The "HTTP/2 | |||
Error Code" registry operates under the "Expert Review" policy | Error Code" registry operates under the "Expert Review" policy | |||
[RFC5226]. | [RFC5226]. | |||
Registrations for error codes are required to include a description | Registrations for error codes are required to include a description | |||
of the error code. An expert reviewer is advised to examine new | of the error code. An expert reviewer is advised to examine new | |||
registrations for possible duplication with existing error codes. | registrations for possible duplication with existing error codes. | |||
Use of existing registrations is to be encouraged, but not mandated. | Use of existing registrations is to be encouraged, but not mandated. | |||
skipping to change at page 62, line 5 | skipping to change at page 71, line 5 | |||
optional. | optional. | |||
Description: A description of the conditions where the error code is | Description: A description of the conditions where the error code is | |||
applicable. | applicable. | |||
Specification: An optional reference for a specification that | Specification: An optional reference for a specification that | |||
defines the error code. | defines the error code. | |||
An initial set of error code registrations can be found in Section 7. | An initial set of error code registrations can be found in Section 7. | |||
12.3. HTTP2-Settings Header Field Registration | 11.3. HTTP2-Settings Header Field Registration | |||
This section registers the "HTTP2-Settings" header field in the | This section registers the "HTTP2-Settings" header field in the | |||
Permanent Message Header Field Registry [BCP90]. | Permanent Message Header Field Registry [BCP90]. | |||
Header field name: HTTP2-Settings | Header field name: HTTP2-Settings | |||
Applicable protocol: http | Applicable protocol: http | |||
Status: standard | Status: standard | |||
Author/Change controller: IETF | Author/Change controller: IETF | |||
Specification document(s): Section 3.2.1 of this document | Specification document(s): Section 3.2.1 of this document | |||
Related information: This header field is only used by an HTTP/2 | Related information: This header field is only used by an HTTP/2 | |||
client for Upgrade-based negotiation. | client for Upgrade-based negotiation. | |||
12.4. PRI Method Registration | 11.4. PRI Method Registration | |||
This section registers the "PRI" method in the HTTP Method Registry | This section registers the "PRI" method in the HTTP Method Registry | |||
[HTTP-p2]. | [HTTP-p2]. | |||
Method Name: PRI | Method Name: PRI | |||
Safe No | Safe No | |||
Idempotent No | Idempotent No | |||
Specification document(s) Section 3.5 of this document | Specification document(s) Section 3.5 of this document | |||
Related information: This method is never used by an actual client. | Related information: This method is never used by an actual client. | |||
This method will appear to be used when an HTTP/1.1 server or | This method will appear to be used when an HTTP/1.1 server or | |||
intermediary attempts to parse an HTTP/2 connection header. | intermediary attempts to parse an HTTP/2 connection preface. | |||
13. Acknowledgements | 12. Acknowledgements | |||
This document includes substantial input from the following | This document includes substantial input from the following | |||
individuals: | individuals: | |||
o Adam Langley, Wan-Teh Chang, Jim Morrison, Mark Nottingham, Alyssa | o Adam Langley, Wan-Teh Chang, Jim Morrison, Mark Nottingham, Alyssa | |||
Wilk, Costin Manolache, William Chan, Vitaliy Lvin, Joe Chan, Adam | Wilk, Costin Manolache, William Chan, Vitaliy Lvin, Joe Chan, Adam | |||
Barth, Ryan Hamilton, Gavin Peters, Kent Alstad, Kevin Lindsay, | Barth, Ryan Hamilton, Gavin Peters, Kent Alstad, Kevin Lindsay, | |||
Paul Amer, Fan Yang, Jonathan Leighton (SPDY contributors). | Paul Amer, Fan Yang, Jonathan Leighton (SPDY contributors). | |||
o Gabriel Montenegro and Willy Tarreau (Upgrade mechanism). | o Gabriel Montenegro and Willy Tarreau (Upgrade mechanism). | |||
skipping to change at page 63, line 16 | skipping to change at page 72, line 16 | |||
Jitu Padhye, Roberto Peon, Rob Trace (Flow control). | Jitu Padhye, Roberto Peon, Rob Trace (Flow control). | |||
o Mark Nottingham, Julian Reschke, James Snell, Jeff Pinner, Mike | o Mark Nottingham, Julian Reschke, James Snell, Jeff Pinner, Mike | |||
Bishop, Herve Ruellan (Substantial editorial contributions). | Bishop, Herve Ruellan (Substantial editorial contributions). | |||
o Alexey Melnikov was an editor of this document during 2013. | o Alexey Melnikov was an editor of this document during 2013. | |||
o A substantial proportion of Martin's contribution was supported by | o A substantial proportion of Martin's contribution was supported by | |||
Microsoft during his employment there. | Microsoft during his employment there. | |||
14. References | 13. References | |||
14.1. Normative References | 13.1. Normative References | |||
[ALT-SVC] Nottingham, M., McManus, P., and J. Reschke, "HTTP | ||||
Alternative Services", draft-ietf-httpbis-alt-svc-01 | ||||
(work in progress), April 2014. | ||||
[COMPRESSION] Ruellan, H. and R. Peon, "HPACK - Header Compression | [COMPRESSION] Ruellan, H. and R. Peon, "HPACK - Header Compression | |||
for HTTP/2", draft-ietf-httpbis-header-compression-06 | for HTTP/2", draft-ietf-httpbis-header-compression-07 | |||
(work in progress), February 2014. | (work in progress), April 2014. | |||
[COOKIE] Barth, A., "HTTP State Management Mechanism", | [COOKIE] Barth, A., "HTTP State Management Mechanism", | |||
RFC 6265, April 2011. | RFC 6265, April 2011. | |||
[HTTP-p1] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | [HTTP-p1] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | |||
Transfer Protocol (HTTP/1.1): Message Syntax and | Transfer Protocol (HTTP/1.1): Message Syntax and | |||
Routing", draft-ietf-httpbis-p1-messaging-26 (work in | Routing", draft-ietf-httpbis-p1-messaging-26 (work in | |||
progress), February 2014. | progress), February 2014. | |||
[HTTP-p2] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | [HTTP-p2] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | |||
skipping to change at page 64, line 27 | skipping to change at page 73, line 32 | |||
[RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | |||
Encodings", RFC 4648, October 2006. | Encodings", RFC 4648, October 2006. | |||
[RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing | [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing | |||
an IANA Considerations Section in RFCs", BCP 26, | an IANA Considerations Section in RFCs", BCP 26, | |||
RFC 5226, May 2008. | RFC 5226, May 2008. | |||
[RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax | [RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax | |||
Specifications: ABNF", STD 68, RFC 5234, January 2008. | Specifications: ABNF", STD 68, RFC 5234, January 2008. | |||
[RFC6125] Saint-Andre, P. and J. Hodges, "Representation and | ||||
Verification of Domain-Based Application Service | ||||
Identity within Internet Public Key Infrastructure | ||||
Using X.509 (PKIX) Certificates in the Context of | ||||
Transport Layer Security (TLS)", RFC 6125, March 2011. | ||||
[RFC6454] Barth, A., "The Web Origin Concept", RFC 6454, | [RFC6454] Barth, A., "The Web Origin Concept", RFC 6454, | |||
December 2011. | December 2011. | |||
[TCP] Postel, J., "Transmission Control Protocol", STD 7, | [TCP] Postel, J., "Transmission Control Protocol", STD 7, | |||
RFC 793, September 1981. | RFC 793, September 1981. | |||
[TLS-EXT] Eastlake, D., "Transport Layer Security (TLS) | [TLS-EXT] Eastlake, D., "Transport Layer Security (TLS) | |||
Extensions: Extension Definitions", RFC 6066, | Extensions: Extension Definitions", RFC 6066, | |||
January 2011. | January 2011. | |||
[TLS12] Dierks, T. and E. Rescorla, "The Transport Layer | [TLS12] Dierks, T. and E. Rescorla, "The Transport Layer | |||
Security (TLS) Protocol Version 1.2", RFC 5246, | Security (TLS) Protocol Version 1.2", RFC 5246, | |||
August 2008. | August 2008. | |||
[TLSALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | [TLSALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
"Transport Layer Security (TLS) Application Layer | "Transport Layer Security (TLS) Application Layer | |||
Protocol Negotiation Extension", | Protocol Negotiation Extension", | |||
draft-ietf-tls-applayerprotoneg-04 (work in progress), | draft-ietf-tls-applayerprotoneg-05 (work in progress), | |||
January 2014. | March 2014. | |||
14.2. Informative References | [UTF-8] Yergeau, F., "UTF-8, a transformation format of ISO | |||
10646", STD 63, RFC 3629, November 2003. | ||||
[AltSvc] Nottingham, M., "HTTP Alternate Services", | 13.2. Informative References | |||
draft-nottingham-httpbis-alt-svc-01 (work in | ||||
progress), December 2013. | ||||
[BCP90] Klyne, G., Nottingham, M., and J. Mogul, "Registration | [BCP90] Klyne, G., Nottingham, M., and J. Mogul, "Registration | |||
Procedures for Message Header Fields", BCP 90, | Procedures for Message Header Fields", BCP 90, | |||
RFC 3864, September 2004. | RFC 3864, September 2004. | |||
[BREACH] Gluck, Y., Harris, N., and A. Prado, "BREACH: Reviving | [BREACH] Gluck, Y., Harris, N., and A. Prado, "BREACH: Reviving | |||
the CRIME Attack", July 2013, <http:// | the CRIME Attack", July 2013, <http:// | |||
breachattack.com/resources/ | breachattack.com/resources/ | |||
BREACH%20-%20SSL,%20gone%20in%2030%20seconds.pdf>. | BREACH%20-%20SSL,%20gone%20in%2030%20seconds.pdf>. | |||
[IDNA] Klensin, J., "Internationalized Domain Names for | ||||
Applications (IDNA): Definitions and Document | ||||
Framework", RFC 5890, August 2010. | ||||
[RC4] Rivest, R., "The RC4 encryption algorithm", RSA Data | [RC4] Rivest, R., "The RC4 encryption algorithm", RSA Data | |||
Security, Inc. , March 1992. | Security, Inc. , March 1992. | |||
[RFC1323] Jacobson, V., Braden, B., and D. Borman, "TCP | [RFC1323] Jacobson, V., Braden, B., and D. Borman, "TCP | |||
Extensions for High Performance", RFC 1323, May 1992. | Extensions for High Performance", RFC 1323, May 1992. | |||
[RFC3749] Hollenbeck, S., "Transport Layer Security Protocol | [RFC3749] Hollenbeck, S., "Transport Layer Security Protocol | |||
Compression Methods", RFC 3749, May 2004. | Compression Methods", RFC 3749, May 2004. | |||
[TALKING] Huang, L-S., Chen, E., Barth, A., Rescorla, E., and C. | [TALKING] Huang, L-S., Chen, E., Barth, A., Rescorla, E., and C. | |||
Jackson, "Talking to Yourself for Fun and Profit", | Jackson, "Talking to Yourself for Fun and Profit", | |||
2011, <http://w2spconf.com/2011/papers/websocket.pdf>. | 2011, <http://w2spconf.com/2011/papers/websocket.pdf>. | |||
[TLSBCP] Sheffer, Y. and R. Holz, "Recommendations for Secure | [TLSBCP] Sheffer, Y., Holz, R., and P. Saint-Andre, | |||
Use of TLS and DTLS", draft-sheffer-tls-bcp-01 (work | "Recommendations for Secure Use of TLS and DTLS", | |||
in progress), September 2013. | draft-sheffer-tls-bcp-02 (work in progress), | |||
February 2014. | ||||
Appendix A. Change Log (to be removed by RFC Editor before publication) | Appendix A. Change Log (to be removed by RFC Editor before publication) | |||
A.1. Since draft-ietf-httpbis-http2-09 | A.1. Since draft-ietf-httpbis-http2-10 | |||
Changed "connection header" to "connection preface" to avoid | ||||
confusion. | ||||
Added dependency-based stream prioritization. | ||||
Added "h2c" identifier to distinguish between cleartext and secured | ||||
HTTP/2. | ||||
Adding missing padding to PUSH_PROMISE. | ||||
Integrate ALTSVC frame and supporting text. | ||||
Dropping requirement on "deflate" Content-Encoding. | ||||
Improving security considerations around use of compression. | ||||
A.2. Since draft-ietf-httpbis-http2-09 | ||||
Adding padding for data frames. | Adding padding for data frames. | |||
Renumbering frame types, error codes, and settings. | Renumbering frame types, error codes, and settings. | |||
Adding INADEQUATE_SECURITY error code. | Adding INADEQUATE_SECURITY error code. | |||
Updating TLS usage requirements to 1.2; forbidding TLS compression. | Updating TLS usage requirements to 1.2; forbidding TLS compression. | |||
Removing extensibility for frames and settings. | Removing extensibility for frames and settings. | |||
skipping to change at page 66, line 16 | skipping to change at page 75, line 36 | |||
Changing the protocol identification token to "h2". | Changing the protocol identification token to "h2". | |||
Changing the use of :authority to make it optional and to allow | Changing the use of :authority to make it optional and to allow | |||
userinfo in non-HTTP cases. | userinfo in non-HTTP cases. | |||
Allowing split on 0x0 for Cookie. | Allowing split on 0x0 for Cookie. | |||
Reserved PRI method in HTTP/1.1 to avoid possible future collisions. | Reserved PRI method in HTTP/1.1 to avoid possible future collisions. | |||
A.2. Since draft-ietf-httpbis-http2-08 | A.3. Since draft-ietf-httpbis-http2-08 | |||
Added cookie crumbling for more efficient header compression. | Added cookie crumbling for more efficient header compression. | |||
Added header field ordering with the value-concatenation mechanism. | Added header field ordering with the value-concatenation mechanism. | |||
A.3. Since draft-ietf-httpbis-http2-07 | A.4. Since draft-ietf-httpbis-http2-07 | |||
Marked draft for implementation. | Marked draft for implementation. | |||
A.4. Since draft-ietf-httpbis-http2-06 | A.5. Since draft-ietf-httpbis-http2-06 | |||
Adding definition for CONNECT method. | Adding definition for CONNECT method. | |||
Constraining the use of push to safe, cacheable methods with no | Constraining the use of push to safe, cacheable methods with no | |||
request body. | request body. | |||
Changing from :host to :authority to remove any potential confusion. | Changing from :host to :authority to remove any potential confusion. | |||
Adding setting for header compression table size. | Adding setting for header compression table size. | |||
Adding settings acknowledgement. | Adding settings acknowledgement. | |||
Removing unnecessary and potentially problematic flags from | Removing unnecessary and potentially problematic flags from | |||
CONTINUATION. | CONTINUATION. | |||
Added denial of service considerations. | Added denial of service considerations. | |||
A.5. Since draft-ietf-httpbis-http2-05 | A.6. Since draft-ietf-httpbis-http2-05 | |||
Marking the draft ready for implementation. | Marking the draft ready for implementation. | |||
Renumbering END_PUSH_PROMISE flag. | Renumbering END_PUSH_PROMISE flag. | |||
Editorial clarifications and changes. | Editorial clarifications and changes. | |||
A.6. Since draft-ietf-httpbis-http2-04 | A.7. Since draft-ietf-httpbis-http2-04 | |||
Added CONTINUATION frame for HEADERS and PUSH_PROMISE. | Added CONTINUATION frame for HEADERS and PUSH_PROMISE. | |||
PUSH_PROMISE is no longer implicitly prohibited if | PUSH_PROMISE is no longer implicitly prohibited if | |||
SETTINGS_MAX_CONCURRENT_STREAMS is zero. | SETTINGS_MAX_CONCURRENT_STREAMS is zero. | |||
Push expanded to allow all safe methods without a request body. | Push expanded to allow all safe methods without a request body. | |||
Clarified the use of HTTP header fields in requests and responses. | Clarified the use of HTTP header fields in requests and responses. | |||
Prohibited HTTP/1.1 hop-by-hop header fields. | Prohibited HTTP/1.1 hop-by-hop header fields. | |||
skipping to change at page 67, line 30 | skipping to change at page 76, line 49 | |||
Clarified requirements around handling different frames after stream | Clarified requirements around handling different frames after stream | |||
close, stream reset and GOAWAY. | close, stream reset and GOAWAY. | |||
Added more specific prohibitions for sending of different frame types | Added more specific prohibitions for sending of different frame types | |||
in various stream states. | in various stream states. | |||
Making the last received setting value the effective value. | Making the last received setting value the effective value. | |||
Clarified requirements on TLS version, extension and ciphers. | Clarified requirements on TLS version, extension and ciphers. | |||
A.7. Since draft-ietf-httpbis-http2-03 | A.8. Since draft-ietf-httpbis-http2-03 | |||
Committed major restructuring atrocities. | Committed major restructuring atrocities. | |||
Added reference to first header compression draft. | Added reference to first header compression draft. | |||
Added more formal description of frame lifecycle. | Added more formal description of frame lifecycle. | |||
Moved END_STREAM (renamed from FINAL) back to HEADERS/DATA. | Moved END_STREAM (renamed from FINAL) back to HEADERS/DATA. | |||
Removed HEADERS+PRIORITY, added optional priority to HEADERS frame. | Removed HEADERS+PRIORITY, added optional priority to HEADERS frame. | |||
Added PRIORITY frame. | Added PRIORITY frame. | |||
A.8. Since draft-ietf-httpbis-http2-02 | A.9. Since draft-ietf-httpbis-http2-02 | |||
Added continuations to frames carrying header blocks. | Added continuations to frames carrying header blocks. | |||
Replaced use of "session" with "connection" to avoid confusion with | Replaced use of "session" with "connection" to avoid confusion with | |||
other HTTP stateful concepts, like cookies. | other HTTP stateful concepts, like cookies. | |||
Removed "message". | Removed "message". | |||
Switched to TLS ALPN from NPN. | Switched to TLS ALPN from NPN. | |||
Editorial changes. | Editorial changes. | |||
A.9. Since draft-ietf-httpbis-http2-01 | A.10. Since draft-ietf-httpbis-http2-01 | |||
Added IANA considerations section for frame types, error codes and | Added IANA considerations section for frame types, error codes and | |||
settings. | settings. | |||
Removed data frame compression. | Removed data frame compression. | |||
Added PUSH_PROMISE. | Added PUSH_PROMISE. | |||
Added globally applicable flags to framing. | Added globally applicable flags to framing. | |||
skipping to change at page 68, line 42 | skipping to change at page 78, line 12 | |||
Restructured frame header. Removed distinction between data and | Restructured frame header. Removed distinction between data and | |||
control frames. | control frames. | |||
Altered flow control properties to include session-level limits. | Altered flow control properties to include session-level limits. | |||
Added note on cacheability of pushed resources and multiple tenant | Added note on cacheability of pushed resources and multiple tenant | |||
servers. | servers. | |||
Changed protocol label form based on discussions. | Changed protocol label form based on discussions. | |||
A.10. Since draft-ietf-httpbis-http2-00 | A.11. Since draft-ietf-httpbis-http2-00 | |||
Changed title throughout. | Changed title throughout. | |||
Removed section on Incompatibilities with SPDY draft#2. | Removed section on Incompatibilities with SPDY draft#2. | |||
Changed INTERNAL_ERROR on GOAWAY to have a value of 2 <https:// | Changed INTERNAL_ERROR on GOAWAY to have a value of 2 <https:// | |||
groups.google.com/forum/?fromgroups#!topic/spdy-dev/cfUef2gL3iU>. | groups.google.com/forum/?fromgroups#!topic/spdy-dev/cfUef2gL3iU>. | |||
Replaced abstract and introduction. | Replaced abstract and introduction. | |||
Added section on starting HTTP/2.0, including upgrade mechanism. | Added section on starting HTTP/2.0, including upgrade mechanism. | |||
Removed unused references. | Removed unused references. | |||
Added flow control principles (Section 5.2.1) based on <http:// | Added flow control principles (Section 5.2.1) based on <http:// | |||
tools.ietf.org/html/draft-montenegro-httpbis-http2-fc-principles-01>. | tools.ietf.org/html/draft-montenegro-httpbis-http2-fc-principles-01>. | |||
A.11. Since draft-mbelshe-httpbis-spdy-00 | A.12. Since draft-mbelshe-httpbis-spdy-00 | |||
Adopted as base for draft-ietf-httpbis-http2. | Adopted as base for draft-ietf-httpbis-http2. | |||
Updated authors/editors list. | Updated authors/editors list. | |||
Added status note. | Added status note. | |||
Authors' Addresses | Authors' Addresses | |||
Mike Belshe | Mike Belshe | |||
End of changes. 247 change blocks. | ||||
709 lines changed or deleted | 1179 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |