draft-ietf-httpbis-http2-14.txt | draft-ietf-httpbis-http2-latest.txt | |||
---|---|---|---|---|
HTTPbis Working Group M. Belshe | HTTPbis Working Group M. Belshe | |||
Internet-Draft Twist | Internet-Draft BitGo | |||
Intended status: Standards Track R. Peon | Intended status: Standards Track R. Peon | |||
Expires: January 31, 2015 Google, Inc | Expires: November 2, 2015 Google, Inc | |||
M. Thomson, Ed. | M. Thomson, Ed. | |||
Mozilla | Mozilla | |||
July 30, 2014 | May 2015 | |||
Hypertext Transfer Protocol version 2 | Hypertext Transfer Protocol Version 2 (HTTP/2) | |||
draft-ietf-httpbis-http2-14 | draft-ietf-httpbis-http2-latest | |||
Abstract | Abstract | |||
This specification describes an optimized expression of the syntax of | This specification describes an optimized expression of the semantics | |||
the Hypertext Transfer Protocol (HTTP). HTTP/2 enables a more | of the Hypertext Transfer Protocol (HTTP), referred to as HTTP | |||
efficient use of network resources and a reduced perception of | version 2 (HTTP/2). HTTP/2 enables a more efficient use of network | |||
latency by introducing header field compression and allowing multiple | resources and a reduced perception of latency by introducing header | |||
concurrent messages on the same connection. It also introduces | field compression and allowing multiple concurrent exchanges on the | |||
unsolicited push of representations from servers to clients. | same connection. It also introduces unsolicited push of | |||
representations from servers to clients. | ||||
This specification is an alternative to, but does not obsolete, the | This specification 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) | ||||
Discussion of this draft takes place on the HTTPBIS working group | ||||
mailing list (ietf-http-wg@w3.org), which is archived at | ||||
<https://lists.w3.org/Archives/Public/ietf-http-wg/>. | ||||
Working Group information can be found at | ||||
<https://tools.ietf.org/wg/httpbis/>; that specific to HTTP/2 are at | ||||
<https://http2.github.io/>. | ||||
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 January 31, 2015. | This Internet-Draft will expire on November 2, 2015. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2014 IETF Trust and the persons identified as the | Copyright (c) 2015 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 | |||
2. HTTP/2 Protocol Overview . . . . . . . . . . . . . . . . . . . 5 | 2. HTTP/2 Protocol Overview . . . . . . . . . . . . . . . . . . . 5 | |||
2.1. Document Organization . . . . . . . . . . . . . . . . . . 6 | 2.1. Document Organization . . . . . . . . . . . . . . . . . . 6 | |||
2.2. Conventions and Terminology . . . . . . . . . . . . . . . 7 | 2.2. Conventions and Terminology . . . . . . . . . . . . . . . 7 | |||
3. Starting HTTP/2 . . . . . . . . . . . . . . . . . . . . . . . 7 | 3. Starting HTTP/2 . . . . . . . . . . . . . . . . . . . . . . . 8 | |||
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 . . . . . . . . . . . . . 8 | |||
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 Preface . . . . . . . . . . . . . . . . 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 . . . . . . . . . . . . . . . . . . . . . . . . 14 | 4.2. Frame Size . . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
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 . . . . . . . . . . . . . . . . . . . . . . 16 | 5.1. Stream States . . . . . . . . . . . . . . . . . . . . . . 16 | |||
5.1.1. Stream Identifiers . . . . . . . . . . . . . . . . . . 20 | 5.1.1. Stream Identifiers . . . . . . . . . . . . . . . . . . 21 | |||
5.1.2. Stream Concurrency . . . . . . . . . . . . . . . . . . 21 | 5.1.2. Stream Concurrency . . . . . . . . . . . . . . . . . . 22 | |||
5.2. Flow Control . . . . . . . . . . . . . . . . . . . . . . . 22 | 5.2. Flow Control . . . . . . . . . . . . . . . . . . . . . . . 22 | |||
5.2.1. Flow Control Principles . . . . . . . . . . . . . . . 22 | 5.2.1. Flow-Control Principles . . . . . . . . . . . . . . . 22 | |||
5.2.2. Appropriate Use of Flow Control . . . . . . . . . . . 23 | 5.2.2. Appropriate Use of Flow Control . . . . . . . . . . . 23 | |||
5.3. Stream priority . . . . . . . . . . . . . . . . . . . . . 23 | 5.3. Stream Priority . . . . . . . . . . . . . . . . . . . . . 24 | |||
5.3.1. Stream Dependencies . . . . . . . . . . . . . . . . . 24 | 5.3.1. Stream Dependencies . . . . . . . . . . . . . . . . . 25 | |||
5.3.2. Dependency Weighting . . . . . . . . . . . . . . . . . 25 | 5.3.2. Dependency Weighting . . . . . . . . . . . . . . . . . 26 | |||
5.3.3. Reprioritization . . . . . . . . . . . . . . . . . . . 25 | 5.3.3. Reprioritization . . . . . . . . . . . . . . . . . . . 26 | |||
5.3.4. Prioritization State Management . . . . . . . . . . . 26 | 5.3.4. Prioritization State Management . . . . . . . . . . . 27 | |||
5.3.5. Default Priorities . . . . . . . . . . . . . . . . . . 27 | 5.3.5. Default Priorities . . . . . . . . . . . . . . . . . . 28 | |||
5.4. Error Handling . . . . . . . . . . . . . . . . . . . . . . 27 | 5.4. Error Handling . . . . . . . . . . . . . . . . . . . . . . 28 | |||
5.4.1. Connection Error Handling . . . . . . . . . . . . . . 27 | 5.4.1. Connection Error Handling . . . . . . . . . . . . . . 29 | |||
5.4.2. Stream Error Handling . . . . . . . . . . . . . . . . 28 | 5.4.2. Stream Error Handling . . . . . . . . . . . . . . . . 29 | |||
5.4.3. Connection Termination . . . . . . . . . . . . . . . . 28 | 5.4.3. Connection Termination . . . . . . . . . . . . . . . . 30 | |||
5.5. Extending HTTP/2 . . . . . . . . . . . . . . . . . . . . . 29 | 5.5. Extending HTTP/2 . . . . . . . . . . . . . . . . . . . . . 30 | |||
6. Frame Definitions . . . . . . . . . . . . . . . . . . . . . . 29 | 6. Frame Definitions . . . . . . . . . . . . . . . . . . . . . . 31 | |||
6.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 | 6.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 | |||
6.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . . . 31 | 6.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . . . 32 | |||
6.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . . . . 33 | 6.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . . . . 34 | |||
6.4. RST_STREAM . . . . . . . . . . . . . . . . . . . . . . . . 34 | 6.4. RST_STREAM . . . . . . . . . . . . . . . . . . . . . . . . 35 | |||
6.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . . . . 35 | 6.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . . . . 36 | |||
6.5.1. SETTINGS Format . . . . . . . . . . . . . . . . . . . 36 | 6.5.1. SETTINGS Format . . . . . . . . . . . . . . . . . . . 37 | |||
6.5.2. Defined SETTINGS Parameters . . . . . . . . . . . . . 36 | 6.5.2. Defined SETTINGS Parameters . . . . . . . . . . . . . 38 | |||
6.5.3. Settings Synchronization . . . . . . . . . . . . . . . 38 | 6.5.3. Settings Synchronization . . . . . . . . . . . . . . . 39 | |||
6.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . . . . 38 | 6.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . . . . 40 | |||
6.7. PING . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 | 6.7. PING . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 | |||
6.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . . . . 41 | 6.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . . . . 43 | |||
6.9. WINDOW_UPDATE . . . . . . . . . . . . . . . . . . . . . . 44 | 6.9. WINDOW_UPDATE . . . . . . . . . . . . . . . . . . . . . . 45 | |||
6.9.1. The Flow Control Window . . . . . . . . . . . . . . . 45 | 6.9.1. The Flow-Control Window . . . . . . . . . . . . . . . 47 | |||
6.9.2. Initial Flow Control Window Size . . . . . . . . . . . 46 | 6.9.2. Initial Flow-Control Window Size . . . . . . . . . . . 48 | |||
6.9.3. Reducing the Stream Window Size . . . . . . . . . . . 47 | 6.9.3. Reducing the Stream Window Size . . . . . . . . . . . 48 | |||
6.10. CONTINUATION . . . . . . . . . . . . . . . . . . . . . . . 47 | 6.10. CONTINUATION . . . . . . . . . . . . . . . . . . . . . . . 49 | |||
7. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 48 | 7. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 50 | |||
8. HTTP Message Exchanges . . . . . . . . . . . . . . . . . . . . 49 | 8. HTTP Message Exchanges . . . . . . . . . . . . . . . . . . . . 51 | |||
8.1. HTTP Request/Response Exchange . . . . . . . . . . . . . . 50 | 8.1. HTTP Request/Response Exchange . . . . . . . . . . . . . . 51 | |||
8.1.1. Upgrading From HTTP/2 . . . . . . . . . . . . . . . . 51 | 8.1.1. Upgrading from HTTP/2 . . . . . . . . . . . . . . . . 53 | |||
8.1.2. HTTP Header Fields . . . . . . . . . . . . . . . . . . 51 | 8.1.2. HTTP Header Fields . . . . . . . . . . . . . . . . . . 53 | |||
8.1.3. Examples . . . . . . . . . . . . . . . . . . . . . . . 55 | 8.1.3. Examples . . . . . . . . . . . . . . . . . . . . . . . 57 | |||
8.1.4. Request Reliability Mechanisms in HTTP/2 . . . . . . . 57 | 8.1.4. Request Reliability Mechanisms in HTTP/2 . . . . . . . 59 | |||
8.2. Server Push . . . . . . . . . . . . . . . . . . . . . . . 58 | 8.2. Server Push . . . . . . . . . . . . . . . . . . . . . . . 60 | |||
8.2.1. Push Requests . . . . . . . . . . . . . . . . . . . . 59 | 8.2.1. Push Requests . . . . . . . . . . . . . . . . . . . . 61 | |||
8.2.2. Push Responses . . . . . . . . . . . . . . . . . . . . 60 | 8.2.2. Push Responses . . . . . . . . . . . . . . . . . . . . 62 | |||
8.3. The CONNECT Method . . . . . . . . . . . . . . . . . . . . 61 | 8.3. The CONNECT Method . . . . . . . . . . . . . . . . . . . . 63 | |||
9. Additional HTTP Requirements/Considerations . . . . . . . . . 62 | 9. Additional HTTP Requirements/Considerations . . . . . . . . . 64 | |||
9.1. Connection Management . . . . . . . . . . . . . . . . . . 62 | 9.1. Connection Management . . . . . . . . . . . . . . . . . . 64 | |||
9.1.1. Connection Reuse . . . . . . . . . . . . . . . . . . . 63 | 9.1.1. Connection Reuse . . . . . . . . . . . . . . . . . . . 65 | |||
9.1.2. The 421 (Not Authoritative) Status Code . . . . . . . 63 | 9.1.2. The 421 (Misdirected Request) Status Code . . . . . . 66 | |||
9.2. Use of TLS Features . . . . . . . . . . . . . . . . . . . 64 | 9.2. Use of TLS Features . . . . . . . . . . . . . . . . . . . 66 | |||
9.2.1. TLS Features . . . . . . . . . . . . . . . . . . . . . 64 | 9.2.1. TLS 1.2 Features . . . . . . . . . . . . . . . . . . . 66 | |||
9.2.2. TLS Cipher Suites . . . . . . . . . . . . . . . . . . 64 | 9.2.2. TLS 1.2 Cipher Suites . . . . . . . . . . . . . . . . 67 | |||
10. Security Considerations . . . . . . . . . . . . . . . . . . . 65 | 10. Security Considerations . . . . . . . . . . . . . . . . . . . 68 | |||
10.1. Server Authority . . . . . . . . . . . . . . . . . . . . . 65 | 10.1. Server Authority . . . . . . . . . . . . . . . . . . . . . 68 | |||
10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . . 65 | 10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . . 68 | |||
10.3. Intermediary Encapsulation Attacks . . . . . . . . . . . . 66 | 10.3. Intermediary Encapsulation Attacks . . . . . . . . . . . . 69 | |||
10.4. Cacheability of Pushed Responses . . . . . . . . . . . . . 66 | 10.4. Cacheability of Pushed Responses . . . . . . . . . . . . . 69 | |||
10.5. Denial of Service Considerations . . . . . . . . . . . . . 67 | 10.5. Denial-of-Service Considerations . . . . . . . . . . . . . 70 | |||
10.5.1. Limits on Header Block Size . . . . . . . . . . . . . 68 | 10.5.1. Limits on Header Block Size . . . . . . . . . . . . . 71 | |||
10.6. Use of Compression . . . . . . . . . . . . . . . . . . . . 68 | 10.5.2. CONNECT Issues . . . . . . . . . . . . . . . . . . . . 71 | |||
10.7. Use of Padding . . . . . . . . . . . . . . . . . . . . . . 69 | 10.6. Use of Compression . . . . . . . . . . . . . . . . . . . . 71 | |||
10.8. Privacy Considerations . . . . . . . . . . . . . . . . . . 70 | 10.7. Use of Padding . . . . . . . . . . . . . . . . . . . . . . 72 | |||
11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 70 | 10.8. Privacy Considerations . . . . . . . . . . . . . . . . . . 73 | |||
11.1. Registration of HTTP/2 Identification Strings . . . . . . 70 | 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 73 | |||
11.2. Frame Type Registry . . . . . . . . . . . . . . . . . . . 71 | 11.1. Registration of HTTP/2 Identification Strings . . . . . . 73 | |||
11.3. Settings Registry . . . . . . . . . . . . . . . . . . . . 71 | 11.2. Frame Type Registry . . . . . . . . . . . . . . . . . . . 74 | |||
11.4. Error Code Registry . . . . . . . . . . . . . . . . . . . 72 | 11.3. Settings Registry . . . . . . . . . . . . . . . . . . . . 75 | |||
11.5. HTTP2-Settings Header Field Registration . . . . . . . . . 73 | 11.4. Error Code Registry . . . . . . . . . . . . . . . . . . . 76 | |||
11.6. PRI Method Registration . . . . . . . . . . . . . . . . . 74 | 11.5. HTTP2-Settings Header Field Registration . . . . . . . . . 77 | |||
11.7. The 421 Not Authoritative HTTP Status Code . . . . . . . . 74 | 11.6. PRI Method Registration . . . . . . . . . . . . . . . . . 77 | |||
12. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 74 | 11.7. The 421 (Misdirected Request) HTTP Status Code . . . . . . 78 | |||
13. References . . . . . . . . . . . . . . . . . . . . . . . . . . 75 | 11.8. The h2c Upgrade Token . . . . . . . . . . . . . . . . . . 78 | |||
13.1. Normative References . . . . . . . . . . . . . . . . . . . 75 | 12. References . . . . . . . . . . . . . . . . . . . . . . . . . . 78 | |||
13.2. Informative References . . . . . . . . . . . . . . . . . . 77 | 12.1. Normative References . . . . . . . . . . . . . . . . . . . 78 | |||
Appendix A. Change Log . . . . . . . . . . . . . . . . . . . . . 78 | 12.2. Informative References . . . . . . . . . . . . . . . . . . 80 | |||
A.1. Since draft-ietf-httpbis-http2-13 . . . . . . . . . . . . 78 | Appendix A. TLS 1.2 Cipher Suite Black List . . . . . . . . . . . 81 | |||
A.2. Since draft-ietf-httpbis-http2-12 . . . . . . . . . . . . 78 | Appendix B. Acknowledgements . . . . . . . . . . . . . . . . . . 93 | |||
A.3. Since draft-ietf-httpbis-http2-11 . . . . . . . . . . . . 78 | ||||
A.4. Since draft-ietf-httpbis-http2-10 . . . . . . . . . . . . 79 | ||||
A.5. Since draft-ietf-httpbis-http2-09 . . . . . . . . . . . . 79 | ||||
A.6. Since draft-ietf-httpbis-http2-08 . . . . . . . . . . . . 80 | ||||
A.7. Since draft-ietf-httpbis-http2-07 . . . . . . . . . . . . 80 | ||||
A.8. Since draft-ietf-httpbis-http2-06 . . . . . . . . . . . . 80 | ||||
A.9. Since draft-ietf-httpbis-http2-05 . . . . . . . . . . . . 80 | ||||
A.10. Since draft-ietf-httpbis-http2-04 . . . . . . . . . . . . 80 | ||||
A.11. Since draft-ietf-httpbis-http2-03 . . . . . . . . . . . . 81 | ||||
A.12. Since draft-ietf-httpbis-http2-02 . . . . . . . . . . . . 81 | ||||
A.13. Since draft-ietf-httpbis-http2-01 . . . . . . . . . . . . 81 | ||||
A.14. Since draft-ietf-httpbis-http2-00 . . . . . . . . . . . . 82 | ||||
A.15. Since draft-mbelshe-httpbis-spdy-00 . . . . . . . . . . . 82 | ||||
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 ([RFC7230], Section | protocol. However, the way HTTP/1.1 uses the underlying transport | |||
3) was designed to be implemented with the tools at hand in the | ([RFC7230], Section 6) has several characteristics that have a | |||
1990s, not modern Web application performance. As such it has | negative overall effect on application performance today. | |||
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 allowed only one request to be outstanding at | |||
a time on a given connection. HTTP/1.1 pipelining only partially | a time on a given TCP connection. HTTP/1.1 added request pipelining, | |||
addressed request concurrency and suffers from head-of-line blocking. | but this only partially addressed request concurrency and still | |||
Therefore, clients that need to make many requests typically use | suffers from head-of-line blocking. Therefore, HTTP/1.0 and HTTP/1.1 | |||
multiple connections to a server in order to reduce latency. | clients that need to make many requests use multiple connections to a | |||
server in order to achieve concurrency and thereby reduce latency. | ||||
Furthermore, HTTP/1.1 header fields are often repetitive and verbose, | Furthermore, HTTP header fields are often repetitive and verbose, | |||
which, in addition to generating more or larger network packets, can | causing unnecessary network traffic as well as causing the initial | |||
cause the small initial TCP [TCP] congestion window to quickly fill. | TCP [TCP] congestion window to quickly fill. This can result in | |||
This can result in excessive latency when multiple requests are made | excessive latency when multiple requests are made on a new TCP | |||
on a single new TCP connection. | connection. | |||
This specification addresses these issues by defining an optimized | HTTP/2 addresses these issues by defining an optimized mapping of | |||
mapping of HTTP's semantics to an underlying connection. | HTTP's semantics to an underlying connection. Specifically, it | |||
Specifically, it allows interleaving of request and response messages | allows interleaving of request and response messages on the same | |||
on the same connection and uses an efficient coding for HTTP header | connection and uses an efficient coding for HTTP header fields. It | |||
fields. It also allows prioritization of requests, letting more | also allows prioritization of requests, letting more important | |||
important requests complete more quickly, further improving | requests complete more quickly, further improving performance. | |||
performance. | ||||
The resulting protocol is designed to be more friendly to the | The resulting protocol is more friendly to the network because fewer | |||
network, because fewer TCP connections can be used in comparison to | TCP connections can be used in comparison to HTTP/1.x. This means | |||
HTTP/1.x. This means less competition with other flows, and longer- | less competition with other flows and longer-lived connections, which | |||
lived connections, which in turn leads to better utilization of | in turn lead to better utilization of available network capacity. | |||
available network capacity. | ||||
Finally, this encapsulation also enables more efficient processing of | Finally, HTTP/2 also enables more efficient processing of messages | |||
messages through use of binary message framing. | through use of binary message framing. | |||
2. HTTP/2 Protocol Overview | 2. HTTP/2 Protocol Overview | |||
HTTP/2 provides an optimized transport for HTTP semantics. HTTP/2 | 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 | supports all of the core features of HTTP/1.1 but aims to be more | |||
efficient in several ways. | efficient in several ways. | |||
The basic protocol unit in HTTP/2 is a frame (Section 4.1). Each | The basic protocol unit in HTTP/2 is a frame (Section 4.1). Each | |||
frame type serves a different purpose. For example, HEADERS and DATA | frame type serves a different purpose. For example, HEADERS and DATA | |||
frames form the basis of HTTP requests and responses (Section 8.1); | frames form the basis of HTTP requests and responses (Section 8.1); | |||
other frame types like SETTINGS, WINDOW_UPDATE, and PUSH_PROMISE are | other frame types like SETTINGS, WINDOW_UPDATE, and PUSH_PROMISE are | |||
used in support of other HTTP/2 features. | used in support of other HTTP/2 features. | |||
Multiplexing of requests is achieved by having each HTTP request- | Multiplexing of requests is achieved by having each HTTP request/ | |||
response exchanged assigned to a single stream (Section 5). Streams | response exchange associated with its own stream (Section 5). | |||
are largely independent of each other, so a blocked or stalled | Streams are largely independent of each other, so a blocked or | |||
request does not prevent progress on other requests. | stalled request or response does not prevent progress on other | |||
streams. | ||||
Flow control and prioritization ensure that it is possible to | Flow control and prioritization ensure that it is possible to | |||
properly use multiplexed streams. Flow control (Section 5.2) helps | efficiently use multiplexed streams. Flow control (Section 5.2) | |||
to ensure that only data that can be used by a receiver is | helps to ensure that only data that can be used by a receiver is | |||
transmitted. Prioritization (Section 5.3) ensures that limited | transmitted. Prioritization (Section 5.3) ensures that limited | |||
resources can be directed to the most important requests first. | resources can be directed to the most important streams first. | |||
HTTP/2 adds a new interaction mode, whereby a server can push | 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 | responses to a client (Section 8.2). Server push allows a server to | |||
speculatively send a client data that the server anticipates the | speculatively send data to a client that the server anticipates the | |||
client will need, trading off some network usage against a potential | client will need, trading off some network usage against a potential | |||
latency gain. The server does this by synthesizing a request, which | 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 | it sends as a PUSH_PROMISE frame. The server is then able to send a | |||
response to the synthetic request on a separate stream. | response to the synthetic request on a separate stream. | |||
Frames that contain HTTP header fields are compressed (Section 4.3). | Because HTTP header fields used in a connection can contain large | |||
HTTP requests can be highly redundant, so compression can reduce the | amounts of redundant data, frames that contain them are compressed | |||
size of requests and responses significantly. | (Section 4.3). This has especially advantageous impact upon request | |||
sizes in the common case, allowing many requests to be compressed | ||||
into one packet. | ||||
2.1. Document Organization | 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 an 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 frame (Section 4) and stream (Section 5) layers describe the | |||
the way HTTP/2 frames are structured and formed into multiplexed | 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 frames and | describe how HTTP semantics are expressed using frames and | |||
streams. | 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, this specification does not define a completely generic frame | |||
The framing and streams layers are tailored to the needs of the HTTP | layer. The frame and stream layers are tailored to the needs of the | |||
protocol and server push. | HTTP protocol and server push. | |||
2.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. | |||
The following terms are used: | The following terms are used: | |||
client: The endpoint initiating the HTTP/2 connection. | client: The endpoint that initiates an HTTP/2 connection. Clients | |||
send HTTP requests and receive HTTP responses. | ||||
connection: A transport-level connection between two endpoints. | connection: A transport-layer connection between two endpoints. | |||
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 octets structured according to the frame type. | |||
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 that accepts an HTTP/2 connection. Servers | |||
receive HTTP requests and send HTTP responses. | ||||
stream: A bi-directional flow of frames across a virtual channel | stream: A bidirectional flow of frames 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. | |||
Finally, the terms "gateway", "intermediary", "proxy", and "tunnel" | Finally, the terms "gateway", "intermediary", "proxy", and "tunnel" | |||
are defined in Section 2.3 of [RFC7230]. | are defined in Section 2.3 of [RFC7230]. Intermediaries act as both | |||
client and server at different times. | ||||
The term "payload body" is defined in Section 3.3 of [RFC7230]. | ||||
3. Starting HTTP/2 | 3. Starting HTTP/2 | |||
An HTTP/2 connection is an application level protocol running on top | An HTTP/2 connection is an application-layer 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. | |||
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 has two identifiers. | The protocol defined in this document has two identifiers. | |||
o The string "h2" identifies the protocol where HTTP/2 uses TLS | o The string "h2" identifies the protocol where HTTP/2 uses | |||
[TLS12]. This identifier is used in the TLS application layer | Transport Layer Security (TLS) [TLS12]. This identifier is used | |||
protocol negotiation extension (ALPN) [TLS-ALPN] field and any | in the TLS application-layer protocol negotiation (ALPN) extension | |||
place that HTTP/2 over TLS is identified. | [TLS-ALPN] field and in any place where HTTP/2 over TLS is | |||
identified. | ||||
The "h2" string is serialized into an ALPN protocol identifier as | The "h2" string is serialized into an ALPN protocol identifier as | |||
the two octet sequence: 0x68, 0x32. | the two-octet sequence: 0x68, 0x32. | |||
o The string "h2c" identifies the protocol where HTTP/2 is run over | 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 | cleartext TCP. This identifier is used in the HTTP/1.1 Upgrade | |||
header field and any place that HTTP/2 over TCP is identified. | header field and in any place where 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 | ||||
themselves as "h2" or "h2c". Until such an RFC exists, | ||||
implementations MUST NOT identify themselves using these strings. | ||||
Examples and text throughout the rest of this document use "h2" as a | ||||
matter of editorial convenience only. Implementations of draft | ||||
versions MUST NOT identify using this string. | ||||
Implementations of draft versions of the protocol MUST add the string | The "h2c" string is reserved from the ALPN identifier space but | |||
"-" and the corresponding draft number to the identifier. For | describes a protocol that does not use TLS. | |||
example, draft-ietf-httpbis-http2-11 over TLS is identified using the | ||||
string "h2-11". | ||||
Non-compatible experiments that are based on these draft versions | Negotiating "h2" or "h2c" implies the use of the transport, security, | |||
MUST append the string "-" and an experiment name to the identifier. | framing, and message semantics described in this document. | |||
For example, an experimental implementation of packet mood-based | ||||
encoding based on draft-ietf-httpbis-http2-09 might identify itself | ||||
as "h2-09-emo". Note that any label MUST conform to the "token" | ||||
syntax defined in Section 3.2.6 of [RFC7230]. Experimenters are | ||||
encouraged to coordinate their experiments on the ietf-http-wg@w3.org | ||||
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 for an "http" URI without prior | |||
knowledge about support for HTTP/2 uses the HTTP Upgrade mechanism | knowledge about support for HTTP/2 on the next hop uses the HTTP | |||
(Section 6.7 of [RFC7230]). The client makes an HTTP/1.1 request | Upgrade mechanism (Section 6.7 of [RFC7230]). The client does so by | |||
that includes an Upgrade header field identifying HTTP/2 with the | making an HTTP/1.1 request that includes an Upgrade header field with | |||
"h2c" token. The HTTP/1.1 request MUST include exactly one HTTP2- | the "h2c" token. Such an HTTP/1.1 request MUST include exactly one | |||
Settings (Section 3.2.1) header field. | HTTP2-Settings (Section 3.2.1) header field. | |||
For example: | For example: | |||
GET / HTTP/1.1 | GET / HTTP/1.1 | |||
Host: server.example.com | Host: server.example.com | |||
Connection: Upgrade, HTTP2-Settings | Connection: Upgrade, HTTP2-Settings | |||
Upgrade: h2c | 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 a payload 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 can block the use of the connection until it is completely | |||
completely sent. | 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, an OPTIONS 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. | |||
A server that does not support HTTP/2 can respond to the request as | A server that does not support HTTP/2 can respond to the request as | |||
though the Upgrade header field were absent: | though the Upgrade header field were absent: | |||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Length: 243 | Content-Length: 243 | |||
Content-Type: text/html | Content-Type: text/html | |||
... | ... | |||
A server MUST ignore a "h2" token in an Upgrade header field. | A server MUST ignore an "h2" token in an Upgrade header field. | |||
Presence of a token with "h2" implies HTTP/2 over TLS, which is | Presence of a token with "h2" implies HTTP/2 over TLS, which is | |||
instead negotiated as described in Section 3.3. | instead negotiated as described in Section 3.3. | |||
A server that supports HTTP/2 can accept the upgrade with a 101 | A server that supports HTTP/2 accepts the upgrade with a 101 | |||
(Switching Protocols) response. After the empty line that terminates | (Switching Protocols) response. After the empty line that terminates | |||
the 101 response, the server can begin sending HTTP/2 frames. These | the 101 response, the server can begin sending HTTP/2 frames. These | |||
frames MUST include a response to the request that initiated the | frames MUST include a response to the request that initiated the | |||
Upgrade. | upgrade. | |||
For example: | ||||
HTTP/1.1 101 Switching Protocols | HTTP/1.1 101 Switching Protocols | |||
Connection: Upgrade | Connection: Upgrade | |||
Upgrade: h2c | Upgrade: h2c | |||
[ 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 MUST be a server connection | |||
(Section 6.5). Upon receiving the 101 response, the client sends a | preface (Section 3.5) consisting of a SETTINGS frame (Section 6.5). | |||
connection preface (Section 3.5), which includes a SETTINGS frame. | Upon receiving the 101 response, the client MUST send a 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 a | |||
identifier 1 and is assigned default priority values (Section 5.3.5). | stream identifier of 1 (see Section 5.1.1) with default priority | |||
Stream 1 is implicitly half closed from the client toward the server, | values (Section 5.3.5). Stream 1 is implicitly "half-closed" from | |||
since the request is completed as an HTTP/1.1 request. After | the client toward the server (see Section 5.1), since the request is | |||
commencing the HTTP/2 connection, stream 1 is used for the response. | completed as an HTTP/1.1 request. After 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 parameters that govern the | is a connection-specific header field that includes parameters that | |||
HTTP/2 connection, provided in anticipation of the server accepting | govern the HTTP/2 connection, provided in anticipation of the server | |||
the request to upgrade. | accepting the request to upgrade. | |||
HTTP2-Settings = token68 | HTTP2-Settings = token68 | |||
A server MUST reject an attempt to upgrade if this header field is | A server MUST NOT upgrade the connection to HTTP/2 if this header | |||
not present. A server MUST NOT send this header field. | field is not present or if more than one is present. A server MUST | |||
NOT send this header field. | ||||
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 | |||
[RFC7235]. | [RFC7235]. | |||
As a hop-by-hop header field, the "Connection" header field MUST | Since the upgrade is only intended to apply to the immediate | |||
include a value of "HTTP2-Settings" in addition to "Upgrade" when | connection, a client sending the HTTP2-Settings header field MUST | |||
upgrading to HTTP/2. | also send "HTTP2-Settings" as a connection option in the Connection | |||
header field to prevent it from being forwarded (see Section 6.1 of | ||||
[RFC7230]). | ||||
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 parameters | SETTINGS frame. Explicit acknowledgement of these settings | |||
(Section 6.5.3) is not necessary, since a 101 response serves as | (Section 6.5.3) is not necessary, since a 101 response serves as | |||
implicit acknowledgment. Providing these values in the Upgrade | implicit acknowledgement. Providing these values in the upgrade | |||
request ensures that the protocol does not require default values for | request gives a client an opportunity to provide parameters prior to | |||
the above SETTINGS parameters, and gives a client an opportunity 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 uses TLS [TLS12] with | |||
knowledge about support for HTTP/2 uses TLS [TLS12] with the | the application-layer protocol negotiation (ALPN) extension | |||
application layer protocol negotiation extension [TLS-ALPN]. | [TLS-ALPN]. | |||
HTTP/2 over TLS uses the "h2" application token. The "h2c" token | HTTP/2 over TLS uses the "h2" protocol identifier. The "h2c" | |||
MUST NOT be sent by a client or selected by a server. | protocol identifier MUST NOT be sent by a client or selected by a | |||
server; the "h2c" protocol identifier describes a protocol that does | ||||
not use TLS. | ||||
Once TLS negotiation is complete, both the client and the server send | Once TLS negotiation is complete, both the client and the server MUST | |||
a connection preface (Section 3.5). | send 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, [ALT-SVC] describes a mechanism for advertising | means. For example, [ALT-SVC] describes a mechanism for advertising | |||
this capability. | this capability. | |||
A client MAY immediately send HTTP/2 frames to a server that is known | A client MUST send the connection preface (Section 3.5) and then MAY | |||
to support HTTP/2, after the connection preface (Section 3.5). A | immediately send HTTP/2 frames to such a server; servers can identify | |||
server can identify such a connection by the use of the "PRI" method | these connections by the presence of the connection preface. This | |||
in the connection preface. This only affects the establishment of | only affects the establishment of HTTP/2 connections over cleartext | |||
HTTP/2 connections over cleartext TCP; implementations that support | TCP; implementations that support HTTP/2 over TLS MUST use protocol | |||
HTTP/2 over TLS MUST use protocol negotiation in TLS [TLS-ALPN]. | negotiation in TLS [TLS-ALPN]. | |||
Prior support for HTTP/2 is not a strong signal that a given server | Likewise, the server MUST send a connection preface (Section 3.5). | |||
will support HTTP/2 for future connections. It is possible for | ||||
server configurations to change; for configurations to differ between | Without additional information, prior support for HTTP/2 is not a | |||
instances in clustered server; or network conditions to change. | strong signal that a given server will support HTTP/2 for future | |||
connections. For example, it is possible for server configurations | ||||
to change, for configurations to differ between instances in | ||||
clustered servers, or for network conditions to change. | ||||
3.5. HTTP/2 Connection Preface | 3.5. HTTP/2 Connection Preface | |||
Upon establishment of a TCP connection and determination that HTTP/2 | In HTTP/2, each endpoint is required to send a connection preface as | |||
will be used by both peers, each endpoint MUST send a connection | a final confirmation of the protocol in use and to establish the | |||
preface as a final confirmation and to establish the initial SETTINGS | initial settings for the HTTP/2 connection. The client and server | |||
parameters for the HTTP/2 connection. | each send a different connection preface. | |||
The client connection preface 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 is: | |||
0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a | 0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a | |||
(the string "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"). This sequence is | That is, the connection preface starts with the string "PRI * | |||
followed by a SETTINGS frame (Section 6.5). The SETTINGS frame MAY | HTTP/2.0\r\n\r\nSM\r\n\r\n"). This sequence MUST be followed by a | |||
be empty. The client sends the client connection preface immediately | SETTINGS frame (Section 6.5), which MAY be empty. The client sends | |||
upon receipt of a 101 Switching Protocols response (indicating a | the client connection preface immediately upon receipt of a 101 | |||
successful upgrade), or as the first application data octets of a TLS | (Switching Protocols) response (indicating a successful upgrade) or | |||
connection. If starting an HTTP/2 connection with prior knowledge of | as the first application data octets of a TLS connection. If | |||
server support for the protocol, the client connection preface is | starting an HTTP/2 connection with prior knowledge of server support | |||
sent upon connection establishment. | for the protocol, the client connection preface is sent upon | |||
connection establishment. | ||||
The client connection preface is selected so that a large | Note: 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 preface consists of a potentially empty | The server connection preface consists of a potentially empty | |||
SETTINGS frame (Section 6.5) that MUST be the first frame the server | SETTINGS frame (Section 6.5) that MUST be the first frame the server | |||
sends in the HTTP/2 connection. | sends in the HTTP/2 connection. | |||
The SETTINGS frames received from a peer as part of the connection | ||||
preface MUST be acknowledged (see Section 6.5.3) after sending the | ||||
connection preface. | ||||
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 preface, without waiting to receive the server connection | connection preface, without waiting to receive the server connection | |||
preface. It is important to note, however, that the server | preface. It is important to note, however, that the server | |||
connection preface SETTINGS frame might include parameters that | connection preface SETTINGS frame might include parameters that | |||
necessarily alter how a client is expected to communicate with the | necessarily alter how a client is expected to communicate with the | |||
server. Upon receiving the SETTINGS frame, the client is expected to | server. Upon receiving the SETTINGS frame, the client is expected to | |||
honor any parameters established. In some configurations, it is | honor any parameters established. In some configurations, it is | |||
possible for the server to transmit SETTINGS before the client, | possible for the server to transmit SETTINGS before the client sends | |||
providing an opportunity to avoid this issue. | additional frames, providing an opportunity to avoid this issue. | |||
Clients and servers MUST terminate the TCP connection if either peer | Clients and servers MUST treat an invalid connection preface as a | |||
does not begin with a valid connection preface. A GOAWAY frame | connection error (Section 5.4.1) of type PROTOCOL_ERROR. A GOAWAY | |||
(Section 6.8) can be omitted if it is clear that the peer is not | frame (Section 6.8) MAY be omitted in this case, since an invalid | |||
using HTTP/2. | preface indicates that the peer is not 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 | |||
All frames begin with a fixed 9-octet header followed by a variable- | All frames begin with a fixed 9-octet header followed by a variable- | |||
length payload. | length payload. | |||
0 1 2 3 | +-----------------------------------------------+ | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Length (24) | | | Length (24) | | |||
+---------------+---------------+---------------+ | +---------------+---------------+---------------+ | |||
| Type (8) | Flags (8) | | | Type (8) | Flags (8) | | |||
+-+-+-----------+---------------+-------------------------------+ | +-+-------------+---------------+-------------------------------+ | |||
|R| Stream Identifier (31) | | |R| Stream Identifier (31) | | |||
+=+=============================================================+ | +=+=============================================================+ | |||
| Frame Payload (0...) ... | | Frame Payload (0...) ... | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
Frame Layout | Figure 1: Frame Layout | |||
The fields of the frame header are defined as: | The fields of the frame header are defined as: | |||
Length: The length of the frame payload expressed as an unsigned 24- | Length: The length of the frame payload expressed as an unsigned 24- | |||
bit integer. Values greater than 2^14 (16,384) MUST NOT be sent | bit integer. Values greater than 2^14 (16,384) MUST NOT be sent | |||
unless the receiver has set a larger value for | unless the receiver has set a larger value for | |||
SETTINGS_MAX_FRAME_SIZE. | SETTINGS_MAX_FRAME_SIZE. | |||
The 9 octets of the frame header are not included in this value. | The 9 octets of the frame header are not included in this value. | |||
Type: The 8-bit type of the frame. The frame type determines the | Type: The 8-bit type of the frame. The frame type determines the | |||
format and semantics of the frame. Implementations MUST ignore | format and semantics of the frame. Implementations MUST ignore | |||
and discard any frame that has a type that is unknown. | and discard any frame that has a type that is unknown. | |||
Flags: An 8-bit field reserved for frame-type specific boolean | Flags: An 8-bit field reserved for boolean flags specific to the | |||
flags. | frame type. | |||
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 (0x0) 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, | |||
and the bit MUST remain unset (0) when sending and MUST be ignored | and the bit MUST remain unset (0x0) when sending and MUST be | |||
when receiving. | ignored when receiving. | |||
Stream Identifier: A 31-bit stream identifier (see Section 5.1.1). | Stream Identifier: A stream identifier (see Section 5.1.1) expressed | |||
The value 0 is reserved for frames that are associated with the | as an unsigned 31-bit integer. The value 0x0 is reserved for | |||
connection as a whole as opposed to an individual stream. | frames that are associated with the 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 size of a frame payload is limited by the maximum size that a | The size of a frame payload is limited by the maximum size that a | |||
receiver advertises in the SETTINGS_MAX_FRAME_SIZE setting. This | receiver advertises in the SETTINGS_MAX_FRAME_SIZE setting. This | |||
setting can have any value between 2^14 (16,384) and 2^24-1 | setting can have any value between 2^14 (16,384) and 2^24-1 | |||
(16,777,215) octets, inclusive. | (16,777,215) octets, inclusive. | |||
All implementations MUST be capable of receiving and minimally | All implementations MUST be capable of receiving and minimally | |||
processing frames up to 2^14 octets in length, plus the 9 octet frame | processing frames up to 2^14 octets in length, plus the 9-octet frame | |||
header (Section 4.1). The size of the frame header is not included | header (Section 4.1). The size of the frame header is not included | |||
when describing frame sizes. | when describing frame sizes. | |||
Note: Certain frame types, such as PING (Section 6.7), impose | Note: Certain frame types, such as PING (Section 6.7), impose | |||
additional limits on the amount of payload data allowed. | additional limits on the amount of payload data allowed. | |||
If a frame size exceeds any defined limit, or is too small to contain | An endpoint MUST send an error code of FRAME_SIZE_ERROR if a frame | |||
mandatory frame data, the endpoint MUST send a FRAME_SIZE_ERROR | exceeds the size defined in SETTINGS_MAX_FRAME_SIZE, exceeds any | |||
error. A frame size error in a frame that could alter the state of | limit defined for the frame type, or is too small to contain | |||
the entire connection MUST be treated as a connection error | mandatory frame data. A frame size error in a frame that could alter | |||
(Section 5.4.1); this includes any frame carrying a header block | the state of the entire connection MUST be treated as a connection | |||
(Section 4.3) (that is, HEADERS, PUSH_PROMISE, and CONTINUATION), | error (Section 5.4.1); this includes any frame carrying a header | |||
SETTINGS, and any WINDOW_UPDATE frame with a stream identifier of 0. | block (Section 4.3) (that is, HEADERS, PUSH_PROMISE, and | |||
CONTINUATION), SETTINGS, and any frame with a stream identifier of 0. | ||||
Endpoints are not obligated to use all available space in a frame. | Endpoints are not obligated to use all available space in a frame. | |||
Responsiveness can be improved by using frames that are smaller than | Responsiveness can be improved by using frames that are smaller than | |||
the permitted maximum size. Sending large frames can result in | the permitted maximum size. Sending large frames can result in | |||
delays in sending maintenance frames, such RST_STREAM, WINDOW_UPDATE, | delays in sending time-sensitive frames (such as RST_STREAM, | |||
or PRIORITY, which if blocked by the transmission of a large frame, | WINDOW_UPDATE, or PRIORITY), which, if blocked by the transmission of | |||
could affect performance. | a large frame, could affect performance. | |||
4.3. Header Compression and Decompression | 4.3. Header Compression and Decompression | |||
A header field in HTTP/2 is a name with one or more associated | Just as in HTTP/1, a header field in HTTP/2 is a name with one or | |||
values. They are used within HTTP request and response messages as | more associated values. Header fields are used within HTTP request | |||
well as server push operations (see Section 8.2). | and response messages as well as in server push operations (see | |||
Section 8.2). | ||||
Header lists are collections of zero or more header fields. When | Header lists are collections of zero or more header fields. When | |||
transmitted over a connection, a header list is serialized into a | transmitted over a connection, a header list 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. | |||
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.2.5). | mapping (see Section 8.1.2.5). | |||
A receiving endpoint reassembles the header block by concatenating | A receiving endpoint reassembles the header block by concatenating | |||
its fragments, then decompresses the block to reconstruct the header | its fragments and then decompresses the block to reconstruct the | |||
list. | header list. | |||
A complete header block consists of either: | A complete header block consists of either: | |||
o a single HEADERS or PUSH_PROMISE frame, with the END_HEADERS flag | o a single HEADERS or PUSH_PROMISE frame, with the END_HEADERS flag | |||
set, or | set, or | |||
o a HEADERS or PUSH_PROMISE frame with the END_HEADERS flag cleared | o a HEADERS or PUSH_PROMISE frame with the END_HEADERS flag cleared | |||
and one or more CONTINUATION frames, where the last CONTINUATION | and one or more CONTINUATION frames, where the last CONTINUATION | |||
frame has the END_HEADERS flag set. | frame has the END_HEADERS flag set. | |||
Header compression is stateful, using a single compression context | Header compression is stateful. One compression context and one | |||
for the entire connection. Each header block is processed as a | decompression context are used for the entire connection. A decoding | |||
discrete unit. Header blocks MUST be transmitted as a contiguous | error in a header block MUST be treated as a connection error | |||
sequence of frames, with no interleaved frames of any other type or | (Section 5.4.1) of type COMPRESSION_ERROR. | |||
from any other stream. The last frame in a sequence of HEADERS or | ||||
CONTINUATION frames MUST have the END_HEADERS flag set. The last | Each header block is processed as a discrete unit. Header blocks | |||
frame in a sequence of PUSH_PROMISE or CONTINUATION frames MUST have | MUST be transmitted as a contiguous sequence of frames, with no | |||
the END_HEADERS flag set. This allows a header block to be logically | interleaved frames of any other type or from any other stream. The | |||
equivalent to a single frame. | last frame in a sequence of HEADERS or CONTINUATION frames has the | |||
END_HEADERS flag set. The last frame in a sequence of PUSH_PROMISE | ||||
or CONTINUATION frames has the END_HEADERS flag set. This allows a | ||||
header block to be logically equivalent to a single frame. | ||||
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, because these frames carry data | PUSH_PROMISE, or CONTINUATION frames because these frames carry data | |||
that can modify the compression context maintained by a receiver. An | that can modify the compression context maintained by a receiver. An | |||
endpoint receiving HEADERS, PUSH_PROMISE or CONTINUATION frames MUST | endpoint receiving HEADERS, PUSH_PROMISE, or CONTINUATION frames | |||
reassemble header blocks and perform decompression even if the frames | needs to reassemble header blocks and perform decompression even if | |||
are to be discarded. A receiver MUST terminate the connection with a | the frames are to be discarded. A receiver MUST terminate the | |||
connection error (Section 5.4.1) of type COMPRESSION_ERROR if it does | connection with a connection error (Section 5.4.1) of type | |||
not decompress a header block. | COMPRESSION_ERROR if it does not decompress a header block. | |||
5. Streams and Multiplexing | 5. Streams and Multiplexing | |||
A "stream" is an independent, bi-directional sequence of frames | A "stream" is an independent, bidirectional sequence of frames | |||
exchanged between the client and server within an HTTP/2 connection. | exchanged between the client and server within an HTTP/2 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 on a stream is significant. | o The order in which frames are sent on a stream is significant. | |||
Recipients process frames in the order they are received. In | Recipients process frames in the order they are received. In | |||
particular, the order of HEADERS, and DATA frames is semantically | particular, the order of HEADERS and DATA frames is semantically | |||
significant. | significant. | |||
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 endpoint initiating the stream. | 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 2. | |||
+--------+ | +--------+ | |||
PP | | PP | send PP | | recv PP | |||
,--------| idle |--------. | ,--------| idle |--------. | |||
/ | | \ | / | | \ | |||
v +--------+ v | v +--------+ v | |||
+----------+ | +----------+ | +----------+ | +----------+ | |||
| | | H | | | | | | send H / | | | |||
,---| reserved | | | reserved |---. | ,------| reserved | | recv H | reserved |------. | |||
| | (local) | v | (remote) | | | | | (local) | | | (remote) | | | |||
| +----------+ +--------+ +----------+ | | | +----------+ v +----------+ | | |||
| | ES | | ES | | | | | +--------+ | | | |||
| | H ,-------| open |-------. | H | | | | recv ES | | send ES | | | |||
| | / | | \ | | | | send H | ,-------| open |-------. | recv H | | |||
| v v +--------+ v v | | | | / | | \ | | | |||
| +----------+ | +----------+ | | | v v +--------+ v v | | |||
| | half | | | half | | | | +----------+ | +----------+ | | |||
| | closed | | R | closed | | | | | half | | | half | | | |||
| | (remote) | | | (local) | | | | | closed | | send R / | closed | | | |||
| +----------+ | +----------+ | | | | (remote) | | recv R | (local) | | | |||
| | v | | | | +----------+ | +----------+ | | |||
| | ES / R +--------+ ES / R | | | | | | | | | |||
| `----------->| |<-----------' | | | | send ES / | recv ES / | | | |||
| R | closed | R | | | | send R / v send R / | | | |||
`-------------------->| |<--------------------' | | | recv R +--------+ recv R | | | |||
+--------+ | | send R / `----------->| |<-----------' send R / | | |||
| recv R | closed | recv R | | ||||
`----------------------->| |<----------------------' | ||||
+--------+ | ||||
send: endpoint sends this frame | ||||
recv: endpoint receives this frame | ||||
H: HEADERS frame (with implied CONTINUATIONs) | H: HEADERS frame (with implied CONTINUATIONs) | |||
PP: PUSH_PROMISE frame (with implied CONTINUATIONs) | PP: PUSH_PROMISE frame (with implied CONTINUATIONs) | |||
ES: END_STREAM flag | ES: END_STREAM flag | |||
R: RST_STREAM frame | R: RST_STREAM frame | |||
Figure 2: Stream States | ||||
Figure 1: Stream States | Note that this diagram shows stream state transitions and the frames | |||
and flags that affect those transitions only. In this regard, | ||||
Note that this diagram shows stream state transitions and frames that | CONTINUATION frames do not result in state transitions; they are | |||
affect those transitions only. In this regard, CONTINUATION frames | effectively part of the HEADERS or PUSH_PROMISE that they follow. | |||
do not result in state transitions and are effectively part of the | For the purpose of state transitions, the END_STREAM flag is | |||
HEADERS or PUSH_PROMISE that they follow. | processed as a separate event to the frame that bears it; a HEADERS | |||
frame with the END_STREAM flag set can cause two state transitions. | ||||
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. | |||
have been exchanged. | ||||
The following transitions are valid from this state: | The following transitions are valid from this state: | |||
* Sending or receiving a HEADERS frame causes the stream to | * Sending or receiving a HEADERS frame causes the stream to | |||
become "open". The stream identifier is selected as described | become "open". The stream identifier is selected as described | |||
in Section 5.1.1. The same HEADERS frame can also cause a | in Section 5.1.1. The same HEADERS frame can also cause a | |||
stream to immediately become "half closed". | stream to immediately become "half-closed". | |||
* Sending a PUSH_PROMISE frame marks the associated stream for | * Sending a PUSH_PROMISE frame on another stream reserves the | |||
later use. The stream state for the reserved stream | idle stream that is identified for later use. The stream state | |||
transitions to "reserved (local)". | for the reserved stream transitions to "reserved (local)". | |||
* Receiving a PUSH_PROMISE frame marks the associated stream as | * Receiving a PUSH_PROMISE frame on another stream reserves an | |||
reserved by the remote peer. The state of the stream becomes | idle stream that is identified for later use. The stream state | |||
"reserved (remote)". | for the reserved stream transitions to "reserved (remote)". | |||
* Note that the PUSH_PROMISE frame is not sent on the idle stream | ||||
but references the newly reserved stream in the Promised Stream | ||||
ID field. | ||||
Receiving any frame other than HEADERS or PRIORITY on a stream in | ||||
this state MUST be treated as a connection error (Section 5.4.1) | ||||
of type PROTOCOL_ERROR. | ||||
reserved (local): | reserved (local): | |||
A stream in the "reserved (local)" state is one that has been | A stream in the "reserved (local)" state is one that has been | |||
promised by sending a PUSH_PROMISE frame. A PUSH_PROMISE frame | promised by sending a PUSH_PROMISE frame. A PUSH_PROMISE frame | |||
reserves an idle stream by associating the stream with an open | reserves an idle stream by associating the stream with an open | |||
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 HEADERS or RST_STREAM | An endpoint MUST NOT send any type of frame other than HEADERS, | |||
in this state. | RST_STREAM, or PRIORITY in this state. | |||
A PRIORITY frame MAY be received in this state. Receiving any | A PRIORITY or WINDOW_UPDATE frame MAY be received in this state. | |||
frames other than RST_STREAM, or PRIORITY MUST be treated as a | Receiving any type of frame other than RST_STREAM, PRIORITY, or | |||
WINDOW_UPDATE on a stream in this state 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)". | |||
* 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 MAY send a PRIORITY frame in this state to | An endpoint MAY send a PRIORITY frame in this state to | |||
reprioritize the reserved stream. An endpoint MUST NOT send any | reprioritize the reserved stream. An endpoint MUST NOT send any | |||
other type of frame other than RST_STREAM or PRIORITY. | type of frame other than RST_STREAM, WINDOW_UPDATE, or PRIORITY in | |||
this state. | ||||
Receiving any other type of frame other than HEADERS or RST_STREAM | Receiving any type of frame other than HEADERS, RST_STREAM, or | |||
MUST be treated as a connection error (Section 5.4.1) of type | PRIORITY on a stream in this state MUST be treated as a connection | |||
PROTOCOL_ERROR. | error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
open: | open: | |||
A stream in the "open" state may be used by both peers to send | A stream in the "open" state may be used by both peers to send | |||
frames of any type. In this state, sending peers observe | frames of any type. In this state, sending peers observe | |||
advertised stream level flow control limits (Section 5.2). | advertised stream-level flow-control limits (Section 5.2). | |||
From this state either endpoint can send a frame with an | From this state, either endpoint can send a frame with an | |||
END_STREAM flag set, which causes the stream to transition into | END_STREAM flag set, which causes the stream to transition into | |||
one of the "half closed" states: an endpoint sending an END_STREAM | one of the "half-closed" states. An endpoint sending an | |||
flag causes the stream state to become "half closed (local)"; an | END_STREAM flag causes the stream state to become "half-closed | |||
endpoint receiving an END_STREAM flag causes the stream state to | (local)"; an endpoint receiving an END_STREAM flag causes the | |||
become "half closed (remote)". | stream state to become "half-closed (remote)". | |||
Either endpoint can send a RST_STREAM frame from this state, | Either endpoint can send a RST_STREAM frame from this state, | |||
causing it to transition immediately to "closed". | causing it to transition immediately to "closed". | |||
half closed (local): | half-closed (local): | |||
A stream that is in the "half closed (local)" state cannot be used | A stream that is in the "half-closed (local)" state cannot be used | |||
for sending frames. Only WINDOW_UPDATE, PRIORITY and RST_STREAM | for sending frames other than WINDOW_UPDATE, PRIORITY, and | |||
frames can be sent in this state. | RST_STREAM. | |||
A stream transitions from this state to "closed" when a frame that | A stream transitions from this state to "closed" when a frame that | |||
contains an END_STREAM flag is received, or when either peer sends | contains an END_STREAM flag is received or when either peer sends | |||
a RST_STREAM frame. | a RST_STREAM frame. | |||
A receiver can ignore WINDOW_UPDATE frames in this state, which | An endpoint can receive any type of frame in this state. | |||
might arrive for a short period after a frame bearing the | Providing flow-control credit using WINDOW_UPDATE frames is | |||
END_STREAM flag is sent. | necessary to continue receiving flow-controlled frames. In this | |||
state, a receiver can ignore WINDOW_UPDATE frames, which might | ||||
arrive for a short period after a frame bearing the END_STREAM | ||||
flag is sent. | ||||
PRIORITY frames received in this state are used to reprioritize | PRIORITY frames received in this state are used to reprioritize | |||
streams that depend on the current stream. | streams that depend on the identified stream. | |||
half closed (remote): | half-closed (remote): | |||
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. | |||
performs flow control. | ||||
If an endpoint receives additional frames for a stream that is in | If an endpoint receives additional frames, other than | |||
this state, other than WINDOW_UPDATE, PRIORITY or RST_STREAM, it | WINDOW_UPDATE, PRIORITY, or RST_STREAM, for a stream that is in | |||
MUST respond with a stream error (Section 5.4.2) of type | this state, it MUST respond with a stream error (Section 5.4.2) of | |||
STREAM_CLOSED. | type STREAM_CLOSED. | |||
A stream that is "half closed (remote)" can be used by the | A stream that is "half-closed (remote)" can be used by the | |||
endpoint to send frames of any type. In this state, the endpoint | endpoint to send frames of any type. In this state, the endpoint | |||
continues to observe advertised stream level flow control limits | continues to observe advertised stream-level flow-control limits | |||
(Section 5.2). | (Section 5.2). | |||
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 an END_STREAM flag, or when either peer sends | frame that contains an END_STREAM flag or when either peer sends a | |||
a RST_STREAM frame. | 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 other than PRIORITY on a closed | |||
that receives any frame other than PRIORITY after receiving a | stream. An endpoint that receives any frame other than PRIORITY | |||
RST_STREAM MUST treat that as a stream error (Section 5.4.2) of | after receiving a RST_STREAM MUST treat that as a stream error | |||
type STREAM_CLOSED. Similarly, an endpoint that receives any | (Section 5.4.2) of type STREAM_CLOSED. Similarly, an endpoint | |||
frames after receiving a frame with the END_STREAM flag set MUST | that receives any frames after receiving a frame with the | |||
treat that as a connection error (Section 5.4.1) of type | END_STREAM flag set MUST treat that as a connection error | |||
STREAM_CLOSED, unless the frame is permitted as described below. | (Section 5.4.1) of type STREAM_CLOSED, unless the frame is | |||
permitted as described below. | ||||
WINDOW_UPDATE or RST_STREAM frames can be received in this state | WINDOW_UPDATE or RST_STREAM frames can be received in this state | |||
for a short period after a DATA or HEADERS frame containing an | for a short period after a DATA or HEADERS frame containing an | |||
END_STREAM flag is sent. Until the remote peer receives and | END_STREAM flag is sent. Until the remote peer receives and | |||
processes the frame bearing the END_STREAM flag, it might send | processes RST_STREAM or the frame bearing the END_STREAM flag, it | |||
frames of these types. Endpoints MUST ignore WINDOW_UPDATE or | might send frames of these types. Endpoints MUST ignore | |||
RST_STREAM frames received in this state, though endpoints MAY | WINDOW_UPDATE or RST_STREAM frames received in this state, though | |||
choose to treat frames that arrive a significant time after | endpoints MAY choose to treat frames that arrive a significant | |||
sending END_STREAM as a connection error (Section 5.4.1) of type | time after sending END_STREAM as a connection error | |||
PROTOCOL_ERROR. | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
PRIORITY frames can be sent on closed streams to prioritize | PRIORITY frames can be sent on closed streams to prioritize | |||
streams that are dependent on the closed stream. Endpoints SHOULD | streams that are dependent on the closed stream. Endpoints SHOULD | |||
process PRIORITY frame, though they can be ignored if the stream | process PRIORITY frames, though they can be ignored if the stream | |||
has been removed from the dependency tree (see Section 5.3.4). | has been removed from the dependency tree (see Section 5.3.4). | |||
If this state is reached as a result of sending a RST_STREAM | If this state is reached as a result of sending a RST_STREAM | |||
frame, the peer that receives the RST_STREAM might have already | frame, the peer that receives the RST_STREAM might have already | |||
sent - or enqueued for sending - frames on the stream that cannot | sent -- or enqueued for sending -- frames on the stream that | |||
be withdrawn. An endpoint MUST ignore frames that it receives on | cannot be withdrawn. An endpoint MUST ignore frames that it | |||
closed streams after it has sent a RST_STREAM frame. An endpoint | receives on closed streams after it has sent a RST_STREAM frame. | |||
MAY choose to limit the period over which it ignores frames and | An endpoint MAY choose to limit the period over which it ignores | |||
treat frames that arrive after this time as being in error. | frames and treat frames that arrive after this time as being in | |||
error. | ||||
Flow controlled frames (i.e., DATA) received after sending | Flow-controlled frames (i.e., DATA) received after sending | |||
RST_STREAM are counted toward the connection flow control window. | RST_STREAM are counted toward the connection flow-control window. | |||
Even though these frames might be ignored, because they are sent | Even though these frames might be ignored, because they are sent | |||
before the sender receives the RST_STREAM, the sender will | before the sender receives the RST_STREAM, the sender will | |||
consider the frames to count against the flow control window. | consider the frames to count against the flow-control window. | |||
An endpoint might receive a PUSH_PROMISE frame after it sends | An endpoint might receive a PUSH_PROMISE frame after it sends | |||
RST_STREAM. PUSH_PROMISE causes a stream to become "reserved" | RST_STREAM. PUSH_PROMISE causes a stream to become "reserved" | |||
even if the associated stream has been reset. Therefore, a | even if the associated stream has been reset. Therefore, a | |||
RST_STREAM is needed to close an unwanted promised stream. | RST_STREAM is needed to close an unwanted promised stream. | |||
In the absence of more specific guidance elsewhere in this document, | In the absence of more specific guidance elsewhere in this document, | |||
implementations SHOULD treat the receipt of a message that is not | implementations SHOULD treat the receipt of a frame that is not | |||
expressly permitted in the description of a state as a connection | expressly permitted in the description of a state as a connection | |||
error (Section 5.4.1) of type PROTOCOL_ERROR. | error (Section 5.4.1) of type PROTOCOL_ERROR. Note that PRIORITY can | |||
be sent and received in any stream state. Frames of unknown types | ||||
are ignored. | ||||
An example of the state transitions for an HTTP request/response | An example of the state transitions for an HTTP request/response | |||
exchange can be found in Section 8.1. An example of the state | exchange can be found in Section 8.1. An example of the state | |||
transitions for server push can be found in Section 8.2.1 and | transitions for server push can be found in Sections 8.2.1 and 8.2.2. | |||
Section 8.2.2. | ||||
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 cannot be used to establish a | messages; the stream identifier of zero cannot be used to establish a | |||
new stream. | new stream. | |||
HTTP/1.1 requests that are upgraded to HTTP/2 (see Section 3.2) are | HTTP/1.1 requests that are upgraded to HTTP/2 (see Section 3.2) are | |||
responded to with a stream identifier of one (0x1). After the | responded to with a stream identifier of one (0x1). After the | |||
upgrade completes, stream 0x1 is "half closed (local)" to the client. | upgrade completes, stream 0x1 is "half-closed (local)" to the client. | |||
Therefore, stream 0x1 cannot be selected as a new stream identifier | Therefore, stream 0x1 cannot be selected as a new stream 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. | |||
skipping to change at page 21, line 37 ¶ | skipping to change at page 22, line 17 ¶ | |||
5.1.2. Stream Concurrency | 5.1.2. Stream Concurrency | |||
A peer can limit the number of concurrently active streams using the | A peer can limit the number of concurrently active streams using the | |||
SETTINGS_MAX_CONCURRENT_STREAMS parameter (see Section 6.5.2) within | SETTINGS_MAX_CONCURRENT_STREAMS parameter (see Section 6.5.2) within | |||
a SETTINGS frame. The maximum concurrent streams setting is specific | a SETTINGS frame. The maximum concurrent streams setting is specific | |||
to each endpoint and applies only to the peer that receives the | to each endpoint and applies only to the peer that receives the | |||
setting. That is, clients specify the maximum number of concurrent | setting. That is, clients specify the maximum number of concurrent | |||
streams the server can initiate, and servers specify the maximum | streams the server can initiate, and servers specify the maximum | |||
number of concurrent streams the client can initiate. | number of concurrent streams the client can initiate. | |||
Streams that are in the "open" state, or either of the "half closed" | Streams that are in the "open" state or in either of the "half- | |||
states count toward the maximum number of streams that an endpoint is | closed" states count toward the maximum number of streams that an | |||
permitted to open. Streams in any of these three states count toward | endpoint is permitted to open. Streams in any of these three states | |||
the limit advertised in the SETTINGS_MAX_CONCURRENT_STREAMS setting. | count toward the limit advertised in the | |||
Streams in either of the "reserved" states do not count toward the | SETTINGS_MAX_CONCURRENT_STREAMS setting. Streams in either of the | |||
stream limit. | "reserved" states do not count toward the stream limit. | |||
Endpoints MUST NOT exceed the limit set by their peer. An endpoint | Endpoints MUST NOT exceed the limit set by their peer. An endpoint | |||
that receives a HEADERS frame that causes their advertised concurrent | that receives a HEADERS frame that causes its advertised concurrent | |||
stream limit to be exceeded MUST treat this as a stream error | stream limit to be exceeded MUST treat this as a stream error | |||
(Section 5.4.2). An endpoint that wishes to reduce the value of | (Section 5.4.2) of type PROTOCOL_ERROR or REFUSED_STREAM. The choice | |||
of error code determines whether the endpoint wishes to enable | ||||
automatic retry (see Section 8.1.4) for details). | ||||
An endpoint that wishes to reduce the value of | ||||
SETTINGS_MAX_CONCURRENT_STREAMS to a value that is below the current | SETTINGS_MAX_CONCURRENT_STREAMS to a value that is below the current | |||
number of open streams can either close streams that exceed the new | number of open streams can either close streams that exceed the new | |||
value or allow streams to complete. | value or allow streams to complete. | |||
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 | |||
frame (Section 6.9). | frame (Section 6.9). | |||
5.2.1. Flow Control Principles | 5.2.1. Flow-Control Principles | |||
HTTP/2 stream flow control aims to allow for future improvements to | HTTP/2 stream flow control aims to allow a variety of flow-control | |||
flow control algorithms without requiring protocol changes. Flow | algorithms to be used without requiring protocol changes. Flow | |||
control in HTTP/2 has the following characteristics: | control in HTTP/2 has the following characteristics: | |||
1. Flow control is hop-by-hop, not end-to-end. | 1. Flow control is specific to a connection. Both types of flow | |||
control are between the endpoints of a single hop and not over | ||||
the entire end-to-end path. | ||||
2. Flow control is based on window update frames. Receivers | 2. Flow control is based on WINDOW_UPDATE frames. Receivers | |||
advertise how many bytes they are prepared to receive on a stream | advertise how many octets they are prepared to receive on a | |||
and for the entire connection. This is a credit-based scheme. | stream and for the entire connection. This is a credit-based | |||
scheme. | ||||
3. Flow control is directional with overall control provided by the | 3. Flow control is directional with overall control provided by the | |||
receiver. A receiver MAY choose to set any window size that it | receiver. A receiver MAY choose to set any window size that it | |||
desires for each stream and for the entire connection. A sender | desires for each stream and for the entire connection. A sender | |||
MUST respect flow control limits imposed by a receiver. Clients, | MUST respect flow-control limits imposed by a receiver. Clients, | |||
servers and intermediaries all independently advertise their flow | servers, and intermediaries all independently advertise their | |||
control window as a receiver and abide by the flow control limits | flow-control window as a receiver and abide by the flow-control | |||
set by their peer when sending. | limits set by their peer when sending. | |||
4. The initial value for the flow control window is 65,535 bytes for | 4. The initial value for the flow-control window is 65,535 octets | |||
both new streams and the overall connection. | for both new streams and the overall connection. | |||
5. The frame type determines whether flow control applies to a | 5. The frame type determines whether flow control applies to a | |||
frame. Of the frames specified in this document, only DATA | frame. Of the frames specified in this document, only DATA | |||
frames are subject to flow control; all other frame types do not | frames are subject to flow control; all other frame types do not | |||
consume space in the advertised flow control window. This | consume space in the advertised flow-control window. This | |||
ensures that important control frames are not blocked by flow | ensures that important control frames are not blocked by flow | |||
control. | control. | |||
6. Flow control cannot be disabled. | 6. Flow control cannot be disabled. | |||
7. HTTP/2 defines only the format and semantics of the WINDOW_UPDATE | 7. HTTP/2 defines only the format and semantics of the WINDOW_UPDATE | |||
frame (Section 6.9). This document does not stipulate how a | frame (Section 6.9). This document does not stipulate how a | |||
receiver decides when to send this frame or the value that it | receiver decides when to send this frame or the value that it | |||
sends. Nor does it specify how a sender chooses to send packets. | sends, nor does it specify how a sender chooses to send packets. | |||
Implementations are able to select any algorithm that suits their | Implementations are able to select any algorithm that suits their | |||
needs. | needs. | |||
Implementations are also responsible for managing how requests and | Implementations are also responsible for managing how requests and | |||
responses are sent based on priority; choosing how to avoid head of | responses are sent based on priority, choosing how to avoid head-of- | |||
line blocking for requests; and managing the creation of new streams. | line blocking for requests, and managing the creation of new streams. | |||
Algorithm choices for these could interact with any flow control | Algorithm choices for these could interact with any flow-control | |||
algorithm. | algorithm. | |||
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 to process data on one stream yet wants | |||
continue to process other streams in the same connection. | to 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 window of the maximum size, incrementing the available space | control window of the maximum size (2^31-1) and can maintain this | |||
when new data is received. This effectively disables flow control | window by sending a WINDOW_UPDATE frame when any data is received. | |||
for that receiver. Conversely, a sender is always subject to the | This effectively disables flow control for that receiver. | |||
flow control window advertised by the receiver. | Conversely, a sender is always subject to the flow-control window | |||
advertised by the receiver. | ||||
Deployments with constrained resources (for example, memory) can | Deployments with constrained resources (for example, memory) can | |||
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 [RFC7323]). | |||
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 read and acted upon. | critical frames, such as WINDOW_UPDATE, are not read and acted upon. | |||
5.3. Stream priority | 5.3. Stream Priority | |||
A client can assign a priority for a new stream by including | A client can assign a priority for a new stream by including | |||
prioritization information in the HEADERS frame (Section 6.2) that | prioritization information in the HEADERS frame (Section 6.2) that | |||
opens the stream. For an existing stream, the PRIORITY frame | opens the stream. At any other time, the PRIORITY frame | |||
(Section 6.3) can be used to change the priority. | (Section 6.3) can be used to change the priority of a stream. | |||
The purpose of prioritization is to allow an endpoint to express how | The purpose of prioritization is to allow an endpoint to express how | |||
it would prefer its peer allocate resources when managing concurrent | it would prefer its peer to allocate resources when managing | |||
streams. Most importantly, priority can be used to select streams | concurrent streams. Most importantly, priority can be used to select | |||
for transmitting frames when there is limited capacity for sending. | streams for transmitting frames when there is limited capacity for | |||
sending. | ||||
Streams can be prioritized by marking them as dependent on the | Streams can be prioritized by marking them as dependent on the | |||
completion of other streams (Section 5.3.1). Each dependency is | completion of other streams (Section 5.3.1). Each dependency is | |||
assigned a relative weight, a number that is used to determine the | assigned a relative weight, a number that is used to determine the | |||
relative proportion of available resources that are assigned to | relative proportion of available resources that are assigned to | |||
streams dependent on the same stream. | streams dependent on the same stream. | |||
Explicitly setting the priority for a stream is input to a | Explicitly setting the priority for a stream is input to a | |||
prioritization process. It does not guarantee any particular | prioritization process. It does not guarantee any particular | |||
processing or transmission order for the stream relative to any other | processing or transmission order for the stream relative to any other | |||
stream. An endpoint cannot force a peer to process concurrent | stream. An endpoint cannot force a peer to process concurrent | |||
streams in a particular order using priority. Expressing priority is | streams in a particular order using priority. Expressing priority is | |||
therefore only ever a suggestion. | therefore only a suggestion. | |||
Prioritization information can be specified explicitly for streams as | Prioritization information can be omitted from messages. Defaults | |||
they are created using the HEADERS frame, or changed using the | are used prior to any explicit values being provided (Section 5.3.5). | |||
PRIORITY frame. Providing prioritization information is optional, so | ||||
default values are used if no explicit indicator is provided | ||||
(Section 5.3.5). | ||||
5.3.1. Stream Dependencies | 5.3.1. Stream Dependencies | |||
Each stream can be given an explicit dependency on another stream. | Each stream can be given an explicit dependency on another stream. | |||
Including a dependency expresses a preference to allocate resources | Including a dependency expresses a preference to allocate resources | |||
to the identified stream rather than to the dependent stream. | to the identified stream rather than to the dependent stream. | |||
A stream that is not dependent on any other stream is given a stream | A stream that is not dependent on any other stream is given a stream | |||
dependency of 0x0. In other words, the non-existent stream 0 forms | dependency of 0x0. In other words, the non-existent stream 0 forms | |||
the root of the tree. | the root of the tree. | |||
A stream that depends on another stream is a dependent stream. The | A stream that depends on another stream is a dependent stream. The | |||
stream upon which a stream is dependent is a parent stream. A | stream upon which a stream is dependent is a parent stream. A | |||
dependency on a stream that is not currently in the tree - such as a | dependency on a stream that is not currently in the tree -- such as a | |||
stream in the "idle" state - results in the stream being given a | stream in the "idle" state -- results in that stream being given a | |||
default priority (Section 5.3.5). | default priority (Section 5.3.5). | |||
When assigning a dependency on another stream, the stream is added as | When assigning a dependency on another stream, the stream is added as | |||
a new dependency of the parent stream. Dependent streams that share | a new dependency of the parent stream. Dependent streams that share | |||
the same parent are not ordered with respect to each other. For | the same parent are not ordered with respect to each other. For | |||
example, if streams B and C are dependent on stream A, and if stream | 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 | D is created with a dependency on stream A, this results in a | |||
dependency order of A followed by B, C, and D in any order. | dependency order of A followed by B, C, and D in any order. | |||
A A | A A | |||
/ \ ==> /|\ | / \ ==> /|\ | |||
B C B D C | B C B D C | |||
Example of Default Dependency Creation | Figure 3: Example of Default Dependency Creation | |||
An exclusive flag allows for the insertion of a new level of | An exclusive flag allows for the insertion of a new level of | |||
dependencies. The exclusive flag causes the stream to become the | dependencies. The exclusive flag causes the stream to become the | |||
sole dependency of its parent stream, causing other dependencies to | sole dependency of its parent stream, causing other dependencies to | |||
become dependent on the prioritized stream. In the previous example, | become dependent on the exclusive stream. In the previous example, | |||
if stream D is created with an exclusive dependency on stream A, this | if stream D is created with an exclusive dependency on stream A, this | |||
results in D becoming the dependency parent of B and C. | results in D becoming the dependency parent of B and C. | |||
A | A | |||
A | | A | | |||
/ \ ==> D | / \ ==> D | |||
B C / \ | B C / \ | |||
B C | B C | |||
Example of Exclusive Dependency Creation | Figure 4: Example of Exclusive Dependency Creation | |||
Inside the dependency tree, a dependent stream SHOULD only be | Inside the dependency tree, a dependent stream SHOULD only be | |||
allocated resources if all of the streams that it depends on (the | allocated resources if either all of the streams that it depends on | |||
chain of parent streams up to 0x0) are either closed, or it is not | (the chain of parent streams up to 0x0) are closed or it is not | |||
possible to make progress on them. | possible to make progress on them. | |||
A stream cannot depend on itself. An endpoint MUST treat this as a | A stream cannot depend on itself. An endpoint MUST treat this as a | |||
stream error (Section 5.4.2) of type PROTOCOL_ERROR. | stream error (Section 5.4.2) of type PROTOCOL_ERROR. | |||
5.3.2. Dependency Weighting | 5.3.2. Dependency Weighting | |||
All dependent streams are allocated an integer weight between 1 to | All dependent streams are allocated an integer weight between 1 and | |||
256 (inclusive). | 256 (inclusive). | |||
Streams with the same parent SHOULD be allocated resources | Streams with the same parent SHOULD be allocated resources | |||
proportionally based on their weight. Thus, if stream B depends on | proportionally based on their weight. Thus, if stream B depends on | |||
stream A with weight 4, and C depends on stream A with weight 12, and | stream A with weight 4, stream C depends on stream A with weight 12, | |||
if no progress can be made on A, stream B ideally receives one third | and no progress can be made on stream A, stream B ideally receives | |||
of the resources allocated to stream C. | one-third of the resources allocated to stream C. | |||
5.3.3. Reprioritization | 5.3.3. Reprioritization | |||
Stream priorities are changed using the PRIORITY frame. Setting a | Stream priorities are changed using the PRIORITY frame. Setting a | |||
dependency causes a stream to become dependent on the identified | dependency causes a stream to become dependent on the identified | |||
parent stream. | parent stream. | |||
Dependent streams move with their parent stream if the parent is | Dependent streams move with their parent stream if the parent is | |||
reprioritized. Setting a dependency with the exclusive flag for a | reprioritized. Setting a dependency with the exclusive flag for a | |||
reprioritized stream moves all the dependencies of the new parent | reprioritized stream causes all the dependencies of the new parent | |||
stream to become dependent on the reprioritized stream. | stream to become dependent on the reprioritized stream. | |||
If a stream is made dependent on one of its own dependencies, the | If a stream is made dependent on one of its own dependencies, the | |||
formerly dependent stream is first moved to be dependent on the | formerly dependent stream is first moved to be dependent on the | |||
reprioritized stream's previous parent. The moved dependency retains | reprioritized stream's previous parent. The moved dependency retains | |||
its weight. | its weight. | |||
For example, consider an original dependency tree where B and C | For example, consider an original dependency tree where B and C | |||
depend on A, D and E depend on C, and F depends on D. If A is made | depend on A, D and E depend on C, and F depends on D. If A is made | |||
dependent on D, then D takes the place of A. All other dependency | dependent on D, then D takes the place of A. All other dependency | |||
relationships stay the same, except for F, which becomes dependent on | relationships stay the same, except for F, which becomes dependent on | |||
A if the reprioritization is exclusive. | A if the reprioritization is exclusive. | |||
? ? ? ? | x x x x | |||
| / \ | | | | / \ | | | |||
A D A D D | A D A D D | |||
/ \ / / \ / \ | | / \ / / \ / \ | | |||
B C ==> F B C ==> F A OR A | B C ==> F B C ==> F A OR A | |||
/ \ | / \ /|\ | / \ | / \ /|\ | |||
D E E B C B C F | D E E B C B C F | |||
| | | | | | | | |||
F E E | F E E | |||
(intermediate) (non-exclusive) (exclusive) | (intermediate) (non-exclusive) (exclusive) | |||
Example of Dependency Reordering | Figure 5: Example of Dependency Reordering | |||
5.3.4. Prioritization State Management | 5.3.4. Prioritization State Management | |||
When a stream is removed from the dependency tree, its dependencies | When a stream is removed from the dependency tree, its dependencies | |||
can be moved to become dependent on the parent of the closed stream. | can be moved to become dependent on the parent of the closed stream. | |||
The weights of new dependencies are recalculated by distributing the | The weights of new dependencies are recalculated by distributing the | |||
weight of the dependency of the closed stream proportionally based on | weight of the dependency of the closed stream proportionally based on | |||
the weights of its dependencies. | the weights of its dependencies. | |||
Streams that are removed from the dependency tree cause some | Streams that are removed from the dependency tree cause some | |||
skipping to change at page 26, line 52 ¶ | skipping to change at page 27, line 46 ¶ | |||
streams A and D are unable to proceed, then stream C receives all the | streams A and D are unable to proceed, then stream C receives all the | |||
resources dedicated to stream A. If stream A is removed from the | resources dedicated to stream A. If stream A is removed from the | |||
tree, the weight of stream A is divided between streams C and D. If | tree, the weight of stream A is divided between streams C and D. If | |||
stream D is still unable to proceed, this results in stream C | stream D is still unable to proceed, this results in stream C | |||
receiving a reduced proportion of resources. For equal starting | receiving a reduced proportion of resources. For equal starting | |||
weights, C receives one third, rather than one half, of available | weights, C receives one third, rather than one half, of available | |||
resources. | resources. | |||
It is possible for a stream to become closed while prioritization | It is possible for a stream to become closed while prioritization | |||
information that creates a dependency on that stream is in transit. | information that creates a dependency on that stream is in transit. | |||
If a stream identified in a dependency has had any associated | If a stream identified in a dependency has no associated priority | |||
priority information destroyed, then the dependent stream is instead | information, then the dependent stream is instead assigned a default | |||
assigned a default priority. This potentially creates suboptimal | priority (Section 5.3.5). This potentially creates suboptimal | |||
prioritization, since the stream could be given a priority that is | prioritization, since the stream could be given a priority that is | |||
higher than intended. | different from what is intended. | |||
To avoid these problems, an endpoint SHOULD retain stream | To avoid these problems, an endpoint SHOULD retain stream | |||
prioritization state for a period after streams become closed. The | prioritization state for a period after streams become closed. The | |||
longer state is retained, the lower the chance that streams are | longer state is retained, the lower the chance that streams are | |||
assigned incorrect or default priority values. | assigned incorrect or default priority values. | |||
This could create a large state burden for an endpoint, so this state | Similarly, streams that are in the "idle" state can be assigned | |||
MAY be limited. An endpoint MAY apply a fixed upper limit on the | priority or become a parent of other streams. This allows for the | |||
number of closed streams for which prioritization state is tracked to | creation of a grouping node in the dependency tree, which enables | |||
limit state exposure. The amount of additional state an endpoint | more flexible expressions of priority. Idle streams begin with a | |||
maintains could be dependent on load; under high load, prioritization | default priority (Section 5.3.5). | |||
state can be discarded to limit resource commitments. In extreme | ||||
cases, an endpoint could even discard prioritization state for active | ||||
or reserved streams. 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 | The retention of priority information for streams that are not | |||
closed stream SHOULD alter the dependencies of the streams that | counted toward the limit set by SETTINGS_MAX_CONCURRENT_STREAMS could | |||
depend on it, if it has retained enough state to do so. | create a large state burden for an endpoint. Therefore, the amount | |||
of prioritization state that is retained MAY be limited. | ||||
The amount of additional state an endpoint maintains for | ||||
prioritization 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. If a limit is applied, endpoints | ||||
SHOULD maintain state for at least as many streams as allowed by | ||||
their setting for SETTINGS_MAX_CONCURRENT_STREAMS. Implementations | ||||
SHOULD also attempt to retain state for streams that are in active | ||||
use in the priority tree. | ||||
If it has retained enough state to do so, an endpoint receiving a | ||||
PRIORITY frame that changes the priority of a closed stream SHOULD | ||||
alter the dependencies of the streams that depend on it. | ||||
5.3.5. Default Priorities | 5.3.5. Default Priorities | |||
Providing priority information is optional. Streams are assigned a | All streams are initially assigned a non-exclusive dependency on | |||
non-exclusive dependency on stream 0x0 by default. Pushed streams | stream 0x0. Pushed streams (Section 8.2) initially depend on their | |||
(Section 8.2) initially depend on their associated stream. In both | associated stream. In both cases, streams are assigned a default | |||
cases, streams are assigned a default weight of 16. | weight of 16. | |||
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 that prevents further processing of | |||
the framing layer, or which corrupts any connection state. | the frame layer or 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 for an error condition, | |||
the TCP connection. | the endpoint MUST close 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 ([RFC7230], Section 6.6 describes how an immediate | |||
provides a best effort attempt to communicate with the peer about why | connection close can result in data loss). In the event of a | |||
the connection is being terminated. | connection error, GOAWAY only provides a best-effort attempt to | |||
communicate with the peer about why the connection is being | ||||
terminated. | ||||
An endpoint can end a connection at any time. In particular, an | An endpoint can end a connection at any time. In particular, an | |||
endpoint MAY choose to treat a stream error as a connection error. | endpoint MAY choose to treat a stream error as a connection error. | |||
Endpoints SHOULD send a GOAWAY frame when ending a connection, | Endpoints SHOULD send a GOAWAY frame when ending a connection, | |||
providing that circumstances permit it. | providing that circumstances permit it. | |||
5.4.2. Stream Error Handling | 5.4.2. Stream Error Handling | |||
A stream error is an error related to a specific stream that does not | A stream error is an error related to a specific stream that does not | |||
affect processing of other streams. | affect processing of other streams. | |||
skipping to change at page 28, line 37 ¶ | skipping to change at page 29, line 44 ¶ | |||
An endpoint that detects a stream error sends a RST_STREAM frame | An endpoint that detects a stream error sends a RST_STREAM frame | |||
(Section 6.4) that contains the stream identifier of the stream where | (Section 6.4) that contains the stream identifier of the stream where | |||
the error occurred. The RST_STREAM frame includes an error code that | the error occurred. The RST_STREAM frame includes an error code that | |||
indicates the type of error. | indicates the type of error. | |||
A RST_STREAM is the last frame that an endpoint can send on a stream. | A RST_STREAM is the last frame that an endpoint can send on a stream. | |||
The peer that sends the RST_STREAM frame MUST be prepared to receive | The peer that sends the RST_STREAM frame MUST be prepared to receive | |||
any frames that were sent or enqueued for sending by the remote peer. | any frames that were sent or enqueued for sending by the remote peer. | |||
These frames can be ignored, except where they modify connection | These frames can be ignored, except where they modify connection | |||
state (such as the state maintained for header compression | state (such as the state maintained for header compression | |||
(Section 4.3), or flow control). | (Section 4.3) or flow control). | |||
Normally, an endpoint SHOULD NOT send more than one RST_STREAM frame | Normally, an endpoint SHOULD NOT send more than one RST_STREAM frame | |||
for any stream. However, an endpoint MAY send additional RST_STREAM | for any stream. However, an endpoint MAY send additional RST_STREAM | |||
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 | To avoid looping, an endpoint MUST NOT send a RST_STREAM in response | |||
frame, to avoid looping. | to a RST_STREAM frame. | |||
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 closed or reset while streams remain in | |||
half closed states, then the endpoint MUST assume that those streams | "open" or "half-closed" state, then the affected streams cannot be | |||
were abnormally interrupted and could be incomplete. | automatically retried (see Section 8.1.4 for details). | |||
5.5. Extending HTTP/2 | 5.5. Extending HTTP/2 | |||
HTTP/2 permits extension of the protocol. Protocol extensions can be | HTTP/2 permits extension of the protocol. Within the limitations | |||
used to provide additional services or alter any aspect of the | described in this section, protocol extensions can be used to provide | |||
protocol, within the limitations described in this section. | additional services or alter any aspect of the protocol. Extensions | |||
Extensions are effective only within the scope of a single HTTP/2 | are effective only within the scope of a single HTTP/2 connection. | |||
connection. | ||||
This applies to the protocol elements defined in this document. This | ||||
does not affect the existing options for extending HTTP, such as | ||||
defining new methods, status codes, or header fields. | ||||
Extensions are permitted to use new frame types (Section 4.1), new | Extensions are permitted to use new frame types (Section 4.1), new | |||
settings (Section 6.5.2), or new error codes (Section 7). Registries | settings (Section 6.5.2), or new error codes (Section 7). Registries | |||
are established for managing these extension points: frame types | are established for managing these extension points: frame types | |||
(Section 11.2), settings (Section 11.3) and error codes | (Section 11.2), settings (Section 11.3), and error codes | |||
(Section 11.4). | (Section 11.4). | |||
Implementations MUST ignore unknown or unsupported values in all | Implementations MUST ignore unknown or unsupported values in all | |||
extensible protocol elements. Implementations MUST discard frames | extensible protocol elements. Implementations MUST discard frames | |||
that have unknown or unsupported types. This means that any of these | that have unknown or unsupported types. This means that any of these | |||
extension points can be safely used by extensions without prior | extension points can be safely used by extensions without prior | |||
arrangement or negotiation. | arrangement or negotiation. However, extension frames that appear in | |||
the middle of a header block (Section 4.3) are not permitted; these | ||||
MUST be treated as a connection error (Section 5.4.1) of type | ||||
PROTOCOL_ERROR. | ||||
However, extensions that could change the semantics of existing | Extensions that could change the semantics of existing protocol | |||
protocol components MUST be negotiated before being used. For | components MUST be negotiated before being used. For example, an | |||
example, an extension that changes the layout of the HEADERS frame | extension that changes the layout of the HEADERS frame cannot be used | |||
cannot be used until the peer has given a positive signal that this | until the peer has given a positive signal that this is acceptable. | |||
is acceptable. In this case, it could also be necessary to | In this case, it could also be necessary to coordinate when the | |||
coordinate when the revised layout comes into effect. Note that | revised layout comes into effect. Note that treating any frames | |||
treating any frame other than DATA frames as flow controlled is such | other than DATA frames as flow controlled is such a change in | |||
a change in semantics, and can only be done through negotiation. | semantics and can only be done through negotiation. | |||
This document doesn't mandate a specific method for negotiating the | This document doesn't mandate a specific method for negotiating the | |||
use of an extension, but notes that a setting (Section 6.5.2) could | use of an extension but notes that a setting (Section 6.5.2) could be | |||
be used for that purpose. If both peers set a value that indicates | used for that purpose. If both peers set a value that indicates | |||
willingness to use the extension, then the extension can be used. If | willingness to use the extension, then the extension can be used. If | |||
a setting is used for extension negotiation, the initial value MUST | a setting is used for extension negotiation, the initial value MUST | |||
be defined so that the extension is initially disabled. | be defined in such a fashion that the extension is initially | |||
disabled. | ||||
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 in the establishment and management either 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. | any given frame. | |||
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 padding. Padding can be added to DATA | |||
to DATA frames to obscure the size of messages. | frames to obscure the size of messages. Padding is a security | |||
feature; see Section 10.7. | ||||
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 | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
|Pad Length? (8)| | |Pad Length? (8)| | |||
+---------------+-----------------------------------------------+ | +---------------+-----------------------------------------------+ | |||
| Data (*) ... | | Data (*) ... | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| Padding (*) ... | | Padding (*) ... | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
DATA Frame Payload | Figure 6: DATA Frame Payload | |||
The DATA frame contains the following fields: | The DATA frame contains the following fields: | |||
Pad Length: An 8-bit field containing the length of the frame | Pad Length: An 8-bit field containing the length of the frame | |||
padding in units of octets. This field is optional and is only | padding in units of octets. This field is conditional (as | |||
present if the PADDED flag is set. | signified by a "?" in the diagram) and is only present if the | |||
PADDED flag is set. | ||||
Data: Application data. The amount of data is the remainder of the | Data: Application data. The amount of data is the remainder of the | |||
frame payload after subtracting the length of the other fields | frame payload after subtracting the length of the other fields | |||
that are present. | that are present. | |||
Padding: Padding octets that contain no application semantic value. | Padding: Padding octets that contain no application semantic value. | |||
Padding octets MUST be set to zero when sending and ignored when | Padding octets MUST be set to zero when sending. A receiver is | |||
receiving. | not obligated to verify padding but MAY treat non-zero padding as | |||
a connection error (Section 5.4.1) of type PROTOCOL_ERROR. | ||||
The DATA frame defines the following flags: | The DATA frame defines the following flags: | |||
END_STREAM (0x1): Bit 1 being set indicates that this frame is the | END_STREAM (0x1): When set, bit 0 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). | |||
PADDED (0x8): Bit 4 being set indicates that the Pad Length field is | PADDED (0x8): When set, bit 3 indicates that the Pad Length field | |||
present. | and any padding that it describes are present. | |||
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. The entire | stream is in the "open" or "half-closed (remote)" state. The entire | |||
DATA frame payload is included in flow control, including Pad Length | DATA frame payload is included in flow control, including the Pad | |||
and Padding fields if present. If a DATA frame is received whose | Length and Padding fields if present. If a DATA frame is received | |||
stream is not in "open" or "half closed (local)" state, the recipient | whose stream is not in "open" or "half-closed (local)" state, the | |||
MUST respond with a stream error (Section 5.4.2) of type | recipient MUST respond with a stream error (Section 5.4.2) of type | |||
STREAM_CLOSED. | STREAM_CLOSED. | |||
The total number of padding octets is determined by the value of the | The total number of padding octets is determined by the value of the | |||
Pad Length field. If the length of the padding is greater than the | Pad Length field. If the length of the padding is the length of the | |||
length of the remainder of the frame payload, the recipient MUST | frame payload or greater, the recipient MUST treat this as a | |||
treat this as a connection error (Section 5.4.1) of type | connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
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 Length field with a value of zero. | Pad Length field with a value of zero. | |||
Use of padding is a security feature; as such, its use demands some | ||||
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) is used to open a stream (Section 5.1), | |||
open a stream (Section 5.1). HEADERS frames can be sent on a stream | and additionally carries a header block fragment. HEADERS frames can | |||
in the "open" or "half closed (remote)" states. | be sent on a stream in the "idle", "reserved (local)", "open", or | |||
"half-closed (remote)" state. | ||||
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 | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
|Pad Length? (8)| | |Pad Length? (8)| | |||
+-+-------------+-----------------------------------------------+ | +-+-------------+-----------------------------------------------+ | |||
|E| Stream Dependency? (31) | | |E| Stream Dependency? (31) | | |||
+-+-------------+-----------------------------------------------+ | +-+-------------+-----------------------------------------------+ | |||
| Weight? (8) | | | Weight? (8) | | |||
+-+-------------+-----------------------------------------------+ | +-+-------------+-----------------------------------------------+ | |||
| Header Block Fragment (*) ... | | Header Block Fragment (*) ... | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| Padding (*) ... | | Padding (*) ... | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
HEADERS Frame Payload | Figure 7: HEADERS Frame Payload | |||
The HEADERS frame payload has the following fields: | The HEADERS frame payload has the following fields: | |||
Pad Length: An 8-bit field containing the length of the frame | Pad Length: An 8-bit field containing the length of the frame | |||
padding in units of octets. This field is optional and is only | padding in units of octets. This field is only present if the | |||
present if the PADDED flag is set. | PADDED flag is set. | |||
E: A single bit flag indicates that the stream dependency is | E: A single-bit flag indicating that the stream dependency is | |||
exclusive, see Section 5.3. This field is optional and is only | exclusive (see Section 5.3). This field is only present if the | |||
present if the PRIORITY flag is set. | PRIORITY flag is set. | |||
Stream Dependency: A 31-bit stream identifier for the stream that | Stream Dependency: A 31-bit stream identifier for the stream that | |||
this stream depends on, see Section 5.3. This field is optional | this stream depends on (see Section 5.3). This field is only | |||
and is only present if the PRIORITY flag is set. | present if the PRIORITY flag is set. | |||
Weight: An 8-bit weight for the stream, see Section 5.3. Add one to | Weight: An unsigned 8-bit integer representing a priority weight for | |||
the value to obtain a weight between 1 and 256. This field is | the stream (see Section 5.3). Add one to the value to obtain a | |||
optional and is only present if the PRIORITY flag is set. | weight between 1 and 256. This field is only present if the | |||
PRIORITY 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): When set, bit 0 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. | |||
one of "half closed" states (Section 5.1). | ||||
A HEADERS frame that is followed by CONTINUATION frames carries | A HEADERS frame carries the END_STREAM flag that signals the end | |||
the END_STREAM flag that signals the end of a stream. A | of a stream. However, a HEADERS frame with the END_STREAM flag | |||
CONTINUATION frame cannot be used to terminate a stream. | set can be followed by CONTINUATION frames on the same stream. | |||
Logically, the CONTINUATION frames are part of the HEADERS frame. | ||||
END_HEADERS (0x4): Bit 3 being set indicates that this frame | END_HEADERS (0x4): When set, bit 2 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. | |||
PADDED (0x8): Bit 4 being set indicates that the Pad Length field is | PADDED (0x8): When set, bit 3 indicates that the Pad Length field | |||
present. | and any padding that it describes are present. | |||
PRIORITY (0x20): Bit 6 being set indicates that the Exclusive Flag | PRIORITY (0x20): When set, bit 5 indicates that the Exclusive Flag | |||
(E), Stream Dependency, and Weight fields are present; see | (E), Stream Dependency, and Weight fields are present; see | |||
Section 5.3. | 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. | |||
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 can include padding. Padding fields and flags are | |||
flags are identical to those defined for DATA frames (Section 6.1). | identical to those defined for DATA frames (Section 6.1). Padding | |||
that exceeds the size remaining for the header block fragment MUST be | ||||
treated as a PROTOCOL_ERROR. | ||||
Prioritization information in a HEADERS frame is logically equivalent | ||||
to a separate PRIORITY frame, but inclusion in HEADERS avoids the | ||||
potential for churn in stream prioritization when new streams are | ||||
created. Prioritization fields in HEADERS frames subsequent to the | ||||
first on a stream reprioritize the stream (Section 5.3.3). | ||||
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 (Section 5.3). It can be sent at any time for an | of a stream (Section 5.3). It can be sent in any stream state, | |||
existing stream, including closed streams. This enables | including idle or closed streams. | |||
reprioritization of existing streams. | ||||
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 | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
|E| Stream Dependency (31) | | |E| Stream Dependency (31) | | |||
+-+-------------+-----------------------------------------------+ | +-+-------------+-----------------------------------------------+ | |||
| Weight (8) | | | Weight (8) | | |||
+-+-------------+ | +-+-------------+ | |||
PRIORITY Frame Payload | Figure 8: PRIORITY Frame Payload | |||
The payload of a PRIORITY frame contains the following fields: | The payload of a PRIORITY frame contains the following fields: | |||
E: A single bit flag indicates that the stream dependency is | E: A single-bit flag indicating that the stream dependency is | |||
exclusive, see Section 5.3. | exclusive (see Section 5.3). | |||
Stream Dependency: A 31-bit stream identifier for the stream that | Stream Dependency: A 31-bit stream identifier for the stream that | |||
this stream depends on, see Section 5.3. | this stream depends on (see Section 5.3). | |||
Weight: An 8-bit weight for the identified stream dependency, see | Weight: An unsigned 8-bit integer representing a priority weight for | |||
Section 5.3. Add one to the value to obtain a weight between 1 | the stream (see Section 5.3). Add one to the value to obtain a | |||
and 256. | weight between 1 and 256. | |||
The PRIORITY frame does not define any flags. | The PRIORITY frame does not define any flags. | |||
The PRIORITY frame is associated with an existing stream. If a | The PRIORITY frame always identifies a stream. If a PRIORITY frame | |||
PRIORITY frame is received with a stream identifier of 0x0, the | is received with a stream identifier of 0x0, the recipient MUST | |||
recipient MUST respond with a connection error (Section 5.4.1) of | respond with a connection error (Section 5.4.1) of type | |||
type PROTOCOL_ERROR. | 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 state, though it | |||
(remote)", "open", "half closed (local)", "half closed (remote)", or | cannot be sent between consecutive frames that comprise a single | |||
"closed" states, though it cannot be sent between consecutive frames | header block (Section 4.3). Note that this frame could arrive after | |||
that comprise a single header block (Section 4.3). Note that this | processing or frame sending has completed, which would cause it to | |||
frame could arrive after processing or frame sending has completed, | have no effect on the identified stream. For a stream that is in the | |||
which would cause it to have no effect on the current stream. For a | "half-closed (remote)" or "closed" state, this frame can only affect | |||
stream that is in the "half closed (remote)" or "closed" - state, | processing of the identified stream and its dependent streams; it | |||
this frame can only affect processing of the current stream and not | does not affect frame transmission on that stream. | |||
frame transmission. | ||||
The PRIORITY frame is the only frame that can be sent for a stream in | The PRIORITY frame can be sent for a stream in the "idle" or "closed" | |||
the "closed" state. This allows for the reprioritization of a group | state. This allows for the reprioritization of a group of dependent | |||
of dependent streams by altering the priority of a parent stream, | streams by altering the priority of an unused or closed parent | |||
which might be closed. However, a PRIORITY frame sent on a closed | stream. | |||
stream risks being ignored due to the peer having discarded priority | ||||
state information for that stream. | A PRIORITY frame with a length other than 5 octets MUST be treated as | |||
a stream error (Section 5.4.2) of type FRAME_SIZE_ERROR. | ||||
6.4. RST_STREAM | 6.4. RST_STREAM | |||
The RST_STREAM frame (type=0x3) allows for abnormal termination of a | The RST_STREAM frame (type=0x3) allows for immediate termination of a | |||
stream. When sent by the initiator of a stream, it indicates that | stream. RST_STREAM is sent to request cancellation of a stream or to | |||
they wish to cancel the stream or that an error condition has | indicate that an error condition has occurred. | |||
occurred. When sent by the receiver of a stream, it indicates that | ||||
either the receiver is rejecting the stream, requesting that the | ||||
stream be cancelled, or that an error condition has occurred. | ||||
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 | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Error Code (32) | | | Error Code (32) | | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
RST_STREAM Frame Payload | Figure 9: RST_STREAM Frame Payload | |||
The RST_STREAM frame contains a single unsigned, 32-bit integer | The RST_STREAM frame contains a single unsigned, 32-bit integer | |||
identifying the error code (Section 7). The error code indicates why | identifying the error code (Section 7). The error code indicates why | |||
the stream is being terminated. | the stream is being terminated. | |||
The RST_STREAM frame does not define any flags. | The RST_STREAM frame does not define any flags. | |||
The RST_STREAM frame fully terminates the referenced stream and | The RST_STREAM frame fully terminates the referenced stream and | |||
causes it to enter the closed state. After receiving a RST_STREAM on | causes it to enter the "closed" state. After receiving a RST_STREAM | |||
a stream, the receiver MUST NOT send additional frames for that | on a stream, the receiver MUST NOT send additional frames for that | |||
stream. However, after sending the RST_STREAM, the sending endpoint | stream, with the exception of PRIORITY. However, after sending the | |||
MUST be prepared to receive and process additional frames sent on the | RST_STREAM, the sending endpoint MUST be prepared to receive and | |||
stream that might have been sent by the peer prior to the arrival of | process additional frames sent on the stream that might have been | |||
the RST_STREAM. | sent by the peer prior to the arrival of the RST_STREAM. | |||
RST_STREAM frames MUST be associated with a stream. If a RST_STREAM | RST_STREAM frames MUST be associated with a stream. If a RST_STREAM | |||
frame is received with a stream identifier of 0x0, the recipient MUST | frame is received with a stream identifier of 0x0, the recipient MUST | |||
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. | |||
A RST_STREAM frame with a length other than 4 octets MUST be treated | ||||
as a connection error (Section 5.4.1) of type FRAME_SIZE_ERROR. | ||||
6.5. SETTINGS | 6.5. SETTINGS | |||
The SETTINGS frame (type=0x4) conveys configuration parameters that | The SETTINGS frame (type=0x4) conveys configuration parameters that | |||
affect how endpoints communicate, such as preferences and constraints | affect how endpoints communicate, such as preferences and constraints | |||
on peer behavior. The SETTINGS frame is also used to acknowledge the | on peer behavior. The SETTINGS frame is also used to acknowledge the | |||
receipt of those parameters. Individually, a SETTINGS parameter can | receipt of those parameters. Individually, a SETTINGS parameter can | |||
also be referred to as a "setting". | also be referred to as a "setting". | |||
SETTINGS parameters are not negotiated; they describe characteristics | SETTINGS parameters are not negotiated; they describe characteristics | |||
of 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 parameter 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. | |||
A SETTINGS frame MUST be sent by both endpoints at the start of a | A SETTINGS frame MUST be sent by both endpoints at the start of a | |||
connection, and MAY be sent at any other time by either endpoint over | connection and MAY be sent at any other time by either endpoint over | |||
the lifetime of the connection. Implementations MUST support all of | the lifetime of the connection. Implementations MUST support all of | |||
the parameters defined by this specification. | the parameters defined by this specification. | |||
Each parameter in a SETTINGS frame replaces any existing value for | Each parameter in a SETTINGS frame replaces any existing value for | |||
that parameter. Parameters are processed in the order in which they | that parameter. Parameters are processed in the order in which they | |||
appear, and a receiver of a SETTINGS frame does not need to maintain | appear, and a receiver of a SETTINGS frame does not need to maintain | |||
any state other than the current value of its parameters. Therefore, | any state other than the current value of its parameters. Therefore, | |||
the value of a SETTINGS parameter is the last value that is seen by a | the value of a SETTINGS parameter is the last value that is seen by a | |||
receiver. | receiver. | |||
SETTINGS parameters are acknowledged by the receiving peer. To | SETTINGS parameters are acknowledged by the receiving peer. To | |||
enable this, the SETTINGS frame defines the following flag: | enable this, the SETTINGS frame defines the following flag: | |||
ACK (0x1): Bit 1 being set indicates that this frame acknowledges | ACK (0x1): When set, bit 0 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 information, | |||
Settings Synchronization (Section 6.5.3). | see Section 6.5.3 ("Settings Synchronization"). | |||
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 (0x0). If an | The stream identifier for a SETTINGS frame MUST be zero (0x0). 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. | |||
A SETTINGS frame with a length other than a multiple of 6 octets MUST | ||||
be treated as a connection error (Section 5.4.1) of type | ||||
FRAME_SIZE_ERROR. | ||||
6.5.1. SETTINGS Format | 6.5.1. SETTINGS Format | |||
The payload of a SETTINGS frame consists of zero or more parameters, | The payload of a SETTINGS frame consists of zero or more parameters, | |||
each consisting of an unsigned 16-bit setting identifier and an | each consisting of an unsigned 16-bit setting identifier and an | |||
unsigned 32-bit value. | unsigned 32-bit value. | |||
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 | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Identifier (16) | | | Identifier (16) | | |||
+-------------------------------+-------------------------------+ | +-------------------------------+-------------------------------+ | |||
| Value (32) | | | Value (32) | | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
Setting Format | Figure 10: Setting Format | |||
6.5.2. Defined SETTINGS Parameters | 6.5.2. Defined SETTINGS Parameters | |||
The following parameters are defined: | The following parameters are defined: | |||
SETTINGS_HEADER_TABLE_SIZE (0x1): Allows the sender to inform the | SETTINGS_HEADER_TABLE_SIZE (0x1): Allows the sender to inform the | |||
remote endpoint of the maximum size of the header compression | remote endpoint of the maximum size of the header compression | |||
table used to decode header blocks. The encoder can select any | table used to decode header blocks, in octets. The encoder can | |||
size equal to or less than this value by using signaling specific | select any size equal to or less than this value by using | |||
to the header compression format inside a header block. The | signaling specific to the header compression format inside a | |||
initial value is 4,096 bytes. | header block (see [COMPRESSION]). The initial value is 4,096 | |||
octets. | ||||
SETTINGS_ENABLE_PUSH (0x2): This setting can be use to disable | SETTINGS_ENABLE_PUSH (0x2): This setting can be used to disable | |||
server push (Section 8.2). An endpoint MUST NOT send a | server push (Section 8.2). An endpoint MUST NOT send a | |||
PUSH_PROMISE frame if it receives this parameter set to a value of | PUSH_PROMISE frame if it receives this parameter set to a value of | |||
0. An endpoint that has both set this parameter to 0 and had it | 0. An endpoint that has both set this parameter to 0 and had it | |||
acknowledged MUST treat the receipt of a PUSH_PROMISE frame as a | acknowledged MUST treat the receipt of a PUSH_PROMISE frame as a | |||
connection 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 server push is | The initial value is 1, which indicates that server push is | |||
permitted. Any value other than 0 or 1 MUST be treated as a | permitted. Any value other than 0 or 1 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. | |||
SETTINGS_MAX_CONCURRENT_STREAMS (0x3): Indicates the maximum number | SETTINGS_MAX_CONCURRENT_STREAMS (0x3): Indicates the maximum number | |||
of concurrent streams that the sender will allow. This limit is | of 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 is more appropriate. | |||
SETTINGS_INITIAL_WINDOW_SIZE (0x4): Indicates the sender's initial | SETTINGS_INITIAL_WINDOW_SIZE (0x4): Indicates the sender's initial | |||
window size (in bytes) for stream level flow control. The initial | window size (in octets) for stream-level flow control. The | |||
value is 2^16-1 (65,535) octets. | initial value is 2^16-1 (65,535) octets. | |||
This setting affects the window size of all streams, including | This setting affects the window size of all streams (see | |||
existing streams, see Section 6.9.2. | 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. | |||
SETTINGS_MAX_FRAME_SIZE (0x5): Indicates the size of the largest | SETTINGS_MAX_FRAME_SIZE (0x5): Indicates the size of the largest | |||
frame payload that a receiver is willing to accept. | frame payload that the sender is willing to receive, in octets. | |||
The initial value is 2^14 (16,384) octets. The value advertised | The initial value is 2^14 (16,384) octets. The value advertised | |||
by an endpoint MUST be between this initial value and the maximum | by an endpoint MUST be between this initial value and the maximum | |||
allowed frame size (2^24-1 or 16,777,215 octets), inclusive. | allowed frame size (2^24-1 or 16,777,215 octets), inclusive. | |||
Values outside this range MUST be treated as a connection error | Values outside this range 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_HEADER_LIST_SIZE (0x6): This advisory setting informs a | SETTINGS_MAX_HEADER_LIST_SIZE (0x6): This advisory setting informs a | |||
peer of the maximum size of header list that the sender is | peer of the maximum size of header list that the sender is | |||
prepared to accept. The value is based on the uncompressed size | prepared to accept, in octets. The value is based on the | |||
of header fields, including the length of the name and value in | uncompressed size of header fields, including the length of the | |||
octets plus an overhead of 32 octets for each header field. | name and value in octets plus an overhead of 32 octets for each | |||
header field. | ||||
For any given request, a lower limit than what is advertised MAY | For any given request, a lower limit than what is advertised MAY | |||
be enforced. The initial value of this setting is unlimited. | be enforced. The initial value of this setting is unlimited. | |||
An endpoint that receives a SETTINGS frame with any unknown or | An endpoint that receives a SETTINGS frame with any unknown or | |||
unsupported identifier MUST ignore that setting. | unsupported identifier MUST ignore that setting. | |||
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 | |||
skipping to change at page 38, line 34 ¶ | skipping to change at page 40, line 18 ¶ | |||
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. | |||
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 | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
|Pad Length? (8)| | |Pad Length? (8)| | |||
+-+-------------+-----------------------------------------------+ | +-+-------------+-----------------------------------------------+ | |||
|R| Promised Stream ID (31) | | |R| Promised Stream ID (31) | | |||
+-+-----------------------------+-------------------------------+ | +-+-----------------------------+-------------------------------+ | |||
| Header Block Fragment (*) ... | | Header Block Fragment (*) ... | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| Padding (*) ... | | Padding (*) ... | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
PUSH_PROMISE Payload Format | Figure 11: PUSH_PROMISE Payload Format | |||
The PUSH_PROMISE frame payload has the following fields: | The PUSH_PROMISE frame payload has the following fields: | |||
Pad Length: An 8-bit field containing the length of the frame | Pad Length: An 8-bit field containing the length of the frame | |||
padding in units of octets. This field is optional and is only | padding in units of octets. This field is only present if the | |||
present if the PADDED flag is set. | PADDED flag is set. | |||
R: A single reserved bit. | R: A single reserved bit. | |||
Promised Stream ID: This unsigned 31-bit integer identifies the | Promised Stream ID: An unsigned 31-bit integer that identifies the | |||
stream the endpoint intends to start sending frames for. The | stream that is reserved by the PUSH_PROMISE. The promised stream | |||
promised stream identifier MUST be a valid choice for the next | identifier MUST be a valid choice for the next stream sent by the | |||
stream sent by the sender (see new stream identifier | sender (see "new stream identifier" in Section 5.1.1). | |||
(Section 5.1.1)). | ||||
Header Block Fragment: A header block fragment (Section 4.3) | Header Block Fragment: A header block fragment (Section 4.3) | |||
containing request header fields. | containing request header fields. | |||
Padding: Padding octets. | Padding: Padding octets. | |||
The PUSH_PROMISE frame defines the following flags: | The PUSH_PROMISE frame defines the following flags: | |||
END_HEADERS (0x4): Bit 3 being set indicates that this frame | END_HEADERS (0x4): When set, bit 2 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_HEADERS 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. | |||
PADDED (0x8): Bit 4 being set indicates that the Pad Length field is | PADDED (0x8): When set, bit 3 indicates that the Pad Length field | |||
present. | and any padding that it describes are present. | |||
PUSH_PROMISE frames MUST be associated with an existing, peer- | PUSH_PROMISE frames MUST only be sent on a peer-initiated stream that | |||
initiated stream. The stream identifier of a PUSH_PROMISE frame | is in either the "open" or "half-closed (remote)" state. The stream | |||
indicates the stream it is associated with. If the stream identifier | identifier of a PUSH_PROMISE frame indicates the stream it is | |||
field specifies the value 0x0, a recipient MUST respond with a | associated with. If the stream identifier field specifies the value | |||
connection error (Section 5.4.1) of type PROTOCOL_ERROR. | 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 the order they are | Promised streams are not required to be used in the order they are | |||
promised. The PUSH_PROMISE only reserves stream identifiers for | promised. The PUSH_PROMISE only reserves stream identifiers for | |||
later use. | later use. | |||
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. An endpoint that has set this setting | the peer endpoint is set to 0. An endpoint that has set this setting | |||
and has received acknowledgement MUST treat the receipt of a | and has received acknowledgement MUST treat the receipt of a | |||
PUSH_PROMISE frame as a connection error (Section 5.4.1) of type | PUSH_PROMISE frame as a connection error (Section 5.4.1) of type | |||
PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
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. | |||
A PUSH_PROMISE frame modifies the connection state in two ways. The | A PUSH_PROMISE frame modifies the connection state in two ways. | |||
inclusion of a header block (Section 4.3) potentially modifies the | First, the inclusion of a header block (Section 4.3) potentially | |||
state maintained for header compression. PUSH_PROMISE also reserves | modifies the state maintained for header compression. Second, | |||
a stream for later use, causing the promised stream to enter the | PUSH_PROMISE also reserves a stream for later use, causing the | |||
"reserved" state. A sender MUST NOT send a PUSH_PROMISE on a stream | promised stream to enter the "reserved" state. A sender MUST NOT | |||
unless that stream is either "open" or "half closed (remote)"; the | send a PUSH_PROMISE on a stream unless that stream is either "open" | |||
sender MUST ensure that the promised stream is a valid choice for a | or "half-closed (remote)"; the sender MUST ensure that the promised | |||
new stream identifier (Section 5.1.1) (that is, the promised stream | stream is a valid choice for a new stream identifier (Section 5.1.1) | |||
MUST be in the "idle" state). | (that is, the promised stream 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. However, an endpoint that | |||
treat the receipt of a PUSH_PROMISE that promises an illegal stream | has sent RST_STREAM on the associated stream MUST handle PUSH_PROMISE | |||
identifier (Section 5.1.1) (that is, an identifier for a stream that | frames that might have been created before the RST_STREAM frame is | |||
is not currently in the "idle" state) as a connection error | received and processed. | |||
(Section 5.4.1) of type PROTOCOL_ERROR. | ||||
The PUSH_PROMISE frame includes optional padding. Padding fields and | A receiver MUST treat the receipt of a PUSH_PROMISE that promises an | |||
flags are identical to those defined for DATA frames (Section 6.1). | illegal stream identifier (Section 5.1.1) as a connection error | |||
(Section 5.4.1) of type PROTOCOL_ERROR. Note that an illegal stream | ||||
identifier is an identifier for a stream that is not currently in the | ||||
"idle" state. | ||||
The PUSH_PROMISE frame can include 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 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 | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| | | | | | |||
| Opaque Data (64) | | | Opaque Data (64) | | |||
| | | | | | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
PING Payload Format | Figure 12: PING Payload Format | |||
In addition to the frame header, PING frames MUST contain 8 octets of | In addition to the frame header, PING frames MUST contain 8 octets of | |||
data in the payload. A sender can include any value it chooses and | opaque data in the payload. A sender can include any value it | |||
use those bytes in any fashion. | chooses and use those octets in any fashion. | |||
Receivers of a PING frame that does not include an ACK flag MUST send | Receivers of a PING frame that does not include an ACK flag MUST send | |||
a PING frame with the ACK flag set in response, with an identical | a PING frame with the ACK flag set in response, with an identical | |||
payload. PING responses SHOULD be given higher priority than any | payload. PING responses SHOULD be given higher priority than any | |||
other frame. | other frame. | |||
The PING frame defines the following flags: | The PING frame defines the following flags: | |||
ACK (0x1): Bit 1 being set indicates that this PING frame is a PING | ACK (0x1): When set, bit 0 indicates that this PING frame is a PING | |||
response. An endpoint MUST set this flag in PING responses. An | response. An endpoint MUST set this flag in PING responses. An | |||
endpoint MUST NOT respond to PING frames containing this flag. | endpoint MUST NOT respond to PING frames containing this flag. | |||
PING frames are not associated with any individual stream. If a PING | PING frames are not associated with any individual stream. If a PING | |||
frame is received with a stream identifier field value other than | frame is received with a stream identifier field value other than | |||
0x0, the recipient MUST respond with a connection error | 0x0, the recipient MUST respond with a connection error | |||
(Section 5.4.1) of type PROTOCOL_ERROR. | (Section 5.4.1) of type PROTOCOL_ERROR. | |||
Receipt of a PING frame with a length field value other than 8 MUST | Receipt of a PING frame with a length field value other than 8 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 | |||
FRAME_SIZE_ERROR. | FRAME_SIZE_ERROR. | |||
6.8. GOAWAY | 6.8. GOAWAY | |||
The GOAWAY frame (type=0x7) informs the remote peer to stop creating | The GOAWAY frame (type=0x7) is used to initiate shutdown of a | |||
streams on this connection. GOAWAY can be sent by either the client | connection or to signal serious error conditions. GOAWAY allows an | |||
or the server. Once sent, the sender will ignore frames sent on any | endpoint to gracefully stop accepting new streams while still | |||
new streams with identifiers higher than the included last stream | finishing processing of previously established streams. This enables | |||
identifier. Receivers of a GOAWAY frame MUST NOT open additional | administrative actions, like server maintenance. | |||
streams on the connection, although a new connection can be | ||||
established for new streams. | ||||
The purpose of this frame is to allow an endpoint to gracefully stop | ||||
accepting new streams, while still finishing processing of previously | ||||
established streams. This enables administrative actions, like | ||||
server maintainence. | ||||
There is an inherent race condition between an endpoint starting new | There is an inherent race condition between an endpoint starting new | |||
streams and the remote sending a GOAWAY frame. To deal with this | streams and the remote sending a GOAWAY frame. To deal with this | |||
case, the GOAWAY contains the stream identifier of the last peer- | case, the GOAWAY contains the stream identifier of the last peer- | |||
initiated stream which was or might be processed on the sending | initiated stream that was or might be processed on the sending | |||
endpoint in this connection. For instance, if the server sends a | endpoint in this connection. For instance, if the server sends a | |||
GOAWAY frame, the identifed stream is the highest numbered stream | GOAWAY frame, the identified stream is the highest-numbered stream | |||
initiated by the client. | initiated by the client. | |||
Once sent, the sender will ignore frames sent on streams initiated by | ||||
the receiver if the stream has an identifier higher than the included | ||||
last stream identifier. Receivers of a GOAWAY frame MUST NOT open | ||||
additional streams on the connection, although a new connection can | ||||
be established for new streams. | ||||
If the receiver of the GOAWAY has sent data on streams with a higher | If the receiver of the GOAWAY has sent data on streams with a higher | |||
stream identifier than what is indicated in the GOAWAY frame, those | stream identifier than what is indicated in the GOAWAY frame, those | |||
streams are not or will not be processed. The receiver of the GOAWAY | streams are not or will not be processed. The receiver of the GOAWAY | |||
frame can treat the streams as though they had never been created at | frame can treat the streams as though they had never been created at | |||
all, thereby allowing those streams to be retried later on a new | all, thereby allowing those streams to be retried later on a new | |||
connection. | connection. | |||
Endpoints SHOULD always send a GOAWAY frame before closing a | Endpoints SHOULD always send a GOAWAY frame before closing a | |||
connection so that the remote can know whether a stream has been | connection so that the remote peer can know whether a stream has been | |||
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 what streams it might | server does not send a GOAWAY frame to indicate what streams it might | |||
have acted on. | have acted on. | |||
An endpoint might choose to close a connection without sending GOAWAY | An endpoint might choose to close a connection without sending a | |||
for misbehaving peers. | GOAWAY for misbehaving peers. | |||
0 1 2 3 | A GOAWAY frame might not immediately precede closing of the | |||
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 | connection; a receiver of a GOAWAY that has no more use for the | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | connection SHOULD still send a GOAWAY frame before terminating the | |||
connection. | ||||
+-+-------------------------------------------------------------+ | ||||
|R| Last-Stream-ID (31) | | |R| Last-Stream-ID (31) | | |||
+-+-------------------------------------------------------------+ | +-+-------------------------------------------------------------+ | |||
| Error Code (32) | | | Error Code (32) | | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
| Additional Debug Data (*) | | | Additional Debug Data (*) | | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
GOAWAY Payload Format | Figure 13: 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- | |||
numbered stream identifier for which the sender of the GOAWAY frame | numbered stream identifier for which the sender of the GOAWAY frame | |||
might have taken some action on, or might yet take action on. All | might have taken some action on or might yet take action on. All | |||
streams up to and including the identified stream might have been | streams up to and including the identified stream might have been | |||
processed in some way. The last stream identifier can be set to 0 if | processed in some way. The last stream identifier can be set to 0 if | |||
no streams were processed. | no streams were processed. | |||
Note: In this context, "processed" means that some data from the | Note: In this context, "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, the last stream | If a connection terminates without a GOAWAY frame, the last stream | |||
identifier is effectively the highest possible stream identifier. | identifier is effectively the highest possible 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, reattempting | |||
requests, transactions, or any protocol activity is not possible, | requests, transactions, or any protocol activity is not possible, | |||
with the exception of idempotent actions like HTTP GET, PUT, or | with the exception of idempotent actions like HTTP GET, PUT, or | |||
DELETE. Any protocol activity that uses higher numbered streams can | DELETE. Any protocol activity that uses higher-numbered streams can | |||
be safely retried using a new connection. | be safely retried using a new connection. | |||
Activity on streams numbered lower or equal to the last stream | Activity on streams numbered lower or equal to the last stream | |||
identifier might still complete successfully. The sender of a GOAWAY | identifier might still complete successfully. The sender of a GOAWAY | |||
frame might gracefully shut down a connection by sending a GOAWAY | frame might gracefully shut down a connection by sending a GOAWAY | |||
frame, maintaining the connection in an open state until all in- | frame, maintaining the connection in an "open" state until all in- | |||
progress streams complete. | progress streams complete. | |||
An endpoint MAY send multiple GOAWAY frames if circumstances change. | An endpoint MAY send multiple GOAWAY frames if circumstances change. | |||
For instance, an endpoint that sends GOAWAY with NO_ERROR during | For instance, an endpoint that sends GOAWAY with NO_ERROR during | |||
graceful shutdown could subsequently encounter an condition that | graceful shutdown could subsequently encounter a condition that | |||
requires immediate termination of the connection. The last stream | requires immediate termination of the connection. The last stream | |||
identifier from the last GOAWAY frame received indicates which | identifier from the last GOAWAY frame received indicates which | |||
streams could have been acted upon. Endpoints MUST NOT increase the | streams could have been acted upon. Endpoints MUST NOT increase the | |||
value they send in the last stream identifier, since the peers might | value they send in the last stream identifier, since the peers might | |||
already have retried unprocessed requests on another connection. | already have retried unprocessed requests on another connection. | |||
A client that is unable to retry requests loses all requests that are | A client that is unable to retry requests loses all requests that are | |||
in flight when the server closes the connection. This is especially | in flight when the server closes the connection. This is especially | |||
true for intermediaries that might not be serving clients using | true for intermediaries that might not be serving clients using | |||
HTTP/2. A server that is attempting to gracefully shut down a | HTTP/2. A server that is attempting to gracefully shut down a | |||
connection SHOULD send an initial GOAWAY frame with the last stream | connection SHOULD send an initial GOAWAY frame with the last stream | |||
identifier set to 2^31-1 and a NO_ERROR code. This signals to the | identifier set to 2^31-1 and a NO_ERROR code. This signals to the | |||
client that a shutdown is imminent and that no further requests can | client that a shutdown is imminent and that initiating further | |||
be initiated. After waiting at least one round trip time, the server | requests is prohibited. After allowing time for any in-flight stream | |||
can send another GOAWAY frame with an updated last stream identifier. | creation (at least one round-trip time), the server can send another | |||
This ensures that a connection can be cleanly shut down without | GOAWAY frame with an updated last stream identifier. This ensures | |||
losing requests. | that a connection can be cleanly shut down without losing requests. | |||
After sending a GOAWAY frame, the sender can discard frames for | After sending a GOAWAY frame, the sender can discard frames for | |||
streams with identifiers higher than the identified last stream. | streams initiated by the receiver with identifiers higher than the | |||
However, any frames that alter connection state cannot be completely | identified last stream. However, any frames that alter connection | |||
ignored. For instance, HEADERS, PUSH_PROMISE and CONTINUATION frames | state cannot be completely ignored. For instance, HEADERS, | |||
MUST be minimally processed to ensure the state maintained for header | PUSH_PROMISE, and CONTINUATION frames MUST be minimally processed to | |||
compression is consistent (see Section 4.3); similarly DATA frames | ensure the state maintained for header compression is consistent (see | |||
MUST be counted toward the connection flow control window. Failure | Section 4.3); similarly, DATA frames MUST be counted toward the | |||
to process these frames can cause flow control or header compression | connection flow-control window. Failure to process these frames can | |||
state to become unsynchronized. | cause flow control or header compression state to become | |||
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. | 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 frames. Frames that are exempt | document, this includes only DATA frames. Frames that are exempt | |||
from flow control MUST be accepted and processed, unless the receiver | from flow control MUST be accepted and processed, unless the receiver | |||
is unable to assign resources to handling the frame. A receiver MAY | is 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 to accept | (Section 5.4.1) of type FLOW_CONTROL_ERROR if it is unable to accept | |||
a frame. | a frame. | |||
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 | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
|R| Window Size Increment (31) | | |R| Window Size Increment (31) | | |||
+-+-------------------------------------------------------------+ | +-+-------------------------------------------------------------+ | |||
WINDOW_UPDATE Payload Format | Figure 14: 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 octets 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 (2,147,483,647) octets. | |||
The WINDOW_UPDATE frame does not define any flags. | The WINDOW_UPDATE frame does not define any flags. | |||
The WINDOW_UPDATE frame can be specific to a stream or to the entire | The WINDOW_UPDATE frame can be specific to a stream or to the entire | |||
connection. In the former case, the frame's stream identifier | connection. In the former case, the frame's stream identifier | |||
indicates the affected stream; in the latter, the value "0" indicates | indicates the affected stream; in the latter, the value "0" indicates | |||
that the entire connection is the subject of the frame. | that the entire connection is the subject of the frame. | |||
A receiver MUST treat the recipt of a WINDOW_UPDATE frame with an | A receiver MUST treat the receipt of a WINDOW_UPDATE frame with an | |||
flow control window increment of 0 as a stream error (Section 5.4.2) | flow-control window increment of 0 as a stream error (Section 5.4.2) | |||
of type PROTOCOL_ERROR; errors on the connection flow control window | of type PROTOCOL_ERROR; errors on the connection flow-control window | |||
MUST be treated as a connection error (Section 5.4.1). | MUST be treated as a connection error (Section 5.4.1). | |||
WINDOW_UPDATE can be sent by a peer that has sent a frame bearing the | WINDOW_UPDATE can be sent by a peer that has sent a frame bearing the | |||
END_STREAM flag. This means that a receiver could receive a | END_STREAM flag. This means that a receiver could receive a | |||
WINDOW_UPDATE frame on a "half closed (remote)" or "closed" stream. | WINDOW_UPDATE frame on a "half-closed (remote)" or "closed" stream. | |||
A receiver MUST NOT treat this as an error, see Section 5.1. | A receiver MUST NOT treat this as an error (see Section 5.1). | |||
A receiver that receives a flow controlled frame MUST always account | A receiver that receives a flow-controlled frame MUST always account | |||
for its contribution against the connection flow control window, | for its contribution against the connection flow-control window, | |||
unless the receiver treats this as a connection error | unless the receiver treats this as a connection error | |||
(Section 5.4.1). This is necessary even if the frame is in error. | (Section 5.4.1). This is necessary even if the frame is in error. | |||
Since the sender counts the frame toward the flow control window, if | The sender counts the frame toward the flow-control window, but if | |||
the receiver does not, the flow control window at sender and receiver | the receiver does not, the flow-control window at the sender and | |||
can become different. | receiver can become different. | |||
6.9.1. The Flow Control Window | A WINDOW_UPDATE frame with a length other than 4 octets MUST be | |||
treated as a connection error (Section 5.4.1) of type | ||||
FRAME_SIZE_ERROR. | ||||
6.9.1. The Flow-Control Window | ||||
Flow control in HTTP/2 is implemented using a window kept by each | Flow control in HTTP/2 is implemented using a window kept by each | |||
sender on every stream. The flow control window is a simple integer | sender on every stream. The flow-control window is a simple integer | |||
value that indicates how many bytes of data the sender is permitted | value that indicates how many octets of data the sender is permitted | |||
to transmit; as such, its size is a measure of the buffering capacity | to transmit; as such, its size is a measure of the buffering capacity | |||
of the receiver. | of the receiver. | |||
Two flow control windows are applicable: the stream flow control | Two flow-control windows are applicable: the stream flow-control | |||
window and the connection flow control window. The sender MUST NOT | window and the connection flow-control window. The sender MUST NOT | |||
send a flow controlled frame with a length that exceeds the space | send a flow-controlled frame with a length that exceeds the space | |||
available in either of the flow control windows advertised by the | available in either of the flow-control windows advertised by the | |||
receiver. Frames with zero length with the END_STREAM flag set (that | receiver. Frames with zero length with the END_STREAM flag set (that | |||
is, an empty DATA frame) MAY be sent if there is no available space | is, an empty DATA frame) MAY be sent if there is no available space | |||
in either flow control window. | in either flow-control window. | |||
For flow control calculations, the 8 byte frame header is not | For flow-control calculations, the 9-octet frame header is not | |||
counted. | counted. | |||
After sending a flow controlled frame, the sender reduces the space | After sending a flow-controlled frame, the sender reduces the space | |||
available in both windows by the length of the transmitted frame. | available in both windows by the length of the transmitted frame. | |||
The receiver of a frame sends a WINDOW_UPDATE frame as it consumes | The receiver of a frame sends a WINDOW_UPDATE frame as it consumes | |||
data and frees up space in flow control windows. Separate | data and frees up space in flow-control windows. Separate | |||
WINDOW_UPDATE frames are sent for the stream and connection level | WINDOW_UPDATE frames are sent for the stream- and connection-level | |||
flow control windows. | flow-control windows. | |||
A sender that receives a WINDOW_UPDATE frame updates the | A sender that receives a WINDOW_UPDATE frame updates the | |||
corresponding window by the amount specified in the frame. | corresponding window by the amount specified in the frame. | |||
A sender MUST NOT allow a flow control window to exceed 2^31-1 bytes. | A sender MUST NOT allow a flow-control window to exceed 2^31-1 | |||
If a sender receives a WINDOW_UPDATE that causes a flow control | octets. If a sender receives a WINDOW_UPDATE that causes a flow- | |||
window to exceed this maximum it MUST terminate either the stream or | control window to exceed this maximum, it MUST terminate either the | |||
the connection, as appropriate. For streams, the sender sends a | stream or the connection, as appropriate. For streams, the sender | |||
RST_STREAM with the error code of FLOW_CONTROL_ERROR code; for the | sends a RST_STREAM with an error code of FLOW_CONTROL_ERROR; for the | |||
connection, a GOAWAY frame with a FLOW_CONTROL_ERROR code. | connection, a GOAWAY frame with an error code of FLOW_CONTROL_ERROR | |||
is sent. | ||||
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 an 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 octets. | |||
The connection flow control window is 65,535 bytes. Both endpoints | The connection flow-control window is also 65,535 octets. Both | |||
can adjust the initial window size for new streams by including a | endpoints can adjust the initial window size for new streams by | |||
value for SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS frame that | including a value for SETTINGS_INITIAL_WINDOW_SIZE in the SETTINGS | |||
forms part of the connection preface. The connection flow control | frame that forms part of the connection preface. The connection | |||
window can only be changed using WINDOW_UPDATE frames. | flow-control window can only be changed using WINDOW_UPDATE frames. | |||
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 | In addition to changing the flow-control window for streams that are | |||
all current streams. When the value of SETTINGS_INITIAL_WINDOW_SIZE | not yet active, a SETTINGS frame can alter the initial flow-control | |||
changes, a receiver MUST adjust the size of all stream flow control | window size for streams with active flow-control windows (that is, | |||
windows that it maintains by the difference between the new value and | streams in the "open" or "half-closed (remote)" state). When the | |||
the old value. | value of SETTINGS_INITIAL_WINDOW_SIZE changes, a receiver MUST adjust | |||
the size of all stream flow-control windows that it maintains by the | ||||
difference between the new value and the old value. | ||||
A change to SETTINGS_INITIAL_WINDOW_SIZE can cause the available | A change to SETTINGS_INITIAL_WINDOW_SIZE can cause the available | |||
space in a flow control window to become negative. A sender MUST | space in a flow-control window to become negative. A sender MUST | |||
track the negative flow control window, and MUST NOT send new flow | track the negative flow-control window and MUST NOT send new flow- | |||
controlled frames until it receives WINDOW_UPDATE frames that cause | controlled frames until it receives WINDOW_UPDATE frames that cause | |||
the flow control window to become positive. | the flow-control window to become positive. | |||
For example, if the client sends 60KB immediately on connection | For example, if the client sends 60 KB immediately on connection | |||
establishment, and the server sets the initial window size to be | establishment and the server sets the initial window size to be 16 | |||
16KB, the client will recalculate the available flow control window | KB, the client will recalculate the available flow-control window to | |||
to be -44KB on receipt of the SETTINGS frame. The client retains a | be -44 KB on receipt of the SETTINGS frame. The client retains a | |||
negative flow control window until WINDOW_UPDATE frames restore the | negative flow-control window until WINDOW_UPDATE frames restore the | |||
window to being positive, after which the client can resume sending. | window to being positive, after which the client can resume sending. | |||
A SETTINGS frame cannot alter the connection flow control window. | A SETTINGS frame cannot alter the connection flow-control window. | |||
An endpoint MUST treat a change to SETTINGS_INITIAL_WINDOW_SIZE that | An endpoint MUST treat a change to SETTINGS_INITIAL_WINDOW_SIZE that | |||
causes any flow control window to exceed the maximum size as a | causes any flow-control window to exceed the maximum size as a | |||
connection error (Section 5.4.1) of type FLOW_CONTROL_ERROR. | connection error (Section 5.4.1) of type FLOW_CONTROL_ERROR. | |||
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. | |||
After sending a SETTINGS frame that reduces the initial flow control | After sending a SETTINGS frame that reduces the initial flow-control | |||
window size, a receiver has two options for handling streams that | window size, a receiver MAY continue to process streams that exceed | |||
exceed flow control limits: | flow-control limits. Allowing streams to continue does not allow the | |||
receiver to immediately reduce the space it reserves for flow-control | ||||
1. The receiver can immediately send RST_STREAM with | windows. Progress on these streams can also stall, since | |||
FLOW_CONTROL_ERROR error code for the affected streams. | WINDOW_UPDATE frames are needed to allow the sender to resume | |||
sending. The receiver MAY instead send a RST_STREAM with an error | ||||
2. The receiver can accept the streams and tolerate the resulting | code of FLOW_CONTROL_ERROR for the affected streams. | |||
head of line blocking, sending WINDOW_UPDATE frames as it | ||||
consumes data. | ||||
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, as long as the preceding frame is on the same | |||
frame is on the same stream and is a HEADERS, PUSH_PROMISE or | stream and is a HEADERS, PUSH_PROMISE, or CONTINUATION frame without | |||
CONTINUATION frame without the END_HEADERS flag set. | the END_HEADERS flag set. | |||
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 | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
| Header Block Fragment (*) ... | | Header Block Fragment (*) ... | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
CONTINUATION Frame Payload | Figure 15: CONTINUATION Frame Payload | |||
The CONTINUATION frame payload contains a header block fragment | The CONTINUATION frame payload contains a header block fragment | |||
(Section 4.3). | (Section 4.3). | |||
The CONTINUATION frame defines the following flag: | The CONTINUATION frame defines the following flag: | |||
END_HEADERS (0x4): Bit 3 being set indicates that this frame ends a | END_HEADERS (0x4): When set, bit 2 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. | |||
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 48, line 32 ¶ | skipping to change at page 50, line 19 ¶ | |||
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 apply only | Error codes share a common code space. Some error codes apply only | |||
to either streams or the entire connection and have no defined | to either streams or the entire connection and have no defined | |||
semantics in the other context. | semantics in the other context. | |||
The following error codes are defined: | The following error codes are defined: | |||
NO_ERROR (0x0): The associated condition is not as a result of an | NO_ERROR (0x0): The associated condition is not a result of an | |||
error. For example, a GOAWAY might include this code to indicate | error. For example, a GOAWAY might include this code to indicate | |||
graceful shutdown of a connection. | graceful shutdown of a connection. | |||
PROTOCOL_ERROR (0x1): The endpoint detected an unspecific protocol | PROTOCOL_ERROR (0x1): The endpoint detected an unspecific protocol | |||
error. This error is for use when a more specific error code is | error. This error is for use when a more specific error code is | |||
not available. | not available. | |||
INTERNAL_ERROR (0x2): The endpoint encountered an unexpected | INTERNAL_ERROR (0x2): The endpoint encountered an unexpected | |||
internal error. | internal error. | |||
FLOW_CONTROL_ERROR (0x3): The endpoint detected that its peer | FLOW_CONTROL_ERROR (0x3): The endpoint detected that its peer | |||
violated the flow control protocol. | violated the flow-control protocol. | |||
SETTINGS_TIMEOUT (0x4): The endpoint sent a SETTINGS frame, but did | SETTINGS_TIMEOUT (0x4): The endpoint sent a SETTINGS frame but did | |||
not receive a response in a timely manner. See Settings | not receive a response in a timely manner. See Section 6.5.3 | |||
Synchronization (Section 6.5.3). | ("Settings Synchronization"). | |||
STREAM_CLOSED (0x5): The endpoint received a frame after a stream | STREAM_CLOSED (0x5): The endpoint received a frame after a stream | |||
was half closed. | was half-closed. | |||
FRAME_SIZE_ERROR (0x6): The endpoint received a frame that was | FRAME_SIZE_ERROR (0x6): The endpoint received a frame with an | |||
larger than the maximum size that it supports. | invalid size. | |||
REFUSED_STREAM (0x7): The endpoint refuses the stream prior to | REFUSED_STREAM (0x7): The endpoint refused the stream prior to | |||
performing any application processing, see Section 8.1.4 for | performing any application processing (see Section 8.1.4 for | |||
details. | details). | |||
CANCEL (0x8): Used by the endpoint to indicate that the stream is no | CANCEL (0x8): Used by the endpoint to indicate that the stream is no | |||
longer needed. | longer needed. | |||
COMPRESSION_ERROR (0x9): The endpoint is unable to maintain the | COMPRESSION_ERROR (0x9): The endpoint is unable to maintain the | |||
header compression context for the connection. | header compression context for the connection. | |||
CONNECT_ERROR (0xa): The connection established in response to a | CONNECT_ERROR (0xa): The connection established in response to a | |||
CONNECT request (Section 8.3) was reset or abnormally closed. | CONNECT request (Section 8.3) was reset or abnormally closed. | |||
ENHANCE_YOUR_CALM (0xb): The endpoint detected that its peer is | ENHANCE_YOUR_CALM (0xb): The endpoint detected that its peer is | |||
exhibiting a behavior that might be generating excessive load. | exhibiting a behavior that might be generating excessive load. | |||
INADEQUATE_SECURITY (0xc): The underlying transport has properties | INADEQUATE_SECURITY (0xc): The underlying transport has properties | |||
that do not meet minimum security requirements (see Section 9.2). | that do not meet minimum security requirements (see Section 9.2). | |||
HTTP_1_1_REQUIRED (0xd): The endpoint requires that HTTP/1.1 be used | ||||
instead of HTTP/2. | ||||
Unknown or unsupported error codes MUST NOT trigger any special | Unknown or unsupported error codes MUST NOT trigger any special | |||
behavior. These MAY be treated by an implementation as being | behavior. These MAY be treated by an implementation as being | |||
equivalent to INTERNAL_ERROR. | equivalent to INTERNAL_ERROR. | |||
8. HTTP Message Exchanges | 8. HTTP Message Exchanges | |||
HTTP/2 is intended to be as compatible as possible with current uses | HTTP/2 is intended to be as compatible as possible with current uses | |||
of HTTP. This means that, from the application perspective, the | of HTTP. This means that, from the application perspective, the | |||
features of the protocol are largely unchanged. To achieve this, all | features of the protocol are largely unchanged. To achieve this, all | |||
request and response semantics are preserved, although the syntax of | request and response semantics are preserved, although the syntax of | |||
conveying those semantics has changed. | conveying those semantics has changed. | |||
Thus, the specification and requirements of HTTP/1.1 Semantics and | Thus, the specification and requirements of HTTP/1.1 Semantics and | |||
Content [RFC7231], Conditional Requests [RFC7232], Range Requests | Content [RFC7231], Conditional Requests [RFC7232], Range Requests | |||
[RFC7233], Caching [RFC7234] and Authentication [RFC7235] are | [RFC7233], Caching [RFC7234], and Authentication [RFC7235] are | |||
applicable to HTTP/2. Selected portions of HTTP/1.1 Message Syntax | applicable to HTTP/2. Selected portions of HTTP/1.1 Message Syntax | |||
and Routing [RFC7230], such as the HTTP and HTTPS URI schemes, are | and Routing [RFC7230], such as the HTTP and HTTPS URI schemes, are | |||
also applicable in HTTP/2, but the expression of those semantics for | also applicable in HTTP/2, but the expression of those semantics for | |||
this protocol are defined in the sections below. | 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 message (request or response) consists of: | An HTTP message (request or response) consists of: | |||
1. for a response only, zero or more HEADERS frames (each followed | 1. for a response only, zero or more HEADERS frames (each followed | |||
by zero or more CONTINUATION frames) containing the message | by zero or more CONTINUATION frames) containing the message | |||
headers of informational (1xx) HTTP responses (see [RFC7230], | headers of informational (1xx) HTTP responses (see [RFC7230], | |||
Section 3.2 and [RFC7231], Section 6.2), and | Section 3.2 and [RFC7231], Section 6.2), | |||
2. one HEADERS frame (followed by zero or more CONTINUATION frames) | 2. one HEADERS frame (followed by zero or more CONTINUATION frames) | |||
containing the message headers (see [RFC7230], Section 3.2), and | containing the message headers (see [RFC7230], Section 3.2), | |||
3. zero or more DATA frames containing the message payload (see | 3. zero or more DATA frames containing the payload body (see | |||
[RFC7230], Section 3.3), and | [RFC7230], Section 3.3), and | |||
4. optionally, one HEADERS frame, followed by zero or more | 4. optionally, one HEADERS frame, followed by zero or more | |||
CONTINUATION frames containing the trailer-part, if present (see | CONTINUATION frames containing the trailer-part, if present (see | |||
[RFC7230], Section 4.1.2). | [RFC7230], Section 4.1.2). | |||
The last frame in the sequence bears an END_STREAM flag, noting that | The last frame in the sequence bears an END_STREAM flag, noting that | |||
a HEADERS frame bearing the END_STREAM flag can be followed by | a 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 (from any stream) MUST NOT occur between either HEADERS | Other frames (from any stream) MUST NOT occur between the HEADERS | |||
frame and any CONTINUATION frames that might follow. | frame and any CONTINUATION frames that might follow. | |||
A HEADERS frame (and associated CONTINUATION frames) can only appear | HTTP/2 uses DATA frames to carry message payloads. The "chunked" | |||
at the start or end of a stream. An endpoint that receives a second | transfer encoding defined in Section 4.1 of [RFC7230] MUST NOT be | |||
HEADERS frame without the END_STREAM flag set MUST treat the | used in HTTP/2. | |||
corresponding request or response as malformed (Section 8.1.2.6). | ||||
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. Such a header block is a sequence starting | |||
frame, followed by zero or more CONTINUATION frames, where the | with a HEADERS frame, followed by zero or more CONTINUATION frames, | |||
HEADERS frame bears an END_STREAM flag. Header blocks after the | where the HEADERS frame bears an END_STREAM flag. Header blocks | |||
first that do not terminate the stream are not part of an HTTP | after the first that do not terminate the stream are not part of an | |||
request or response. | HTTP request or response. | |||
A HEADERS frame (and associated CONTINUATION frames) can only appear | ||||
at the start or end of a stream. An endpoint that receives a HEADERS | ||||
frame without the END_STREAM flag set after receiving a final (non- | ||||
informational) status code MUST treat the corresponding request or | ||||
response as malformed (Section 8.1.2.6). | ||||
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 | |||
"open" state. The request ends with a frame bearing END_STREAM, | "open" state. The request ends with a frame bearing END_STREAM, | |||
which causes the stream to become "half closed (local)" for the | which causes the stream to become "half-closed (local)" for the | |||
client and "half closed (remote)" for the server. A response starts | client and "half-closed (remote)" for the server. A response starts | |||
with a HEADERS frame and ends with a frame bearing END_STREAM, which | with a HEADERS frame and ends with a frame bearing END_STREAM, which | |||
places the stream in the "closed" state. | places the stream in the "closed" state. | |||
8.1.1. Upgrading From HTTP/2 | An HTTP response is complete after the server sends -- or the client | |||
receives -- a frame with the END_STREAM flag set (including any | ||||
CONTINUATION frames needed to complete a header block). A server can | ||||
send a complete response prior to the client sending an entire | ||||
request if the response does not depend on any portion of the request | ||||
that has not been sent and received. When this is true, a server MAY | ||||
request that the client abort transmission of a request without error | ||||
by sending a RST_STREAM with an error code of NO_ERROR after sending | ||||
a complete response (i.e., a frame with the END_STREAM flag). | ||||
Clients MUST NOT discard responses as a result of receiving such a | ||||
RST_STREAM, though clients can always discard responses at their | ||||
discretion for other reasons. | ||||
8.1.1. Upgrading from HTTP/2 | ||||
HTTP/2 removes support for the 101 (Switching Protocols) | HTTP/2 removes support for the 101 (Switching Protocols) | |||
informational status code ([RFC7231], Section 6.2.2). | informational status code ([RFC7231], Section 6.2.2). | |||
The semantics of 101 (Switching Protocols) aren't applicable to a | The semantics of 101 (Switching Protocols) aren't applicable to a | |||
multiplexed protocol. Alternative protocols are able to use the same | multiplexed protocol. Alternative protocols are able to use the same | |||
mechanisms that HTTP/2 uses to negotiate their use (see Section 3). | mechanisms that HTTP/2 uses to negotiate their use (see Section 3). | |||
8.1.2. HTTP Header Fields | 8.1.2. HTTP Header Fields | |||
HTTP header fields carry information as a series of key-value pairs. | HTTP header fields carry information as a series of key-value pairs. | |||
For a listing of registered HTTP headers, see the Message Header | For a listing of registered HTTP headers, see the "Message Header | |||
Field Registry maintained at | Field" registry maintained at | |||
<https://www.iana.org/assignments/message-headers>. | <https://www.iana.org/assignments/message-headers>. | |||
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.2.6). | ||||
8.1.2.1. Pseudo-Header Fields | 8.1.2.1. Pseudo-Header Fields | |||
While HTTP/1.x used the message start-line (see [RFC7230], Section | While HTTP/1.x used the message start-line (see [RFC7230], Section | |||
3.1) to convey the target URI and method of the request, and the | 3.1) to convey the target URI, the method of the request, and the | |||
status code for the response, HTTP/2 uses special pseudo-header | status code for the response, HTTP/2 uses special pseudo-header | |||
fields beginning with ':' character (ASCII 0x3a) for this purpose. | fields beginning with ':' character (ASCII 0x3a) for this purpose. | |||
Pseudo-header fields are only valid in the HTTP/2 context. These are | Pseudo-header fields are not HTTP header fields. Endpoints MUST NOT | |||
not HTTP header fields. Endpoints MUST NOT generate pseudo-header | generate pseudo-header fields other than those defined in this | |||
fields other than those defined in this document. | document. | |||
Pseudo-header fields are only valid in the context in which they are | Pseudo-header fields are only valid in the context in which they are | |||
defined. Pseudo-header fields defined for requests MUST NOT appear | defined. Pseudo-header fields defined for requests MUST NOT appear | |||
in responses; pseudo-header fields defined for responses MUST NOT | in responses; pseudo-header fields defined for responses MUST NOT | |||
appear in requests. Pseudo-header fields MUST NOT appear in | appear in requests. Pseudo-header fields MUST NOT appear in | |||
trailers. Endpoints MUST treat a request or response that contains | trailers. Endpoints MUST treat a request or response that contains | |||
undefined or invalid pseudo-header fields as malformed | undefined or invalid pseudo-header fields as malformed | |||
(Section 8.1.2.6). | (Section 8.1.2.6). | |||
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.2.6). | ||||
All pseudo-header fields MUST appear in the header block before | All pseudo-header fields MUST appear in the header block before | |||
regular header fields. Any request or response that contains a | regular header fields. Any request or response that contains a | |||
pseudo-header field that appears in a header block after a regular | pseudo-header field that appears in a header block after a regular | |||
header field MUST be treated as malformed (Section 8.1.2.6). | header field MUST be treated as malformed (Section 8.1.2.6). | |||
8.1.2.2. Hop-by-Hop Header Fields | 8.1.2.2. Connection-Specific Header Fields | |||
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" header fields; in this protocol, connection-specific metadata is | connection-specific header fields; in this protocol, connection- | |||
conveyed by other means. As such, a HTTP/2 message containing | specific metadata is conveyed by other means. An endpoint MUST NOT | |||
Connection MUST be treated as malformed (Section 8.1.2.6). | generate an HTTP/2 message containing connection-specific header | |||
fields; any message containing connection-specific header fields MUST | ||||
be treated as malformed (Section 8.1.2.6). | ||||
The only exception to this is the TE header field, which MAY be | ||||
present in an HTTP/2 request; when it is, it MUST NOT contain any | ||||
value other than "trailers". | ||||
This means that an intermediary transforming an 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 the | |||
Connection. | Connection header field. | |||
One exception to this is the TE header field, which MAY be present in | ||||
an HTTP/2 request, but when it is MUST NOT contain any value other | ||||
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.2.3. Request Header Fields | 8.1.2.3. Request Pseudo-Header Fields | |||
HTTP/2 defines a number of pseudo header fields starting with a colon | The following pseudo-header fields are defined for HTTP/2 requests: | |||
':' character that carry information about the request target: | ||||
o The ":method" header field includes the HTTP method ([RFC7231], | o The ":method" pseudo-header field includes the HTTP method | |||
Section 4). | ([RFC7231], Section 4). | |||
o The ":scheme" header field includes the scheme portion of the | o The ":scheme" pseudo-header field includes the scheme portion of | |||
target URI ([RFC3986], Section 3.1). | the target URI ([RFC3986], Section 3.1). | |||
":scheme" is not restricted to "http" and "https" schemed URIs. A | ":scheme" is not restricted to "http" and "https" schemed URIs. A | |||
proxy or gateway can translate requests for non-HTTP schemes, | proxy or gateway can translate requests for non-HTTP schemes, | |||
enabling the use of HTTP to interact with non-HTTP services. | enabling the use of HTTP to interact with non-HTTP services. | |||
o The ":authority" header field includes the authority portion of | o The ":authority" pseudo-header field includes the authority | |||
the target URI ([RFC3986], Section 3.2). The authority MUST NOT | portion of the target URI ([RFC3986], Section 3.2). The authority | |||
include the deprecated "userinfo" subcomponent for "http" or | MUST NOT include the deprecated "userinfo" subcomponent for "http" | |||
"https" schemed URIs. | or "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 pseudo-header field MUST be omitted when | |||
from an HTTP/1.1 request that has a request target in origin or | translating from an HTTP/1.1 request that has a request target in | |||
asterisk form (see [RFC7230], Section 5.3). Clients that generate | origin or asterisk form (see [RFC7230], Section 5.3). Clients | |||
HTTP/2 requests directly SHOULD instead omit the "Host" header | that generate HTTP/2 requests directly SHOULD use the ":authority" | |||
field. An intermediary that converts an HTTP/2 request to | pseudo-header field instead of the Host header field. An | |||
HTTP/1.1 MUST create a "Host" header field if one is not present | intermediary that converts an HTTP/2 request to HTTP/1.1 MUST | |||
in a request by copying the value of the ":authority" header | create a Host header field if one is not present in a request by | |||
field. | copying the value of the ":authority" pseudo-header field. | |||
o The ":path" header field includes the path and query parts of the | o The ":path" pseudo-header field includes the path and query parts | |||
target URI (the "path-absolute" production from [RFC3986] and | of the target URI (the "path-absolute" production and optionally a | |||
optionally a '?' character followed by the "query" production, see | '?' character followed by the "query" production (see Sections 3.3 | |||
[RFC3986], Section 3.3 and [RFC3986], Section 3.4). A request in | and 3.4 of [RFC3986]). A request in asterisk form includes the | |||
asterisk form includes the value '*' for the ":path" header field. | value '*' for the ":path" pseudo-header field. | |||
This field MUST NOT be empty for "http" or "https" URIs; "http" or | This pseudo-header field MUST NOT be empty for "http" or "https" | |||
"https" URIs that do not contain a path component MUST include a | URIs; "http" or "https" URIs that do not contain a path component | |||
value of '/'. The exception to this rule is an OPTIONS request | MUST include a value of '/'. The exception to this rule is an | |||
for an "http" or "https" URI that does not include a path | OPTIONS request for an "http" or "https" URI that does not include | |||
component; these MUST include a ":path" header field with a value | a path component; these MUST include a ":path" pseudo-header field | |||
of '*' (see [RFC7230], Section 5.3.4). | with a value of '*' (see [RFC7230], Section 5.3.4). | |||
All HTTP/2 requests MUST include exactly one valid value for the | All HTTP/2 requests MUST include exactly one valid value for the | |||
":method", ":scheme", and ":path" header fields, unless this is a | ":method", ":scheme", and ":path" pseudo-header fields, unless it is | |||
CONNECT request (Section 8.3). An HTTP request that omits mandatory | a CONNECT request (Section 8.3). An HTTP request that omits | |||
header fields is malformed (Section 8.1.2.6). | mandatory pseudo-header fields is malformed (Section 8.1.2.6). | |||
HTTP/2 does not define a way to carry the version identifier that is | HTTP/2 does not define a way to carry the version identifier that is | |||
included in the HTTP/1.1 request line. | included in the HTTP/1.1 request line. | |||
8.1.2.4. Response Header Fields | 8.1.2.4. Response Pseudo-Header Fields | |||
A single ":status" header field is defined that carries the HTTP | For HTTP/2 responses, a single ":status" pseudo-header field is | |||
status code field (see [RFC7231], Section 6). This header field MUST | defined that carries the HTTP status code field (see [RFC7231], | |||
be included in all responses, otherwise the response is malformed | Section 6). This pseudo-header field MUST be included in all | |||
(Section 8.1.2.6). | responses; otherwise, the response is malformed (Section 8.1.2.6). | |||
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.2.5. Compressing the Cookie Header Field | 8.1.2.5. Compressing the Cookie Header Field | |||
The Cookie header field [COOKIE] can carry a significant amount of | The Cookie header field [COOKIE] uses a semi-colon (";") to delimit | |||
redundant data. | cookie-pairs (or "crumbs"). This header field doesn't follow the | |||
list construction rules in HTTP (see [RFC7230], Section 3.2.2), which | ||||
The Cookie header field uses a semi-colon (";") to delimit cookie- | ||||
pairs (or "crumbs"). This header field doesn't follow the list | ||||
construction rules in HTTP (see [RFC7230], Section 3.2.2), which | ||||
prevents cookie-pairs from being separated into different name-value | prevents cookie-pairs from being separated into different name-value | |||
pairs. This can significantly reduce compression efficiency as | pairs. This can significantly reduce compression efficiency as | |||
individual cookie-pairs are updated. | individual cookie-pairs are updated. | |||
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 "; ") | |||
before being passed into a non-HTTP/2 context, such as an HTTP/1.1 | before being passed into a non-HTTP/2 context, such as an HTTP/1.1 | |||
connection, or a generic HTTP server application. | connection, or a generic HTTP server application. | |||
Therefore, the following two lists of Cookie header fields are | Therefore, the following two lists of Cookie header fields are | |||
semantically equivalent. | semantically equivalent. | |||
cookie: a=b; c=d; e=f | cookie: a=b; c=d; e=f | |||
cookie: a=b | cookie: a=b | |||
cookie: c=d | cookie: c=d | |||
cookie: e=f | cookie: e=f | |||
8.1.2.6. Malformed Requests and Responses | 8.1.2.6. Malformed Requests and Responses | |||
A malformed request or response is one that is an otherwise valid | A malformed request or response is one that is an otherwise valid | |||
sequence of HTTP/2 frames, but is otherwise invalid due to the | sequence of HTTP/2 frames but is invalid due to the presence of | |||
presence of extraneous frames, prohibited header fields, the absence | extraneous frames, prohibited header fields, the absence of mandatory | |||
of mandatory header fields, or the inclusion of uppercase header | header fields, or the inclusion of uppercase header field names. | |||
field names. | ||||
A request or response that includes an entity body can include a | A request or response that includes a payload 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 | |||
malformed if the value of a "content-length" header field does not | if the value of a content-length header field does not equal the sum | |||
equal the sum of the DATA frame payload lengths that form the body, | of the DATA frame payload lengths that form the body. A response | |||
with the exception of responses to HEAD requests, which always | that is defined to have no payload, as described in [RFC7230], | |||
contain no DATA frames. | Section 3.3.2, can have a non-zero content-length header field, even | |||
though no content is included in DATA frames. | ||||
Intermediaries that process HTTP requests or responses (i.e., any | Intermediaries that process HTTP requests or responses (i.e., any | |||
intermediary not acting as a tunnel) MUST NOT forward a malformed | intermediary not acting as a tunnel) MUST NOT forward a malformed | |||
request or response. Malformed requests or responses that are | request or response. Malformed requests or responses that are | |||
detected MUST be treated as a stream error (Section 5.4.2) of type | detected MUST be treated as a stream error (Section 5.4.2) of type | |||
PROTOCOL_ERROR. | PROTOCOL_ERROR. | |||
For malformed requests, a server MAY send an HTTP response prior to | For malformed requests, a server MAY send an HTTP response prior to | |||
closing or resetting the stream. Clients MUST NOT accept a malformed | closing or resetting the stream. Clients MUST NOT accept a malformed | |||
response. Note that these requirements are intended to protect | response. Note that these requirements are intended to protect | |||
against several types of common attacks against HTTP; they are | against several types of common attacks against HTTP; they are | |||
deliberately strict, because being permissive can expose | deliberately strict because being permissive can expose | |||
implementations to these vulnerabilities. | implementations to these vulnerabilities. | |||
8.1.3. Examples | 8.1.3. 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 payload | |||
therefore transmitted as a single HEADERS frame, followed by zero or | body and is therefore transmitted as a single HEADERS frame, followed | |||
more CONTINUATION frames containing the serialized block of request | by zero or more CONTINUATION frames containing the serialized block | |||
header fields. The HEADERS frame in the following has both the | of request header fields. The HEADERS frame in the following has | |||
END_HEADERS and END_STREAM flags set; no CONTINUATION frames are | both the END_HEADERS and END_STREAM flags set; no CONTINUATION frames | |||
sent: | are sent. | |||
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 | |||
:path = /resource | :path = /resource | |||
host = example.org | host = example.org | |||
accept = image/jpeg | accept = image/jpeg | |||
skipping to change at page 56, line 10 ¶ | skipping to change at page 58, line 10 ¶ | |||
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 | |||
:path = /resource | :path = /resource | |||
{binary data} content-type = image/jpeg | {binary data} :scheme = https | |||
CONTINUATION | CONTINUATION | |||
+ END_HEADERS | + END_HEADERS | |||
content-type = image/jpeg | ||||
host = example.org | host = example.org | |||
:scheme = https | ||||
content-length = 123 | content-length = 123 | |||
DATA | DATA | |||
+ END_STREAM | + END_STREAM | |||
{binary data} | {binary data} | |||
Note that data contributing to any given header field could be spread | Note that data contributing to any given header field could be spread | |||
between header block fragments. The allocation of header fields to | between header block fragments. The allocation of header fields to | |||
frames in this example is illustrative only. | frames in this example is illustrative only. | |||
skipping to change at page 56, line 42 ¶ | skipping to change at page 58, line 42 ¶ | |||
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} | |||
An informational response using a 1xx status code other than 101 is | ||||
transmitted as a HEADERS frame, followed by zero or more CONTINUATION | ||||
frames. | ||||
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 HEADERS frame starting the trailers header block has the | sent. The HEADERS frame starting the trailers header block has the | |||
END_STREAM flag set. | END_STREAM flag set. | |||
The following example includes both a 100 (Continue) status code, | ||||
which is sent in response to a request containing a "100-continue" | ||||
token in the Expect header field, and trailing header fields: | ||||
HTTP/1.1 100 Continue HEADERS | ||||
Extension-Field: bar ==> - END_STREAM | ||||
+ END_HEADERS | ||||
:status = 100 | ||||
extension-field = bar | ||||
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 | |||
Trailer: Foo :status = 200 | Trailer: Foo :status = 200 | |||
content-length = 123 | content-length = 123 | |||
123 content-type = image/jpeg | 123 content-type = image/jpeg | |||
{binary data} trailer = Foo | {binary data} trailer = Foo | |||
0 | 0 | |||
Foo: bar DATA | Foo: bar DATA | |||
- END_STREAM | - END_STREAM | |||
{binary data} | {binary data} | |||
HEADERS | HEADERS | |||
+ END_STREAM | + END_STREAM | |||
+ END_HEADERS | + END_HEADERS | |||
foo = bar | foo = bar | |||
An informational response using a 1xx status code other than 101 is | ||||
transmitted as a HEADERS frame, followed by zero or more CONTINUATION | ||||
frames: | ||||
HTTP/1.1 103 BAR HEADERS | ||||
Extension-Field: bar ==> - END_STREAM | ||||
+ END_HEADERS | ||||
:status = 103 | ||||
extension-field = bar | ||||
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 | |||
that a request has not been processed: | that a request has not been processed: | |||
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. | |||
skipping to change at page 58, line 16 ¶ | skipping to change at page 60, line 16 ¶ | |||
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") one or more | HTTP/2 allows a server to pre-emptively send (or "push") responses | |||
associated responses to a client in response to a single request. | (along with corresponding "promised" requests) to a client in | |||
This feature becomes particularly helpful when the server knows the | association with a previous client-initiated request. This can be | |||
client will need to have those responses available in order to fully | useful when the server knows the client will need to have those | |||
process the response to the original request. | responses available in order to fully process the response to the | |||
original request. | ||||
Pushing additional responses is optional, and is negotiated between | A client can request that server push be disabled, though this is | |||
individual endpoints. The SETTINGS_ENABLE_PUSH setting can be set to | negotiated for each hop independently. The SETTINGS_ENABLE_PUSH | |||
0 to indicate that server push is disabled. | setting can be set to 0 to indicate that server push is disabled. | |||
Because pushing responses is effectively hop-by-hop, an intermediary | Promised requests MUST be cacheable (see [RFC7231], Section 4.2.3), | |||
could receive pushed responses from the server and choose not to | MUST be safe (see [RFC7231], Section 4.2.1), and MUST NOT include a | |||
forward those on to the client. In other words, how to make use of | request body. Clients that receive a promised request that is not | |||
the pushed responses is up to that intermediary. Equally, the | cacheable, that is not known to be safe, or that indicates the | |||
intermediary might choose to push additional responses to the client, | presence of a request body MUST reset the promised stream with a | |||
stream error (Section 5.4.2) of type PROTOCOL_ERROR. Note this could | ||||
result in the promised stream being reset if the client does not | ||||
recognize a newly defined method as being safe. | ||||
Pushed responses that are cacheable (see [RFC7234], Section 3) can be | ||||
stored by the client, if it implements an HTTP cache. Pushed | ||||
responses are considered successfully validated on the origin server | ||||
(e.g., if the "no-cache" cache response directive is present | ||||
([RFC7234], Section 5.2.2)) while the stream identified by the | ||||
promised stream ID is still open. | ||||
Pushed responses that are not cacheable MUST NOT be stored by any | ||||
HTTP cache. They MAY be made available to the application | ||||
separately. | ||||
The server MUST include a value in the ":authority" pseudo-header | ||||
field for which the server is authoritative (see Section 10.1). A | ||||
client MUST treat a PUSH_PROMISE for which the server is not | ||||
authoritative as a stream error (Section 5.4.2) of type | ||||
PROTOCOL_ERROR. | ||||
An intermediary can receive pushes from the server and choose not to | ||||
forward them on to the client. In other words, how to make use of | ||||
the pushed information is up to that intermediary. Equally, the | ||||
intermediary might choose to make additional pushes to the client, | ||||
without any action taken by the server. | without any action taken by the server. | |||
A client cannot push. Thus, servers MUST treat the receipt of a | A client cannot push. Thus, servers MUST treat the receipt of a | |||
PUSH_PROMISE frame as a connection error (Section 5.4.1) of type | PUSH_PROMISE frame as a connection error (Section 5.4.1) of type | |||
PROTOCOL_ERROR. Clients MUST reject any attempt to change the | PROTOCOL_ERROR. Clients MUST reject any attempt to change the | |||
SETTINGS_ENABLE_PUSH setting to a value other than 0 by treating 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. | message as a connection error (Section 5.4.1) of type PROTOCOL_ERROR. | |||
A server can only push responses that are cacheable (see [RFC7234], | ||||
Section 3); promised requests MUST be safe (see [RFC7231], 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; however, in this case that request is also sent by the | request; however, in this case, that request is also sent by the | |||
server, as a PUSH_PROMISE frame. | server, as a PUSH_PROMISE frame. | |||
The PUSH_PROMISE frame includes a header block that contains a | The PUSH_PROMISE frame includes a header block that contains a | |||
complete set of request header fields that the server attributes to | complete set of request header fields that the server attributes to | |||
the request. It is not possible to push a response to a request that | the request. It is not possible to push a response to a request that | |||
includes a request body. | includes a request body. | |||
Pushed responses are always associated with an explicit request from | Pushed responses are always associated with an explicit request from | |||
the client. The PUSH_PROMISE frames sent by the server are sent on | the client. The PUSH_PROMISE frames sent by the server are sent on | |||
that explicit request's stream. The PUSH_PROMISE frame also includes | that explicit request's stream. The PUSH_PROMISE frame also includes | |||
a promised stream identifier, chosen from the stream identifiers | a promised stream identifier, chosen from the stream identifiers | |||
available to the server (see Section 5.1.1). | 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.2.3). The server MUST include a method in the ":method" | (Section 8.1.2.3). The server MUST include a method in the ":method" | |||
header field that is safe and cacheable. If a client receives a | pseudo-header field that is safe and cacheable. If a client receives | |||
PUSH_PROMISE that does not include a complete and valid set of header | a PUSH_PROMISE that does not include a complete and valid set of | |||
fields, or the ":method" header field identifies a method that is not | header fields or the ":method" pseudo-header field identifies a | |||
safe, it MUST respond with a stream error (Section 5.4.2) of type | method that is not safe, it MUST respond with a stream error | |||
PROTOCOL_ERROR. | (Section 5.4.2) of type 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 responses. This | sending any frames that reference the promised responses. This | |||
avoids a race where clients issue requests prior to receiving any | avoids a race where clients issue requests prior to 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 | |||
promises before the DATA frames that contain the image links ensures | PUSH_PROMISE frames before the DATA frames that contain the image | |||
that the client is able to see the promises before discovering | links ensures that the client is able to see that a resource will be | |||
embedded links. Similarly, if the server pushes responses referenced | pushed before discovering embedded links. Similarly, if the server | |||
by the header block (for instance, in Link header fields), sending | pushes responses referenced by the header block (for instance, in | |||
the push promises before sending the header block ensures that | Link header fields), sending a PUSH_PROMISE before sending the header | |||
clients do not request them. | block ensures that clients do not request those resources. | |||
PUSH_PROMISE frames MUST NOT be sent by the client. | PUSH_PROMISE frames MUST NOT be sent by the client. | |||
PUSH_PROMISE frames can be sent by the server in response to any | PUSH_PROMISE frames can be sent by the server in response to any | |||
client-initiated stream, but the stream MUST be in either the "open" | client-initiated stream, but the stream MUST be in either the "open" | |||
or "half closed (remote)" state with respect to the server. | or "half-closed (remote)" state with respect to the server. | |||
PUSH_PROMISE frames are interspersed with the frames that comprise a | PUSH_PROMISE frames are interspersed with the frames that comprise a | |||
response, though they cannot be interspersed with HEADERS and | response, though they cannot be interspersed with HEADERS and | |||
CONTINUATION frames that comprise a single header block. | CONTINUATION frames that comprise a single header block. | |||
Sending a PUSH_PROMISE frame creates a new stream and puts the stream | Sending a PUSH_PROMISE frame creates a new stream and puts the stream | |||
into the "reserved (local)" state for the server and the "reserved | into the "reserved (local)" state for the server and the "reserved | |||
(remote)" state for the client. | (remote)" state for the client. | |||
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 response as a response (Section 8.1.2.4) on a server- | the pushed response as a response (Section 8.1.2.4) 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 response, the client SHOULD NOT issue any requests for the | pushed response, the client SHOULD NOT issue any requests for the | |||
promised response 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 response 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 response, 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, | a RST_STREAM frame, using either the CANCEL or REFUSED_STREAM code | |||
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 responses 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 either the | |||
authorized to provide the response, see Section 10.1. For example, a | server is authoritative (see Section 10.1) or the proxy that provided | |||
server that offers a certificate for only the "example.com" DNS-ID or | the pushed response is configured for the corresponding request. For | |||
Common Name is not permitted to push a response for | example, a server that offers a certificate for only the | |||
"https://www.example.org/doc". | "example.com" DNS-ID or Common Name is not permitted to push a | |||
response for "https://www.example.org/doc". | ||||
The response for a PUSH_PROMISE stream begins with a HEADERS frame, | The response for a PUSH_PROMISE stream begins with a HEADERS frame, | |||
which immediately puts the stream into the "half closed (remote)" | which immediately puts the stream into the "half-closed (remote)" | |||
state for the server and "half closed (local)" state for the client, | state for the server and "half-closed (local)" state for the client, | |||
and ends with a frame bearing END_STREAM, which places the stream in | and ends with a frame bearing END_STREAM, which places the stream in | |||
the "closed" state. | the "closed" state. | |||
Note: The client never sends a frame with the END_STREAM flag for a | Note: The client never sends a frame with the END_STREAM flag for | |||
server push. | a server push. | |||
8.3. The CONNECT Method | 8.3. The CONNECT Method | |||
In HTTP/1.x, the pseudo-method CONNECT ([RFC7231], Section 4.3.6) is | In HTTP/1.x, the pseudo-method CONNECT ([RFC7231], Section 4.3.6) is | |||
used to convert an HTTP 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 an origin server for the purposes of interacting with | session with an origin server for the purposes of interacting with | |||
"https" 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, for similar purposes. The | single HTTP/2 stream to a remote host for similar purposes. The HTTP | |||
HTTP header field mapping works as mostly as defined in Request | header field mapping works as defined in Section 8.1.2.3 ("Request | |||
Header Fields (Section 8.1.2.3), with a few differences. | Pseudo-Header Fields"), with a few differences. Specifically: | |||
Specifically: | ||||
o The ":method" header field is set to "CONNECT". | o The ":method" pseudo-header field is set to "CONNECT". | |||
o The ":scheme" and ":path" header fields MUST be omitted. | o The ":scheme" and ":path" pseudo-header fields MUST be omitted. | |||
o The ":authority" header field contains the host and port to | o The ":authority" pseudo-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 [RFC7230], Section 5.3). | of CONNECT requests (see [RFC7230], Section 5.3)). | |||
A CONNECT request that does not conform to these restrictions is | ||||
malformed (Section 8.1.2.6). | ||||
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" pseudo-header field. Once | |||
connection is successfully established, the proxy sends a HEADERS | this connection is successfully established, the proxy sends a | |||
frame containing a 2xx series status code to the client, as defined | HEADERS frame containing a 2xx series status code to the client, as | |||
in [RFC7231], Section 4.3.6. | defined in [RFC7231], 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 is 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. | |||
The TCP connection can be closed by either peer. The END_STREAM flag | The TCP connection can be closed by either peer. The END_STREAM flag | |||
on a DATA frame is treated as being equivalent to the TCP FIN bit. A | on a DATA frame is treated as being equivalent to the TCP FIN bit. A | |||
client is expected to send a DATA frame with the END_STREAM flag set | client is expected to send a DATA frame with the END_STREAM flag set | |||
after receiving a frame bearing the END_STREAM flag. A proxy that | after receiving a frame bearing the END_STREAM flag. A proxy that | |||
receives a DATA frame with the END_STREAM flag set sends the attached | receives a DATA frame with the END_STREAM flag set sends the attached | |||
data with the FIN bit set on the last TCP segment. A proxy that | data with the FIN bit set on the last TCP segment. A proxy that | |||
receives a TCP segment with the FIN bit set sends a DATA frame with | receives a TCP segment with the FIN bit set sends a DATA frame with | |||
the END_STREAM flag set. Note that the final TCP segment or DATA | the END_STREAM flag set. Note that the final TCP segment or DATA | |||
skipping to change at page 62, line 22 ¶ | skipping to change at page 64, line 40 ¶ | |||
9. Additional HTTP Requirements/Considerations | 9. Additional HTTP Requirements/Considerations | |||
This section outlines attributes of the HTTP protocol that improve | This section outlines attributes of the HTTP protocol that improve | |||
interoperability, reduce exposure to known security vulnerabilities, | interoperability, reduce exposure to known security vulnerabilities, | |||
or reduce the potential for implementation variation. | or reduce the potential for implementation variation. | |||
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 that clients will not close connections until it is | |||
that no further communication with a server is necessary (for | determined that no further communication with a server is necessary | |||
example, when a user navigates away from a particular web page), or | (for example, when a user navigates away from a particular web page) | |||
until the server closes the connection. | or 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 | |||
host and port pair, where host is derived from a URI, a selected | host and port pair, where the host is derived from a URI, a selected | |||
alternative service [ALT-SVC], or a configured proxy. | alternative service [ALT-SVC], or a configured proxy. | |||
A client can create additional connections as replacements, either to | A client can create additional connections as replacements, either to | |||
replace connections that are near to exhausting the available stream | replace connections that are near to exhausting the available stream | |||
identifier space (Section 5.1.1), to refresh the keying material for | identifier space (Section 5.1.1), to refresh the keying material for | |||
a TLS connection, or to replace connections that have encountered | a TLS connection, or to replace connections that have encountered | |||
errors (Section 5.4.1). | errors (Section 5.4.1). | |||
A client MAY open multiple connections to the same IP address and TCP | A client MAY open multiple connections to the same IP address and TCP | |||
port using different Server Name Indication [TLS-EXT] values or to | port using different Server Name Indication [TLS-EXT] values or to | |||
provide different TLS client certificates, but SHOULD avoid creating | provide different TLS client certificates but SHOULD avoid creating | |||
multiple connections with the same configuration. | multiple connections with the same configuration. | |||
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-layer | |||
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.1.1. Connection Reuse | 9.1.1. Connection Reuse | |||
Clients MAY use a single server connection to send requests for URIs | Connections that are made to an origin server, either directly or | |||
with multiple different authority components as long as the server is | through a tunnel created using the CONNECT method (Section 8.3), MAY | |||
authoritative (Section 10.1). For "http" resources, this depends on | be reused for requests with multiple different URI authority | |||
the host having resolved to the same IP address. | components. A connection can be reused as long as the origin server | |||
is authoritative (Section 10.1). For TCP connections without TLS, | ||||
this depends on the host having resolved to the same IP address. | ||||
For "https" resources, connection reuse additionally depends on | For "https" resources, connection reuse additionally depends on | |||
having a certificate that is valid for the host in the URI. That is | having a certificate that is valid for the host in the URI. The | |||
the use of server certificate with multiple "subjectAltName" | certificate presented by the server MUST satisfy any checks that the | |||
attributes, or names with wildcards. For example, a certificate with | client would perform when forming a new TLS connection for the host | |||
in the URI. | ||||
An origin server might offer a certificate with multiple | ||||
"subjectAltName" attributes or names with wildcards, one of which is | ||||
valid for the authority in the URI. For example, a certificate with | ||||
a "subjectAltName" of "*.example.com" might permit the use of the | a "subjectAltName" of "*.example.com" might permit the use of the | |||
same connection for "a.example.com" and "b.example.com". | same connection for requests to URIs starting with | |||
"https://a.example.com/" and "https://b.example.com/". | ||||
In some deployments, reusing a connection for multiple origins can | In some deployments, reusing a connection for multiple origins can | |||
result in requests being directed to the wrong origin server. For | result in requests being directed to the wrong origin server. For | |||
example, TLS termination might be performed by a middlebox that uses | example, TLS termination might be performed by a middlebox that uses | |||
the TLS Server Name Indication (SNI) [TLS-EXT] extension to select | the TLS Server Name Indication (SNI) [TLS-EXT] extension to select an | |||
the an origin server. This means that it is possible for clients to | origin server. This means that it is possible for clients to send | |||
send confidential information to servers that might not be the | confidential information to servers that might not be the intended | |||
intended target for the request, even though the server has valid | target for the request, even though the server is otherwise | |||
authentication credentials. | authoritative. | |||
A server that does not wish clients to reuse connections can indicate | A server that does not wish clients to reuse connections can indicate | |||
that it is not authoritative for a request by sending a 421 (Not | that it is not authoritative for a request by sending a 421 | |||
Authoritative) status code in response to the request (see | (Misdirected Request) status code in response to the request (see | |||
Section 9.1.2). | Section 9.1.2). | |||
9.1.2. The 421 (Not Authoritative) Status Code | A client that is configured to use a proxy over HTTP/2 directs | |||
requests to that proxy through a single connection. That is, all | ||||
requests sent via a proxy reuse the connection to the proxy. | ||||
The 421 (Not Authoritative) status code indicates that the current | 9.1.2. The 421 (Misdirected Request) Status Code | |||
origin server is not authoritative for the requested resource, in the | ||||
sense of [RFC7230], Section 9.1 (see also Section 10.1). | ||||
Clients receiving a 421 (Not Authoritative) response from a server | The 421 (Misdirected Request) status code indicates that the request | |||
MAY retry the request - whether the request method is idempotent or | was directed at a server that is not able to produce a response. | |||
not - over a different connection. This is possible if a connection | This can be sent by a server that is not configured to produce | |||
responses for the combination of scheme and authority that are | ||||
included in the request URI. | ||||
Clients receiving a 421 (Misdirected Request) response from a server | ||||
MAY retry the request -- whether the request method is idempotent or | ||||
not -- over a different connection. This is possible if a connection | ||||
is reused (Section 9.1.1) or if an alternative service is selected | is reused (Section 9.1.1) or if an alternative service is selected | |||
([ALT-SVC]). | [ALT-SVC]. | |||
This status code MUST NOT be generated by proxies. | This status code MUST NOT be generated by proxies. | |||
A 421 response is cacheable by default; i.e., unless otherwise | A 421 response is cacheable by default, i.e., unless otherwise | |||
indicated by the method definition or explicit cache controls (see | indicated by the method definition or explicit cache controls (see | |||
Section 4.2.2 of [RFC7234]). | Section 4.2.2 of [RFC7234]). | |||
9.2. Use of TLS Features | 9.2. Use of TLS Features | |||
Implementations of HTTP/2 MUST support TLS 1.2 [TLS12] for HTTP/2 | Implementations of HTTP/2 MUST use TLS version 1.2 [TLS12] or higher | |||
over TLS. The general TLS usage guidance in [TLSBCP] SHOULD be | for HTTP/2 over TLS. The general TLS usage guidance in [TLSBCP] | |||
followed, with some additional restrictions that are specific to | SHOULD be followed, with some additional restrictions that are | |||
HTTP/2. | specific to HTTP/2. | |||
An implementation of HTTP/2 over TLS MUST use TLS 1.2 or higher with | ||||
the restrictions on feature set and cipher suite described in this | ||||
section. Due to implementation limitations, it might not be possible | ||||
to fail TLS negotiation. An endpoint MUST immediately terminate an | ||||
HTTP/2 connection that does not meet these minimum requirements with | ||||
a connection error (Section 5.4.1) of type INADEQUATE_SECURITY. | ||||
9.2.1. TLS Features | ||||
The TLS implementation MUST support the Server Name Indication (SNI) | The TLS implementation MUST support the Server Name Indication (SNI) | |||
[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 | Deployments of HTTP/2 that negotiate TLS 1.3 or higher need only | |||
lead to the exposure of information that would not otherwise be | support and use the SNI extension; deployments of TLS 1.2 are subject | |||
revealed [RFC3749]. Generic compression is unnecessary since HTTP/2 | to the requirements in the following sections. Implementations are | |||
provides compression features that are more aware of context and | encouraged to provide defaults that comply, but it is recognized that | |||
therefore likely to be more appropriate for use for performance, | deployments are ultimately responsible for compliance. | |||
security or other reasons. | ||||
The TLS implementation MUST disable renegotiation. An endpoint MUST | 9.2.1. TLS 1.2 Features | |||
treat a TLS renegotiation as a connection error (Section 5.4.1) of | ||||
type PROTOCOL_ERROR. Note that disabling renegotiation can result in | ||||
long-lived connections becoming unusable due to limits on the number | ||||
of messages the underlying cipher suite can encipher. | ||||
A client MAY use renegotiation to provide confidentiality protection | This section describes restrictions on the TLS 1.2 feature set that | |||
for client credentials offered in the handshake, but any | can be used with HTTP/2. Due to deployment limitations, it might not | |||
be possible to fail TLS negotiation when these restrictions are not | ||||
met. An endpoint MAY immediately terminate an HTTP/2 connection that | ||||
does not meet these TLS requirements with a connection error | ||||
(Section 5.4.1) of type INADEQUATE_SECURITY. | ||||
A deployment of HTTP/2 over TLS 1.2 MUST disable compression. TLS | ||||
compression can lead to the exposure of information that would not | ||||
otherwise be revealed [RFC3749]. Generic compression is unnecessary | ||||
since HTTP/2 provides compression features that are more aware of | ||||
context and therefore likely to be more appropriate for use for | ||||
performance, security, or other reasons. | ||||
A deployment of HTTP/2 over TLS 1.2 MUST disable renegotiation. An | ||||
endpoint MUST treat a TLS renegotiation as a connection error | ||||
(Section 5.4.1) of type PROTOCOL_ERROR. Note that disabling | ||||
renegotiation can result in long-lived connections becoming unusable | ||||
due to limits on the number of messages the underlying cipher suite | ||||
can encipher. | ||||
An endpoint MAY use renegotiation to provide confidentiality | ||||
protection for client credentials offered in the handshake, but any | ||||
renegotiation MUST occur prior to sending the connection preface. A | renegotiation MUST occur prior to sending the connection preface. A | |||
server SHOULD request a client certificate if it sees a renegotiation | server SHOULD request a client certificate if it sees a renegotiation | |||
request immediately after establishing a connection. | request immediately after establishing a connection. | |||
This effectively prevents the use of renegotiation in response to a | This effectively prevents the use of renegotiation in response to a | |||
request for a specific protected resource. A future specification | request for a specific protected resource. A future specification | |||
might provide a way to support this use case. | might provide a way to support this use case. Alternatively, a | |||
server might use an error (Section 5.4) of type HTTP_1_1_REQUIRED to | ||||
request the client use a protocol that supports renegotiation. | ||||
9.2.2. TLS Cipher Suites | Implementations MUST support ephemeral key exchange sizes of at least | |||
2048 bits for cipher suites that use ephemeral finite field Diffie- | ||||
Hellman (DHE) [TLS12] and 224 bits for cipher suites that use | ||||
ephemeral elliptic curve Diffie-Hellman (ECDHE) [RFC4492]. Clients | ||||
MUST accept DHE sizes of up to 4096 bits. Endpoints MAY treat | ||||
negotiation of key sizes smaller than the lower limits as a | ||||
connection error (Section 5.4.1) of type INADEQUATE_SECURITY. | ||||
The set of TLS cipher suites that are permitted in HTTP/2 is | 9.2.2. TLS 1.2 Cipher Suites | |||
restricted. HTTP/2 MUST only be used with cipher suites that have | ||||
ephemeral key exchange, such as the ephemeral Diffie-Hellman (DHE) | ||||
[TLS12] or the elliptic curve variant (ECDHE) [RFC4492]. Ephemeral | A deployment of HTTP/2 over TLS 1.2 SHOULD NOT use any of the cipher | |||
key exchange MUST have a minimum size of 2048 bits for DHE or | suites that are listed in the cipher suite black list (Appendix A). | |||
security level of 128 bits for ECDHE. Clients MUST accept DHE sizes | ||||
of up to 4096 bits. HTTP MUST NOT be used with cipher suites that | ||||
use stream or block ciphers. Authenticated Encryption with | ||||
Additional Data (AEAD) modes, such as the Galois Counter Model (GCM) | ||||
mode for AES [RFC5288] are acceptable. | ||||
The effect of these restrictions is that TLS 1.2 implementations | Endpoints MAY choose to generate a connection error (Section 5.4.1) | |||
could have non-intersecting sets of available cipher suites, since | of type INADEQUATE_SECURITY if one of the cipher suites from the | |||
these prevent the use of the cipher suite that TLS 1.2 makes | black list is negotiated. A deployment that chooses to use a black- | |||
mandatory. To avoid this problem, implementations of HTTP/2 that use | listed cipher suite risks triggering a connection error unless the | |||
TLS 1.2 MUST support TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 | set of potential peers is known to accept that cipher suite. | |||
[TLS-ECDHE] with P256 [FIPS186]. | ||||
Clients MAY advertise support of cipher suites that are prohibited by | Implementations MUST NOT generate this error in reaction to the | |||
the above restrictions in order to allow for connection to servers | negotiation of a cipher suite that is not on the black list. | |||
that do not support HTTP/2. This enables a fallback to protocols | Consequently, when clients offer a cipher suite that is not on the | |||
without these constraints without the additional latency imposed by | black list, they have to be prepared to use that cipher suite with | |||
using a separate connection for fallback. | HTTP/2. | |||
The black list includes the cipher suite that TLS 1.2 makes | ||||
mandatory, which means that TLS 1.2 deployments could have non- | ||||
intersecting sets of permitted cipher suites. To avoid this problem | ||||
causing TLS handshake failures, deployments of HTTP/2 that use TLS | ||||
1.2 MUST support TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 [TLS-ECDHE] | ||||
with the P-256 elliptic curve [FIPS186]. | ||||
Note that clients might advertise support of cipher suites that are | ||||
on the black list in order to allow for connection to servers that do | ||||
not support HTTP/2. This allows servers to select HTTP/1.1 with a | ||||
cipher suite that is on the HTTP/2 black list. However, this can | ||||
result in HTTP/2 being negotiated with a black-listed cipher suite if | ||||
the application protocol and cipher suite are independently selected. | ||||
10. Security Considerations | 10. Security Considerations | |||
10.1. Server Authority | 10.1. Server Authority | |||
A client is only able to accept HTTP/2 responses from servers that | ||||
are authoritative for those resources. This is particularly | ||||
important for server push (Section 8.2), where the client validates | ||||
the PUSH_PROMISE before accepting the response. | ||||
HTTP/2 relies on the HTTP/1.1 definition of authority for determining | HTTP/2 relies on the HTTP/1.1 definition of authority for determining | |||
whether a server is authoritative in providing a given response, see | whether a server is authoritative in providing a given response (see | |||
[RFC7230], Section 9.1. This relies on local name resolution for the | [RFC7230], Section 9.1). This relies on local name resolution for | |||
"http" URI scheme, and the authenticated server identity for the | the "http" URI scheme and the authenticated server identity for the | |||
"https" scheme (see [RFC2818], Section 3). | "https" scheme (see [RFC2818], Section 3). | |||
A client MUST discard responses provided by a server that is not | ||||
authoritative for those resources. | ||||
10.2. Cross-Protocol Attacks | 10.2. Cross-Protocol Attacks | |||
In a cross-protocol attack, an attacker causes a client to initiate a | In a cross-protocol attack, an attacker causes a client to initiate a | |||
transaction in one protocol toward a server that understands a | transaction in one protocol toward a server that understands a | |||
different protocol. An attacker might be able to cause the | different protocol. An attacker might be able to cause the | |||
transaction to appear as valid transaction in the second protocol. | transaction to appear as a valid transaction in the second protocol. | |||
In combination with the capabilities of the web context, this can be | In combination with the capabilities of the web context, this can be | |||
used to interact with poorly protected servers in private networks. | used to interact with poorly protected servers in private networks. | |||
Completing a TLS handshake with an ALPN identifier for HTTP/2 can be | Completing a TLS handshake with an ALPN identifier for HTTP/2 can be | |||
considered sufficient protection against cross protocol attacks. | considered sufficient protection against cross-protocol attacks. | |||
ALPN provides a positive indication that a server is willing to | ALPN provides a positive indication that a server is willing to | |||
proceed with HTTP/2, which prevents attacks on other TLS-based | proceed with HTTP/2, which prevents attacks on other TLS-based | |||
protocols. | protocols. | |||
The encryption in TLS makes it difficult for attackers to control the | 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 | data that could be used in a cross-protocol attack on a cleartext | |||
protocol. | protocol. | |||
The cleartext version of HTTP/2 has minimal protection against cross- | The cleartext version of HTTP/2 has minimal protection against cross- | |||
protocol attacks. The connection preface (Section 3.5) contains a | protocol attacks. The connection preface (Section 3.5) contains a | |||
string that is designed to confuse HTTP/1.1 servers, but no special | string that is designed to confuse HTTP/1.1 servers, but no special | |||
protection is offered for other protocols. A server that is willing | protection is offered for other protocols. A server that is willing | |||
to ignore parts of an HTTP/1.1 request containing an Upgrade header | to ignore parts of an HTTP/1.1 request containing an Upgrade header | |||
field in addition to the client connection preface could be exposed | field in addition to the client connection preface could be exposed | |||
to a cross-protocol attack. | 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 | The HTTP/2 header field encoding allows the expression of names that | |||
octets with a length prefix. This enables HTTP/2 to carry any string | are not valid field names in the Internet Message Syntax used by | |||
of octets as the name or value of a header field. An intermediary | HTTP/1.1. Requests or responses containing invalid header field | |||
that translates HTTP/2 requests or responses into HTTP/1.1 directly | names MUST be treated as malformed (Section 8.1.2.6). An | |||
could permit the creation of corrupted HTTP/1.1 messages. An | intermediary therefore cannot translate an HTTP/2 request or response | |||
attacker might exploit this behavior to cause the intermediary to | containing an invalid field name into an HTTP/1.1 message. | |||
create HTTP/1.1 messages with illegal header fields, extra header | ||||
fields, or even new messages that are entirely falsified. | ||||
Header field names or values that contain characters not permitted by | ||||
HTTP/1.1, including carriage return (ASCII 0xd) or line feed (ASCII | ||||
0xa) MUST NOT be translated verbatim by an intermediary, as | ||||
stipulated in [RFC7230], Section 3.2.4. | ||||
Translation from HTTP/1.x to HTTP/2 does not produce the same | Similarly, HTTP/2 allows header field values that are not valid. | |||
opportunity to an attacker. Intermediaries that perform translation | While most of the values that can be encoded will not alter header | |||
to HTTP/2 MUST remove any instances of the "obs-fold" production from | field parsing, carriage return (CR, ASCII 0xd), line feed (LF, ASCII | |||
header field values. | 0xa), and the zero character (NUL, ASCII 0x0) might be exploited by | |||
an attacker if they are translated verbatim. Any request or response | ||||
that contains a character not permitted in a header field value MUST | ||||
be treated as malformed (Section 8.1.2.6). Valid characters are | ||||
defined by the "field-content" ABNF rule in Section 3.2 of [RFC7230]. | ||||
10.4. Cacheability of Pushed Responses | 10.4. Cacheability of Pushed Responses | |||
Pushed responses do not have an explicit request from the client; the | Pushed responses do not have an explicit request from the client; the | |||
request is provided by the server in the PUSH_PROMISE frame. | request is provided by the server in the PUSH_PROMISE frame. | |||
Caching responses 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 responses for which an origin server is not authoritative (see | Pushed responses for which an origin server is not authoritative (see | |||
Section 10.1) are never cached or used. | Section 10.1) MUST NOT be used or cached. | |||
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 an 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. | |||
The number of PUSH_PROMISE frames is not constrained in the same | The number of PUSH_PROMISE frames is not constrained in the same | |||
fashion. A client that accepts server push SHOULD limit the number | fashion. A client that accepts server push SHOULD limit the number | |||
of streams it allows to be in the "reserved (remote)" state. | of streams it allows to be in the "reserved (remote)" state. An | |||
Excessive number of server push streams can be treated as a stream | excessive number of server push streams can be treated as a stream | |||
error (Section 5.4.2) of type ENHANCE_YOUR_CALM. | error (Section 5.4.2) of type ENHANCE_YOUR_CALM. | |||
Processing capacity cannot be guarded as effectively as state | Processing capacity cannot be guarded as effectively as state | |||
capacity. | capacity. | |||
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 SETTINGS | processing time. This might be done by pointlessly changing SETTINGS | |||
parameters, setting multiple undefined parameters, or changing the | parameters, setting multiple undefined parameters, or changing the | |||
same setting multiple times in the same frame. WINDOW_UPDATE or | same setting multiple times in the same frame. WINDOW_UPDATE 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. | |||
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 | |||
are entirely legitimate, such as the sending of an empty DATA frame | uses are entirely legitimate, such as the sending of an empty DATA or | |||
to end a stream. | CONTINUATION frame at the end of a stream. | |||
Header compression also offers some opportunities to waste processing | Header compression also offers some opportunities to waste processing | |||
resources; see Section 8 of [COMPRESSION] for more details on | resources; see Section 7 of [COMPRESSION] for more details on | |||
potential abuses. | potential abuses. | |||
Limits in SETTINGS parameters cannot be reduced instantaneously, | Limits in SETTINGS parameters cannot be reduced instantaneously, | |||
which leaves an endpoint exposed to behavior from a peer that could | which leaves an endpoint exposed to behavior from a peer that could | |||
exceed the new limits. In particular, immediately after establishing | exceed the new limits. In particular, immediately after establishing | |||
a connection, limits set by a server are not known to clients and | a connection, limits set by a server are not known to clients and | |||
could be exceeded without being an obvious protocol violation. | could be exceeded without being an obvious protocol violation. | |||
All these features - i.e., SETTINGS changes, small frames, header | All these features -- i.e., SETTINGS changes, small frames, header | |||
compression - have legitimate uses. These features become a burden | compression -- have legitimate uses. These features become a burden | |||
only when they 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.5.1. Limits on Header Block Size | 10.5.1. Limits on Header Block Size | |||
A large header block (Section 4.3) can cause an implementation to | A large header block (Section 4.3) can cause an implementation to | |||
commit a large amount of state. In servers and intermediaries, | commit a large amount of state. Header fields that are critical for | |||
header fields that are critical to routing, such as ":authority", | routing can appear toward the end of a header block, which prevents | |||
":path", and ":scheme" are not guaranteed to be present early in the | streaming of header fields to their ultimate destination. This | |||
header block. In particular, values that are in the reference set | ordering and other reasons, such as ensuring cache correctness, mean | |||
cannot be emitted until the header block ends. | that an endpoint might need to buffer the entire header block. Since | |||
there is no hard limit to the size of a header block, some endpoints | ||||
This can prevent streaming of the header fields to their ultimate | could be forced to commit a large amount of available memory for | |||
destination, and forces the endpoint to buffer the entire header | header fields. | |||
block. Since there is no hard limit to the size of a header block, | ||||
an endpoint could be forced to exhaust available memory. | ||||
An endpoint can use the SETTINGS_MAX_HEADER_LIST_SIZE to avise peers | An endpoint can use the SETTINGS_MAX_HEADER_LIST_SIZE to advise peers | |||
of limits that might apply on the size of header blocks. This | of limits that might apply on the size of header blocks. This | |||
setting is only advisory, so endpoints MAY choose to send header | setting is only advisory, so endpoints MAY choose to send header | |||
blocks that exceed this limit and risk having the request or response | blocks that exceed this limit and risk having the request or response | |||
being treated as malformed. This setting is advertised hop-by-hop, | being treated as malformed. This setting is specific to a | |||
so any request or response could encounter a hop with a lower, | connection, so any request or response could encounter a hop with a | |||
unknown limit. An intermediary can attempt to avoid this problem by | lower, unknown limit. An intermediary can attempt to avoid this | |||
passing on values presented by different peers, but they are not | problem by passing on values presented by different peers, but they | |||
obligated to do so. | are not obligated to do so. | |||
A server that receives a larger header block than it is willing to | A server that receives a larger header block than it is willing to | |||
handle can send an HTTP 431 (Request Header Fields Too Large) status | handle can send an HTTP 431 (Request Header Fields Too Large) status | |||
code [RFC6585]. A client can discard responses that it cannot | code [RFC6585]. A client can discard responses that it cannot | |||
process. The header block MUST be processed to ensure a consistent | process. The header block MUST be processed to ensure a consistent | |||
connection state, unless the connection is closed. | connection state, unless the connection is closed. | |||
10.5.2. CONNECT Issues | ||||
The CONNECT method can be used to create disproportionate load on an | ||||
proxy, since stream creation is relatively inexpensive when compared | ||||
to the creation and maintenance of a TCP connection. A proxy might | ||||
also maintain some resources for a TCP connection beyond the closing | ||||
of the stream that carries the CONNECT request, since the outgoing | ||||
TCP connection remains in the TIME_WAIT state. Therefore, a proxy | ||||
cannot rely on SETTINGS_MAX_CONCURRENT_STREAMS alone to limit the | ||||
resources consumed by CONNECT requests. | ||||
10.6. Use of Compression | 10.6. Use of Compression | |||
HTTP/2 enables greater use of compression for both header fields | Compression can allow an attacker to recover secret data when it is | |||
(Section 4.3) and entity bodies. Compression can allow an attacker | compressed in the same context as data under attacker control. | |||
to recover secret data when it is compressed in the same context as | HTTP/2 enables compression of header fields (Section 4.3); the | |||
data under attacker control. | following concerns also apply to the use of HTTP compressed content- | |||
codings ([RFC7231], Section 3.1.2.1). | ||||
There are demonstrable attacks on compression that exploit the | There are demonstrable attacks on compression that exploit the | |||
characteristics of the web (e.g., [BREACH]). The attacker induces | characteristics of the web (e.g., [BREACH]). The attacker induces | |||
multiple requests containing varying plaintext, observing the length | multiple requests containing varying plaintext, observing the length | |||
of the resulting ciphertext in each, which reveals a shorter length | of the resulting ciphertext in each, which reveals a shorter length | |||
when a guess about the secret is correct. | when a guess about the secret is correct. | |||
Implementations communicating on a secure channel MUST NOT compress | Implementations communicating on a secure channel MUST NOT compress | |||
content that includes both confidential and attacker-controlled data | content that includes both confidential and attacker-controlled data | |||
unless separate compression dictionaries are used for each source of | unless separate compression dictionaries are used for each source of | |||
data. Compression MUST NOT be used if the source of data cannot be | data. Compression MUST NOT be used if the source of data cannot be | |||
reliably determined. | reliably determined. Generic stream compression, such as that | |||
provided by TLS, MUST NOT be used with HTTP/2 (see Section 9.2). | ||||
Further considerations regarding the compression of header fields are | Further considerations regarding the compression of header fields are | |||
described in [COMPRESSION]. | described in [COMPRESSION]. | |||
10.7. Use of Padding | 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 or limiting | To mitigate attacks that rely on compression, disabling or limiting | |||
compression might be preferable to padding as a countermeasure. | compression might be preferable to padding as a countermeasure. | |||
Padding can be used to obscure the exact size of frame content, and | Padding can be used to obscure the exact size of frame content and is | |||
is provided to mitigate specific attacks within HTTP. For example, | provided to mitigate specific attacks within HTTP, for example, | |||
attacks where compressed content includes both attacker-controlled | attacks where compressed content includes both attacker-controlled | |||
plaintext and secret data (see for example, [BREACH]). | plaintext and secret data (e.g., [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; similarly, padding payloads to a fixed size exposes | protection; similarly, padding payloads to a fixed size exposes | |||
information as payload sizes cross the fixed size boundary, which | information as payload sizes cross the fixed-sized boundary, which | |||
could be possible if an attacker can control plaintext. | could be possible if an attacker can control plaintext. | |||
Intermediaries SHOULD retain padding for DATA frames, but MAY drop | Intermediaries SHOULD retain padding for DATA frames but MAY drop | |||
padding for HEADERS and PUSH_PROMISE frames. A valid reason for an | padding for HEADERS and PUSH_PROMISE frames. A valid reason for an | |||
intermediary to change the amount of padding of frames is to improve | intermediary to change the amount of padding of frames is to improve | |||
the protections that padding provides. | the protections that padding provides. | |||
10.8. Privacy Considerations | 10.8. Privacy Considerations | |||
Several characteristics of HTTP/2 provide an observer an opportunity | Several characteristics of HTTP/2 provide an observer an opportunity | |||
to correlate actions of a single client or server over time. This | to correlate actions of a single client or server over time. These | |||
includes the value of settings, the manner in which flow control | include the value of settings, the manner in which flow-control | |||
windows are managed, the way priorities are allocated to streams, | windows are managed, the way priorities are allocated to streams, the | |||
timing of reactions to stimulus, and handling of any optional | timing of reactions to stimulus, and the handling of any features | |||
features. | that are controlled by settings. | |||
As far as this creates observable differences in behavior, they could | As far as these create observable differences in behavior, they could | |||
be used as a basis for fingerprinting a specific client, as defined | be used as a basis for fingerprinting a specific client, as defined | |||
in Section 1.8 of [HTML5]. | in Section 1.8 of [HTML5]. | |||
HTTP/2's preference for using a single TCP connection allows | ||||
correlation of a user's activity on a site. Reusing connections for | ||||
different origins allows tracking across those origins. | ||||
Because the PING and SETTINGS frames solicit immediate responses, | ||||
they can be used by an endpoint to measure latency to their peer. | ||||
This might have privacy implications in certain scenarios. | ||||
11. IANA Considerations | 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 [TLS-ALPN]. | in [TLS-ALPN]. | |||
This document establishes a registry for frame types, settings, and | This document establishes a registry for frame types, settings, and | |||
error codes. These new registries are entered into a new "Hypertext | error codes. These new registries appear in the new "Hypertext | |||
Transfer Protocol (HTTP) 2 Parameters" section. | Transfer Protocol version 2 (HTTP/2) 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; and the 421 (Not Authoritative) status code. | HTTP; it also registers the 421 (Misdirected Request) status code. | |||
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 preface (Section 3.5). | collisions with the connection preface (Section 3.5). | |||
11.1. Registration of HTTP/2 Identification Strings | 11.1. Registration of HTTP/2 Identification Strings | |||
This document creates two registrations for the identification of | This document creates two registrations for the identification of | |||
HTTP/2 in the "Application Layer Protocol Negotiation (ALPN) Protocol | HTTP/2 (see Section 3.3) in the "Application-Layer Protocol | |||
IDs" registry established in [TLS-ALPN]. | Negotiation (ALPN) Protocol IDs" registry established in [TLS-ALPN]. | |||
The "h2" string identifies HTTP/2 when used over TLS: | The "h2" string identifies HTTP/2 when used over TLS: | |||
Protocol: HTTP/2 over TLS | Protocol: HTTP/2 over TLS | |||
Identification Sequence: 0x68 0x32 ("h2") | Identification Sequence: 0x68 0x32 ("h2") | |||
Specification: This document | Specification: This document | |||
The "h2c" string identifies HTTP/2 when used over cleartext TCP: | The "h2c" string identifies HTTP/2 when used over cleartext TCP: | |||
Protocol: HTTP/2 over TCP | Protocol: HTTP/2 over TCP | |||
Identification Sequence: 0x68 0x32 0x63 ("h2c") | Identification Sequence: 0x68 0x32 0x63 ("h2c") | |||
Specification: This document | Specification: This document | |||
11.2. Frame Type Registry | 11.2. Frame Type Registry | |||
This document establishes a registry for HTTP/2 frame types codes. | This document establishes a registry for HTTP/2 frame type codes. | |||
The "HTTP/2 Frame Type" registry manages an 8-bit space. The "HTTP/2 | The "HTTP/2 Frame Type" registry manages an 8-bit space. The "HTTP/2 | |||
Frame Type" registry operates under either of the "IETF Review" or | Frame Type" registry operates under either of the "IETF Review" or | |||
"IESG Approval" policies [RFC5226] for values between 0x00 and 0xef, | "IESG Approval" policies [RFC5226] for values between 0x00 and 0xef, | |||
with values between 0xf0 and 0xff being reserved for experimental | with values between 0xf0 and 0xff being reserved for Experimental | |||
use. | Use. | |||
New entries in this registry require the following information: | New entries in this registry require the following information: | |||
Frame Type: A name or label for the frame type. | Frame Type: A name or label for the frame type. | |||
Code: The 8-bit code assigned to the frame type. | Code: The 8-bit code assigned to the frame type. | |||
Specification: A reference to a specification that includes a | Specification: A reference to a specification that includes a | |||
description of the frame layout, it's semantics and flags that the | description of the frame layout, its semantics, and flags that the | |||
frame type uses, including any parts of the frame that are | frame type uses, including any parts of the frame that are | |||
conditionally present based on the value of flags. | conditionally present based on the value of flags. | |||
The entries in the following table are registered by this document. | The entries in the following table are registered by this document. | |||
+---------------+------+--------------+ | +---------------+------+--------------+ | |||
| Frame Type | Code | Section | | | Frame Type | Code | Section | | |||
+---------------+------+--------------+ | +---------------+------+--------------+ | |||
| DATA | 0x0 | Section 6.1 | | | DATA | 0x0 | Section 6.1 | | |||
| HEADERS | 0x1 | Section 6.2 | | | HEADERS | 0x1 | Section 6.2 | | |||
skipping to change at page 72, line 4 ¶ | skipping to change at page 75, line 25 ¶ | |||
| GOAWAY | 0x7 | Section 6.8 | | | GOAWAY | 0x7 | Section 6.8 | | |||
| WINDOW_UPDATE | 0x8 | Section 6.9 | | | WINDOW_UPDATE | 0x8 | Section 6.9 | | |||
| CONTINUATION | 0x9 | Section 6.10 | | | CONTINUATION | 0x9 | Section 6.10 | | |||
+---------------+------+--------------+ | +---------------+------+--------------+ | |||
11.3. Settings Registry | 11.3. Settings Registry | |||
This document establishes a registry for HTTP/2 settings. The | This document establishes a registry for HTTP/2 settings. The | |||
"HTTP/2 Settings" registry manages a 16-bit space. The "HTTP/2 | "HTTP/2 Settings" registry manages a 16-bit space. The "HTTP/2 | |||
Settings" registry operates under the "Expert Review" policy | Settings" registry operates under the "Expert Review" policy | |||
[RFC5226] for values in the range from 0x0000 to 0xefff, with values | [RFC5226] for values in the range from 0x0000 to 0xefff, with values | |||
between and 0xf000 and 0xffff being reserved for experimental use. | between and 0xf000 and 0xffff being reserved for Experimental Use. | |||
New registrations are advised to provide the following information: | New registrations are advised to provide the following information: | |||
Name: A symbolic name for the setting. Specifying a setting name is | Name: A symbolic name for the setting. Specifying a setting name is | |||
optional. | optional. | |||
Code: The 16-bit code assigned to the setting. | Code: The 16-bit code assigned to the setting. | |||
Initial Value: An initial value for the setting. | Initial Value: An initial value for the setting. | |||
Specification: A stable reference to a specification that describes | Specification: An optional reference to a specification that | |||
the use of the setting. | describes the use of the setting. | |||
An initial set of setting registrations can be found in | The entries in the following table are registered by this document. | |||
Section 6.5.2. | ||||
+------------------------+------+---------------+---------------+ | +------------------------+------+---------------+---------------+ | |||
| Name | Code | Initial Value | Specification | | | Name | Code | Initial Value | Specification | | |||
+------------------------+------+---------------+---------------+ | +------------------------+------+---------------+---------------+ | |||
| HEADER_TABLE_SIZE | 0x1 | 4096 | Section 6.5.2 | | | HEADER_TABLE_SIZE | 0x1 | 4096 | Section 6.5.2 | | |||
| ENABLE_PUSH | 0x2 | 1 | Section 6.5.2 | | | ENABLE_PUSH | 0x2 | 1 | Section 6.5.2 | | |||
| MAX_CONCURRENT_STREAMS | 0x3 | (infinite) | Section 6.5.2 | | | MAX_CONCURRENT_STREAMS | 0x3 | (infinite) | Section 6.5.2 | | |||
| INITIAL_WINDOW_SIZE | 0x4 | 65535 | Section 6.5.2 | | | INITIAL_WINDOW_SIZE | 0x4 | 65535 | Section 6.5.2 | | |||
| MAX_FRAME_SIZE | 0x5 | 65536 | Section 6.5.2 | | | MAX_FRAME_SIZE | 0x5 | 16384 | Section 6.5.2 | | |||
| MAX_HEADER_LIST_SIZE | 0x6 | (infinite) | Section 6.5.2 | | | MAX_HEADER_LIST_SIZE | 0x6 | (infinite) | Section 6.5.2 | | |||
+------------------------+------+---------------+---------------+ | +------------------------+------+---------------+---------------+ | |||
11.4. Error Code Registry | 11.4. 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]. | |||
skipping to change at page 73, line 22 ¶ | skipping to change at page 76, line 39 ¶ | |||
The entries in the following table are registered by this document. | The entries in the following table are registered by this document. | |||
+---------------------+------+----------------------+---------------+ | +---------------------+------+----------------------+---------------+ | |||
| Name | Code | Description | Specification | | | Name | Code | Description | Specification | | |||
+---------------------+------+----------------------+---------------+ | +---------------------+------+----------------------+---------------+ | |||
| NO_ERROR | 0x0 | Graceful shutdown | Section 7 | | | NO_ERROR | 0x0 | Graceful shutdown | Section 7 | | |||
| PROTOCOL_ERROR | 0x1 | Protocol error | Section 7 | | | PROTOCOL_ERROR | 0x1 | Protocol error | Section 7 | | |||
| | | detected | | | | | | detected | | | |||
| INTERNAL_ERROR | 0x2 | Implementation fault | Section 7 | | | INTERNAL_ERROR | 0x2 | Implementation fault | Section 7 | | |||
| FLOW_CONTROL_ERROR | 0x3 | Flow control limits | Section 7 | | | FLOW_CONTROL_ERROR | 0x3 | Flow-control limits | Section 7 | | |||
| | | exceeded | | | | | | exceeded | | | |||
| SETTINGS_TIMEOUT | 0x4 | Settings not | Section 7 | | | SETTINGS_TIMEOUT | 0x4 | Settings not | Section 7 | | |||
| | | acknowledged | | | | | | acknowledged | | | |||
| STREAM_CLOSED | 0x5 | Frame received for | Section 7 | | | STREAM_CLOSED | 0x5 | Frame received for | Section 7 | | |||
| | | closed stream | | | | | | closed stream | | | |||
| FRAME_SIZE_ERROR | 0x6 | Frame size incorrect | Section 7 | | | FRAME_SIZE_ERROR | 0x6 | Frame size incorrect | Section 7 | | |||
| REFUSED_STREAM | 0x7 | Stream not processed | Section 7 | | | REFUSED_STREAM | 0x7 | Stream not processed | Section 7 | | |||
| CANCEL | 0x8 | Stream cancelled | Section 7 | | | CANCEL | 0x8 | Stream cancelled | Section 7 | | |||
| COMPRESSION_ERROR | 0x9 | Compression state | Section 7 | | | COMPRESSION_ERROR | 0x9 | Compression state | Section 7 | | |||
| | | not updated | | | | | | not updated | | | |||
| CONNECT_ERROR | 0xa | TCP connection error | Section 7 | | | CONNECT_ERROR | 0xa | TCP connection error | Section 7 | | |||
| | | for CONNECT method | | | | | | for CONNECT method | | | |||
| ENHANCE_YOUR_CALM | 0xb | Processing capacity | Section 7 | | | ENHANCE_YOUR_CALM | 0xb | Processing capacity | Section 7 | | |||
| | | exceeded | | | | | | exceeded | | | |||
| INADEQUATE_SECURITY | 0xc | Negotiated TLS | Section 7 | | | INADEQUATE_SECURITY | 0xc | Negotiated TLS | Section 7 | | |||
| | | parameters not | | | | | | parameters not | | | |||
| | | acceptable | | | | | | acceptable | | | |||
| HTTP_1_1_REQUIRED | 0xd | Use HTTP/1.1 for the | Section 7 | | ||||
| | | request | | | ||||
+---------------------+------+----------------------+---------------+ | +---------------------+------+----------------------+---------------+ | |||
11.5. HTTP2-Settings Header Field Registration | 11.5. 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 Names" 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. | |||
11.6. PRI Method Registration | 11.6. 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" | |||
([RFC7231], Section 8.1). | ([RFC7231], Section 8.1). | |||
Method Name: PRI | Method Name: PRI | |||
Safe No | Safe: Yes | |||
Idempotent No | Idempotent: Yes | |||
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 preface. | intermediary attempts to parse an HTTP/2 connection preface. | |||
11.7. The 421 Not Authoritative HTTP Status Code | 11.7. The 421 (Misdirected Request) HTTP Status Code | |||
This document registers the 421 (Not Authoritative) HTTP Status code | This document registers the 421 (Misdirected Request) HTTP status | |||
in the Hypertext Transfer Protocol (HTTP) Status Code Registry | code in the "HTTP Status Codes" registry ([RFC7231], Section 8.2). | |||
([RFC7231], Section 8.2). | ||||
Status Code: 421 | Status Code: 421 | |||
Short Description: Not Authoritative | Short Description: Misdirected Request | |||
Specification: Section 9.1.2 of this document | Specification: Section 9.1.2 of this document | |||
12. Acknowledgements | 11.8. The h2c Upgrade Token | |||
This document includes substantial input from the following | ||||
individuals: | ||||
o Adam Langley, Wan-Teh Chang, Jim Morrison, Mark Nottingham, Alyssa | ||||
Wilk, Costin Manolache, William Chan, Vitaliy Lvin, Joe Chan, Adam | ||||
Barth, Ryan Hamilton, Gavin Peters, Kent Alstad, Kevin Lindsay, | ||||
Paul Amer, Fan Yang, Jonathan Leighton (SPDY contributors). | ||||
o Gabriel Montenegro and Willy Tarreau (Upgrade mechanism). | ||||
o William Chan, Salvatore Loreto, Osama Mazahir, Gabriel Montenegro, | ||||
Jitu Padhye, Roberto Peon, Rob Trace (Flow control). | ||||
o Mike Bishop (Extensibility). | This document registers the "h2c" upgrade token in the "HTTP Upgrade | |||
Tokens" registry ([RFC7230], Section 8.6). | ||||
o Mark Nottingham, Julian Reschke, James Snell, Jeff Pinner, Mike | Value: h2c | |||
Bishop, Herve Ruellan (Substantial editorial contributions). | ||||
o Kari Hurtta, Tatsuhiro Tsujikawa, Greg Wilkins, Poul-Henning Kamp. | Description: Hypertext Transfer Protocol version 2 (HTTP/2) | |||
o Alexey Melnikov was an editor of this document during 2013. | Expected Version Tokens: None | |||
o A substantial proportion of Martin's contribution was supported by | Reference: Section 3.2 of this document | |||
Microsoft during his employment there. | ||||
13. References | 12. References | |||
13.1. Normative References | 12.1. Normative References | |||
[COMPRESSION] Ruellan, H. and R. Peon, "HPACK - Header Compression | [COMPRESSION] Peon, R. and H. Ruellan, "HPACK: Header Compression | |||
for HTTP/2", draft-ietf-httpbis-header-compression-09 | for HTTP/2", RFC 7541, DOI 10.17487/RFC7541, May 2015, | |||
(work in progress), July 2014. | <http://www.rfc-editor.org/info/rfc7541>. | |||
[COOKIE] Barth, A., "HTTP State Management Mechanism", | [COOKIE] Barth, A., "HTTP State Management Mechanism", | |||
RFC 6265, April 2011. | RFC 6265, DOI 10.17487/RFC6265, April 2011, | |||
<http://www.rfc-editor.org/info/rfc6265>. | ||||
[FIPS186] NIST, "Digital Signature Standard (DSS)", FIPS PUB | [FIPS186] NIST, "Digital Signature Standard (DSS)", FIPS PUB | |||
186-4, July 2013. | 186-4, July 2013, | |||
<http://dx.doi.org/10.6028/NIST.FIPS.186-4>. | ||||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, March 1997. | Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/ | |||
RFC2119, March 1997, | ||||
<http://www.rfc-editor.org/info/rfc2119>. | ||||
[RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000. | [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, DOI 10.17487/ | |||
RFC2818, May 2000, | ||||
<http://www.rfc-editor.org/info/rfc2818>. | ||||
[RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, | [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, | |||
"Uniform Resource Identifier (URI): Generic Syntax", | "Uniform Resource Identifier (URI): Generic Syntax", | |||
STD 66, RFC 3986, January 2005. | STD 66, RFC 3986, DOI 10.17487/RFC3986, January 2005, | |||
<http://www.rfc-editor.org/info/rfc3986>. | ||||
[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, DOI 10.17487/RFC4648, | |||
October 2006, | ||||
<http://www.rfc-editor.org/info/rfc4648>. | ||||
[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, DOI 10.17487/RFC5226, May 2008, | |||
<http://www.rfc-editor.org/info/rfc5226>. | ||||
[RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax | [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for | |||
Specifications: ABNF", STD 68, RFC 5234, January 2008. | Syntax Specifications: ABNF", STD 68, RFC 5234, | |||
DOI 10.17487/RFC5234, January 2008, | ||||
<http://www.rfc-editor.org/info/rfc5234>. | ||||
[RFC7230] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | [RFC7230] 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", RFC 7230, June 2014. | Routing", RFC 7230, DOI 10.17487/RFC7230, June 2014, | |||
<http://www.rfc-editor.org/info/rfc7230>. | ||||
[RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | [RFC7231] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | |||
Transfer Protocol (HTTP/1.1): Semantics and Content", | Transfer Protocol (HTTP/1.1): Semantics and Content", | |||
RFC 7231, June 2014. | RFC 7231, DOI 10.17487/RFC7231, June 2014, | |||
<http://www.rfc-editor.org/info/rfc7231>. | ||||
[RFC7232] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | [RFC7232] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | |||
Transfer Protocol (HTTP/1.1): Conditional Requests", | Transfer Protocol (HTTP/1.1): Conditional Requests", | |||
RFC 7232, June 2014. | RFC 7232, DOI 10.17487/RFC7232, June 2014, | |||
<http://www.rfc-editor.org/info/rfc7232>. | ||||
[RFC7233] Fielding, R., Ed., Lafon, Y., Ed., and J. Reschke, | [RFC7233] Fielding, R., Ed., Lafon, Y., Ed., and J. Reschke, | |||
Ed., "Hypertext Transfer Protocol (HTTP/1.1): Range | Ed., "Hypertext Transfer Protocol (HTTP/1.1): Range | |||
Requests", RFC 7233, June 2014. | Requests", RFC 7233, DOI 10.17487/RFC7233, June 2014, | |||
<http://www.rfc-editor.org/info/rfc7233>. | ||||
[RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. | [RFC7234] Fielding, R., Ed., Nottingham, M., Ed., and J. | |||
Reschke, Ed., "Hypertext Transfer Protocol (HTTP/1.1): | Reschke, Ed., "Hypertext Transfer Protocol (HTTP/1.1): | |||
Caching", RFC 7234, June 2014. | Caching", RFC 7234, DOI 10.17487/RFC7234, June 2014, | |||
<http://www.rfc-editor.org/info/rfc7234>. | ||||
[RFC7235] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | [RFC7235] Fielding, R., Ed. and J. Reschke, Ed., "Hypertext | |||
Transfer Protocol (HTTP/1.1): Authentication", | Transfer Protocol (HTTP/1.1): Authentication", | |||
RFC 7235, June 2014. | RFC 7235, DOI 10.17487/RFC7235, June 2014, | |||
<http://www.rfc-editor.org/info/rfc7235>. | ||||
[TCP] Postel, J., "Transmission Control Protocol", STD 7, | [TCP] Postel, J., "Transmission Control Protocol", STD 7, | |||
RFC 793, September 1981. | RFC 793, DOI 10.17487/RFC0793, September 1981, | |||
<http://www.rfc-editor.org/info/rfc793>. | ||||
[TLS-ALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | [TLS-ALPN] Friedl, S., Popov, A., Langley, A., and E. Stephan, | |||
"Transport Layer Security (TLS) Application-Layer | "Transport Layer Security (TLS) Application-Layer | |||
Protocol Negotiation Extension", RFC 7301, July 2014. | Protocol Negotiation Extension", RFC 7301, | |||
DOI 10.17487/RFC7301, July 2014, | ||||
<http://www.rfc-editor.org/info/rfc7301>. | ||||
[TLS-ECDHE] Rescorla, E., "TLS Elliptic Curve Cipher Suites with | [TLS-ECDHE] Rescorla, E., "TLS Elliptic Curve Cipher Suites with | |||
SHA-256/384 and AES Galois Counter Mode (GCM)", | SHA-256/384 and AES Galois Counter Mode (GCM)", | |||
RFC 5289, August 2008. | RFC 5289, DOI 10.17487/RFC5289, August 2008, | |||
<http://www.rfc-editor.org/info/rfc5289>. | ||||
[TLS-EXT] Eastlake, D., "Transport Layer Security (TLS) | [TLS-EXT] Eastlake 3rd, D., "Transport Layer Security (TLS) | |||
Extensions: Extension Definitions", RFC 6066, | Extensions: Extension Definitions", RFC 6066, | |||
January 2011. | DOI 10.17487/RFC6066, January 2011, | |||
<http://www.rfc-editor.org/info/rfc6066>. | ||||
[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. | DOI 10.17487/RFC5246, August 2008, | |||
<http://www.rfc-editor.org/info/rfc5246>. | ||||
13.2. Informative References | 12.2. Informative References | |||
[ALT-SVC] Nottingham, M., McManus, P., and J. Reschke, "HTTP | [ALT-SVC] Nottingham, M., McManus, P., and J. Reschke, "HTTP | |||
Alternative Services", draft-ietf-httpbis-alt-svc-01 | Alternative Services", draft-ietf-httpbis-alt-svc-06 | |||
(work in progress), April 2014. | (work in progress), February 2015. | |||
[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, | |||
<http://www.rfc-editor.org/info/bcp90>. | ||||
[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>. | |||
[HTML5] Berjon, R., Faulkner, S., Leithead, T., Doyle Navara, | [HTML5] Hickson, I., Berjon, R., Faulkner, S., Leithead, T., | |||
E., O'Connor, E., and S. Pfeiffer, "HTML5", W3C | Doyle Navara, E., O'Connor, E., and S. Pfeiffer, | |||
Candidate Recommendation CR-html5-20140204, | "HTML5", W3C Recommendation REC-html5-20141028, | |||
Febuary 2014, | October 2014, | |||
<http://www.w3.org/TR/2014/CR-html5-20140204/>. | <http://www.w3.org/TR/2014/REC-html5-20141028/>. | |||
Latest version available at | ||||
<http://www.w3.org/TR/html5/>. | ||||
[RFC1323] Jacobson, V., Braden, B., and D. Borman, "TCP | ||||
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, DOI 10.17487/RFC3749, | |||
May 2004, <http://www.rfc-editor.org/info/rfc3749>. | ||||
[RFC4492] Blake-Wilson, S., Bolyard, N., Gupta, V., Hawk, C., | [RFC4492] Blake-Wilson, S., Bolyard, N., Gupta, V., Hawk, C., | |||
and B. Moeller, "Elliptic Curve Cryptography (ECC) | and B. Moeller, "Elliptic Curve Cryptography (ECC) | |||
Cipher Suites for Transport Layer Security (TLS)", | Cipher Suites for Transport Layer Security (TLS)", | |||
RFC 4492, May 2006. | RFC 4492, DOI 10.17487/RFC4492, May 2006, | |||
<http://www.rfc-editor.org/info/rfc4492>. | ||||
[RFC5288] Salowey, J., Choudhury, A., and D. McGrew, "AES Galois | [RFC6585] Nottingham, M. and R. Fielding, "Additional HTTP | |||
Counter Mode (GCM) Cipher Suites for TLS", RFC 5288, | Status Codes", RFC 6585, DOI 10.17487/RFC6585, | |||
August 2008. | April 2012, <http://www.rfc-editor.org/info/rfc6585>. | |||
[RFC6585] Nottingham, N. and R. Fielding, "Additional HTTP | [RFC7323] Borman, D., Braden, B., Jacobson, V., and R. | |||
Status Codes", RFC 6585, April 2012. | Scheffenegger, Ed., "TCP Extensions for High | |||
Performance", RFC 7323, DOI 10.17487/RFC7323, | ||||
September 2014, | ||||
<http://www.rfc-editor.org/info/rfc7323>. | ||||
[TALKING] Huang, L-S., Chen, E., Barth, A., Rescorla, E., and C. | [TALKING] Huang, L., 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., Holz, R., and P. Saint-Andre, | [TLSBCP] Sheffer, Y., Holz, R., and P. Saint-Andre, | |||
"Recommendations for Secure Use of TLS and DTLS", | "Recommendations for Secure Use of Transport Layer | |||
draft-sheffer-tls-bcp-02 (work in progress), | Security (TLS) and Datagram Transport Layer Security | |||
February 2014. | (DTLS)", BCP 195, RFC 7525, DOI 10.17487/RFC7525, | |||
May 2015, <http://www.rfc-editor.org/info/rfc7525>. | ||||
Appendix A. Change Log | Appendix A. TLS 1.2 Cipher Suite Black List | |||
This section is to be removed by RFC Editor before publication. | An HTTP/2 implementation MAY treat the negotiation of any of the | |||
following cipher suites with TLS 1.2 as a connection error | ||||
(Section 5.4.1) of type INADEQUATE_SECURITY: | ||||
A.1. Since draft-ietf-httpbis-http2-13 | o TLS_NULL_WITH_NULL_NULL | |||
Pseudo-header fields are now required to appear strictly before | o TLS_RSA_WITH_NULL_MD5 | |||
regular ones. | ||||
Restored 1xx series status codes, except 101. | o TLS_RSA_WITH_NULL_SHA | |||
Changed frame length field 24-bits. Expanded frame header to 9 | o TLS_RSA_EXPORT_WITH_RC4_40_MD5 | |||
octets. Added a setting to limit the damage. | ||||
Added a setting to advise peers of header set size limits. | o TLS_RSA_WITH_RC4_128_MD5 | |||
Removed segments. | o TLS_RSA_WITH_RC4_128_SHA | |||
o TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 | ||||
Made non-semantic-bearing HEADERS frames illegal in the HTTP mapping. | o TLS_RSA_WITH_IDEA_CBC_SHA | |||
A.2. Since draft-ietf-httpbis-http2-12 | o TLS_RSA_EXPORT_WITH_DES40_CBC_SHA | |||
Restored extensibility options. | o TLS_RSA_WITH_DES_CBC_SHA | |||
Restricting TLS cipher suites to AEAD only. | o TLS_RSA_WITH_3DES_EDE_CBC_SHA | |||
Removing Content-Encoding requirements. | o TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA | |||
Permitting the use of PRIORITY after stream close. | o TLS_DH_DSS_WITH_DES_CBC_SHA | |||
Removed ALTSVC frame. | o TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA | |||
Removed BLOCKED frame. | o TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA | |||
Reducing the maximum padding size to 256 octets; removing padding | o TLS_DH_RSA_WITH_DES_CBC_SHA | |||
from CONTINUATION frames. | ||||
Removed per-frame GZIP compression. | o TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA | |||
A.3. Since draft-ietf-httpbis-http2-11 | o TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA | |||
Added BLOCKED frame (at risk). | o TLS_DHE_DSS_WITH_DES_CBC_SHA | |||
Simplified priority scheme. | o TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA | |||
Added DATA per-frame GZIP compression. | o TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA | |||
A.4. Since draft-ietf-httpbis-http2-10 | o TLS_DHE_RSA_WITH_DES_CBC_SHA | |||
Changed "connection header" to "connection preface" to avoid | o TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA | |||
confusion. | ||||
Added dependency-based stream prioritization. | o TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 | |||
Added "h2c" identifier to distinguish between cleartext and secured | o TLS_DH_anon_WITH_RC4_128_MD5 | |||
HTTP/2. | ||||
Adding missing padding to PUSH_PROMISE. | o TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA | |||
Integrate ALTSVC frame and supporting text. | o TLS_DH_anon_WITH_DES_CBC_SHA | |||
Dropping requirement on "deflate" Content-Encoding. | o TLS_DH_anon_WITH_3DES_EDE_CBC_SHA | |||
Improving security considerations around use of compression. | o TLS_KRB5_WITH_DES_CBC_SHA | |||
A.5. Since draft-ietf-httpbis-http2-09 | o TLS_KRB5_WITH_3DES_EDE_CBC_SHA | |||
o TLS_KRB5_WITH_RC4_128_SHA | ||||
Adding padding for data frames. | o TLS_KRB5_WITH_IDEA_CBC_SHA | |||
Renumbering frame types, error codes, and settings. | o TLS_KRB5_WITH_DES_CBC_MD5 | |||
Adding INADEQUATE_SECURITY error code. | o TLS_KRB5_WITH_3DES_EDE_CBC_MD5 | |||
Updating TLS usage requirements to 1.2; forbidding TLS compression. | o TLS_KRB5_WITH_RC4_128_MD5 | |||
Removing extensibility for frames and settings. | o TLS_KRB5_WITH_IDEA_CBC_MD5 | |||
Changing setting identifier size. | o TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA | |||
Removing the ability to disable flow control. | o TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA | |||
Changing the protocol identification token to "h2". | o TLS_KRB5_EXPORT_WITH_RC4_40_SHA | |||
Changing the use of :authority to make it optional and to allow | o TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5 | |||
userinfo in non-HTTP cases. | ||||
Allowing split on 0x0 for Cookie. | o TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5 | |||
Reserved PRI method in HTTP/1.1 to avoid possible future collisions. | o TLS_KRB5_EXPORT_WITH_RC4_40_MD5 | |||
A.6. Since draft-ietf-httpbis-http2-08 | o TLS_PSK_WITH_NULL_SHA | |||
Added cookie crumbling for more efficient header compression. | o TLS_DHE_PSK_WITH_NULL_SHA | |||
Added header field ordering with the value-concatenation mechanism. | o TLS_RSA_PSK_WITH_NULL_SHA | |||
A.7. Since draft-ietf-httpbis-http2-07 | o TLS_RSA_WITH_AES_128_CBC_SHA | |||
Marked draft for implementation. | o TLS_DH_DSS_WITH_AES_128_CBC_SHA | |||
A.8. Since draft-ietf-httpbis-http2-06 | o TLS_DH_RSA_WITH_AES_128_CBC_SHA | |||
Adding definition for CONNECT method. | o TLS_DHE_DSS_WITH_AES_128_CBC_SHA | |||
Constraining the use of push to safe, cacheable methods with no | o TLS_DHE_RSA_WITH_AES_128_CBC_SHA | |||
request body. | ||||
Changing from :host to :authority to remove any potential confusion. | o TLS_DH_anon_WITH_AES_128_CBC_SHA | |||
Adding setting for header compression table size. | o TLS_RSA_WITH_AES_256_CBC_SHA | |||
Adding settings acknowledgement. | o TLS_DH_DSS_WITH_AES_256_CBC_SHA | |||
Removing unnecessary and potentially problematic flags from | o TLS_DH_RSA_WITH_AES_256_CBC_SHA | |||
CONTINUATION. | o TLS_DHE_DSS_WITH_AES_256_CBC_SHA | |||
Added denial of service considerations. | o TLS_DHE_RSA_WITH_AES_256_CBC_SHA | |||
A.9. Since draft-ietf-httpbis-http2-05 | o TLS_DH_anon_WITH_AES_256_CBC_SHA | |||
Marking the draft ready for implementation. | o TLS_RSA_WITH_NULL_SHA256 | |||
Renumbering END_PUSH_PROMISE flag. | o TLS_RSA_WITH_AES_128_CBC_SHA256 | |||
Editorial clarifications and changes. | o TLS_RSA_WITH_AES_256_CBC_SHA256 | |||
A.10. Since draft-ietf-httpbis-http2-04 | o TLS_DH_DSS_WITH_AES_128_CBC_SHA256 | |||
Added CONTINUATION frame for HEADERS and PUSH_PROMISE. | o TLS_DH_RSA_WITH_AES_128_CBC_SHA256 | |||
PUSH_PROMISE is no longer implicitly prohibited if | o TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 | |||
SETTINGS_MAX_CONCURRENT_STREAMS is zero. | ||||
Push expanded to allow all safe methods without a request body. | o TLS_RSA_WITH_CAMELLIA_128_CBC_SHA | |||
Clarified the use of HTTP header fields in requests and responses. | o TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA | |||
Prohibited HTTP/1.1 hop-by-hop header fields. | ||||
Requiring that intermediaries not forward requests with missing or | o TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA | |||
illegal routing :-headers. | ||||
Clarified requirements around handling different frames after stream | o TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA | |||
close, stream reset and GOAWAY. | ||||
Added more specific prohibitions for sending of different frame types | o TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA | |||
in various stream states. | ||||
Making the last received setting value the effective value. | o TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA | |||
Clarified requirements on TLS version, extension and ciphers. | o TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 | |||
A.11. Since draft-ietf-httpbis-http2-03 | o TLS_DH_DSS_WITH_AES_256_CBC_SHA256 | |||
Committed major restructuring atrocities. | o TLS_DH_RSA_WITH_AES_256_CBC_SHA256 | |||
Added reference to first header compression draft. | o TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 | |||
Added more formal description of frame lifecycle. | o TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 | |||
Moved END_STREAM (renamed from FINAL) back to HEADERS/DATA. | o TLS_DH_anon_WITH_AES_128_CBC_SHA256 | |||
Removed HEADERS+PRIORITY, added optional priority to HEADERS frame. | o TLS_DH_anon_WITH_AES_256_CBC_SHA256 | |||
Added PRIORITY frame. | o TLS_RSA_WITH_CAMELLIA_256_CBC_SHA | |||
A.12. Since draft-ietf-httpbis-http2-02 | o TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA | |||
o TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA | ||||
Added continuations to frames carrying header blocks. | o TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA | |||
Replaced use of "session" with "connection" to avoid confusion with | o TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA | |||
other HTTP stateful concepts, like cookies. | ||||
Removed "message". | o TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA | |||
Switched to TLS ALPN from NPN. | o TLS_PSK_WITH_RC4_128_SHA | |||
Editorial changes. | o TLS_PSK_WITH_3DES_EDE_CBC_SHA | |||
A.13. Since draft-ietf-httpbis-http2-01 | o TLS_PSK_WITH_AES_128_CBC_SHA | |||
Added IANA considerations section for frame types, error codes and | o TLS_PSK_WITH_AES_256_CBC_SHA | |||
settings. | ||||
Removed data frame compression. | o TLS_DHE_PSK_WITH_RC4_128_SHA | |||
Added PUSH_PROMISE. | o TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA | |||
Added globally applicable flags to framing. | o TLS_DHE_PSK_WITH_AES_128_CBC_SHA | |||
Removed zlib-based header compression mechanism. | o TLS_DHE_PSK_WITH_AES_256_CBC_SHA | |||
Updated references. | o TLS_RSA_PSK_WITH_RC4_128_SHA | |||
Clarified stream identifier reuse. | o TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA | |||
Removed CREDENTIALS frame and associated mechanisms. | o TLS_RSA_PSK_WITH_AES_128_CBC_SHA | |||
Added advice against naive implementation of flow control. | o TLS_RSA_PSK_WITH_AES_256_CBC_SHA | |||
Added session header section. | o TLS_RSA_WITH_SEED_CBC_SHA | |||
Restructured frame header. Removed distinction between data and | o TLS_DH_DSS_WITH_SEED_CBC_SHA | |||
control frames. | ||||
Altered flow control properties to include session-level limits. | o TLS_DH_RSA_WITH_SEED_CBC_SHA | |||
Added note on cacheability of pushed resources and multiple tenant | o TLS_DHE_DSS_WITH_SEED_CBC_SHA | |||
servers. | ||||
Changed protocol label form based on discussions. | o TLS_DHE_RSA_WITH_SEED_CBC_SHA | |||
A.14. Since draft-ietf-httpbis-http2-00 | o TLS_DH_anon_WITH_SEED_CBC_SHA | |||
Changed title throughout. | o TLS_RSA_WITH_AES_128_GCM_SHA256 | |||
Removed section on Incompatibilities with SPDY draft#2. | o TLS_RSA_WITH_AES_256_GCM_SHA384 | |||
o TLS_DH_RSA_WITH_AES_128_GCM_SHA256 | ||||
Changed INTERNAL_ERROR on GOAWAY to have a value of 2 <https:// | o TLS_DH_RSA_WITH_AES_256_GCM_SHA384 | |||
groups.google.com/forum/?fromgroups#!topic/spdy-dev/cfUef2gL3iU>. | ||||
Replaced abstract and introduction. | o TLS_DH_DSS_WITH_AES_128_GCM_SHA256 | |||
Added section on starting HTTP/2.0, including upgrade mechanism. | o TLS_DH_DSS_WITH_AES_256_GCM_SHA384 | |||
Removed unused references. | o TLS_DH_anon_WITH_AES_128_GCM_SHA256 | |||
Added flow control principles (Section 5.2.1) based on <https:// | o TLS_DH_anon_WITH_AES_256_GCM_SHA384 | |||
tools.ietf.org/html/draft-montenegro-httpbis-http2-fc-principles-01>. | ||||
A.15. Since draft-mbelshe-httpbis-spdy-00 | o TLS_PSK_WITH_AES_128_GCM_SHA256 | |||
Adopted as base for draft-ietf-httpbis-http2. | o TLS_PSK_WITH_AES_256_GCM_SHA384 | |||
Updated authors/editors list. | o TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 | |||
Added status note. | o TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 | |||
o TLS_PSK_WITH_AES_128_CBC_SHA256 | ||||
o TLS_PSK_WITH_AES_256_CBC_SHA384 | ||||
o TLS_PSK_WITH_NULL_SHA256 | ||||
o TLS_PSK_WITH_NULL_SHA384 | ||||
o TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 | ||||
o TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 | ||||
o TLS_DHE_PSK_WITH_NULL_SHA256 | ||||
o TLS_DHE_PSK_WITH_NULL_SHA384 | ||||
o TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 | ||||
o TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 | ||||
o TLS_RSA_PSK_WITH_NULL_SHA256 | ||||
o TLS_RSA_PSK_WITH_NULL_SHA384 | ||||
o TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 | ||||
o TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256 | ||||
o TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256 | ||||
o TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 | ||||
o TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 | ||||
o TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256 | ||||
o TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 | ||||
o TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256 | ||||
o TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256 | ||||
o TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 | ||||
o TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 | ||||
o TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256 | ||||
o TLS_EMPTY_RENEGOTIATION_INFO_SCSV | ||||
o TLS_ECDH_ECDSA_WITH_NULL_SHA | ||||
o TLS_ECDH_ECDSA_WITH_RC4_128_SHA | ||||
o TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA | ||||
o TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA | ||||
o TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA | ||||
o TLS_ECDHE_ECDSA_WITH_NULL_SHA | ||||
o TLS_ECDHE_ECDSA_WITH_RC4_128_SHA | ||||
o TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA | ||||
o TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA | ||||
o TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA | ||||
o TLS_ECDH_RSA_WITH_NULL_SHA | ||||
o TLS_ECDH_RSA_WITH_RC4_128_SHA | ||||
o TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA | ||||
o TLS_ECDH_RSA_WITH_AES_128_CBC_SHA | ||||
o TLS_ECDH_RSA_WITH_AES_256_CBC_SHA | ||||
o TLS_ECDHE_RSA_WITH_NULL_SHA | ||||
o TLS_ECDHE_RSA_WITH_RC4_128_SHA | ||||
o TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA | ||||
o TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA | ||||
o TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA | ||||
o TLS_ECDH_anon_WITH_NULL_SHA | ||||
o TLS_ECDH_anon_WITH_RC4_128_SHA | ||||
o TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA | ||||
o TLS_ECDH_anon_WITH_AES_128_CBC_SHA | ||||
o TLS_ECDH_anon_WITH_AES_256_CBC_SHA | ||||
o TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA | ||||
o TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA | ||||
o TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA | ||||
o TLS_SRP_SHA_WITH_AES_128_CBC_SHA | ||||
o TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA | ||||
o TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA | ||||
o TLS_SRP_SHA_WITH_AES_256_CBC_SHA | ||||
o TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA | ||||
o TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA | ||||
o TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 | ||||
o TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 | ||||
o TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 | ||||
o TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 | ||||
o TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 | ||||
o TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 | ||||
o TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 | ||||
o TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 | ||||
o TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 | ||||
o TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 | ||||
o TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 | ||||
o TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 | ||||
o TLS_ECDHE_PSK_WITH_RC4_128_SHA | ||||
o TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA | ||||
o TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA | ||||
o TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA | ||||
o TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 | ||||
o TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 | ||||
o TLS_ECDHE_PSK_WITH_NULL_SHA | ||||
o TLS_ECDHE_PSK_WITH_NULL_SHA256 | ||||
o TLS_ECDHE_PSK_WITH_NULL_SHA384 | ||||
o TLS_RSA_WITH_ARIA_128_CBC_SHA256 | ||||
o TLS_RSA_WITH_ARIA_256_CBC_SHA384 | ||||
o TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256 | ||||
o TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384 | ||||
o TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256 | ||||
o TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384 | ||||
o TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256 | ||||
o TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384 | ||||
o TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256 | ||||
o TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384 | ||||
o TLS_DH_anon_WITH_ARIA_128_CBC_SHA256 | ||||
o TLS_DH_anon_WITH_ARIA_256_CBC_SHA384 | ||||
o TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256 | ||||
o TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384 | ||||
o TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256 | ||||
o TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384 | ||||
o TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256 | ||||
o TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384 | ||||
o TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256 | ||||
o TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384 | ||||
o TLS_RSA_WITH_ARIA_128_GCM_SHA256 | ||||
o TLS_RSA_WITH_ARIA_256_GCM_SHA384 | ||||
o TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256 | ||||
o TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384 | ||||
o TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256 | ||||
o TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384 | ||||
o TLS_DH_anon_WITH_ARIA_128_GCM_SHA256 | ||||
o TLS_DH_anon_WITH_ARIA_256_GCM_SHA384 | ||||
o TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 | ||||
o TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 | ||||
o TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 | ||||
o TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 | ||||
o TLS_PSK_WITH_ARIA_128_CBC_SHA256 | ||||
o TLS_PSK_WITH_ARIA_256_CBC_SHA384 | ||||
o TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256 | ||||
o TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384 | ||||
o TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256 | ||||
o TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384 | ||||
o TLS_PSK_WITH_ARIA_128_GCM_SHA256 | ||||
o TLS_PSK_WITH_ARIA_256_GCM_SHA384 | ||||
o TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256 | ||||
o TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384 | ||||
o TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256 | ||||
o TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384 | ||||
o TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 | ||||
o TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 | ||||
o TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 | ||||
o TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 | ||||
o TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 | ||||
o TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 | ||||
o TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 | ||||
o TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 | ||||
o TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 | ||||
o TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 | ||||
o TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256 | ||||
o TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384 | ||||
o TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256 | ||||
o TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384 | ||||
o TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256 | ||||
o TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384 | ||||
o TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 | ||||
o TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 | ||||
o TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 | ||||
o TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 | ||||
o TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 | ||||
o TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 | ||||
o TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 | ||||
o TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 | ||||
o TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 | ||||
o TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 | ||||
o TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 | ||||
o TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 | ||||
o TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 | ||||
o TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 | ||||
o TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 | ||||
o TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 | ||||
o TLS_RSA_WITH_AES_128_CCM | ||||
o TLS_RSA_WITH_AES_256_CCM | ||||
o TLS_RSA_WITH_AES_128_CCM_8 | ||||
o TLS_RSA_WITH_AES_256_CCM_8 | ||||
o TLS_PSK_WITH_AES_128_CCM | ||||
o TLS_PSK_WITH_AES_256_CCM | ||||
o TLS_PSK_WITH_AES_128_CCM_8 | ||||
o TLS_PSK_WITH_AES_256_CCM_8 | ||||
Note: This list was assembled from the set of registered TLS | ||||
cipher suites at the time of writing. This list includes those | ||||
cipher suites that do not offer an ephemeral key exchange and | ||||
those that are based on the TLS null, stream, or block cipher type | ||||
(as defined in Section 6.2.3 of [TLS12]). Additional cipher | ||||
suites with these properties could be defined; these would not be | ||||
explicitly prohibited. | ||||
Appendix B. Acknowledgements | ||||
This document includes substantial input from the following | ||||
individuals: | ||||
o Adam Langley, Wan-Teh Chang, Jim Morrison, Mark Nottingham, Alyssa | ||||
Wilk, Costin Manolache, William Chan, Vitaliy Lvin, Joe Chan, Adam | ||||
Barth, Ryan Hamilton, Gavin Peters, Kent Alstad, Kevin Lindsay, | ||||
Paul Amer, Fan Yang, and Jonathan Leighton (SPDY contributors). | ||||
o Gabriel Montenegro and Willy Tarreau (Upgrade mechanism). | ||||
o William Chan, Salvatore Loreto, Osama Mazahir, Gabriel Montenegro, | ||||
Jitu Padhye, Roberto Peon, and Rob Trace (Flow control). | ||||
o Mike Bishop (Extensibility). | ||||
o Mark Nottingham, Julian Reschke, James Snell, Jeff Pinner, Mike | ||||
Bishop, and Herve Ruellan (Substantial editorial contributions). | ||||
o Kari Hurtta, Tatsuhiro Tsujikawa, Greg Wilkins, Poul-Henning Kamp, | ||||
and Jonathan Thackray. | ||||
o Alexey Melnikov, who was an editor of this document in 2013. | ||||
A substantial proportion of Martin's contribution was supported by | ||||
Microsoft during his employment there. | ||||
The Japanese HTTP/2 community provided invaluable contributions, | ||||
including a number of implementations as well as numerous technical | ||||
and editorial contributions. | ||||
Authors' Addresses | Authors' Addresses | |||
Mike Belshe | Mike Belshe | |||
Twist | BitGo | |||
EMail: mbelshe@chromium.org | EMail: mike@belshe.com | |||
Roberto Peon | Roberto Peon | |||
Google, Inc | Google, Inc | |||
EMail: fenix@google.com | EMail: fenix@google.com | |||
Martin Thomson (editor) | Martin Thomson (editor) | |||
Mozilla | Mozilla | |||
331 E Evelyn Street | 331 E Evelyn Street | |||
Mountain View, CA 94041 | Mountain View, CA 94041 | |||
US | United States | |||
EMail: martin.thomson@gmail.com | EMail: martin.thomson@gmail.com | |||
End of changes. 597 change blocks. | ||||
1429 lines changed or deleted | 1912 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |