idnits 2.17.1 draft-mcquistin-quic-augmented-diagrams-01.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 document seems to lack a Security Considerations section. ** The document seems to lack an IANA Considerations section. (See Section 2.2 of https://www.ietf.org/id-info/checklist for how to handle the case when there are no actions for IANA.) ** The document seems to lack a both a reference to RFC 2119 and the recommended RFC 2119 boilerplate, even if it appears to use RFC 2119 keywords. RFC 2119 keyword, line 184: '...in this version and MUST be discarded....' RFC 2119 keyword, line 234: '...server. Clients MUST ignore the value...' RFC 2119 keyword, line 235: '... field. Servers SHOULD set the most s...' RFC 2119 keyword, line 240: '...gotiation packet MUST be set to 0x0000...' RFC 2119 keyword, line 289: '...in this version and MUST be discarded....' (17 more instances...) Miscellaneous warnings: ---------------------------------------------------------------------------- == The copyright year in the IETF Trust and authors Copyright Line does not match the current year -- The document date (17 June 2020) is 1407 days in the past. Is this intentional? Checking references for intended status: Experimental ---------------------------------------------------------------------------- == Missing Reference: 'Version' is mentioned on line 258, but not defined == Missing Reference: 'Frame' is mentioned on line 737, but not defined == Outdated reference: A later version (-34) exists of draft-ietf-quic-transport-27 == Outdated reference: A later version (-13) exists of draft-mcquistin-augmented-ascii-diagrams-05 Summary: 3 errors (**), 0 flaws (~~), 5 warnings (==), 1 comment (--). Run idnits with the --verbose option for more detailed information about the items above. -------------------------------------------------------------------------------- 2 Network Working Group S. McQuistin 3 Internet-Draft V. Band 4 Intended status: Experimental D. Jacob 5 Expires: 19 December 2020 C. S. Perkins 6 University of Glasgow 7 17 June 2020 9 Describing QUIC's Protocol Data Units with Augmented Packet Header 10 Diagrams 11 draft-mcquistin-quic-augmented-diagrams-01 13 Abstract 15 This document describes the core transport protocol data units used 16 in the QUIC protocol using a machine-readable augmented packet header 17 diagram format. It is intended as an example of the packet header 18 diagram language, and not as a contribution to the development of the 19 QUIC protocol. 21 Status of This Memo 23 This Internet-Draft is submitted in full conformance with the 24 provisions of BCP 78 and BCP 79. 26 Internet-Drafts are working documents of the Internet Engineering 27 Task Force (IETF). Note that other groups may also distribute 28 working documents as Internet-Drafts. The list of current Internet- 29 Drafts is at https://datatracker.ietf.org/drafts/current/. 31 Internet-Drafts are draft documents valid for a maximum of six months 32 and may be updated, replaced, or obsoleted by other documents at any 33 time. It is inappropriate to use Internet-Drafts as reference 34 material or to cite them other than as "work in progress." 36 This Internet-Draft will expire on 19 December 2020. 38 Copyright Notice 40 Copyright (c) 2020 IETF Trust and the persons identified as the 41 document authors. All rights reserved. 43 This document is subject to BCP 78 and the IETF Trust's Legal 44 Provisions Relating to IETF Documents (https://trustee.ietf.org/ 45 license-info) in effect on the date of publication of this document. 46 Please review these documents carefully, as they describe your rights 47 and restrictions with respect to this document. Code Components 48 extracted from this document must include Simplified BSD License text 49 as described in Section 4.e of the Trust Legal Provisions and are 50 provided without warranty as described in the Simplified BSD License. 52 Table of Contents 54 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 55 2. Header and Packet Protection . . . . . . . . . . . . . . . . 3 56 3. Variable Length Integer Encoding . . . . . . . . . . . . . . 4 57 4. Stateless Reset . . . . . . . . . . . . . . . . . . . . . . . 4 58 5. Version Negotiation Packet . . . . . . . . . . . . . . . . . 5 59 6. Long Header Packets . . . . . . . . . . . . . . . . . . . . . 6 60 6.1. Initial Packet . . . . . . . . . . . . . . . . . . . . . 9 61 6.2. 0RTT Packet . . . . . . . . . . . . . . . . . . . . . . . 11 62 6.3. Handshake Packet . . . . . . . . . . . . . . . . . . . . 12 63 6.4. Retry Packet . . . . . . . . . . . . . . . . . . . . . . 13 64 7. Short Header Packets . . . . . . . . . . . . . . . . . . . . 14 65 8. Frames and Frame Formats . . . . . . . . . . . . . . . . . . 17 66 8.1. PADDING frame . . . . . . . . . . . . . . . . . . . . . . 17 67 8.2. PING frame . . . . . . . . . . . . . . . . . . . . . . . 17 68 8.3. ACK frame . . . . . . . . . . . . . . . . . . . . . . . . 17 69 8.4. RESET_STREAM frame . . . . . . . . . . . . . . . . . . . 20 70 8.5. STOP_SENDING frame . . . . . . . . . . . . . . . . . . . 20 71 8.6. CRYPTO frame . . . . . . . . . . . . . . . . . . . . . . 21 72 8.7. NEW_TOKEN frame . . . . . . . . . . . . . . . . . . . . . 21 73 8.8. STREAM frame . . . . . . . . . . . . . . . . . . . . . . 22 74 8.9. MAX_DATA frame . . . . . . . . . . . . . . . . . . . . . 23 75 8.10. MAX_STREAM_DATA frame . . . . . . . . . . . . . . . . . . 24 76 8.11. MAX_STREAMS frame . . . . . . . . . . . . . . . . . . . . 24 77 8.12. DATA_BLOCKED frame . . . . . . . . . . . . . . . . . . . 25 78 8.13. STREAM_DATA_BLOCKED frame . . . . . . . . . . . . . . . . 25 79 8.14. STREAMS_BLOCKED frame . . . . . . . . . . . . . . . . . . 26 80 8.15. NEW_CONNECTION_ID frame . . . . . . . . . . . . . . . . . 26 81 8.16. RETIRE_CONNECTION_ID frame . . . . . . . . . . . . . . . 27 82 8.17. PATH_CHALLENGE frame . . . . . . . . . . . . . . . . . . 27 83 8.18. PATH_RESPONSE frame . . . . . . . . . . . . . . . . . . . 28 84 8.19. CONNECTION_CLOSE frame . . . . . . . . . . . . . . . . . 28 85 8.20. HANDSHAKE_DONE frame . . . . . . . . . . . . . . . . . . 29 86 9. Informative References . . . . . . . . . . . . . . . . . . . 30 87 Appendix A. Source code repository . . . . . . . . . . . . . . . 30 88 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 30 90 1. Introduction 92 The augmented packet header diagram format [AUGMENTED-DIAGRAMS] 93 enables documents to specify the syntax of protocol data units in a 94 way that enables support for automated parser generation, while 95 maintaining human readability. 97 To demonstrate how this approach can be applied, and the value that 98 it can provide, this document describes QUIC [QUIC-TRANSPORT] using 99 the augment packet header diagram format. 101 This document is not an exhaustive description of the QUIC protocol. 102 It contains only those elements necessary to demonstrate the 103 augmented packet header diagram format, and should be read as an 104 example of the use of that format. 106 This document describes the QUIC protocol. The QUIC protocol uses 107 Stateless Reset Packets, Protected Packets, Retry Packets, and 108 Version Negotiation Packets. 110 2. Header and Packet Protection 112 A Protected Packet is either a Protected Long Header Packet or a 113 Protected Short Header Packet. 115 An Unprotected Packet is either a Long Header Packet or a Short 116 Header Packet. 118 An Unprotected Packet is parsed from a Protected Packet using the 119 remove_protection function. The remove_protection function is 120 defined as: 122 func remove_protection(from: Protected Packet) -> Unprotected Packet: 123 remove header protection from protected_packet 124 remove packet protection from protected_packet 125 construct appropriate packet type 126 return Unprotected Packet 128 An Unprotected Packet is serialised to a Protected Packet using the 129 apply_protection function. The apply_protection function is defined 130 as: 132 func apply_protection(to: Unprotected Packet) 133 -> Protected Packet: 134 apply packet protection to payload 135 apply header protection to first_byte and packet_number 136 construct appropriate Protected Packet based on first_byte 137 return Protected Packet 139 3. Variable Length Integer Encoding 141 A Variable Length Integer Encoding is formatted as follows: 143 0 1 2 3 144 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 145 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 146 |Len| 147 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 148 | Value ... 149 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 151 where: 153 Len: 2 bits. The base 2 logarithm of the integer encoding length in 154 bytes. 156 Value: ((2^Len)*8)-2 bits. The integer value encoded in network byte 157 order. 159 4. Stateless Reset 161 A Stateless Reset Packet is formatted as follows: 163 0 1 2 3 164 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 165 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 166 |0|1| Unpredictable Bits ... 167 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 168 | | 169 + + 170 | | 171 + Stateless Reset Token + 172 | | 173 + + 174 | | 175 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 177 where: 179 Header Form (HF): 1 bit; HF == 0. The most significant bit (0x80) of 180 byte 0 (the first byte) is set to 0 for stateless reset packets. 182 Fixed Bit (FB): 1 bit; FB == 1. The next bit (0x40) of byte 0 is set 183 to 1. Packets containing a zero value for this bit are not valid 184 packets in this version and MUST be discarded. 186 Unpredictable Bits (UB): UB.Size > 38. The remainder of the first 187 byte and an arbitrary number of bytes following it that are set to 188 unpredictable values. 190 Stateless Reset Token: 128 bits. The last 16 bytes of the datagram 191 contain a Stateless Reset Token. 193 5. Version Negotiation Packet 195 A Version is formatted as follows: 197 0 1 2 3 198 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 199 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 200 | Version identifier | 201 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 203 where: 205 Version identifier (ID): 32 bits. 32-bit version identifier. 207 A Version Negotiation Packet is formatted as follows: 209 0 1 2 3 210 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 211 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 212 |1| Unused | 213 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 214 | Version ID | 215 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 216 | DCID Len | 217 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 218 | Destination Connection ID ... 219 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 220 | SCID Len | 221 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 222 | Source Connection ID ... 223 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 224 | [Supported Versions] | 225 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 227 where: 229 Header Form (HF): 1 bit; HF == 1. The most significant bit (0x80) of 230 byte 0 (the first byte) is set to 1 for version negotiation 231 packets. 233 Unused (T): 6 bits. The value in the Unused field is selected 234 randomly by the server. Clients MUST ignore the value of this 235 field. Servers SHOULD set the most significant bit of this field 236 (0x40) to 1 so that Version Negotiation packets appear to have the 237 Fixed Bit field. 239 Version ID (VID): 1 Version; VID.ID == 0. The Version field of a 240 Version Negotiation packet MUST be set to 0x0000000. 242 DCID Len (DLen): 1 byte. This field is as previously define. 243 However, as future versions of QUIC may support Connection IDs 244 larger than the version 1 limit, Version Negotiation packets could 245 carry Connection IDs that are longer than 20 bytes. 247 Destination Connection ID: DLen bytes. The Destination Connection ID 248 field is between 0 and 2^8-1 bytes in length. 250 SCID Len (SLen): 1 byte. This field is as previously define. 251 However, as future versions of QUIC may support Connection IDs 252 larger than the version 1 limit, Version Negotiation packets could 253 carry Connection IDs that are longer than 20 bytes. 255 Source Connection ID: SLen bytes. The Source Connection ID field is 256 between 0 and 2^8-1 bytes in length. 258 Supported Versions: [Version]. The remainder of the Version 259 Negotiation packet is a list of 32-bit versions which the server 260 supports. 262 6. Long Header Packets 264 A Long Header is formatted as follows: 266 0 1 2 3 267 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 268 +-+-+-+-+-+-+-+-+ 269 |1|1| T | R | P | 270 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 271 | Version ID | 272 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 273 | DCID Len | 274 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 275 | Destination Connection ID (DCID) ... 276 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 277 | SCID Len | 278 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 279 | Source Connection ID (SCID) ... 280 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 282 where: 284 Header Form (HF): 1 bit; HF == 1. The most significant bit (0x80) of 285 byte 0 (the first byte) is set to 1 for long headers. 287 Fixed Bit (FB): 1 bit; FB == 1. The next bit (0x40) of byte 0 is set 288 to 1. Packets containing a zero value for this bit are not valid 289 packets in this version and MUST be discarded. 291 Long Packet Type (T): 2 bits. The next two bits (those with a mask 292 of 0x30) of byte 0 contain a packet type. 294 Reserved Bits (R): 2 bits. Two bits (those with a mask of 0x0c) of 295 byte 0 are reserved across multiple packet types. These bits are 296 protected using header protection. 298 Packet Number Length (P): 2 bits. In packet types which contain a 299 Packet Number field, the least significant two bits (those with a 300 mask of 0x03) of byte 0 contain the length of the packet number, 301 encoded as an unsigned, two-bit integer that is one less than the 302 length of the packet number field in bytes. 304 Version ID (VID): 1 Version. This field indicates which version of 305 QUIC is in use and determines how the rest of the protocol fields 306 are interpreted. 308 DCID Len (DLen): 1 byte; DLen <= 20. This field contains the length, 309 in bytes, of the Destination Connection ID field that follows it. 310 This length is encoded as an 8-bit unsigned integer. In QUIC 311 version 1, this value MUST NOT exceed 20. Endpoints that receive 312 a version 1 long header with a value larger than 20 MUST drop the 313 packet. Servers SHOULD be able to read longer connection IDs from 314 other QUIC versions in order to properly form a version 315 negotiation packet. 317 Destination Connection ID (DCID): DLen bytes. The Destination 318 Connection ID field is between 0 and 20 bytes in length. 320 SCID Len (SLen): 1 byte; SLen <= 20. This field contains the length, 321 in bytes, of the Source Connection ID field that follows it. This 322 length is encoded as an 8-bit unsigned integer. In QUIC version 323 1, this value MUST NOT exceed 20 bytes. Endpoints that receive a 324 version 1 long header with a value larger than 20 MUST drop the 325 packet. Servers SHOULD be able to read longer connection IDs from 326 other QUIC versions in order to properly form a version 327 negotiation packet. 329 Source Connection ID (SCID): SLen bytes. The Source Connection ID 330 field is between 0 and 20 bytes in length. 332 A Long Header Packet is one of: an Initial Packet, a 0RTT Packet, a 333 Handshake Packet, or a Retry Packet. 335 A Protected Long Header is formatted as follows: 337 0 1 2 3 338 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 339 +-+-+-+-+-+-+-+-+ 340 |1|1| T | PBits | 341 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 342 | Version ID | 343 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 344 | DCID Len | 345 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 346 | Destination Connection ID ... 347 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 348 | SCID Len | 349 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 350 | Source Connection ID ... 351 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 353 where: 355 Header Form (HF): 1 bit; HF == 1. The most significant bit (0x80) of 356 byte 0 (the first byte) is set to 1 for long headers. 358 Fixed Bit (FB): 1 bit; FB == 1. The next bit (0x40) of byte 0 is set 359 to 1. Packets containing a zero value for this bit are not valid 360 packets in this version and MUST be discarded. 362 Long Packet Type (T): 2 bits. The next two bits (those with a mask 363 of 0x30) of byte 0 contain a packet type. 365 Protected Bits (PBits): 4 bits. 4 bits protected using header 366 protection. 368 Version ID (VID): 1 Version. This field indicates which version of 369 QUIC is in use and determines how the rest of the protocol fields 370 are interpreted. 372 DCID Len (DLen): 1 byte; DLen <= 20. This field contains the length, 373 in bytes, of the Destination Connection ID field that follows it. 374 This length is encoded as an 8-bit unsigned integer. In QUIC 375 version 1, this value MUST NOT exceed 20. Endpoints that receive 376 a version 1 long header with a value larger than 20 MUST drop the 377 packet. Servers SHOULD be able to read longer connection IDs from 378 other QUIC versions in order to properly form a version 379 negotiation packet. 381 Destination Connection ID: DLen bytes. The Destination Connection ID 382 field is between 0 and 20 bytes in length. 384 SCID Len (SLen): 1 byte; SLen <= 20. This field contains the length, 385 in bytes, of the Source Connection ID field that follows it. This 386 length is encoded as an 8-bit unsigned integer. In QUIC version 387 1, this value MUST NOT exceed 20 bytes. Endpoints that receive a 388 version 1 long header with a value larger than 20 MUST drop the 389 packet. Servers SHOULD be able to read longer connection IDs from 390 other QUIC versions in order to properly form a version 391 negotiation packet. 393 Source Connection ID: SLen bytes. The Source Connection ID field is 394 between 0 and 20 bytes in length. 396 A Protected Long Header Packet is one of: a Protected Initial Packet, 397 a Protected 0RTT Packet, or a Protected Handshake Packet. 399 6.1. Initial Packet 401 An Initial Packet is formatted as follows: 403 0 1 2 3 404 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 405 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 406 | : 407 : Long Header : 408 : | 409 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 410 | Token Length ... 411 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 412 | Token ... 413 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 414 | Length ... 415 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 416 | Packet Number ... 417 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 418 | Payload ... 419 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 421 where: 423 Long Header (LH): 1 Long Header; LH.T == 0. An Initial packet uses 424 long headers with a type value of 0x0. On receipt, the value of 425 LH.DCID is stored as Initial DCID. 427 Token Length (TL): 1 Variable Length Integer Encoding. A variable- 428 length integer specifying the length of the Token field, in bytes. 430 Token: TL.Value bytes; present only when TL.Value > 0. The value of 431 the token that was previously provided in a Retry packet or 432 NEW_TOKEN frame. 434 Length: 1 Variable Length Integer Encoding. The length of the 435 remainder of the packet (that is, the Packet Number and Payload 436 fields) in bytes, encoded as a variable-length integer. 438 Packet Number: LH.P+1 bytes. The packet number field. 440 Payload: [Frame]. The payload field, comprised of multiple frames. 442 A Protected Initial packet is formatted as follows: 444 0 1 2 3 445 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 446 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 447 | : 448 : Long Header : 449 : | 450 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 451 | Token Length ... 452 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 453 | Token ... 454 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 455 | Length ... 456 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 457 | Protected Packet Number ... 458 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 459 | Protected Payload ... 460 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 462 where: 464 Long Header (LH): 1 Long Header; LH.T == 0. An Initial packet uses 465 long headers with a type value of 0x0. 467 Token Length (TL): 1 Variable Length Integer Encoding. A variable- 468 length integer specifying the length of the Token field, in bytes. 470 Token: TL.Value bytes; present only when TL.Value > 0. The value of 471 the token that was previously provided in a Retry packet or 472 NEW_TOKEN frame. 474 Length: 1 Variable Length Integer Encoding. The length of the 475 remainder of the packet (that is, the Packet Number and Payload 476 fields) in bytes, encoded as a variable-length integer. 478 Protected Packet Number: LH.P+1 bytes. The packet number field, with 479 header protection. 481 Protected Payload: (Length.Value-(LH.P+1)) bytes. The protected 482 payload field. 484 6.2. 0RTT Packet 486 A 0RTT Packet is formatted as follows: 488 0 1 2 3 489 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 490 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 491 | : 492 : Long Header : 493 : | 494 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 495 | Length ... 496 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 497 | Packet Number ... 498 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 499 | Payload ... 500 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 502 where: 504 Long Header (LH): 1 Long Header; LH.T == 1. A 0-RTT packet uses long 505 headers with a type value of 0x1. 507 Length: 1 Variable Length Integer Encoding. The length of the 508 remainder of the packet (that is, the Packet Number and Payload 509 fields) in bytes, encoded as a variable-length integer. 511 Packet Number: LH.P+1 bytes. The packet number field. 513 Payload: [Frame]. The payload field, comprised of multiple frames. 515 A Protected 0RTT Packet is formatted as follows: 517 0 1 2 3 518 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 519 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 520 | : 521 : Long Header : 522 : | 523 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 524 | Length ... 525 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 526 | Protected Packet Number ... 527 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 528 | Protected Payload ... 529 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 531 where: 533 Long Header (LH): 1 Long Header; LH.T == 1. A 0-RTT packet uses long 534 headers with a type value of 0x1. 536 Length: 1 Variable Length Integer Encoding. The length of the 537 remainder of the packet (that is, the Packet Number and Payload 538 fields) in bytes, encoded as a variable-length integer. 540 Protected Packet Number: LH.P+1 bytes. The packet number field, with 541 header protection. 543 Protected Payload: (Length.Value-(LH.P+1)) bytes. The protected 544 payload field. 546 6.3. Handshake Packet 548 A Handshake Packet is formatted as follows: 550 0 1 2 3 551 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 552 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 553 | : 554 : Long Header : 555 : | 556 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 557 | Length ... 558 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 559 | Packet Number ... 560 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 561 | Payload ... 562 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 564 where: 566 Long Header (LH): 1 Long Header; LH.T == 2. A Handshake packet uses 567 long headers with a type value of 0x2. 569 Length: 1 Variable Length Integer Encoding. The length of the 570 remainder of the packet (that is, the Packet Number and Payload 571 fields) in bytes, encoded as a variable-length integer. 573 Packet Number: LH.P+1 bytes. The packet number field. 575 Payload: [Frame]. The payload field, comprised of multiple frames. 577 A Protected Handshake packet is formatted as follows: 579 0 1 2 3 580 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 581 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 582 | : 583 : Long Header : 584 : | 585 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 586 | Length ... 587 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 588 | Protected Packet Number ... 589 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 590 | Protected Payload ... 591 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 593 where: 595 Long Header (LH): 1 Long Header; LH.T == 2. A Handshake packet uses 596 long headers with a type value of 0x2. 598 Length: 1 Variable Length Integer Encoding. The length of the 599 remainder of the packet (that is, the Packet Number and Payload 600 fields) in bytes, encoded as a variable-length integer. 602 Protected Packet Number: LH.P+1 bytes. The packet number field, with 603 header protection. 605 Protected Payload: (Length.Value-(LH.P+1)) bytes. The protected 606 payload field. 608 6.4. Retry Packet 610 A Retry Packet is formatted as follows: 612 0 1 2 3 613 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 614 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 615 | : 616 : Long Header : 617 : | 618 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 619 | Retry Token ... 620 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 621 | | 622 + + 623 | | 624 + Retry Integrity Tag + 625 | | 626 + + 627 | | 628 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 630 where: 632 Long Header (LH): 1 Long Header; LH.T == 3. A Retry packet uses long 633 headers with a type value of 0x3. 635 Retry Token. An opaque token that the server can use to validate the 636 client's address. 638 Retry Integrity Tag: 128 bits. Retry Integrity Tag field. 640 7. Short Header Packets 642 A Short Header Packet is formatted as follows: 644 0 1 2 3 645 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 646 +-+-+-+-+-+-+-+-+ 647 |0|1|S| R |K| P | 648 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 649 | Destination Connection ID ... 650 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 651 | Packet Number ... 652 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 653 | : 654 : Payload : 655 : | 656 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 658 where: 660 Header Form (HF): 1 bit; HF == 0. The most significant bit (0x80) of 661 byte 0 (the first byte) is set to 0 for short headers. 663 Fixed Bit (FB): 1 bit; FB == 1. The next bit (0x40) of byte 0 is set 664 to 1. Packets containing a zero value for this bit are not valid 665 packets in this version and MUST be discarded. 667 Spin Bit (S): 1 bit. The third most significant bit (0x20) of byte 0 668 is the latency spin bit. 670 Reserved Bits (R): 2 bits. The next two bits (those with a mask of 671 0x18) of byte 0 are reserved. These bits are protected using 672 header protection. The value included prior to protection MUST be 673 set to 0. 675 Key Phase (K): 1 bit. The next bit (0x04) of byte 0 indicates the 676 key phase, which allows a recipient of a packet to identify the 677 packet protection keys that are used to protect the packet. This 678 bit is protected using header protection. 680 Packet Number Length (P): 2 bits. In packet types which contain a 681 Packet Number field, the least significant two bits (those with a 682 mask of 0x03) of byte 0 contain the length of the packet number, 683 encoded as an unsigned, two-bit integer that is one less than the 684 length of the packet number field in bytes. These bits are 685 protected using header protection. 687 Destination Connection ID: 20 bytes. The Destination Connection ID 688 is a connection ID that is chosen by the intended recipient of the 689 packet. 691 Packet Number: P+1 bytes. The packet number field is 1 to 4 bytes 692 long. The packet number has confidentiality protection separate 693 from packet protection. The length of the packet number field is 694 encoded in Packet Number Length field. 696 Payload: [Frame]. The payload field, comprised of multiple frames. 698 A Protected Short Header Packet is formatted as follows: 700 0 1 2 3 701 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 702 +-+-+-+-+-+-+-+-+ 703 |0|1|S| ProcRKP | 704 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 705 | Destination Connection ID ... 706 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 707 | Protected Packet Number ... 708 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 709 | : 710 : Protected Payload : 711 : | 712 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 714 where: 716 Header Form (HF): 1 bit; HF == 0. The most significant bit (0x80) of 717 byte 0 (the first byte) is set to 0 for short headers. 719 Fixed Bit (FB): 1 bit; FB == 1. The next bit (0x40) of byte 0 is set 720 to 1. Packets containing a zero value for this bit are not valid 721 packets in this version and MUST be discarded. 723 Spin Bit (S): 1 bit. The third most significant bit (0x20) of byte 0 724 is the latency spin bit. 726 Protected Bits (ProcRKP): 5 bits. Five header protected bits. 728 Destination Connection ID: 20 bytes. The Destination Connection ID 729 is a connection ID that is chosen by the intended recipient of the 730 packet. 732 Packet Number. The packet number field is 1 to 4 bytes long. The 733 packet number has confidentiality protection separate from packet 734 protection. The length of the packet number field is encoded in 735 Packet Number Length field. 737 Protected Payload: [Frame]. Packets with a short header always 738 include a 1-RTT protected payload. 740 8. Frames and Frame Formats 742 A Frame is one of: a PADDING frame, a PING frame, an ACK frame, a 743 RESET_STREAM frame, a STOP_SENDING frame, a CRYPTO frame, a NEW_TOKEN 744 frame, a STREAM frame, a MAX_DATA frame, a MAX_STREAM_DATA frame, a 745 MAX_STREAMS frame, a DATA_BLOCKED frame, a STREAM_DATA_BLOCKED frame, 746 a STREAMS_BLOCKED frame, a NEW_CONNECTION_ID frame, a PATH_CHALLENGE 747 frame, a PATH_RESPONSE frame, a CONNECTION_CLOSE frame, or a 748 HANDSHAKE_DONE frame. 750 8.1. PADDING frame 752 A PADDING Frame is formatted as follows: 754 0 1 2 3 755 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 756 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 757 | 0 | 758 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 760 where: 762 Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == 763 0. Frame type, set to 0 for PADDING frames. 765 8.2. PING frame 767 A PING Frame is formatted as follows: 769 0 1 2 3 770 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 771 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 772 | 1 | 773 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 775 where: 777 Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == 778 1. Frame type, set to 1 for PING frames. 780 8.3. ACK frame 782 An ACK Range is formatted as follows: 784 0 1 2 3 785 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 786 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 787 | Gap ... 788 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 789 | ACK Packet Range ... 790 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 792 where: 794 Gap: 1 Variable Length Integer Encoding. A variable-length integer 795 indicating the number of contiguous unacknowledged packets 796 preceding the packet number one lower than the smallest in the 797 preceding ACK Range. 799 ACK Packet Range: 1 Variable Length Integer Encoding. A variable- 800 length integer indicating the number of contiguous acknowledged 801 packets preceding the largest packet number, as determined by the 802 preceding Gap. 804 An ECN Count is formatted as follows: 806 0 1 2 3 807 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 808 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 809 | ECT0 Count ... 810 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 811 | ECT1 Count ... 812 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 813 | ECNCE Count ... 814 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 816 where: 818 ECT0 Count: 1 Variable Length Integer Encoding. A variable-length 819 integer representing the total number of packets received with the 820 ECT(0) codepoint in the packet number space of the ACK frame. 822 ECT1 Count: 1 Variable Length Integer Encoding. A variable-length 823 integer representing the total number of packets received with the 824 ECT(1) codepoint in the packet number space of the ACK frame. 826 ECNCE Count: 1 Variable Length Integer Encoding. A variable-length 827 integer representing the total number of packets received with the 828 CE codepoint in the packet number space of the ACK frame. 830 An ACK Frame is formatted as follows: 832 0 1 2 3 833 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 834 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 835 | Frame Type | 836 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 837 | Largest Acknowledged ... 838 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 839 | ACK Delay ... 840 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 841 | ACK Range Count ... 842 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 843 | First ACK Range ... 844 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 845 | [Other ACK Ranges] ... 846 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 847 | ECN Counts ... 848 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 850 where: 852 Frame Type (FT): 1 Variable Length Integer Encoding; (FT.Value == 853 3) || (FT.Value == 4). Frame type, set to 3 or 4 for ACK frames. 855 Largest Acknowledged: 1 Variable Length Integer Encoding. A 856 variable-length integer representing the largest packet number the 857 peer is acknowledging; this is usually the largest packet number 858 that the peer has received prior to generating the ACK frame. 859 Unlike the packet number in the QUIC long or short header, the 860 value in an ACK frame is not truncated. 862 ACK Delay: 1 Variable Length Integer Encoding. A variable-length 863 integer representing the time delta in microseconds between when 864 this ACK was sent and when the largest acknowledged packet, as 865 indicated in the Largest Acknowledged field, was received by this 866 peer. 868 ACK Range Count: 1 Variable Length Integer Encoding. A variable- 869 length integer specifying the number of Gap and ACK Range fields 870 in the frame. 872 First ACK Range: 1 ACK Range. The First ACK Range is encoded as an 873 ACK Range starting from the Largest Acknowledged. 875 Other ACK Ranges: [ACK Range]. Contains additional ranges of packets 876 which are alternately not acknowledged and acknowledged. 878 ECN Counts: 1 ECN Count; present only when FT.Value == 3. The three 879 ECN Counts. 881 8.4. RESET_STREAM frame 883 A RESET_STREAM Frame is formatted as follows: 885 0 1 2 3 886 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 887 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 888 | 4 | 889 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 890 | Stream ID ... 891 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 892 | Application Error Code ... 893 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 894 | Final Size ... 895 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 897 where: 899 Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == 900 4. Frame type, set to 4 for RESET_STREAM frames. 902 Stream ID: 1 Variable Length Integer Encoding. A variable-length 903 integer encoding of the Stream ID of the stream being terminated. 905 Application Error Code: 1 Variable Length Integer Encoding. A variab 906 le-length integer containing the application protocol error code 907 which indicates why the stream is being closed. 909 Final Size: 1 Variable Length Integer Encoding. A variable-length 910 integer indicating the final size of the stream by the 911 RESET_STREAM sender, in unit of bytes. 913 8.5. STOP_SENDING frame 915 A STOP_SENDING Frame is formatted as follows: 917 0 1 2 3 918 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 919 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 920 | 5 | 921 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 922 | Stream ID ... 923 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 924 | Application Error Code ... 925 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 927 where: 929 Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == 930 5. Frame type, set to 5 for STOP_SENDING frames. 932 Stream ID: 1 Variable Length Integer Encoding. A variable-length 933 integer carrying the Stream ID of the stream being ignored. 935 Application Error Code: 1 Variable Length Integer Encoding. A variab 936 le-length integer containing the application-specified reason the 937 sender is ignoring the stream. 939 8.6. CRYPTO frame 941 A CRYPTO Frame is formatted as follows: 943 0 1 2 3 944 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 945 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 946 | 6 | 947 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 948 | Offset ... 949 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 950 | Length ... 951 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 952 | : 953 : Crypto Data : 954 : | 955 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 957 where: 959 Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == 960 6. Frame type, set to 6 for CRYPTO frames. 962 Offset: 1 Variable Length Integer Encoding. A variable-length 963 integer specifying the byte offset in the stream for the data in 964 this CRYPTO frame. 966 Length: 1 Variable Length Integer Encoding. A variable-length 967 integer specifying the length of the Crypto Data field in this 968 CRYPTO frame. 970 Crypto Data: Length.Value bytes. The cryptographic message data. 972 8.7. NEW_TOKEN frame 974 A NEW_TOKEN Frame is formatted as follows: 976 0 1 2 3 977 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 978 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 979 | 7 | 980 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 981 | Token Length ... 982 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 983 | : 984 : Token : 985 : | 986 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 988 where: 990 Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == 991 7. Frame type, set to 7 for NEW_TOKEN frames. 993 Token Length (TL): 1 Variable Length Integer Encoding. A variable- 994 length integer specifying the length of the token in bytes. 996 Token: TL.Value bytes. An opaque blob that the client may use with a 997 future Initial packet. 999 8.8. STREAM frame 1001 A STREAM Frame is formatted as follows: 1003 0 1 2 3 1004 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 1005 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1006 | 1 |O|L|F| 1007 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1008 | Stream ID ... 1009 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1010 | Offset ... 1011 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1012 | Length ... 1013 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1014 | : 1015 : Stream Data : 1016 : | 1017 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1019 where: 1021 Unused: 5 bits; Unused == 1. Five high-order bits in frame type 1022 field; set to 1 for STREAM frames. 1024 OFF bit (O): 1 bit. Set to indicate that there is an Offset field 1025 present. 1027 LEN bit (L): 1 bit. Set to indicate that there is a Length field 1028 present. 1030 FIN bit (F): 1 bit. Set only on frames that contain the final size 1031 of the stream. 1033 Stream ID: 1 Variable Length Integer Encoding. A variable-length 1034 integer indicating the stream ID of the stream. 1036 Offset: 1 Variable Length Integer Encoding; present only when O == 1037 1. A variable-length integer specifying the byte offset in the 1038 stream for the data in this STREAM frame. 1040 Length: 1 Variable Length Integer Encoding; present only when L == 1041 1. A variable-length integer specifying the length of the Stream 1042 Data field in this STREAM frame. This field is present when the 1043 LEN bit is set to 1. When the LEN bit is set to 0, the Stream 1044 Data field consumes all the remaining bytes in the packet. 1046 Stream Data: Length.Value bytes. The bytes from the designated 1047 stream to be delivered. 1049 8.9. MAX_DATA frame 1051 A MAX_DATA Frame is formatted as follows: 1053 0 1 2 3 1054 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 1055 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1056 | 16 | 1057 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1058 | Maximum Data ... 1059 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1061 where: 1063 Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == 1064 16. Frame type, set to 16 for MAX_DATA frames. 1066 Maximum Data: 1 Variable Length Integer Encoding. A variable-length 1067 integer indicating the maximum amount of data that can be sent on 1068 the entire connection, in units of bytes. 1070 8.10. MAX_STREAM_DATA frame 1072 A MAX_STREAM_DATA Frame is formatted as follows: 1074 0 1 2 3 1075 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 1076 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1077 | 17 | 1078 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1079 | Stream ID ... 1080 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1081 | Maximum Stream Data ... 1082 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1084 where: 1086 Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == 1087 17. Frame type, set to 17 for MAX_STREAM_DATA frames. 1089 Stream ID: 1 Variable Length Integer Encoding. The stream ID of the 1090 stream that is affected encoded as a variable-length integer. 1092 Maximum Stream Data: 1 Variable Length Integer Encoding. A variable- 1093 length integer indicating the maximum amount of data that can be 1094 sent on the identified stream, in units of bytes. 1096 8.11. MAX_STREAMS frame 1098 A MAX_STREAMS Frame is formatted as follows: 1100 0 1 2 3 1101 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 1102 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1103 | FT | 1104 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1105 | Maximum Streams ... 1106 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1108 where: 1110 Frame Type (FT): 1 Variable Length Integer Encoding; (FT.Value == 1111 18) || (FT.Value == 19). Frame type, set to 18 or 19 for MAX_STREAMS 1112 frames. 1114 Maximum Streams: 1 Variable Length Integer Encoding. A count of the 1115 cumulative number of streams of the corresponding type that can be 1116 opened over the lifetime of the connection. 1118 8.12. DATA_BLOCKED frame 1120 A DATA_BLOCKED Frame is formatted as follows: 1122 0 1 2 3 1123 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 1124 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1125 | 20 | 1126 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1127 | Data Limit ... 1128 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1130 where: 1132 Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == 1133 20. Frame type, set to 20 for DATA_BLOCKED frames. 1135 Data Limit: 1 Variable Length Integer Encoding. A variable-length 1136 integer indicating the connection-level limit at which blocking 1137 occurred. 1139 8.13. STREAM_DATA_BLOCKED frame 1141 A STREAM_DATA_BLOCKED Frame is formatted as follows: 1143 0 1 2 3 1144 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 1145 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1146 | 21 | 1147 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1148 | Stream ID ... 1149 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1150 | Stream Data Limit ... 1151 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1153 where: 1155 Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == 1156 21. Frame type, set to 21 for STREAM_DATA_BLOCKED frames. 1158 Stream ID: 1 Variable Length Integer Encoding. A variable-length 1159 integer indicating the stream which is flow control blocked. 1161 Maximum Stream Data: 1 Variable Length Integer Encoding. A variable- 1162 length integer indicating the offset of the stream at which the 1163 blocking occurred. 1165 8.14. STREAMS_BLOCKED frame 1167 A STREAMS_BLOCKED Frame is formatted as follows: 1169 0 1 2 3 1170 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 1171 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1172 | FT | 1173 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1174 | Stream Limit ... 1175 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1177 where: 1179 Frame Type (FT): 1 Variable Length Integer Encoding; (FT.Value == 1180 22) || (FT.Value == 23). Frame type, set to 22 or 23 for 1181 STREAMS_BLOCKED frames. 1183 Stream Limit: 1 Variable Length Integer Encoding. A variable-length 1184 integer indicating the stream limit at the time the frame was 1185 sent. 1187 8.15. NEW_CONNECTION_ID frame 1189 A NEW_CONNECTION_ID Frame is formatted as follows: 1191 0 1 2 3 1192 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 1193 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1194 | 24 | 1195 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1196 | Sequence Number ... 1197 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1198 | Retire Prior To ... 1199 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1200 | Length | | 1201 +-+-+-+-+-+-+-+-+ Connection ID + 1202 | ... 1203 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1204 | | 1205 + + 1206 | | 1207 + Stateless Reset Token + 1208 | | 1209 + + 1210 | | 1211 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1213 where: 1215 Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == 1216 24. Frame type, set to 24 for NEW_CONNECTION_ID frames. 1218 Sequence Number: 1 Variable Length Integer Encoding. The sequence 1219 number assigned to the connection ID by the sender. 1221 Retire Prior To: 1 Variable Length Integer Encoding. A variable- 1222 length integer indicating which connection IDs should be retired. 1224 Length: 1 byte. An 8-bit unsigned integer containing the length of 1225 the connection ID. Values less than 1 and greater than 20 are 1226 invalid and MUST be treated as a connection error of type 1227 FRAME_ENCODING_ERROR. 1229 Connection ID: Length bytes. A connection ID of the specified 1230 length. 1232 Stateless Reset Token: 128 bits. A 128-bit value that will be used 1233 for a stateless reset when the associated connection ID is used. 1235 8.16. RETIRE_CONNECTION_ID frame 1237 A RETIRE_CONNECTION_ID Frame is formatted as follows: 1239 0 1 2 3 1240 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 1241 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1242 | 25 | 1243 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1244 | Sequence Number ... 1245 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1247 where: 1249 Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == 1250 25. Frame type, set to 25 for RETIRE_CONNECTION_ID frames. 1252 Sequence Number: 1 Variable Length Integer Encoding. The sequence 1253 number of the connection ID being retired. 1255 8.17. PATH_CHALLENGE frame 1257 A PATH_CHALLENGE Frame is formatted as follows: 1259 0 1 2 3 1260 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 1261 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1262 | 26 | 1263 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1264 | | 1265 + Data + 1266 | | 1267 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1269 where: 1271 Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == 1272 26. Frame type, set to 26 for PATH_CHALLENGE frames. 1274 Data: 64 bits. This 8-byte field contains arbitrary data. 1276 8.18. PATH_RESPONSE frame 1278 A PATH_RESPONSE Frame is formatted as follows: 1280 0 1 2 3 1281 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 1282 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1283 | 27 | 1284 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1285 | | 1286 + Data + 1287 | | 1288 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1290 where: 1292 Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == 1293 27. Frame type, set to 27 for PATH_RESPONSE frames. 1295 Data: 64 bits. This 8-byte field contains arbitrary data. 1297 8.19. CONNECTION_CLOSE frame 1299 A CONNECTION_CLOSE Frame is formatted as follows: 1301 0 1 2 3 1302 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 1303 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1304 | FT | 1305 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1306 | Error Code ... 1307 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1308 | Frame Type ... 1309 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1310 | Phrase Length ... 1311 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1312 | : 1313 : Reason Phrase : 1314 : | 1315 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1317 where: 1319 Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == 1320 28 || FT.Value == 29. Frame type, set to 28 or 29 for 1321 CONNECTION_CLOSE frames. 1323 Error Code: 1 Variable Length Integer Encoding. A variable length 1324 integer error code which indicates the reason for closing this 1325 connection. 1327 Frame Type: 1 Variable Length Integer Encoding; present only when 1328 FT.Value == 28. A variable-length integer encoding the type of frame 1329 that triggered the error. 1331 Phrase Length (Length): 1 Variable Length Integer Encoding. A variab 1332 le-length integer specifying the length of the reason phrase in 1333 bytes. 1335 Reason Phrase: Length.Value bytes. A human-readable explanation for 1336 why the connection was closed. 1338 8.20. HANDSHAKE_DONE frame 1340 A HANDSHAKE_DONE Frame is formatted as follows: 1342 0 1 2 3 1343 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 1344 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1345 | 30 | 1346 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1348 where: 1350 Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == 1351 30. Frame type, set to 30 for HANDSHAKE_DONE frames. 1353 9. Informative References 1355 [QUIC-TRANSPORT] 1356 Iyengar, J. and M. Thomson, "QUIC: A UDP-Based Multiplexed 1357 and Secure Transport", Work in Progress, Internet-Draft, 1358 draft-ietf-quic-transport-27, 21 February 2020, 1359 . 1362 [AUGMENTED-DIAGRAMS] 1363 McQuistin, S., Band, V., Jacob, D., and C. S. Perkins, 1364 "Describing Protocol Data Units with Augmented Packet 1365 Header Diagrams", Work in Progress, Internet-Draft, draft- 1366 mcquistin-augmented-ascii-diagrams-05, 17 June 2020, 1367 . 1370 Appendix A. Source code repository 1372 The source for this draft is available from https://github.com/ 1373 glasgow-ipl/draft-mcquistin-quic-augmented-diagrams. 1375 The source code for tooling that can be used to parse this document 1376 is available from https://github.com/glasgow-ipl/ips-protodesc-code. 1378 Authors' Addresses 1380 Stephen McQuistin 1381 University of Glasgow 1382 School of Computing Science 1383 Glasgow 1384 G12 8QQ 1385 United Kingdom 1387 Email: sm@smcquistin.uk 1389 Vivian Band 1390 University of Glasgow 1391 School of Computing Science 1392 Glasgow 1393 G12 8QQ 1394 United Kingdom 1396 Email: vivianband0@gmail.com 1397 Dejice Jacob 1398 University of Glasgow 1399 School of Computing Science 1400 Glasgow 1401 G12 8QQ 1402 United Kingdom 1404 Email: d.jacob.1@research.gla.ac.uk 1406 Colin Perkins 1407 University of Glasgow 1408 School of Computing Science 1409 Glasgow 1410 G12 8QQ 1411 United Kingdom 1413 Email: csp@csperkins.org