idnits 2.17.1 draft-mcquistin-quic-augmented-diagrams-04.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 186: '...in this version and MUST be discarded....' RFC 2119 keyword, line 236: '...server. Clients MUST ignore the value...' RFC 2119 keyword, line 237: '... field. Servers SHOULD set the most s...' RFC 2119 keyword, line 242: '...gotiation packet MUST be set to 0x0000...' RFC 2119 keyword, line 291: '...in this version and MUST be discarded....' (18 more instances...) Miscellaneous warnings: ---------------------------------------------------------------------------- == The copyright year in the IETF Trust and authors Copyright Line does not match the current year -- The document date (5 May 2021) is 1084 days in the past. Is this intentional? Checking references for intended status: Experimental ---------------------------------------------------------------------------- == Missing Reference: 'Version' is mentioned on line 260, but not defined == Missing Reference: 'Frame' is mentioned on line 752, 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-08 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: 6 November 2021 C. S. Perkins 6 University of Glasgow 7 5 May 2021 9 Describing QUIC's Protocol Data Units with Augmented Packet Header 10 Diagrams 11 draft-mcquistin-quic-augmented-diagrams-04 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 augmented packet 18 header diagram language, and not as a contribution to the development 19 of the 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 6 November 2021. 38 Copyright Notice 40 Copyright (c) 2021 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 . . . . . . . . . . . . . . . . . . . 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 . . . . . . . . . . . . . . . . . . . . 13 63 6.4. Retry Packet . . . . . . . . . . . . . . . . . . . . . . 14 64 7. Short Header Packets . . . . . . . . . . . . . . . . . . . . 15 65 8. Frames and Frame Formats . . . . . . . . . . . . . . . . . . 18 66 8.1. PADDING frame . . . . . . . . . . . . . . . . . . . . . . 18 67 8.2. PING frame . . . . . . . . . . . . . . . . . . . . . . . 18 68 8.3. ACK frame . . . . . . . . . . . . . . . . . . . . . . . . 19 69 8.4. RESET_STREAM frame . . . . . . . . . . . . . . . . . . . 21 70 8.5. STOP_SENDING frame . . . . . . . . . . . . . . . . . . . 21 71 8.6. CRYPTO frame . . . . . . . . . . . . . . . . . . . . . . 22 72 8.7. NEW_TOKEN frame . . . . . . . . . . . . . . . . . . . . . 23 73 8.8. STREAM frame . . . . . . . . . . . . . . . . . . . . . . 23 74 8.9. MAX_DATA frame . . . . . . . . . . . . . . . . . . . . . 25 75 8.10. MAX_STREAM_DATA frame . . . . . . . . . . . . . . . . . . 25 76 8.11. MAX_STREAMS frame . . . . . . . . . . . . . . . . . . . . 26 77 8.12. DATA_BLOCKED frame . . . . . . . . . . . . . . . . . . . 26 78 8.13. STREAM_DATA_BLOCKED frame . . . . . . . . . . . . . . . . 26 79 8.14. STREAMS_BLOCKED frame . . . . . . . . . . . . . . . . . . 27 80 8.15. NEW_CONNECTION_ID frame . . . . . . . . . . . . . . . . . 27 81 8.16. RETIRE_CONNECTION_ID frame . . . . . . . . . . . . . . . 28 82 8.17. PATH_CHALLENGE frame . . . . . . . . . . . . . . . . . . 29 83 8.18. PATH_RESPONSE frame . . . . . . . . . . . . . . . . . . . 29 84 8.19. CONNECTION_CLOSE frame . . . . . . . . . . . . . . . . . 30 85 8.20. HANDSHAKE_DONE frame . . . . . . . . . . . . . . . . . . 31 86 9. Informative References . . . . . . . . . . . . . . . . . . . 31 87 Appendix A. Source code repository . . . . . . . . . . . . . . . 31 88 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 32 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. It is intended as an 100 example of the augmented packet header diagram language, and not as a 101 contribution to the development of the QUIC protocol. 103 This document is not an exhaustive description of the QUIC protocol. 104 It contains only those elements necessary to demonstrate the 105 augmented packet header diagram format, and should be read as an 106 example of the use of that format. 108 This document describes the QUIC protocol. The QUIC protocol uses 109 Stateless Reset Packets, Protected Packets, Retry Packets, and 110 Version Negotiation Packets. 112 2. Header and Packet Protection 114 A Protected Packet is either a Protected Long Header Packet or a 115 Protected Short Header Packet. 117 An Unprotected Packet is either a Long Header Packet or a Short 118 Header Packet. 120 An Unprotected Packet is parsed from a Protected Packet using the 121 remove_protection function. The remove_protection function is 122 defined as: 124 func remove_protection(from: Protected Packet) -> Unprotected Packet: 125 remove header protection from protected_packet 126 remove packet protection from protected_packet 127 construct appropriate packet type 128 return Unprotected Packet 130 An Unprotected Packet is serialised to a Protected Packet using the 131 apply_protection function. The apply_protection function is defined 132 as: 134 func apply_protection(to: Unprotected Packet) 135 -> Protected Packet: 136 apply packet protection to payload 137 apply header protection to first_byte and packet_number 138 construct appropriate Protected Packet based on first_byte 139 return Protected Packet 141 3. Variable Length Integer 143 A Variable Length Integer is formatted as follows: 145 0 1 2 3 146 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 147 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 148 |Len| 149 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 150 | Value ... 151 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 153 where: 155 Len: 2 bits. The base 2 logarithm of the integer encoding length in 156 bytes. 158 Value: ((2^Len)*8)-2 bits. The integer value encoded in network byte 159 order. 161 4. Stateless Reset 163 A Stateless Reset Packet is formatted as follows: 165 0 1 2 3 166 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 167 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 168 |0|1| Unpredictable Bits ... 169 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 170 | | 171 + + 172 | | 173 + Stateless Reset Token + 174 | | 175 + + 176 | | 177 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 179 where: 181 Header Form (HF): 1 bit; HF == 0. The most significant bit (0x80) of 182 byte 0 (the first byte) is set to 0 for stateless reset packets. 184 Fixed Bit (FB): 1 bit; FB == 1. The next bit (0x40) of byte 0 is set 185 to 1. Packets containing a zero value for this bit are not valid 186 packets in this version and MUST be discarded. 188 Unpredictable Bits (UB): UB#Size > 38. The remainder of the first 189 byte and an arbitrary number of bytes following it that are set to 190 unpredictable values. 192 Stateless Reset Token: 128 bits. The last 16 bytes of the datagram 193 contain a Stateless Reset Token. 195 5. Version Negotiation Packet 197 A Version is formatted as follows: 199 0 1 2 3 200 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 201 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 202 | Version identifier | 203 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 205 where: 207 Version identifier (ID): 32 bits. 32-bit version identifier. 209 A Version Negotiation Packet is formatted as follows: 211 0 1 2 3 212 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 213 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 214 |1| Unused | 215 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 216 | Version ID | 217 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 218 | DCID Len | 219 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 220 | Destination Connection ID ... 221 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 222 | SCID Len | 223 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 224 | Source Connection ID ... 225 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 226 | [Supported Versions] | 227 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 229 where: 231 Header Form (HF): 1 bit; HF == 1. The most significant bit (0x80) of 232 byte 0 (the first byte) is set to 1 for version negotiation 233 packets. 235 Unused (T): 6 bits. The value in the Unused field is selected 236 randomly by the server. Clients MUST ignore the value of this 237 field. Servers SHOULD set the most significant bit of this field 238 (0x40) to 1 so that Version Negotiation packets appear to have the 239 Fixed Bit field. 241 Version ID (VID): 1 Version; VID.ID == 0. The Version field of a 242 Version Negotiation packet MUST be set to 0x0000000. 244 DCID Len (DLen): 1 byte. This field is as previously define. 245 However, as future versions of QUIC may support Connection IDs 246 larger than the version 1 limit, Version Negotiation packets could 247 carry Connection IDs that are longer than 20 bytes. 249 Destination Connection ID: DLen bytes. The Destination Connection ID 250 field is between 0 and 2^8-1 bytes in length. 252 SCID Len (SLen): 1 byte. This field is as previously define. 253 However, as future versions of QUIC may support Connection IDs 254 larger than the version 1 limit, Version Negotiation packets could 255 carry Connection IDs that are longer than 20 bytes. 257 Source Connection ID: SLen bytes. The Source Connection ID field is 258 between 0 and 2^8-1 bytes in length. 260 Supported Versions: [Version]. The remainder of the Version 261 Negotiation packet is a list of 32-bit versions which the server 262 supports. 264 6. Long Header Packets 266 A Long Header is formatted as follows: 268 0 1 2 3 269 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 270 +-+-+-+-+-+-+-+-+ 271 |1|1| T | R | P | 272 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 273 | Version ID | 274 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 275 | DCID Len | 276 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 277 | Destination Connection ID (DCID) ... 278 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 279 | SCID Len | 280 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 281 | Source Connection ID (SCID) ... 282 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 284 where: 286 Header Form (HF): 1 bit; HF == 1. The most significant bit (0x80) of 287 byte 0 (the first byte) is set to 1 for long headers. 289 Fixed Bit (FB): 1 bit; FB == 1. The next bit (0x40) of byte 0 is set 290 to 1. Packets containing a zero value for this bit are not valid 291 packets in this version and MUST be discarded. 293 Long Packet Type (T): 2 bits. The next two bits (those with a mask 294 of 0x30) of byte 0 contain a packet type. 296 Reserved Bits (R): 2 bits. Two bits (those with a mask of 0x0c) of 297 byte 0 are reserved across multiple packet types. These bits are 298 protected using header protection. 300 Packet Number Length (P): 2 bits. In packet types which contain a 301 Packet Number field, the least significant two bits (those with a 302 mask of 0x03) of byte 0 contain the length of the packet number, 303 encoded as an unsigned, two-bit integer that is one less than the 304 length of the packet number field in bytes. 306 Version ID (VID): 1 Version. This field indicates which version of 307 QUIC is in use and determines how the rest of the protocol fields 308 are interpreted. 310 DCID Len (DLen): 1 byte; DLen <= 20. This field contains the length, 311 in bytes, of the Destination Connection ID field that follows it. 312 This length is encoded as an 8-bit unsigned integer. In QUIC 313 version 1, this value MUST NOT exceed 20. Endpoints that receive 314 a version 1 long header with a value larger than 20 MUST drop the 315 packet. Servers SHOULD be able to read longer connection IDs from 316 other QUIC versions in order to properly form a version 317 negotiation packet. 319 Destination Connection ID (DCID): DLen bytes. The Destination 320 Connection ID field is between 0 and 20 bytes in length. 322 SCID Len (SLen): 1 byte; SLen <= 20. This field contains the length, 323 in bytes, of the Source Connection ID field that follows it. This 324 length is encoded as an 8-bit unsigned integer. In QUIC version 325 1, this value MUST NOT exceed 20 bytes. Endpoints that receive a 326 version 1 long header with a value larger than 20 MUST drop the 327 packet. Servers SHOULD be able to read longer connection IDs from 328 other QUIC versions in order to properly form a version 329 negotiation packet. 331 Source Connection ID (SCID): SLen bytes. The Source Connection ID 332 field is between 0 and 20 bytes in length. 334 A Long Header Packet is one of: an Initial Packet, a 0RTT Packet, a 335 Handshake Packet, or a Retry Packet. 337 A Protected Long Header is formatted as follows: 339 0 1 2 3 340 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 341 +-+-+-+-+-+-+-+-+ 342 |1|1| T | PBits | 343 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 344 | Version ID | 345 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 346 | DCID Len | 347 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 348 | Destination Connection ID ... 349 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 350 | SCID Len | 351 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 352 | Source Connection ID ... 353 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 355 where: 357 Header Form (HF): 1 bit; HF == 1. The most significant bit (0x80) of 358 byte 0 (the first byte) is set to 1 for long headers. 360 Fixed Bit (FB): 1 bit; FB == 1. The next bit (0x40) of byte 0 is set 361 to 1. Packets containing a zero value for this bit are not valid 362 packets in this version and MUST be discarded. 364 Long Packet Type (T): 2 bits. The next two bits (those with a mask 365 of 0x30) of byte 0 contain a packet type. 367 Protected Bits (PBits): 4 bits. 4 bits protected using header 368 protection. 370 Version ID (VID): 1 Version. This field indicates which version of 371 QUIC is in use and determines how the rest of the protocol fields 372 are interpreted. 374 DCID Len (DLen): 1 byte; DLen <= 20. This field contains the length, 375 in bytes, of the Destination Connection ID field that follows it. 376 This length is encoded as an 8-bit unsigned integer. In QUIC 377 version 1, this value MUST NOT exceed 20. Endpoints that receive 378 a version 1 long header with a value larger than 20 MUST drop the 379 packet. Servers SHOULD be able to read longer connection IDs from 380 other QUIC versions in order to properly form a version 381 negotiation packet. 383 Destination Connection ID: DLen bytes. The Destination Connection ID 384 field is between 0 and 20 bytes in length. 386 SCID Len (SLen): 1 byte; SLen <= 20. This field contains the length, 387 in bytes, of the Source Connection ID field that follows it. This 388 length is encoded as an 8-bit unsigned integer. In QUIC version 389 1, this value MUST NOT exceed 20 bytes. Endpoints that receive a 390 version 1 long header with a value larger than 20 MUST drop the 391 packet. Servers SHOULD be able to read longer connection IDs from 392 other QUIC versions in order to properly form a version 393 negotiation packet. 395 Source Connection ID: SLen bytes. The Source Connection ID field is 396 between 0 and 20 bytes in length. 398 A Protected Long Header Packet is one of: a Protected Initial Packet, 399 a Protected 0RTT Packet, or a Protected Handshake Packet. 401 6.1. Initial Packet 403 An Initial Packet is formatted as follows: 405 0 1 2 3 406 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 407 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 408 | : 409 : Long Header : 410 : | 411 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 412 | Token Length ... 413 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 414 | Token ... 415 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 416 | Length ... 417 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 418 | Packet Number ... 419 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 420 | Payload ... 421 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 423 where: 425 Long Header (LH): 1 Long Header; LH.T == 0. An Initial packet uses 426 long headers with a type value of 0x0. On receipt, the value of 427 LH.DCID is stored as Initial DCID. 429 Token Length (TL): 1 Variable Length Integer. A variable-length 430 integer specifying the length of the Token field, in bytes. 432 Token: TL bytes; present only when TL > 0. The value of the token 433 that was previously provided in a Retry packet or NEW_TOKEN frame. 435 Length: 1 Variable Length Integer. The length of the remainder of 436 the packet (that is, the Packet Number and Payload fields) in 437 bytes, encoded as a variable-length integer. 439 Packet Number: LH.P+1 bytes. The packet number field. 441 Payload: [Frame]. The payload field, comprised of multiple frames. 443 A Protected Initial packet is formatted as follows: 445 0 1 2 3 446 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 447 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 448 | : 449 : Long Header : 450 : | 451 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 452 | Token Length ... 453 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 454 | Token ... 455 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 456 | Length ... 457 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 458 | Protected Packet Number ... 459 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 460 | Protected Payload ... 461 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 463 where: 465 Long Header (LH): 1 Long Header; LH.T == 0. An Initial packet uses 466 long headers with a type value of 0x0. 468 Token Length (TL): 1 Variable Length Integer. A variable-length 469 integer specifying the length of the Token field, in bytes. 471 Token: TL bytes; present only when TL > 0. The value of the token 472 that was previously provided in a Retry packet or NEW_TOKEN frame. 474 Length: 1 Variable Length Integer. The length of the remainder of 475 the packet (that is, the Packet Number and Payload fields) in 476 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-(LH.P+1)) bytes. The protected payload 482 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. The length of the remainder of 508 the packet (that is, the Packet Number and Payload fields) in 509 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. The length of the remainder of 537 the packet (that is, the Packet Number and Payload fields) in 538 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-(LH.P+1)) bytes. The protected payload 544 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. The length of the remainder of 570 the packet (that is, the Packet Number and Payload fields) in 571 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. The length of the remainder of 599 the packet (that is, the Packet Number and Payload fields) in 600 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-(LH.P+1)) bytes. The protected payload 606 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| R |K| P | 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 Reserved Bits (R): 2 bits. The next two bits (those with a mask of 727 0x18) of byte 0 are reserved. These bits are protected using 728 header protection. The value included prior to protection MUST be 729 set to 0. 731 Key Phase (K): 1 bit. The next bit (0x04) of byte 0 indicates the 732 key phase, which allows a recipient of a packet to identify the 733 packet protection keys that are used to protect the packet. This 734 bit is protected using header protection. 736 Packet Number Length (P): 2 bits. In packet types which contain a 737 Packet Number field, the least significant two bits (those with a 738 mask of 0x03) of byte 0 contain the length of the packet number, 739 encoded as an unsigned, two-bit integer that is one less than the 740 length of the packet number field in bytes. These bits are 741 protected using header protection. 743 Destination Connection ID: 20 bytes. The Destination Connection ID 744 is a connection ID that is chosen by the intended recipient of the 745 packet. 747 Packet Number: P+1 bytes. The packet number field is 1 to 4 bytes 748 long. The packet number has confidentiality protection separate 749 from packet protection. The length of the packet number field is 750 encoded in Packet Number Length field. 752 Protected Payload: [Frame]. Packets with a short header always 753 include a 1-RTT protected payload. 755 8. Frames and Frame Formats 757 A Frame is one of: a PADDING Frame, a PING Frame, an ACK Frame, a 758 RESET_STREAM Frame, a STOP_SENDING Frame, a CRYPTO Frame, a NEW_TOKEN 759 Frame, a STREAM Frame, a MAX_DATA Frame, a MAX_STREAM_DATA Frame, a 760 MAX_STREAMS Frame, a DATA_BLOCKED Frame, a STREAM_DATA_BLOCKED Frame, 761 a STREAMS_BLOCKED Frame, a NEW_CONNECTION_ID Frame, a PATH_CHALLENGE 762 Frame, a PATH_RESPONSE Frame, a CONNECTION_CLOSE Frame, or a 763 HANDSHAKE_DONE Frame. 765 8.1. PADDING frame 767 A PADDING 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 | 0 | 773 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 775 where: 777 Frame Type (FT): 1 Variable Length Integer; FT.Value == 0. Frame 778 type, set to 0 for PADDING frames. 780 8.2. PING frame 782 A PING Frame 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 | 1 | 788 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 790 where: 792 Frame Type (FT): 1 Variable Length Integer; FT.Value == 1. Frame 793 type, set to 1 for PING frames. 795 8.3. ACK frame 797 An ACK Range is formatted as follows: 799 0 1 2 3 800 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 801 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 802 | Gap ... 803 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 804 | ACK Packet Range ... 805 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 807 where: 809 Gap: 1 Variable Length Integer. A variable-length integer indicating 810 the number of contiguous unacknowledged packets preceding the 811 packet number one lower than the smallest in the preceding ACK 812 Range. 814 ACK Packet Range: 1 Variable Length Integer. A variable-length 815 integer indicating the number of contiguous acknowledged packets 816 preceding the largest packet number, as determined by the 817 preceding Gap. 819 An ECN Count is formatted as follows: 821 0 1 2 3 822 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 823 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 824 | ECT0 Count ... 825 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 826 | ECT1 Count ... 827 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 828 | ECNCE Count ... 829 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 831 where: 833 ECT0 Count: 1 Variable Length Integer. A variable-length integer 834 representing the total number of packets received with the ECT(0) 835 codepoint in the packet number space of the ACK frame. 837 ECT1 Count: 1 Variable Length Integer. A variable-length integer 838 representing the total number of packets received with the ECT(1) 839 codepoint in the packet number space of the ACK frame. 841 ECNCE Count: 1 Variable Length Integer. A variable-length integer 842 representing the total number of packets received with the CE 843 codepoint in the packet number space of the ACK frame. 845 An ACK Frame is formatted as follows: 847 0 1 2 3 848 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 849 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 850 | Frame Type | 851 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 852 | Largest Acknowledged ... 853 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 854 | ACK Delay ... 855 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 856 | ACK Range Count ... 857 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 858 | First ACK Range ... 859 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 860 | [Other ACK Ranges] ... 861 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 862 | ECN Counts ... 863 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 865 where: 867 Frame Type (FT): 1 Variable Length Integer; (FT.Value == 3) || 868 (FT.Value == 4). Frame type, set to 3 or 4 for ACK frames. 870 Largest Acknowledged: 1 Variable Length Integer. A variable-length 871 integer representing the largest packet number the peer is 872 acknowledging; this is usually the largest packet number that the 873 peer has received prior to generating the ACK frame. Unlike the 874 packet number in the QUIC long or short header, the value in an 875 ACK frame is not truncated. 877 ACK Delay: 1 Variable Length Integer. A variable-length integer 878 representing the time delta in microseconds between when this ACK 879 was sent and when the largest acknowledged packet, as indicated in 880 the Largest Acknowledged field, was received by this peer. 882 ACK Range Count: 1 Variable Length Integer. A variable-length 883 integer specifying the number of Gap and ACK Range fields in the 884 frame. 886 First ACK Range: 1 ACK Range. The First ACK Range is encoded as an 887 ACK Range starting from the Largest Acknowledged. 889 Other ACK Ranges: [ACK Range]. Contains additional ranges of packets 890 which are alternately not acknowledged and acknowledged. 892 ECN Counts: 1 ECN Count; present only when FT.Value == 3. The three 893 ECN Counts. 895 8.4. RESET_STREAM frame 897 A RESET_STREAM Frame is formatted as follows: 899 0 1 2 3 900 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 901 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 902 | 4 | 903 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 904 | Stream ID ... 905 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 906 | Application Error Code ... 907 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 908 | Final Size ... 909 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 911 where: 913 Frame Type (FT): 1 Variable Length Integer; FT.Value == 4. Frame 914 type, set to 4 for RESET_STREAM frames. 916 Stream ID: 1 Variable Length Integer. A variable-length integer 917 encoding of the Stream ID of the stream being terminated. 919 Application Error Code: 1 Variable Length Integer. A variable-length 920 integer containing the application protocol error code which 921 indicates why the stream is being closed. 923 Final Size: 1 Variable Length Integer. A variable-length integer 924 indicating the final size of the stream by the RESET_STREAM 925 sender, in unit of bytes. 927 8.5. STOP_SENDING frame 929 A STOP_SENDING Frame is formatted as follows: 931 0 1 2 3 932 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 933 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 934 | 5 | 935 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 936 | Stream ID ... 937 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 938 | Application Error Code ... 939 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 941 where: 943 Frame Type (FT): 1 Variable Length Integer; FT.Value == 5. Frame 944 type, set to 5 for STOP_SENDING frames. 946 Stream ID: 1 Variable Length Integer. A variable-length integer 947 carrying the Stream ID of the stream being ignored. 949 Application Error Code: 1 Variable Length Integer. A variable-length 950 integer containing the application-specified reason the sender is 951 ignoring the stream. 953 8.6. CRYPTO frame 955 A CRYPTO Frame is formatted as follows: 957 0 1 2 3 958 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 959 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 960 | 6 | 961 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 962 | Offset ... 963 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 964 | Length ... 965 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 966 | : 967 : Crypto Data : 968 : | 969 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 971 where: 973 Frame Type (FT): 1 Variable Length Integer; FT.Value == 6. Frame 974 type, set to 6 for CRYPTO frames. 976 Offset: 1 Variable Length Integer. A variable-length integer 977 specifying the byte offset in the stream for the data in this 978 CRYPTO frame. 980 Length: 1 Variable Length Integer. A variable-length integer 981 specifying the length of the Crypto Data field in this CRYPTO 982 frame. 984 Crypto Data: Length bytes. The cryptographic message data. 986 8.7. NEW_TOKEN frame 988 A NEW_TOKEN Frame is formatted as follows: 990 0 1 2 3 991 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 992 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 993 | 7 | 994 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 995 | Token Length ... 996 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 997 | : 998 : Token : 999 : | 1000 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1002 where: 1004 Frame Type (FT): 1 Variable Length Integer; FT.Value == 7. Frame 1005 type, set to 7 for NEW_TOKEN frames. 1007 Token Length (TL): 1 Variable Length Integer. A variable-length 1008 integer specifying the length of the token in bytes. 1010 Token: TL bytes. An opaque blob that the client may use with a 1011 future Initial packet. 1013 8.8. STREAM frame 1015 A STREAM Frame is formatted as follows: 1017 0 1 2 3 1018 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 1019 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1020 | 1 |O|L|F| 1021 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1022 | Stream ID ... 1023 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1024 | Offset ... 1025 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1026 | Length ... 1027 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1028 | : 1029 : Stream Data : 1030 : | 1031 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1033 where: 1035 Unused: 5 bits; Unused == 1. Five high-order bits in frame type 1036 field; set to 1 for STREAM frames. 1038 OFF bit (O): 1 bit. Set to indicate that there is an Offset field 1039 present. 1041 LEN bit (L): 1 bit. Set to indicate that there is a Length field 1042 present. 1044 FIN bit (F): 1 bit. Set only on frames that contain the final size 1045 of the stream. 1047 Stream ID: 1 Variable Length Integer. A variable-length integer 1048 indicating the stream ID of the stream. 1050 Offset: 1 Variable Length Integer; present only when O == 1. A varia 1051 ble-length integer specifying the byte offset in the stream for 1052 the data in this STREAM frame. 1054 Length: 1 Variable Length Integer; present only when L == 1. A varia 1055 ble-length integer specifying the length of the Stream Data field 1056 in this STREAM frame. This field is present when the LEN bit is 1057 set to 1. When the LEN bit is set to 0, the Stream Data field 1058 consumes all the remaining bytes in the packet. 1060 Stream Data: Length bytes. The bytes from the designated stream to 1061 be delivered. 1063 8.9. MAX_DATA frame 1065 A MAX_DATA Frame is formatted as follows: 1067 0 1 2 3 1068 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 1069 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1070 | 16 | 1071 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1072 | Maximum Data ... 1073 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1075 where: 1077 Frame Type (FT): 1 Variable Length Integer; FT.Value == 16. Frame 1078 type, set to 16 for MAX_DATA frames. 1080 Maximum Data: 1 Variable Length Integer. A variable-length integer 1081 indicating the maximum amount of data that can be sent on the 1082 entire connection, in units of bytes. 1084 8.10. MAX_STREAM_DATA frame 1086 A MAX_STREAM_DATA Frame is formatted as follows: 1088 0 1 2 3 1089 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 1090 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1091 | 17 | 1092 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1093 | Stream ID ... 1094 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1095 | Maximum Stream Data ... 1096 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1098 where: 1100 Frame Type (FT): 1 Variable Length Integer; FT.Value == 17. Frame 1101 type, set to 17 for MAX_STREAM_DATA frames. 1103 Stream ID: 1 Variable Length Integer. The stream ID of the stream 1104 that is affected encoded as a variable-length integer. 1106 Maximum Stream Data: 1 Variable Length Integer. A variable-length 1107 integer indicating the maximum amount of data that can be sent on 1108 the identified stream, in units of bytes. 1110 8.11. MAX_STREAMS frame 1112 A MAX_STREAMS Frame is formatted as follows: 1114 0 1 2 3 1115 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 1116 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1117 | FT | 1118 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1119 | Maximum Streams ... 1120 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1122 where: 1124 Frame Type (FT): 1 Variable Length Integer; (FT.Value == 18) || 1125 (FT.Value == 19). Frame type, set to 18 or 19 for MAX_STREAMS 1126 frames. 1128 Maximum Streams: 1 Variable Length Integer. A count of the 1129 cumulative number of streams of the corresponding type that can be 1130 opened over the lifetime of the connection. 1132 8.12. DATA_BLOCKED frame 1134 A DATA_BLOCKED Frame is formatted as follows: 1136 0 1 2 3 1137 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 1138 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1139 | 20 | 1140 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1141 | Data Limit ... 1142 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1144 where: 1146 Frame Type (FT): 1 Variable Length Integer; FT.Value == 20. Frame 1147 type, set to 20 for DATA_BLOCKED frames. 1149 Data Limit: 1 Variable Length Integer. A variable-length integer 1150 indicating the connection-level limit at which blocking occurred. 1152 8.13. STREAM_DATA_BLOCKED frame 1154 A STREAM_DATA_BLOCKED Frame is formatted as follows: 1156 0 1 2 3 1157 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 1158 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1159 | 21 | 1160 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1161 | Stream ID ... 1162 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1163 | Stream Data Limit ... 1164 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1166 where: 1168 Frame Type (FT): 1 Variable Length Integer; FT.Value == 21. Frame 1169 type, set to 21 for STREAM_DATA_BLOCKED frames. 1171 Stream ID: 1 Variable Length Integer. A variable-length integer 1172 indicating the stream which is flow control blocked. 1174 Maximum Stream Data: 1 Variable Length Integer. A variable-length 1175 integer indicating the offset of the stream at which the blocking 1176 occurred. 1178 8.14. STREAMS_BLOCKED frame 1180 A STREAMS_BLOCKED Frame is formatted as follows: 1182 0 1 2 3 1183 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 1184 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1185 | FT | 1186 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1187 | Stream Limit ... 1188 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1190 where: 1192 Frame Type (FT): 1 Variable Length Integer; (FT.Value == 22) || 1193 (FT.Value == 23). Frame type, set to 22 or 23 for STREAMS_BLOCKED 1194 frames. 1196 Stream Limit: 1 Variable Length Integer. A variable-length integer 1197 indicating the stream limit at the time the frame was sent. 1199 8.15. NEW_CONNECTION_ID frame 1201 A NEW_CONNECTION_ID Frame is formatted as follows: 1203 0 1 2 3 1204 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 1205 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1206 | 24 | 1207 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1208 | Sequence Number ... 1209 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1210 | Retire Prior To ... 1211 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1212 | Length | 1213 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1214 | Connection ID ... 1215 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1216 | | 1217 + + 1218 | | 1219 + Stateless Reset Token + 1220 | | 1221 + + 1222 | | 1223 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1225 where: 1227 Frame Type (FT): 1 Variable Length Integer; FT.Value == 24. Frame 1228 type, set to 24 for NEW_CONNECTION_ID frames. 1230 Sequence Number: 1 Variable Length Integer. The sequence number 1231 assigned to the connection ID by the sender. 1233 Retire Prior To: 1 Variable Length Integer. A variable-length 1234 integer indicating which connection IDs should be retired. 1236 Length: 1 byte. An 8-bit unsigned integer containing the length of 1237 the connection ID. Values less than 1 and greater than 20 are 1238 invalid and MUST be treated as a connection error of type 1239 FRAME_ENCODING_ERROR. 1241 Connection ID: Length bytes. A connection ID of the specified 1242 length. 1244 Stateless Reset Token: 128 bits. A 128-bit value that will be used 1245 for a stateless reset when the associated connection ID is used. 1247 8.16. RETIRE_CONNECTION_ID frame 1249 A RETIRE_CONNECTION_ID Frame is formatted as follows: 1251 0 1 2 3 1252 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 1253 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1254 | 25 | 1255 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1256 | Sequence Number ... 1257 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1259 where: 1261 Frame Type (FT): 1 Variable Length Integer; FT.Value == 25. Frame 1262 type, set to 25 for RETIRE_CONNECTION_ID frames. 1264 Sequence Number: 1 Variable Length Integer. The sequence number of 1265 the connection ID being retired. 1267 8.17. PATH_CHALLENGE frame 1269 A PATH_CHALLENGE Frame is formatted as follows: 1271 0 1 2 3 1272 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 1273 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1274 | 26 | 1275 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1276 | | 1277 + Data + 1278 | | 1279 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1281 where: 1283 Frame Type (FT): 1 Variable Length Integer; FT.Value == 26. Frame 1284 type, set to 26 for PATH_CHALLENGE frames. 1286 Data: 64 bits. This 8-byte field contains arbitrary data. 1288 8.18. PATH_RESPONSE frame 1290 A PATH_RESPONSE Frame is formatted as follows: 1292 0 1 2 3 1293 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 1294 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1295 | 27 | 1296 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1297 | | 1298 + Data + 1299 | | 1300 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1302 where: 1304 Frame Type (FT): 1 Variable Length Integer; FT.Value == 27. Frame 1305 type, set to 27 for PATH_RESPONSE frames. 1307 Data: 64 bits. This 8-byte field contains arbitrary data. 1309 8.19. CONNECTION_CLOSE frame 1311 A CONNECTION_CLOSE Frame is formatted as follows: 1313 0 1 2 3 1314 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 1315 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1316 | FT | 1317 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1318 | Error Code ... 1319 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1320 | Frame Type ... 1321 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1322 | Phrase Length ... 1323 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1324 | : 1325 : Reason Phrase : 1326 : | 1327 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1329 where: 1331 Frame Type (FT): 1 Variable Length Integer; FT.Value == 28 || 1332 FT.Value == 29. Frame type, set to 28 or 29 for CONNECTION_CLOSE 1333 frames. 1335 Error Code: 1 Variable Length Integer. A variable length integer 1336 error code which indicates the reason for closing this connection. 1338 Frame Type: 1 Variable Length Integer; present only when FT.Value 1339 == 28. A variable-length integer encoding the type of frame that 1340 triggered the error. 1342 Phrase Length (Length): 1 Variable Length Integer. A variable-length 1343 integer specifying the length of the reason phrase in bytes. 1345 Reason Phrase: Length bytes. A human-readable explanation for why 1346 the connection was closed. 1348 8.20. HANDSHAKE_DONE frame 1350 A HANDSHAKE_DONE Frame is formatted as follows: 1352 0 1 2 3 1353 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 1354 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1355 | 30 | 1356 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 1358 where: 1360 Frame Type (FT): 1 Variable Length Integer; FT.Value == 30. Frame 1361 type, set to 30 for HANDSHAKE_DONE frames. 1363 9. Informative References 1365 [QUIC-TRANSPORT] 1366 Iyengar, J. and M. Thomson, "QUIC: A UDP-Based Multiplexed 1367 and Secure Transport", Work in Progress, Internet-Draft, 1368 draft-ietf-quic-transport-27, 21 February 2020, 1369 . 1372 [AUGMENTED-DIAGRAMS] 1373 McQuistin, S., Band, V., Jacob, D., and C. S. Perkins, 1374 "Describing Protocol Data Units with Augmented Packet 1375 Header Diagrams", Work in Progress, Internet-Draft, draft- 1376 mcquistin-augmented-ascii-diagrams-08, 5 May 2021, 1377 . 1380 Appendix A. Source code repository 1382 The source for this draft is available from https://github.com/ 1383 glasgow-ipl/draft-mcquistin-quic-augmented-diagrams. 1385 The source code for tooling that can be used to parse this document 1386 is available from https://github.com/glasgow-ipl/ips-protodesc-code. 1388 Authors' Addresses 1390 Stephen McQuistin 1391 University of Glasgow 1392 School of Computing Science 1393 Glasgow 1394 G12 8QQ 1395 United Kingdom 1397 Email: sm@smcquistin.uk 1399 Vivian Band 1400 University of Glasgow 1401 School of Computing Science 1402 Glasgow 1403 G12 8QQ 1404 United Kingdom 1406 Email: vivianband0@gmail.com 1408 Dejice Jacob 1409 University of Glasgow 1410 School of Computing Science 1411 Glasgow 1412 G12 8QQ 1413 United Kingdom 1415 Email: d.jacob.1@research.gla.ac.uk 1417 Colin Perkins 1418 University of Glasgow 1419 School of Computing Science 1420 Glasgow 1421 G12 8QQ 1422 United Kingdom 1424 Email: csp@csperkins.org