idnits 2.17.1 draft-bishop-quic-http-and-qpack-03.txt: Checking boilerplate required by RFC 5378 and the IETF Trust (see https://trustee.ietf.org/license-info): ---------------------------------------------------------------------------- No issues found here. Checking nits according to https://www.ietf.org/id-info/1id-guidelines.txt: ---------------------------------------------------------------------------- No issues found here. Checking nits according to https://www.ietf.org/id-info/checklist : ---------------------------------------------------------------------------- ** The abstract seems to contain references ([RFC7540], [RFC7541], [I-D.ietf-quic-transport]), which it shouldn't. Please replace those with straight textual mentions of the documents in question. Miscellaneous warnings: ---------------------------------------------------------------------------- == The copyright year in the IETF Trust and authors Copyright Line does not match the current year == The document seems to lack the recommended RFC 2119 boilerplate, even if it appears to use RFC 2119 keywords. (The document does seem to have the reference to RFC 2119 which the ID-Checklist requires). -- The document date (August 14, 2017) is 2445 days in the past. Is this intentional? Checking references for intended status: Proposed Standard ---------------------------------------------------------------------------- (See RFCs 3967 and 4897 for information about using normative references to lower-maturity documents in RFCs) == Outdated reference: A later version (-34) exists of draft-ietf-quic-http-04 == Outdated reference: A later version (-34) exists of draft-ietf-quic-transport-04 ** Obsolete normative reference: RFC 7540 (Obsoleted by RFC 9113) Summary: 2 errors (**), 0 flaws (~~), 4 warnings (==), 1 comment (--). Run idnits with the --verbose option for more detailed information about the items above. -------------------------------------------------------------------------------- 2 QUIC Working Group M. Bishop 3 Internet-Draft Microsoft 4 Intended status: Standards Track August 14, 2017 5 Expires: February 15, 2018 7 Header Compression for HTTP/QUIC 8 draft-bishop-quic-http-and-qpack-03 10 Abstract 12 HTTP/2 [RFC7540] uses HPACK [RFC7541] for header compression. 13 However, HPACK relies on the in-order message-based semantics of the 14 HTTP/2 framing layer in order to function. Messages can only be 15 successfully decoded if processed by the decoder in the same order as 16 generated by the encoder. This draft refines HPACK to loosen the 17 ordering requirements for use over QUIC [I-D.ietf-quic-transport]. 19 Status of This Memo 21 This Internet-Draft is submitted in full conformance with the 22 provisions of BCP 78 and BCP 79. 24 Internet-Drafts are working documents of the Internet Engineering 25 Task Force (IETF). Note that other groups may also distribute 26 working documents as Internet-Drafts. The list of current Internet- 27 Drafts is at http://datatracker.ietf.org/drafts/current/. 29 Internet-Drafts are draft documents valid for a maximum of six months 30 and may be updated, replaced, or obsoleted by other documents at any 31 time. It is inappropriate to use Internet-Drafts as reference 32 material or to cite them other than as "work in progress." 34 This Internet-Draft will expire on February 15, 2018. 36 Copyright Notice 38 Copyright (c) 2017 IETF Trust and the persons identified as the 39 document authors. All rights reserved. 41 This document is subject to BCP 78 and the IETF Trust's Legal 42 Provisions Relating to IETF Documents 43 (http://trustee.ietf.org/license-info) in effect on the date of 44 publication of this document. Please review these documents 45 carefully, as they describe your rights and restrictions with respect 46 to this document. Code Components extracted from this document must 47 include Simplified BSD License text as described in Section 4.e of 48 the Trust Legal Provisions and are provided without warranty as 49 described in the Simplified BSD License. 51 Table of Contents 53 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 54 1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 3 55 2. QPACK . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 56 2.1. Basic model . . . . . . . . . . . . . . . . . . . . . . . 3 57 2.2. Changes to Static and Dynamic Tables . . . . . . . . . . 4 58 2.2.1. Changes to Header Table Size . . . . . . . . . . . . 4 59 2.2.2. Dynamic Table State Synchronization . . . . . . . . . 5 60 2.3. Header Management Streams . . . . . . . . . . . . . . . . 6 61 2.3.1. Insert . . . . . . . . . . . . . . . . . . . . . . . 6 62 2.3.2. Delete . . . . . . . . . . . . . . . . . . . . . . . 7 63 2.3.3. Delete-Ack . . . . . . . . . . . . . . . . . . . . . 10 64 2.4. Format of Encoded Headers on Message Streams . . . . . . 10 65 2.4.1. Indexed Header Field Representation . . . . . . . . . 10 66 2.4.2. Literal Header Field Representation . . . . . . . . . 11 67 3. Use in HTTP/QUIC . . . . . . . . . . . . . . . . . . . . . . 12 68 4. Performance Considerations . . . . . . . . . . . . . . . . . 12 69 5. Security Considerations . . . . . . . . . . . . . . . . . . . 13 70 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 13 71 7. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 13 72 8. Normative References . . . . . . . . . . . . . . . . . . . . 14 73 Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 14 75 1. Introduction 77 HPACK has a number of features that were intended to provide 78 performance advantages to HTTP/2, but which don't live well in an 79 out-of-order environment such as that provided by QUIC. 81 The largest challenge is the fact that elements are referenced by a 82 very fluid index. Not only is the index implicit when an item is 83 added to the header table, the index will change without notice as 84 other items are added to the header table. Static entries occupy the 85 first 61 values, followed by dynamic entries. A newly-added dynamic 86 entry would cause older dynamic entries to be evicted, and the 87 retained items are then renumbered beginning with 62. This means 88 that, without processing all preceding header sets, no index into the 89 dynamic table can be interpreted, and the index of a given entry 90 cannot be predicted. 92 Any solution to the above will almost certainly fall afoul of the 93 memory constraints the decompressor imposes. The automatic eviction 94 of entries is done based on the compressor's declared dynamic table 95 size, which MUST be less than the maximum permitted by the 96 decompressor (and relayed using an HTTP/2 SETTINGS value). 98 Further, streams in QUIC are lossy in the presence of stream resets. 99 While HTTP/2 (via TCP) guarantees the delivery of all previously-sent 100 data on a stream even if that stream is reset, QUIC does not 101 retransmit lost frames if a stream has been reset, and may discard 102 data which has not yet been delivered to the application. 104 Previous versions of QPACK were small deltas of HPACK to introduce 105 order-resiliency. This version departs from HPACK more substantially 106 to add resilience against reset message streams. 108 In the following sections, this document proposes a new version of 109 HPACK which makes different trade-offs, enabling partial out-of-order 110 interpretation and bounded memory consumption with minimal head-of- 111 line blocking. None of the proposed improvements to HPACK (strongly- 112 typed fields, binary compression of common header syntax) are 113 currently included, but certainly could be. 115 1.1. Terminology 117 In this document, the key words "MUST", "MUST NOT", "REQUIRED", 118 "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", 119 and "OPTIONAL" are to be interpreted as described in BCP 14, 120 [RFC2119] and indicate requirement levels for compliant 121 implementations. 123 2. QPACK 125 2.1. Basic model 127 HPACK combines header table modification and message header emission 128 in a single sequence of coded bytes. QPACK bifurcates these into two 129 channels: 131 o Connection-wide sets of table update instructions sent on non- 132 request streams 134 o Non-modifying instructions which use the current header table 135 state to encode message headers on request streams 137 Because the per-message instructions introduce no changes to the 138 header table state, no state is lost if these instructions are 139 discarded due to a stream reset. Because the updates to the header 140 table supply their own order controls (the delete logic), they can be 141 processed in any order and therefore delivered as messages using 142 unidirectional QUIC streams. 144 2.2. Changes to Static and Dynamic Tables 146 QPACK uses two tables for associating header fields to indexes. The 147 static table is unchanged from [RFC7541]. 149 The dynamic table is a map from index to header field. Indices are 150 arbitrary numbers greater than the last index of the static table and 151 less than 2^27. Each insert instruction will specify the index being 152 modified. While any index MAY be chosen for a new entry, smaller 153 numbers will yield better compression performance. 155 The dynamic table is still constrained to the size specified by the 156 decoder. An attempt to add a header to the dynamic table which 157 causes it to exceed the maximum size MUST be treated as an error by a 158 decoder. To enable encoders to reclaim space, encoders can delete 159 entries in the dynamic table, but can only reuse the index or the 160 space after receiving confirmation of a successful deletion. 162 Because it is possible for QPACK frames to arrive which reference 163 indices which have not yet been defined, such frames MUST wait until 164 another frame has arrived and defined the index. In order to guard 165 against malicious peers, implementations SHOULD impose a time limit 166 and treat expiration of the timer as a decoding error. 168 2.2.1. Changes to Header Table Size 170 HTTP/QUIC prohibits mid-stream changes of settings. As a result, 171 only one table size change is possible: From the value a client 172 assumes during the 0-RTT flight to the actual value included in the 173 server's SETTINGS frame. The assumed value is required to be either 174 a server's previous value or zero. A server whose configuration has 175 recently changed MAY overlook inadvertent violations of its maximum 176 table size during the first round-trip. 178 In the case that the value has increased, either from zero to a non- 179 zero value or from the cached value to a higher value, no action is 180 required by the client. The encoder can simply begin using the 181 additional space. In the case that the value has decreased, the 182 encoder MUST immediately emit delete instructions which, upon 183 completion, would bring the table within the required size. 185 Regardless of changes to header table size, the encoder MUST NOT add 186 entries to the table which would result in a size greater than the 187 maximum permitted. This can imply that no additions are permitted 188 while waiting for these delete instructions to complete. 190 2.2.2. Dynamic Table State Synchronization 192 In order to ensure table consistency, all modifications of the header 193 table occur as separate messages rather than on request streams. 194 Request streams contain only indexed and literal header entries. 196 No entries are automatically evicted from the dynamic table. Size 197 management is purely the responsibility of the encoder, which MUST 198 NOT exceed the declared memory size of the decoder. 200 The encoder SHOULD track the following information about each entry 201 in the table: 203 o The list of recently-active streams which reference the entry in a 204 trailer block, if any 206 o The list of recently-active streams which reference the entry in a 207 non-trailer block, if any 209 "Recently-active" streams are those which are still open or were 210 closed less than a reasonable number of RTTs ago. An implementation 211 MAY vary its definition of "recent" to trade off memory consumption 212 and timely completion of deletes, and tracking no information is a 213 functional (though potentially less performant) choice in this space. 215 The encoder MUST consider memory as committed beginning when the 216 indexed entry is assigned. 218 When the encoder wishes to delete an inserted value, it flows through 219 the following set of states: 221 1. *Delete requested.* The encoder emits a delete instruction 222 indicating which streams might have referenced the entry. The 223 encoder MUST NOT reference the entry in any subsequent frame 224 until this state machine has completed and MUST continue to 225 include the entry in its calculation of consumed memory. 227 2. *Delete pending.* The decoder receives the delete instruction and 228 checks the current state of its incoming streams (see 229 Section 2.3.2.2). If more references might arrive, it stores the 230 streams still needed and waits for them to complete. 232 3. *Delete acknowledged.* The decoder has received all QPACK frames 233 which reference the deleted value, and can safely delete the 234 entry. The decoder SHOULD promptly emit a Delete-Ack instruction 235 on a header management stream. 237 4. *Delete completed.* When the encoder receives a Delete-Ack 238 instruction acknowledging the delete, it no longer counts the 239 size of the deleted entry against the table size and MAY emit 240 insert instructions for the field with a new value. 242 2.3. Header Management Streams 244 Header management streams are unidirectional streams in either 245 direction which contain a series of QPACK instructions with no 246 message boundaries. Data on these streams SHOULD be processed as 247 soon as it arrives. 249 This section describes the instructions which are possible on header 250 management streams. 252 2.3.1. Insert 254 An addition to the header table starts with the '1' one-bit pattern, 255 followed by the new index of the header represented as an integer 256 with a 7-bit prefix. This value is always greater than the number of 257 entries in the static table. 259 If the header field name matches the header field name of an entry 260 stored in the static table or the dynamic table, the header field 261 name can be represented using the index of that entry. In this case, 262 the index of the entry is represented as an integer with an 8-bit 263 prefix (see Section 5.1 of [RFC7541]). This value is always non- 264 zero. 266 0 1 2 3 4 5 6 7 267 +---+---+---+---+---+---+---+---+ 268 | 1 | New Index (7+) | 269 +---+---+-----------------------+ 270 | Name Index (8+) | 271 +---+---------------------------+ 272 | H | Value Length (7+) | 273 +---+---------------------------+ 274 | Value String (Length octets) | 275 +-------------------------------+ 277 Insert Header Field -- Indexed Name 279 Otherwise, the header field name is represented as a string literal 280 (see Section 5.2 of [RFC7541]). A value 0 is used in place of the 281 8-bit index, followed by the header field name. 283 0 1 2 3 4 5 6 7 284 +---+---+---+---+---+---+---+---+ 285 | 1 | New Index (7+) | 286 +---+---+-----------------------+ 287 | 0 | 288 +---+---+-----------------------+ 289 | H | Name Length (7+) | 290 +---+---------------------------+ 291 | Name String (Length octets) | 292 +---+---------------------------+ 293 | H | Value Length (7+) | 294 +---+---------------------------+ 295 | Value String (Length octets) | 296 +-------------------------------+ 298 Insert Header Field -- New Name 300 Either form of header field name representation is followed by the 301 header field value represented as a string literal (see Section 5.2 302 of [RFC7541]). 304 An encoder MUST NOT attempt to place a value at an index not known to 305 be vacant. A decoder MUST treat the attempt to insert into an 306 occupied slot as a fatal error. 308 2.3.2. Delete 310 A deletion from the header table starts with the '00' two bit 311 pattern, followed by the index of the affected entry represented as 312 an integer with a 6-bit prefix. This value is always greater than 313 the number of entries in the static table. 315 A delete instruction then encodes a series of stream IDs which might 316 have contained references to the entry in question. 318 0 1 2 3 4 5 6 7 319 +---+---+---+---+---+---+---+---+ 320 | 0 | 0 | Index (6+) | 321 +---+---+-----------------------+ 322 | Non-Trailer List (*) ... 323 +-------------------------------+ 324 | Trailer List (*) ... 325 +-------------------------------+ 327 Delete Instruction 329 Both the Non-Trailer List and Trailer List are Stream ID Lists (see 330 below) encoding a list of streams which might have referenced the 331 entry either in non-trailer or trailer blocks. 333 2.3.2.1. Stream ID List 335 A Stream ID List encodes a sequence of stream IDs in two parts: 336 First, a Horizon value indicates the first non-occurrence about which 337 data is maintained. If data is maintained from the beginning of the 338 connection, the Horizon is zero. This allows senders to succinctly 339 express both old state which has been discarded and large regions 340 where many or all streams contain references. 342 Following the horizon, a sequence of deltas indicates all streams 343 since the Horizon on which a value has been used. 345 This structure permits either side to adjust the amount of tracking 346 complexity it is willing to devote to ensure timely deletions. In 347 the simplest case, a Stream ID List might be a horizon value followed 348 by one zero byte. This indicates an absolute cut-off after which the 349 entry is guaranteed not to be referenced, and requires the receiver 350 to wait until all prior requests have been completed. Similarly, the 351 receiver can create equivalent-but-less-complex forms of a Stream ID 352 list by increasing the Horizon value and discarding all explicit 353 stream entries less than the new value. 355 0 1 2 3 4 5 6 7 356 +-------------------------------+ 357 | Horizon (8+) | 358 +-------------------------------+ 359 | NumEntries (8+) | 360 +-------------------------------+ 361 | [Delta1 (8+)] | 362 +-------------------------------+ 363 | [Delta2 (8+)] | 364 +-------------------------------+ 365 ... 366 +-------------------------------+ 367 | [DeltaN (8+)] | 368 +-------------------------------+ 370 Stream ID List 372 The field are as follows: 374 Horizon: The ID of the first stream for which the sender retains 375 state which does not reference the deleted entry in the indicated 376 block 378 NumEntries: The number of streams greater than the Horizon which 379 might reference the entry and are listed in the remainder of the 380 instruction 382 Delta1..N: A sequence of streams greater than the Horizon which 383 might reference the entry, encoded as the difference in stream 384 number from the previously-listed stream. This field is repeated 385 NumEntries times. 387 2.3.2.2. Delete Validation 389 In order to safely delete an entry, a decoder MUST ensure that all 390 outstanding references have arrived and been processed. Because no 391 data is available about stream IDs less than the Horizon, a decoder 392 MUST assume that any earlier stream ID might have contained a 393 reference to the value in question. 395 A decoder can ensure all outstanding references have been processed 396 by verifying that the following statements are true: 398 o In the Non-Trailer Block, all streams less than the Horizon and 399 all streams explicitly listed are in one of two states: 401 * closed 403 * headers completely processed 405 o In the Trailer Block, all streams less than the Horizon and all 406 streams explicitly listed are in one of three states: 408 * closed 410 * headers completely processed AND no trailers are expected 412 * trailers completely processed 414 An implementation MAY omit the "trailers completely processed" case, 415 since the stream is expected to close immediately after receipt of 416 the trailers block. 418 If these conditions are not met upon receipt of a Delete instruction, 419 a decoder MUST wait to emit a Delete-Ack instruction until the 420 outstanding streams have reached an appropriate state. 422 Note that a decoder MAY condense the list of specified streams by 423 increasing the Horizon value and discarding those explicitly-listed 424 stream IDs which are less than the new Horizon it has chosen. This 425 delays delete completion, but reduces the amount of state to be 426 tracked by the decoder without changing the correctness of the 427 requirements above. 429 2.3.3. Delete-Ack 431 Confirmation that a delete has completed is expressed by an 432 instruction which starts with the '01' two-bit pattern, followed by 433 the index of the affected entry represented as an integer with a 434 6-bit prefix. This value is always greater than the number of 435 entries in the static table. 437 Note that unlike all other instructions, this instruction refers to 438 the receiver's dynamic table, not the sender's. 440 0 1 2 3 4 5 6 7 441 +---+---+---+---+---+---+---+---+ 442 | 0 | 1 | Index (6+) | 443 +---+---+-----------------------+ 445 Delete-Ack Instruction 447 This instruction MUST NOT be sent before the conditions described in 448 Section 2.3.2.2 have been satisfied, and SHOULD be sent as soon as 449 possible once they are. 451 2.4. Format of Encoded Headers on Message Streams 453 Frames which carry HTTP message headers encode them using the 454 following instructions: 456 2.4.1. Indexed Header Field Representation 458 An indexed header field representation identifies an entry in either 459 the static table or the dynamic table and causes that header field to 460 be added to the decoded header list, as described in Section 3.2 of 461 [RFC7541]. 463 0 1 2 3 4 5 6 7 464 +---+---+---+---+---+---+---+---+ 465 | 1 | Index (7+) | 466 +---+---------------------------+ 468 Indexed Header Field 470 An indexed header field starts with the '1' 1-bit pattern, followed 471 by the index of the matching header field, represented as an integer 472 with a 7-bit prefix (see Section 5.1 of [RFC7541]). 474 The index value of 0 is not used. It MUST be treated as a decoding 475 error if found in an indexed header field representation. 477 2.4.2. Literal Header Field Representation 479 A literal header field representation starts with the '0' 1-bit 480 pattern and causes a header field to be added the decoded header 481 list. 483 The second bit, 'N', indicates whether an intermediary is permitted 484 to add this header to the dynamic header table on subsequent hops. 485 When the 'N' bit is set, the encoded header MUST always be encoded 486 with this specific literal representation. In particular, when a 487 peer sends a header field that it received represented as a literal 488 header field with the 'N' bit set, it MUST use the same 489 representation to forward this header field. This bit is intended 490 for protecting header field values that are not to be put at risk by 491 compressing them (see Section 7.1 of [RFC7541] for more details). 493 If the header field name matches the header field name of an entry 494 stored in the static table or the dynamic table, the header field 495 name can be represented using the index of that entry. In this case, 496 the index of the entry is represented as an integer with a 6-bit 497 prefix (see Section 5.1 of [RFC7541]). This value is always non- 498 zero. 500 0 1 2 3 4 5 6 7 501 +---+---+---+---+---+---+---+---+ 502 | 0 | N | Name Index (6+) | 503 +---+---+-----------------------+ 504 | H | Value Length (7+) | 505 +---+---------------------------+ 506 | Value String (Length octets) | 507 +-------------------------------+ 509 Literal Header Field -- Indexed Name 511 Otherwise, the header field name is represented as a string literal 512 (see Section 5.2 of [RFC7541]). A value 0 is used in place of the 513 6-bit index, followed by the header field name. 515 0 1 2 3 4 5 6 7 516 +---+---+---+---+---+---+---+---+ 517 | 0 | N | 0 | 518 +---+---+-----------------------+ 519 | H | Name Length (7+) | 520 +---+---------------------------+ 521 | Name String (Length octets) | 522 +---+---------------------------+ 523 | H | Value Length (7+) | 524 +---+---------------------------+ 525 | Value String (Length octets) | 526 +-------------------------------+ 528 Literal Header Field -- Literal Name 530 Either form of header field name representation is followed by the 531 header field value represented as a string literal (see Section 5.2). 533 3. Use in HTTP/QUIC 535 HTTP/QUIC [I-D.ietf-quic-http] currently retains the HPACK encoder/ 536 decoder from HTTP/2, using a Sequence number to enforce ordering. 537 Using QPACK instead would entail the following changes: 539 o The Sequence field is removed from HEADERS frames (Section 5.2.2) 540 and PUSH_PROMISE frames (Section 5.2.6). 542 o Header Block Fragments consist of QPACK data instead of HPACK 543 data. 545 o Just as unidirectional push streams have a stream header 546 identifying their type and Push ID, a header will need to be added 547 to differentiate header table update streams from requests and 548 pushes. 550 A HEADERS or PUSH_PROMISE frame MAY contain an arbitrary number of 551 QPACK instructions, but QPACK instructions SHOULD NOT cross a 552 boundary between successive HEADERS frames. A partial HEADERS or 553 PUSH_PROMISE frame MAY be processed upon arrival and the resulting 554 partial header set emitted or buffered according to implementation 555 requirements. 557 4. Performance Considerations 559 While QPACK is designed to minimize head-of-line blocking between 560 streams on header decoding, there are some situations in which lost 561 or delayed packets can still impact the performance of header 562 compression. 564 References to indexed entries will block if the frame containing the 565 entry definition is lost or delayed. Encoders MAY choose to trade 566 off compression efficiency and avoid blocking by using literal 567 instructions rather than referencing the dynamic table until the 568 insertion is believed to be complete. 570 Since it is possible to insert header values without emitting them on 571 a stream, an encoder MAY proactively insert header values which it 572 believes will be needed on future requests. 574 Delayed frames which prevent deletes from completing can prevent the 575 encoder from adding any new entries due to the maximum table size. 576 This does not block the encoder from continuing to make requests, but 577 could sharply limit compression performance. Encoders would be well- 578 served to delete entries in advance of encountering the table 579 maximum. Decoders SHOULD be prompt about emitting Delete-Ack 580 instructions to enable the encoder to recover the table space. 582 The ability to split updates to the header table into discrete 583 messages reduces the possibility for head-of-line blocking within the 584 table update streams. Implementations SHOULD limit the size of table 585 update messages to avoid head-of-line blocking within these messages. 587 5. Security Considerations 589 A malicious encoder might attempt to consume a large amount of space 590 on the decoder by opening the maximum number of streams, adding 591 entries to the table, then sending delete instructions enumerating 592 many streams in a Stream ID List. 594 To guard against such attacks, a decoder SHOULD bound its state 595 tracking by generalizing the list of streams to be tracked. This is 596 most easily achieved by advancing the Horizon to a later value and 597 discarding explicit Stream IDs to track, but can also be accomplished 598 by eliding explicit streams in ranges. This does not cause any loss 599 of consistency for deletes, but could delay completion and reduce 600 performance if done aggressively. 602 6. IANA Considerations 604 This document currently makes no request of IANA, and might not need 605 to. 607 7. Acknowledgements 609 This draft draws heavily on the text of [RFC7541]. The indirect 610 input of those authors is gratefully acknowledged, as well as ideas 611 gleefully stolen from: 613 o Jana Iyengar 615 o Patrick McManus 617 o Martin Thomson 619 o Charles 'Buck' Krasic 621 o Kyle Rose 623 8. Normative References 625 [I-D.ietf-quic-http] 626 Bishop, M., "Hypertext Transfer Protocol (HTTP) over 627 QUIC", draft-ietf-quic-http-04 (work in progress), June 628 2017. 630 [I-D.ietf-quic-transport] 631 Iyengar, J. and M. Thomson, "QUIC: A UDP-Based Multiplexed 632 and Secure Transport", draft-ietf-quic-transport-04 (work 633 in progress), June 2017. 635 [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate 636 Requirement Levels", BCP 14, RFC 2119, 637 DOI 10.17487/RFC2119, March 1997, 638 . 640 [RFC7540] Belshe, M., Peon, R., and M. Thomson, Ed., "Hypertext 641 Transfer Protocol Version 2 (HTTP/2)", RFC 7540, 642 DOI 10.17487/RFC7540, May 2015, 643 . 645 [RFC7541] Peon, R. and H. Ruellan, "HPACK: Header Compression for 646 HTTP/2", RFC 7541, DOI 10.17487/RFC7541, May 2015, 647 . 649 Author's Address 651 Mike Bishop 652 Microsoft 654 Email: michael.bishop@microsoft.com