-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdraft-ietf-httpbis-http2-17.txt
5177 lines (3551 loc) · 211 KB
/
draft-ietf-httpbis-http2-17.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
HTTPbis Working Group M. Belshe
Internet-Draft Twist
Intended status: Standards Track R. Peon
Expires: August 15, 2015 Google, Inc
M. Thomson, Ed.
Mozilla
February 11, 2015
Hypertext Transfer Protocol version 2
draft-ietf-httpbis-http2-17
Abstract
This specification describes an optimized expression of the semantics
of the Hypertext Transfer Protocol (HTTP). HTTP/2 enables a more
efficient use of network resources and a reduced perception of
latency by introducing header field compression and allowing multiple
concurrent exchanges on the same connection. It also introduces
unsolicited push of representations from servers to clients.
本规范描述了一种对超文本传输(HTTP)协议的优化的表达方式. HTTP/2可以更高
效的利用网络资源, 通过引入头字段的压缩和在同一个连接中允许同时多个并发
的数据交换带来明显的时延减少. 它同时也引入了一种服务端向客户端主动推送
消息的机制.
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消息语法的改进, 而不是废弃. HTTP现有的语义依然没
变化.
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 [1].
Working Group information can be found at [2]; that specific to
HTTP/2 are at [3].
The changes in this draft are summarized in Appendix B.
Status of This Memo
This Internet-Draft is submitted in full conformance with the
provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet-
Drafts is at http://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."
Belshe, et al. Expires August 15, 2015 [Page 1]
Internet-Draft HTTP/2 February 2015
This Internet-Draft will expire on August 15, 2015.
Copyright Notice
Copyright (c) 2015 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents
(http://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents
carefully, as they describe your rights and restrictions with respect
to this document. Code Components extracted from this document must
include Simplified BSD License text as described in Section 4.e of
the Trust Legal Provisions and are provided without warranty as
described in the Simplified BSD License.
Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4
2. HTTP/2 Protocol Overview . . . . . . . . . . . . . . . . . . 5
2.1. Document Organization . . . . . . . . . . . . . . . . . . 6
2.2. Conventions and Terminology . . . . . . . . . . . . . . . 6
3. Starting HTTP/2 . . . . . . . . . . . . . . . . . . . . . . . 7
3.1. HTTP/2 Version Identification . . . . . . . . . . . . . . 8
3.2. Starting HTTP/2 for "http" URIs . . . . . . . . . . . . . 9
3.2.1. HTTP2-Settings Header Field . . . . . . . . . . . . . 10
3.3. Starting HTTP/2 for "https" URIs . . . . . . . . . . . . 11
3.4. Starting HTTP/2 with Prior Knowledge . . . . . . . . . . 11
3.5. HTTP/2 Connection Preface . . . . . . . . . . . . . . . . 11
4. HTTP Frames . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.1. Frame Format . . . . . . . . . . . . . . . . . . . . . . 13
4.2. Frame Size . . . . . . . . . . . . . . . . . . . . . . . 14
4.3. Header Compression and Decompression . . . . . . . . . . 14
5. Streams and Multiplexing . . . . . . . . . . . . . . . . . . 15
5.1. Stream States . . . . . . . . . . . . . . . . . . . . . . 16
5.1.1. Stream Identifiers . . . . . . . . . . . . . . . . . 21
5.1.2. Stream Concurrency . . . . . . . . . . . . . . . . . 22
5.2. Flow Control . . . . . . . . . . . . . . . . . . . . . . 23
5.2.1. Flow Control Principles . . . . . . . . . . . . . . . 23
5.2.2. Appropriate Use of Flow Control . . . . . . . . . . . 24
5.3. Stream priority . . . . . . . . . . . . . . . . . . . . . 25
5.3.1. Stream Dependencies . . . . . . . . . . . . . . . . . 25
5.3.2. Dependency Weighting . . . . . . . . . . . . . . . . 26
5.3.3. Reprioritization . . . . . . . . . . . . . . . . . . 27
5.3.4. Prioritization State Management . . . . . . . . . . . 27
5.3.5. Default Priorities . . . . . . . . . . . . . . . . . 29
5.4. Error Handling . . . . . . . . . . . . . . . . . . . . . 29
Belshe, et al. Expires August 15, 2015 [Page 2]
Internet-Draft HTTP/2 February 2015
5.4.1. Connection Error Handling . . . . . . . . . . . . . . 29
5.4.2. Stream Error Handling . . . . . . . . . . . . . . . . 30
5.4.3. Connection Termination . . . . . . . . . . . . . . . 30
5.5. Extending HTTP/2 . . . . . . . . . . . . . . . . . . . . 30
6. Frame Definitions . . . . . . . . . . . . . . . . . . . . . . 31
6.1. DATA . . . . . . . . . . . . . . . . . . . . . . . . . . 31
6.2. HEADERS . . . . . . . . . . . . . . . . . . . . . . . . . 33
6.3. PRIORITY . . . . . . . . . . . . . . . . . . . . . . . . 35
6.4. RST_STREAM . . . . . . . . . . . . . . . . . . . . . . . 36
6.5. SETTINGS . . . . . . . . . . . . . . . . . . . . . . . . 37
6.5.1. SETTINGS Format . . . . . . . . . . . . . . . . . . . 38
6.5.2. Defined SETTINGS Parameters . . . . . . . . . . . . . 38
6.5.3. Settings Synchronization . . . . . . . . . . . . . . 40
6.6. PUSH_PROMISE . . . . . . . . . . . . . . . . . . . . . . 40
6.7. PING . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6.8. GOAWAY . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.9. WINDOW_UPDATE . . . . . . . . . . . . . . . . . . . . . . 46
6.9.1. The Flow Control Window . . . . . . . . . . . . . . . 47
6.9.2. Initial Flow Control Window Size . . . . . . . . . . 48
6.9.3. Reducing the Stream Window Size . . . . . . . . . . . 49
6.10. CONTINUATION . . . . . . . . . . . . . . . . . . . . . . 49
7. Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . 50
8. HTTP Message Exchanges . . . . . . . . . . . . . . . . . . . 51
8.1. HTTP Request/Response Exchange . . . . . . . . . . . . . 51
8.1.1. Upgrading From HTTP/2 . . . . . . . . . . . . . . . . 53
8.1.2. HTTP Header Fields . . . . . . . . . . . . . . . . . 53
8.1.3. Examples . . . . . . . . . . . . . . . . . . . . . . 57
8.1.4. Request Reliability Mechanisms in HTTP/2 . . . . . . 59
8.2. Server Push . . . . . . . . . . . . . . . . . . . . . . . 60
8.2.1. Push Requests . . . . . . . . . . . . . . . . . . . . 61
8.2.2. Push Responses . . . . . . . . . . . . . . . . . . . 62
8.3. The CONNECT Method . . . . . . . . . . . . . . . . . . . 63
9. Additional HTTP Requirements/Considerations . . . . . . . . . 64
9.1. Connection Management . . . . . . . . . . . . . . . . . . 64
9.1.1. Connection Reuse . . . . . . . . . . . . . . . . . . 65
9.1.2. The 421 (Misdirected Request) Status Code . . . . . . 66
9.2. Use of TLS Features . . . . . . . . . . . . . . . . . . . 66
9.2.1. TLS 1.2 Features . . . . . . . . . . . . . . . . . . 67
9.2.2. TLS 1.2 Cipher Suites . . . . . . . . . . . . . . . . 68
10. Security Considerations . . . . . . . . . . . . . . . . . . . 68
10.1. Server Authority . . . . . . . . . . . . . . . . . . . . 68
10.2. Cross-Protocol Attacks . . . . . . . . . . . . . . . . . 68
10.3. Intermediary Encapsulation Attacks . . . . . . . . . . . 69
10.4. Cacheability of Pushed Responses . . . . . . . . . . . . 69
10.5. Denial of Service Considerations . . . . . . . . . . . . 70
10.5.1. Limits on Header Block Size . . . . . . . . . . . . 71
10.5.2. CONNECT Issues . . . . . . . . . . . . . . . . . . . 71
10.6. Use of Compression . . . . . . . . . . . . . . . . . . . 72
Belshe, et al. Expires August 15, 2015 [Page 3]
Internet-Draft HTTP/2 February 2015
10.7. Use of Padding . . . . . . . . . . . . . . . . . . . . . 72
10.8. Privacy Considerations . . . . . . . . . . . . . . . . . 73
11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 73
11.1. Registration of HTTP/2 Identification Strings . . . . . 74
11.2. Frame Type Registry . . . . . . . . . . . . . . . . . . 74
11.3. Settings Registry . . . . . . . . . . . . . . . . . . . 75
11.4. Error Code Registry . . . . . . . . . . . . . . . . . . 76
11.5. HTTP2-Settings Header Field Registration . . . . . . . . 77
11.6. PRI Method Registration . . . . . . . . . . . . . . . . 78
11.7. The 421 (Misdirected Request) HTTP Status Code . . . . . 78
12. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 78
13. References . . . . . . . . . . . . . . . . . . . . . . . . . 79
13.1. Normative References . . . . . . . . . . . . . . . . . . 79
13.2. Informative References . . . . . . . . . . . . . . . . . 80
13.3. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Appendix A. TLS 1.2 Cipher Suite Black List . . . . . . . . . . 82
Appendix B. Change Log . . . . . . . . . . . . . . . . . . . . . 86
B.1. Since draft-ietf-httpbis-http2-15 . . . . . . . . . . . . 86
B.2. Since draft-ietf-httpbis-http2-14 . . . . . . . . . . . . 86
B.3. Since draft-ietf-httpbis-http2-13 . . . . . . . . . . . . 87
B.4. Since draft-ietf-httpbis-http2-12 . . . . . . . . . . . . 87
B.5. Since draft-ietf-httpbis-http2-11 . . . . . . . . . . . . 87
B.6. Since draft-ietf-httpbis-http2-10 . . . . . . . . . . . . 87
B.7. Since draft-ietf-httpbis-http2-09 . . . . . . . . . . . . 88
B.8. Since draft-ietf-httpbis-http2-08 . . . . . . . . . . . . 88
B.9. Since draft-ietf-httpbis-http2-07 . . . . . . . . . . . . 89
B.10. Since draft-ietf-httpbis-http2-06 . . . . . . . . . . . . 89
B.11. Since draft-ietf-httpbis-http2-05 . . . . . . . . . . . . 89
B.12. Since draft-ietf-httpbis-http2-04 . . . . . . . . . . . . 89
B.13. Since draft-ietf-httpbis-http2-03 . . . . . . . . . . . . 90
B.14. Since draft-ietf-httpbis-http2-02 . . . . . . . . . . . . 90
B.15. Since draft-ietf-httpbis-http2-01 . . . . . . . . . . . . 90
B.16. Since draft-ietf-httpbis-http2-00 . . . . . . . . . . . . 91
B.17. Since draft-mbelshe-httpbis-spdy-00 . . . . . . . . . . . 91
1. Introduction
The Hypertext Transfer Protocol (HTTP) is a wildly successful
protocol. However, how HTTP/1.1 uses the underlying transport
([RFC7230], Section 6) has several characteristics that have a
negative overall effect on application performance today.
In particular, HTTP/1.0 allowed only one request to be outstanding at
a time on a given TCP connection. HTTP/1.1 added request pipelining,
but this only partially addressed request concurrency and still
suffers from head-of-line blocking. Therefore, HTTP/1.0 and HTTP/1.1
clients that need to make many requests use multiple connections to a
server in order to achieve concurrency and thereby reduce latency.
Belshe, et al. Expires August 15, 2015 [Page 4]
Internet-Draft HTTP/2 February 2015
Furthermore, HTTP header fields are often repetitive and verbose,
causing unnecessary network traffic, as well as causing the initial
TCP [TCP] congestion window to quickly fill. This can result in
excessive latency when multiple requests are made on a new TCP
connection.
HTTP/2 addresses these issues by defining an optimized mapping of
HTTP's semantics to an underlying connection. Specifically, it
allows interleaving of request and response messages on the same
connection and uses an efficient coding for HTTP header fields. It
also allows prioritization of requests, letting more important
requests complete more quickly, further improving performance.
The resulting protocol is more friendly to the network, because fewer
TCP connections can be used in comparison to HTTP/1.x. This means
less competition with other flows, and longer-lived connections,
which in turn leads to better utilization of available network
capacity.
Finally, HTTP/2 also enables more efficient processing of messages
through use of binary message framing.
2. HTTP/2 Protocol Overview
HTTP/2 provides an optimized transport for HTTP semantics. HTTP/2
supports all of the core features of HTTP/1.1, but aims to be more
efficient in several ways.
The basic protocol unit in HTTP/2 is a frame (Section 4.1). Each
frame type serves a different purpose. For example, HEADERS and DATA
frames form the basis of HTTP requests and responses (Section 8.1);
other frame types like SETTINGS, WINDOW_UPDATE, and PUSH_PROMISE are
used in support of other HTTP/2 features.
Multiplexing of requests is achieved by having each HTTP request-
response exchange associated with its own stream (Section 5).
Streams are largely independent of each other, so a blocked or
stalled request or response does not prevent progress on other
streams.
Flow control and prioritization ensure that it is possible to
efficiently use multiplexed streams. Flow control (Section 5.2)
helps to ensure that only data that can be used by a receiver is
transmitted. Prioritization (Section 5.3) ensures that limited
resources can be directed to the most important streams first.
HTTP/2 adds a new interaction mode, whereby a server can push
responses to a client (Section 8.2). Server push allows a server to
Belshe, et al. Expires August 15, 2015 [Page 5]
Internet-Draft HTTP/2 February 2015
speculatively send data to a client that the server anticipates the
client will need, trading off some network usage against a potential
latency gain. The server does this by synthesizing a request, which
it sends as a PUSH_PROMISE frame. The server is then able to send a
response to the synthetic request on a separate stream.
Because HTTP header fields used in a connection can contain large
amounts of redundant data, frames that contain them are compressed
(Section 4.3). This has especially advantageous impact upon request
sizes in the common case, allowing many requests to be compressed
into one packet.
HTTP/2是对HTTP语义的一种更优化的传输方式. HTTP/2支持HTTP/1.1所有的核心
功能, 但是其通过多种方式实现了更高效的目标.
HTTP/2协议的基本单元是一个帧(Section 4.1). 每个类型的帧用于不同的目的.
例如, HEADERS和DATA帧用于HTTP的请求和响应消息; 其它像SETTINGS,
WINDOW_UPDATE和PUSH_PROMISE这些类型的帧则用于支持HTTP/2的功能.
请求的多路复用通过每个HTTP请求响应携带自己的流来实现(Section 5). 流在
大多数情况下互不相干, 所以一个阻塞或者暂停的请求响应的会话不会阻塞应用
程序上的其它流.
数据流的多路复用通过流量控制和优先性得以保证. 流量控制(Section 5.2)用
于确保发送的数据能够被接收方使用. 优先性(Section 5.3)确保了最重要的数
据流可以优先获取有限的资源.
HTTP/2增加了交互模式, 在这种模式下服务器可以推送响应消息到客户端(Section 8.2).
服务器推送模式允许服务器预测客户端对数据的需求, 预先发送一些数据到客户端,
通过这样的方式可以平衡网络的利用率, 并有可能降低网络延迟. 服务器通过封装
一个PUSH_PROMISE帧来实现一个伪请求, 然后服务器就可以在一个单独的流中向之
前的伪请求发送响应数据.
由于在一个连接中的HTTP的头数据存在大量的冗余数据, 因此包含这些头的帧对其
进行了压缩(Section 4.3). 这在常见的场景中对请求消息的压缩有很大的帮助,
可以使得很多请求都被压缩到一个数据包中.
2.1. Document Organization
The HTTP/2 specification is split into four parts:
o Starting HTTP/2 (Section 3) covers how an HTTP/2 connection is
initiated.
o The framing (Section 4) and streams (Section 5) layers describe
the way HTTP/2 frames are structured and formed into multiplexed
streams.
o Frame (Section 6) and error (Section 7) definitions include
details of the frame and error types used in HTTP/2.
o HTTP mappings (Section 8) and additional requirements (Section 9)
describe how HTTP semantics are expressed using frames and
streams.
While some of the frame and stream layer concepts are isolated from
HTTP, this specification does not define a completely generic framing
layer. The framing and streams layers are tailored to the needs of
the HTTP protocol and server push.
2.2. Conventions and Terminology
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in RFC 2119 [RFC2119].
All numeric values are in network byte order. Values are unsigned
unless otherwise indicated. Literal values are provided in decimal
or hexadecimal as appropriate. Hexadecimal literals are prefixed
with "0x" to distinguish them from decimal literals.
The following terms are used:
Belshe, et al. Expires August 15, 2015 [Page 6]
Internet-Draft HTTP/2 February 2015
client: The endpoint that initiates an HTTP/2 connection. Clients
send HTTP requests and receive HTTP responses.
connection: A transport-layer connection between two endpoints.
connection error: An error that affects the entire HTTP/2
connection.
endpoint: Either the client or server of the connection.
frame: The smallest unit of communication within an HTTP/2
connection, consisting of a header and a variable-length sequence
of octets structured according to the frame type.
peer: An endpoint. When discussing a particular endpoint, "peer"
refers to the endpoint that is remote to the primary subject of
discussion.
receiver: An endpoint that is receiving frames.
sender: An endpoint that is transmitting frames.
server: The endpoint that accepts an HTTP/2 connection. Servers
receive HTTP requests and serve HTTP responses.
stream: A bi-directional flow of frames within the HTTP/2
connection.
stream error: An error on the individual HTTP/2 stream.
Finally, the terms "gateway", "intermediary", "proxy", and "tunnel"
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
An HTTP/2 connection is an application layer protocol running on top
of a TCP connection ([TCP]). The client is the TCP connection
initiator.
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
443 for "https" URIs. As a result, implementations processing
requests for target resource URIs like "http://example.org/foo" or
"https://example.com/bar" are required to first discover whether the
Belshe, et al. Expires August 15, 2015 [Page 7]
Internet-Draft HTTP/2 February 2015
upstream server (the immediate peer to which the client wishes to
establish a connection) supports HTTP/2.
The means by which support for HTTP/2 is determined is different for
"http" and "https" URIs. Discovery for "http" URIs is described in
Section 3.2. Discovery for "https" URIs is described in Section 3.3.
3.1. HTTP/2 Version Identification
The protocol defined in this document has two identifiers.
o The string "h2" identifies the protocol where HTTP/2 uses TLS
[TLS12]. This identifier is used in the TLS application layer
protocol negotiation extension (ALPN) [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 two octet sequence: 0x68, 0x32.
o The string "h2c" identifies the protocol where HTTP/2 is run over
cleartext TCP. This identifier is used in the HTTP/1.1 Upgrade
header field and in any place where HTTP/2 over TCP is identified.
The "h2c" string is reserved from the ALPN identifier space, but
describes a protocol that does not use TLS.
Negotiating "h2" or "h2c" implies the use of the transport, security,
framing and message semantics described in this document.
[[CREF1: 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.
Implementations of draft versions of the protocol MUST add the string
"-" and the corresponding draft number to the identifier. For
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
MUST append the string "-" and an experiment name to the identifier.
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
Belshe, et al. Expires August 15, 2015 [Page 8]
Internet-Draft HTTP/2 February 2015
encouraged to coordinate their experiments on the ietf-http-wg@w3.org
mailing list.
3.2. Starting HTTP/2 for "http" URIs
A client that makes a request for an "http" URI without prior
knowledge about support for HTTP/2 on the next hop uses the HTTP
Upgrade mechanism (Section 6.7 of [RFC7230]). The client does so by
making an HTTP/1.1 request that includes an Upgrade header field with
the "h2c" token. Such an HTTP/1.1 request MUST include exactly one
HTTP2-Settings (Section 3.2.1) header field.
For example:
GET / HTTP/1.1
Host: server.example.com
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>
Requests that contain an payload body MUST be sent in their entirety
before the client can send HTTP/2 frames. This means that a large
request can block the use of the connection until it is completely
sent.
If concurrency of an initial request with subsequent requests is
important, an OPTIONS request can be used to perform the upgrade to
HTTP/2, at the cost of an additional round-trip.
A server that does not support HTTP/2 can respond to the request as
though the Upgrade header field were absent:
HTTP/1.1 200 OK
Content-Length: 243
Content-Type: text/html
...
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
instead negotiated as described in Section 3.3.
A server that supports HTTP/2 accepts the upgrade with a 101
(Switching Protocols) response. After the empty line that terminates
the 101 response, the server can begin sending HTTP/2 frames. These
frames MUST include a response to the request that initiated the
Upgrade.
Belshe, et al. Expires August 15, 2015 [Page 9]
Internet-Draft HTTP/2 February 2015
For example:
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: h2c
[ HTTP/2 connection ...
The first HTTP/2 frame sent by the server MUST be a SETTINGS frame
(Section 6.5) as the server connection preface (Section 3.5). 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 a
stream identifier of 1 (see Section 5.1.1) with default priority
values (Section 5.3.5). Stream 1 is implicitly "half closed" from
the client toward the server (see Section 5.1), since the request is
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
A request that upgrades from HTTP/1.1 to HTTP/2 MUST include exactly
one "HTTP2-Settings" header field. The "HTTP2-Settings" header field
is a connection-specific header field that includes parameters that
govern the HTTP/2 connection, provided in anticipation of the server
accepting the request to upgrade.
HTTP2-Settings = token68
A server MUST NOT upgrade the connection to HTTP/2 if this header
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
SETTINGS frame (Section 6.5), encoded as a base64url string (that is,
the URL- and filename-safe Base64 encoding described in Section 5 of
[RFC4648], with any trailing '=' characters omitted). The ABNF
[RFC5234] production for "token68" is defined in Section 2.1 of
[RFC7235].
Since the upgrade is only intended to apply to the immediate
connection, a client sending "HTTP2-Settings" MUST 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]).
Belshe, et al. Expires August 15, 2015 [Page 10]
Internet-Draft HTTP/2 February 2015
A server decodes and interprets these values as it would any other
SETTINGS frame. Explicit acknowledgement of these settings
(Section 6.5.3) is not necessary, since a 101 response serves as
implicit acknowledgment. Providing these values in the Upgrade
request gives a client an opportunity to provide parameters prior to
receiving any frames from the server.
3.3. Starting HTTP/2 for "https" URIs
A client that makes a request to an "https" URI uses TLS [TLS12] with
the application layer protocol negotiation (ALPN) extension
[TLS-ALPN].
HTTP/2 over TLS uses the "h2" protocol identifier. The "h2c"
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 MUST
send a connection preface (Section 3.5).
3.4. Starting HTTP/2 with Prior Knowledge
A client can learn that a particular server supports HTTP/2 by other
means. For example, [ALT-SVC] describes a mechanism for advertising
this capability.
A client MUST send the connection preface (Section 3.5), and then MAY
immediately send HTTP/2 frames to such a server; servers can identify
these connections by the presence of the connection preface. This
only affects the establishment of HTTP/2 connections over cleartext
TCP; implementations that support HTTP/2 over TLS MUST use protocol
negotiation in TLS [TLS-ALPN].
Likewise, the server MUST send a connection preface (Section 3.5).
Without additional information, prior support for HTTP/2 is not a
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
In HTTP/2, each endpoint is required to send a connection preface as
a final confirmation of the protocol in use, and to establish the
initial settings for the HTTP/2 connection. The client and server
each send a different connection preface.
Belshe, et al. Expires August 15, 2015 [Page 11]
Internet-Draft HTTP/2 February 2015
The client connection preface starts with a sequence of 24 octets,
which in hex notation are:
0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a
(the string "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"). This sequence MUST
be followed by a SETTINGS frame (Section 6.5), which MAY be empty.
The client sends the client connection preface immediately upon
receipt of a 101 Switching Protocols response (indicating a
successful upgrade), or as the first application data octets of a TLS
connection. If starting an HTTP/2 connection with prior knowledge of
server support for the protocol, the client connection preface is
sent upon connection establishment.
The client connection preface is selected so that a large
proportion of HTTP/1.1 or HTTP/1.0 servers and intermediaries do
not attempt to process further frames. Note that this does not
address the concerns raised in [TALKING].
The server connection preface consists of a potentially empty
SETTINGS frame (Section 6.5) that MUST be the first frame the server
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
additional frames to the server immediately after sending the client
connection preface, without waiting to receive the server connection
preface. It is important to note, however, that the server
connection preface SETTINGS frame might include parameters that
necessarily alter how a client is expected to communicate with the
server. Upon receiving the SETTINGS frame, the client is expected to
honor any parameters established. In some configurations, it is
possible for the server to transmit SETTINGS before the client sends
additional frames, providing an opportunity to avoid this issue.
Clients and servers MUST treat an invalid connection preface as a
connection error (Section 5.4.1) of type PROTOCOL_ERROR. A GOAWAY
frame (Section 6.8) MAY be omitted in this case, since an invalid
preface indicates that the peer is not using HTTP/2.
4. HTTP Frames
Once the HTTP/2 connection is established, endpoints can begin
exchanging frames.
Belshe, et al. Expires August 15, 2015 [Page 12]
Internet-Draft HTTP/2 February 2015
4.1. Frame Format
All frames begin with a fixed 9-octet header followed by a variable-
length payload.
+-----------------------------------------------+
| Length (24) |
+---------------+---------------+---------------+
| Type (8) | Flags (8) |
+-+-------------+---------------+-------------------------------+
|R| Stream Identifier (31) |
+=+=============================================================+
| Frame Payload (0...) ...
+---------------------------------------------------------------+
Figure 1: Frame Layout
The fields of the frame header are defined as:
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 unless the receiver has set a larger value for
SETTINGS_MAX_FRAME_SIZE.
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
format and semantics of the frame. Implementations MUST ignore
and discard any frame that has a type that is unknown.
Flags: An 8-bit field reserved for frame-type specific boolean
flags.
Flags are assigned semantics specific to the indicated frame type.
Flags that have no defined semantics for a particular frame type
MUST be ignored, and MUST be left unset (0x0) when sending.
R: A reserved 1-bit field. The semantics of this bit are undefined
and the bit MUST remain unset (0x0) when sending and MUST be
ignored when receiving.
Stream Identifier: A stream identifier (see Section 5.1.1) expressed
as an unsigned 31-bit integer. The value 0x0 is reserved for
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
on the frame type.
Belshe, et al. Expires August 15, 2015 [Page 13]
Internet-Draft HTTP/2 February 2015
4.2. Frame Size
The size of a frame payload is limited by the maximum size that a
receiver advertises in the SETTINGS_MAX_FRAME_SIZE setting. This
setting can have any value between 2^14 (16,384) and 2^24-1
(16,777,215) octets, inclusive.
All implementations MUST be capable of receiving and minimally
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
when describing frame sizes.
Note: Certain frame types, such as PING (Section 6.7), impose
additional limits on the amount of payload data allowed.
An endpoint MUST send a FRAME_SIZE_ERROR error if a frame exceeds the
size defined in SETTINGS_MAX_FRAME_SIZE, any limit defined for the
frame type, or it is too small to contain mandatory frame data. A
frame size error in a frame that could alter the state of the entire
connection MUST be treated as a connection error (Section 5.4.1);
this includes any frame carrying a header block (Section 4.3) (that
is, HEADERS, PUSH_PROMISE, and CONTINUATION), SETTINGS, and any frame
with a stream identifier of 0.
Endpoints are not obligated to use all available space in a frame.
Responsiveness can be improved by using frames that are smaller than
the permitted maximum size. Sending large frames can result in
delays in sending time-sensitive frames (such as RST_STREAM,
WINDOW_UPDATE, or PRIORITY) which if blocked by the transmission of a
large frame, could affect performance.
4.3. Header Compression and Decompression
Just as in HTTP/1, a header field in HTTP/2 is a name with one or
more associated values. They are used within HTTP request and
response messages as well as server push operations (see
Section 8.2).
Header lists are collections of zero or more header fields. When
transmitted over a connection, a header list is serialized into a
header block using HTTP Header Compression [COMPRESSION]. The
serialized header block is then divided into one or more octet
sequences, called header block fragments, and transmitted within the
payload of HEADERS (Section 6.2), PUSH_PROMISE (Section 6.6) or
CONTINUATION (Section 6.10) frames.
The Cookie header field [COOKIE] is treated specially by the HTTP
mapping (see Section 8.1.2.5).
Belshe, et al. Expires August 15, 2015 [Page 14]
Internet-Draft HTTP/2 February 2015
A receiving endpoint reassembles the header block by concatenating
its fragments, then decompresses the block to reconstruct the header
list.
A complete header block consists of either:
o a single HEADERS or PUSH_PROMISE frame, with the END_HEADERS flag
set, or
o a HEADERS or PUSH_PROMISE frame with the END_HEADERS flag cleared
and one or more CONTINUATION frames, where the last CONTINUATION
frame has the END_HEADERS flag set.
Header compression is stateful. One compression context and one
decompression context is used for the entire connection. A decoding
error in a header block MUST be treated as a connection error
(Section 5.4.1) of type COMPRESSION_ERROR.
Each header block is processed as a discrete unit. Header blocks
MUST be transmitted as a contiguous sequence of frames, with no
interleaved frames of any other type or from any other stream. The
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,
PUSH_PROMISE or CONTINUATION frames, because these frames carry data
that can modify the compression context maintained by a receiver. An
endpoint receiving HEADERS, PUSH_PROMISE or CONTINUATION frames needs
to reassemble header blocks and perform decompression even if the
frames are to be discarded. A receiver MUST terminate the connection
with a connection error (Section 5.4.1) of type COMPRESSION_ERROR if
it does not decompress a header block.
5. Streams and Multiplexing
A "stream" is an independent, bi-directional sequence of frames
exchanged between the client and server within an HTTP/2 connection.
Streams have several important characteristics:
o A single HTTP/2 connection can contain multiple concurrently open
streams, with either endpoint interleaving frames from multiple
streams.
o Streams can be established and used unilaterally or shared by
either the client or server.
Belshe, et al. Expires August 15, 2015 [Page 15]
Internet-Draft HTTP/2 February 2015
o Streams can be closed by either endpoint.
o The order in which frames are sent on a stream is significant.
Recipients process frames in the order they are received. In
particular, the order of HEADERS, and DATA frames is semantically
significant.
o Streams are identified by an integer. Stream identifiers are
assigned to streams by the endpoint initiating the stream.
5.1. Stream States
The lifecycle of a stream is shown in Figure 2.
Belshe, et al. Expires August 15, 2015 [Page 16]
Internet-Draft HTTP/2 February 2015
+--------+
send PP | | recv PP
,--------| idle |--------.
/ | | \
v +--------+ v
+----------+ | +----------+
| | | send H / | |
,------| reserved | | recv H | reserved |------.
| | (local) | | | (remote) | |
| +----------+ v +----------+ |
| | +--------+ | |
| | recv ES | | send ES | |
| send H | ,-------| open |-------. | recv H |
| | / | | \ | |
| v v +--------+ v v |
| +----------+ | +----------+ |
| | half | | | half | |
| | closed | | send R / | closed | |
| | (remote) | | recv R | (local) | |
| +----------+ | +----------+ |
| | | | |
| | send ES / | recv ES / | |
| | 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)
PP: PUSH_PROMISE frame (with implied CONTINUATIONs)
ES: END_STREAM flag
R: RST_STREAM frame
Figure 2: Stream States
Note that this diagram shows stream state transitions and the frames
and flags that affect those transitions only. In this regard,
CONTINUATION frames do not result in state transitions; they are
effectively part of the HEADERS or PUSH_PROMISE that they follow.
For the purpose of state transitions, the END_STREAM flag is
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.
Belshe, et al. Expires August 15, 2015 [Page 17]
Internet-Draft HTTP/2 February 2015
Both endpoints have a subjective view of the state of a stream that
could be different when frames are in transit. Endpoints do not
coordinate the creation of streams; they are created unilaterally by
either endpoint. The negative consequences of a mismatch in states
are limited to the "closed" state after sending RST_STREAM, where
frames might be received for some time after closing.
Streams have the following states:
idle:
All streams start in the "idle" state.
The following transitions are valid from this state:
* Sending or receiving a HEADERS frame causes the stream to
become "open". The stream identifier is selected as described
in Section 5.1.1. The same HEADERS frame can also cause a
stream to immediately become "half closed".