draft-mcquistin-quic-augmented-diagrams-00.txt   draft-mcquistin-quic-augmented-diagrams-01.txt 
Network Working Group S. McQuistin Network Working Group S. McQuistin
Internet-Draft V. Band Internet-Draft V. Band
Intended status: Experimental D. Jacob Intended status: Experimental D. Jacob
Expires: 26 October 2020 C. S. Perkins Expires: 19 December 2020 C. S. Perkins
University of Glasgow University of Glasgow
24 April 2020 17 June 2020
Describing QUIC's Protocol Data Units with Augmented Packet Header Describing QUIC's Protocol Data Units with Augmented Packet Header
Diagrams Diagrams
draft-mcquistin-quic-augmented-diagrams-00 draft-mcquistin-quic-augmented-diagrams-01
Abstract Abstract
This document describes the core transport protocol data units used This document describes the core transport protocol data units used
in the QUIC protocol using a machine-readable augmented packet header in the QUIC protocol using a machine-readable augmented packet header
diagram format. It is intended as an example of the packet header diagram format. It is intended as an example of the packet header
diagram language, and not as a contribution to the development of the diagram language, and not as a contribution to the development of the
QUIC protocol. QUIC protocol.
Status of This Memo Status of This Memo
skipping to change at page 1, line 37 skipping to change at page 1, line 37
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet- working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/. Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on 26 October 2020. This Internet-Draft will expire on 19 December 2020.
Copyright Notice Copyright Notice
Copyright (c) 2020 IETF Trust and the persons identified as the Copyright (c) 2020 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents (https://trustee.ietf.org/ Provisions Relating to IETF Documents (https://trustee.ietf.org/
license-info) in effect on the date of publication of this document. license-info) in effect on the date of publication of this document.
Please review these documents carefully, as they describe your rights Please review these documents carefully, as they describe your rights
skipping to change at page 2, line 24 skipping to change at page 2, line 24
Table of Contents Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3
2. Header and Packet Protection . . . . . . . . . . . . . . . . 3 2. Header and Packet Protection . . . . . . . . . . . . . . . . 3
3. Variable Length Integer Encoding . . . . . . . . . . . . . . 4 3. Variable Length Integer Encoding . . . . . . . . . . . . . . 4
4. Stateless Reset . . . . . . . . . . . . . . . . . . . . . . . 4 4. Stateless Reset . . . . . . . . . . . . . . . . . . . . . . . 4
5. Version Negotiation Packet . . . . . . . . . . . . . . . . . 5 5. Version Negotiation Packet . . . . . . . . . . . . . . . . . 5
6. Long Header Packets . . . . . . . . . . . . . . . . . . . . . 6 6. Long Header Packets . . . . . . . . . . . . . . . . . . . . . 6
6.1. Initial Packet . . . . . . . . . . . . . . . . . . . . . 9 6.1. Initial Packet . . . . . . . . . . . . . . . . . . . . . 9
6.2. 0RTT Packet . . . . . . . . . . . . . . . . . . . . . . . 11 6.2. 0RTT Packet . . . . . . . . . . . . . . . . . . . . . . . 11
6.3. Handshake Packet . . . . . . . . . . . . . . . . . . . . 13 6.3. Handshake Packet . . . . . . . . . . . . . . . . . . . . 12
6.4. Retry Packet . . . . . . . . . . . . . . . . . . . . . . 14 6.4. Retry Packet . . . . . . . . . . . . . . . . . . . . . . 13
7. Short Header Packets . . . . . . . . . . . . . . . . . . . . 15 7. Short Header Packets . . . . . . . . . . . . . . . . . . . . 14
8. Frames and Frame Formats . . . . . . . . . . . . . . . . . . 18 8. Frames and Frame Formats . . . . . . . . . . . . . . . . . . 17
8.1. PADDING frame . . . . . . . . . . . . . . . . . . . . . . 18 8.1. PADDING frame . . . . . . . . . . . . . . . . . . . . . . 17
8.2. PING frame . . . . . . . . . . . . . . . . . . . . . . . 18 8.2. PING frame . . . . . . . . . . . . . . . . . . . . . . . 17
8.3. ACK frame . . . . . . . . . . . . . . . . . . . . . . . . 18 8.3. ACK frame . . . . . . . . . . . . . . . . . . . . . . . . 17
8.4. RESET_STREAM frame . . . . . . . . . . . . . . . . . . . 21 8.4. RESET_STREAM frame . . . . . . . . . . . . . . . . . . . 20
8.5. STOP_SENDING frame . . . . . . . . . . . . . . . . . . . 21 8.5. STOP_SENDING frame . . . . . . . . . . . . . . . . . . . 20
8.6. CRYPTO frame . . . . . . . . . . . . . . . . . . . . . . 22 8.6. CRYPTO frame . . . . . . . . . . . . . . . . . . . . . . 21
8.7. NEW_TOKEN frame . . . . . . . . . . . . . . . . . . . . . 23 8.7. NEW_TOKEN frame . . . . . . . . . . . . . . . . . . . . . 21
8.8. STREAM frame . . . . . . . . . . . . . . . . . . . . . . 23 8.8. STREAM frame . . . . . . . . . . . . . . . . . . . . . . 22
8.9. MAX_DATA frame . . . . . . . . . . . . . . . . . . . . . 25 8.9. MAX_DATA frame . . . . . . . . . . . . . . . . . . . . . 23
8.10. MAX_STREAM_DATA frame . . . . . . . . . . . . . . . . . . 25 8.10. MAX_STREAM_DATA frame . . . . . . . . . . . . . . . . . . 24
8.11. MAX_STREAMS frame . . . . . . . . . . . . . . . . . . . . 26 8.11. MAX_STREAMS frame . . . . . . . . . . . . . . . . . . . . 24
8.12. DATA_BLOCKED frame . . . . . . . . . . . . . . . . . . . 26 8.12. DATA_BLOCKED frame . . . . . . . . . . . . . . . . . . . 25
8.13. STREAM_DATA_BLOCKED frame . . . . . . . . . . . . . . . . 26 8.13. STREAM_DATA_BLOCKED frame . . . . . . . . . . . . . . . . 25
8.14. STREAMS_BLOCKED frame . . . . . . . . . . . . . . . . . . 27 8.14. STREAMS_BLOCKED frame . . . . . . . . . . . . . . . . . . 26
8.15. NEW_CONNECTION_ID frame . . . . . . . . . . . . . . . . . 28 8.15. NEW_CONNECTION_ID frame . . . . . . . . . . . . . . . . . 26
8.16. RETIRE_CONNECTION_ID frame . . . . . . . . . . . . . . . 29 8.16. RETIRE_CONNECTION_ID frame . . . . . . . . . . . . . . . 27
8.17. PATH_CHALLENGE frame . . . . . . . . . . . . . . . . . . 29 8.17. PATH_CHALLENGE frame . . . . . . . . . . . . . . . . . . 27
8.18. PATH_RESPONSE frame . . . . . . . . . . . . . . . . . . . 29 8.18. PATH_RESPONSE frame . . . . . . . . . . . . . . . . . . . 28
8.19. CONNECTION_CLOSE frame . . . . . . . . . . . . . . . . . 30 8.19. CONNECTION_CLOSE frame . . . . . . . . . . . . . . . . . 28
8.20. HANDSHAKE_DONE frame . . . . . . . . . . . . . . . . . . 31 8.20. HANDSHAKE_DONE frame . . . . . . . . . . . . . . . . . . 29
9. Informative References . . . . . . . . . . . . . . . . . . . 31 9. Informative References . . . . . . . . . . . . . . . . . . . 30
Appendix A. Source code repository . . . . . . . . . . . . . . . 32 Appendix A. Source code repository . . . . . . . . . . . . . . . 30
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 32 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 30
1. Introduction 1. Introduction
The augmented packet header diagram format [AUGMENTED-DIAGRAMS] The augmented packet header diagram format [AUGMENTED-DIAGRAMS]
enables documents to specify the syntax of protocol data units in a enables documents to specify the syntax of protocol data units in a
way that enables support for automated parser generation, while way that enables support for automated parser generation, while
maintaining human readability. maintaining human readability.
To demonstrate how this approach can be applied, and the value that To demonstrate how this approach can be applied, and the value that
it can provide, this document describes QUIC [QUIC-TRANSPORT] using it can provide, this document describes QUIC [QUIC-TRANSPORT] using
skipping to change at page 3, line 30 skipping to change at page 3, line 30
This document describes the QUIC protocol. The QUIC protocol uses This document describes the QUIC protocol. The QUIC protocol uses
Stateless Reset Packets, Protected Packets, Retry Packets, and Stateless Reset Packets, Protected Packets, Retry Packets, and
Version Negotiation Packets. Version Negotiation Packets.
2. Header and Packet Protection 2. Header and Packet Protection
A Protected Packet is either a Protected Long Header Packet or a A Protected Packet is either a Protected Long Header Packet or a
Protected Short Header Packet. Protected Short Header Packet.
The apply_protection function is defined as: An Unprotected Packet is either a Long Header Packet or a Short
Header Packet.
func apply_protection(to: Unprotected Packet)
-> Protected Packet:
apply packet protection to payload
apply header protection to first_byte and packet_number
construct appropriate Protected Packet based on first_byte
return Protected Packet
An Unprotected Packet is serialised to a Protected Packet using the
apply_protection function.
The remove_protection function is defined as: An Unprotected Packet is parsed from a Protected Packet using the
remove_protection function. The remove_protection function is
defined as:
func remove_protection(from: Protected Packet) func remove_protection(from: Protected Packet) -> Unprotected Packet:
-> Unprotected Packet:
remove header protection from protected_packet remove header protection from protected_packet
remove packet protection from protected_packet remove packet protection from protected_packet
construct appropriate packet type construct appropriate packet type
return Unprotected Packet return Unprotected Packet
An Unprotected Packet is parsed from a Protected Packet using the An Unprotected Packet is serialised to a Protected Packet using the
remove_protection function. apply_protection function. The apply_protection function is defined
as:
An Unprotected Packet is either a Long Header Packet or a Short func apply_protection(to: Unprotected Packet)
Header Packet. -> Protected Packet:
apply packet protection to payload
apply header protection to first_byte and packet_number
construct appropriate Protected Packet based on first_byte
return Protected Packet
3. Variable Length Integer Encoding 3. Variable Length Integer Encoding
A Variable Length Integer Encoding is formatted as follows: A Variable Length Integer Encoding is formatted as follows:
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Len| |Len|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
skipping to change at page 5, line 37 skipping to change at page 5, line 31
Version identifier (ID): 32 bits. 32-bit version identifier. Version identifier (ID): 32 bits. 32-bit version identifier.
A Version Negotiation Packet is formatted as follows: A Version Negotiation Packet is formatted as follows:
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|1| Unused | |1| Unused |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version | | Version ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DCID Len | | DCID Len |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Connection ID ... | Destination Connection ID ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SCID Len | | SCID Len |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Connection ID ... | Source Connection ID ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| [Supported Versions] | | [Supported Versions] |
skipping to change at page 6, line 15 skipping to change at page 6, line 9
Header Form (HF): 1 bit; HF == 1. The most significant bit (0x80) of Header Form (HF): 1 bit; HF == 1. The most significant bit (0x80) of
byte 0 (the first byte) is set to 1 for version negotiation byte 0 (the first byte) is set to 1 for version negotiation
packets. packets.
Unused (T): 6 bits. The value in the Unused field is selected Unused (T): 6 bits. The value in the Unused field is selected
randomly by the server. Clients MUST ignore the value of this randomly by the server. Clients MUST ignore the value of this
field. Servers SHOULD set the most significant bit of this field field. Servers SHOULD set the most significant bit of this field
(0x40) to 1 so that Version Negotiation packets appear to have the (0x40) to 1 so that Version Negotiation packets appear to have the
Fixed Bit field. Fixed Bit field.
Version: 1 Version; Version.ID == 0. The Version field of a Version Version ID (VID): 1 Version; VID.ID == 0. The Version field of a
Negotiation packet MUST be set to 0x0000000. Version Negotiation packet MUST be set to 0x0000000.
DCID Len (DLen): 1 byte. This field is as previously define. DCID Len (DLen): 1 byte. This field is as previously define.
However, as future versions of QUIC may support Connection IDs However, as future versions of QUIC may support Connection IDs
larger than the version 1 limit, Version Negotiation packets could larger than the version 1 limit, Version Negotiation packets could
carry Connection IDs that are longer than 20 bytes. carry Connection IDs that are longer than 20 bytes.
Destination Connection ID: DLen bytes. The Destination Connection ID Destination Connection ID: DLen bytes. The Destination Connection ID
field is between 0 and 2^8-1 bytes in length. field is between 0 and 2^8-1 bytes in length.
SCID Len (SLen): 1 byte. This field is as previously define. SCID Len (SLen): 1 byte. This field is as previously define.
skipping to change at page 7, line 10 skipping to change at page 6, line 41
6. Long Header Packets 6. Long Header Packets
A Long Header is formatted as follows: A Long Header is formatted as follows:
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 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
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|1|1| T | R | P | |1|1| T | R | P |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version | | Version ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DCID Len | | DCID Len |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Connection ID (DCID) ... | Destination Connection ID (DCID) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SCID Len | | SCID Len |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Connection ID (SCID) ... | Source Connection ID (SCID) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
skipping to change at page 7, line 43 skipping to change at page 7, line 27
Reserved Bits (R): 2 bits. Two bits (those with a mask of 0x0c) of Reserved Bits (R): 2 bits. Two bits (those with a mask of 0x0c) of
byte 0 are reserved across multiple packet types. These bits are byte 0 are reserved across multiple packet types. These bits are
protected using header protection. protected using header protection.
Packet Number Length (P): 2 bits. In packet types which contain a Packet Number Length (P): 2 bits. In packet types which contain a
Packet Number field, the least significant two bits (those with a Packet Number field, the least significant two bits (those with a
mask of 0x03) of byte 0 contain the length of the packet number, mask of 0x03) of byte 0 contain the length of the packet number,
encoded as an unsigned, two-bit integer that is one less than the encoded as an unsigned, two-bit integer that is one less than the
length of the packet number field in bytes. length of the packet number field in bytes.
Version: 1 Version. This field indicates which version of QUIC is in Version ID (VID): 1 Version. This field indicates which version of
use and determines how the rest of the protocol fields are QUIC is in use and determines how the rest of the protocol fields
interpreted. are interpreted.
DCID Len (DLen): 1 byte; DLen <= 20. This field contains the length, DCID Len (DLen): 1 byte; DLen <= 20. This field contains the length,
in bytes, of the Destination Connection ID field that follows it. in bytes, of the Destination Connection ID field that follows it.
This length is encoded as an 8-bit unsigned integer. In QUIC This length is encoded as an 8-bit unsigned integer. In QUIC
version 1, this value MUST NOT exceed 20. Endpoints that receive version 1, this value MUST NOT exceed 20. Endpoints that receive
a version 1 long header with a value larger than 20 MUST drop the a version 1 long header with a value larger than 20 MUST drop the
packet. Servers SHOULD be able to read longer connection IDs from packet. Servers SHOULD be able to read longer connection IDs from
other QUIC versions in order to properly form a version other QUIC versions in order to properly form a version
negotiation packet. negotiation packet.
skipping to change at page 8, line 39 skipping to change at page 8, line 16
A Long Header Packet is one of: an Initial Packet, a 0RTT Packet, a A Long Header Packet is one of: an Initial Packet, a 0RTT Packet, a
Handshake Packet, or a Retry Packet. Handshake Packet, or a Retry Packet.
A Protected Long Header is formatted as follows: A Protected Long Header is formatted as follows:
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 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
+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+
|1|1| T | PBits | |1|1| T | PBits |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version | | Version ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DCID Len | | DCID Len |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Connection ID ... | Destination Connection ID ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SCID Len | | SCID Len |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Connection ID ... | Source Connection ID ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
skipping to change at page 9, line 18 skipping to change at page 8, line 42
Fixed Bit (FB): 1 bit; FB == 1. The next bit (0x40) of byte 0 is set Fixed Bit (FB): 1 bit; FB == 1. The next bit (0x40) of byte 0 is set
to 1. Packets containing a zero value for this bit are not valid to 1. Packets containing a zero value for this bit are not valid
packets in this version and MUST be discarded. packets in this version and MUST be discarded.
Long Packet Type (T): 2 bits. The next two bits (those with a mask Long Packet Type (T): 2 bits. The next two bits (those with a mask
of 0x30) of byte 0 contain a packet type. of 0x30) of byte 0 contain a packet type.
Protected Bits (PBits): 4 bits. 4 bits protected using header Protected Bits (PBits): 4 bits. 4 bits protected using header
protection. protection.
Version: 1 Version. This field indicates which version of QUIC is in Version ID (VID): 1 Version. This field indicates which version of
use and determines how the rest of the protocol fields are QUIC is in use and determines how the rest of the protocol fields
interpreted. are interpreted.
DCID Len (DLen): 1 byte; DLen <= 20. This field contains the length, DCID Len (DLen): 1 byte; DLen <= 20. This field contains the length,
in bytes, of the Destination Connection ID field that follows it. in bytes, of the Destination Connection ID field that follows it.
This length is encoded as an 8-bit unsigned integer. In QUIC This length is encoded as an 8-bit unsigned integer. In QUIC
version 1, this value MUST NOT exceed 20. Endpoints that receive version 1, this value MUST NOT exceed 20. Endpoints that receive
a version 1 long header with a value larger than 20 MUST drop the a version 1 long header with a value larger than 20 MUST drop the
packet. Servers SHOULD be able to read longer connection IDs from packet. Servers SHOULD be able to read longer connection IDs from
other QUIC versions in order to properly form a version other QUIC versions in order to properly form a version
negotiation packet. negotiation packet.
skipping to change at page 18, line 28 skipping to change at page 17, line 28
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0 | | 0 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
where: where:
Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value ==
0. 0. Frame type, set to 0 for PADDING frames.
Frame type, set to 0 for PADDING frames.
8.2. PING frame 8.2. PING frame
A PING Frame is formatted as follows: A PING Frame is formatted as follows:
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 1 | | 1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
where: where:
Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value ==
1. 1. Frame type, set to 1 for PING frames.
Frame type, set to 1 for PING frames.
8.3. ACK frame 8.3. ACK frame
An ACK Range is formatted as follows: An ACK Range is formatted as follows:
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Gap ... | Gap ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
skipping to change at page 20, line 26 skipping to change at page 19, line 26
| First ACK Range ... | First ACK Range ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| [Other ACK Ranges] ... | [Other ACK Ranges] ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ECN Counts ... | ECN Counts ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
where: where:
Frame Type (FT): 1 Variable Length Integer Encoding; (FT.Value == Frame Type (FT): 1 Variable Length Integer Encoding; (FT.Value ==
3) || (FT.Value == 4). 3) || (FT.Value == 4). Frame type, set to 3 or 4 for ACK frames.
Frame type, set to 3 or 4 for ACK frames.
Largest Acknowledged: 1 Variable Length Integer Encoding. A Largest Acknowledged: 1 Variable Length Integer Encoding. A
variable-length integer representing the largest packet number the variable-length integer representing the largest packet number the
peer is acknowledging; this is usually the largest packet number peer is acknowledging; this is usually the largest packet number
that the peer has received prior to generating the ACK frame. that the peer has received prior to generating the ACK frame.
Unlike the packet number in the QUIC long or short header, the Unlike the packet number in the QUIC long or short header, the
value in an ACK frame is not truncated. value in an ACK frame is not truncated.
ACK Delay: 1 Variable Length Integer Encoding. A variable-length ACK Delay: 1 Variable Length Integer Encoding. A variable-length
integer representing the time delta in microseconds between when integer representing the time delta in microseconds between when
skipping to change at page 21, line 27 skipping to change at page 20, line 24
| Stream ID ... | Stream ID ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Application Error Code ... | Application Error Code ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Final Size ... | Final Size ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
where: where:
Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value ==
4. 4. Frame type, set to 4 for RESET_STREAM frames.
Frame type, set to 4 for RESET_STREAM frames.
Stream ID: 1 Variable Length Integer Encoding. A variable-length Stream ID: 1 Variable Length Integer Encoding. A variable-length
integer encoding of the Stream ID of the stream being terminated. integer encoding of the Stream ID of the stream being terminated.
Application Error Code: 1 Variable Length Integer Encoding. A variab Application Error Code: 1 Variable Length Integer Encoding. A variab
le-length integer containing the application protocol error code le-length integer containing the application protocol error code
which indicates why the stream is being closed. which indicates why the stream is being closed.
Final Size: 1 Variable Length Integer Encoding. A variable-length Final Size: 1 Variable Length Integer Encoding. A variable-length
integer indicating the final size of the stream by the integer indicating the final size of the stream by the
skipping to change at page 22, line 18 skipping to change at page 21, line 6
| 5 | | 5 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Stream ID ... | Stream ID ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Application Error Code ... | Application Error Code ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
where: where:
Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value ==
5. 5. Frame type, set to 5 for STOP_SENDING frames.
Frame type, set to 5 for STOP_SENDING frames.
Stream ID: 1 Variable Length Integer Encoding. A variable-length Stream ID: 1 Variable Length Integer Encoding. A variable-length
integer carrying the Stream ID of the stream being ignored. integer carrying the Stream ID of the stream being ignored.
Application Error Code: 1 Variable Length Integer Encoding. A variab Application Error Code: 1 Variable Length Integer Encoding. A variab
le-length integer containing the application-specified reason the le-length integer containing the application-specified reason the
sender is ignoring the stream. sender is ignoring the stream.
8.6. CRYPTO frame 8.6. CRYPTO frame
skipping to change at page 22, line 49 skipping to change at page 21, line 36
| Length ... | Length ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| : | :
: Crypto Data : : Crypto Data :
: | : |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
where: where:
Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value ==
6. 6. Frame type, set to 6 for CRYPTO frames.
Frame type, set to 6 for CRYPTO frames.
Offset: 1 Variable Length Integer Encoding. A variable-length Offset: 1 Variable Length Integer Encoding. A variable-length
integer specifying the byte offset in the stream for the data in integer specifying the byte offset in the stream for the data in
this CRYPTO frame. this CRYPTO frame.
Length: 1 Variable Length Integer Encoding. A variable-length Length: 1 Variable Length Integer Encoding. A variable-length
integer specifying the length of the Crypto Data field in this integer specifying the length of the Crypto Data field in this
CRYPTO frame. CRYPTO frame.
Crypto Data: Length.Value bytes. The cryptographic message data. Crypto Data: Length.Value bytes. The cryptographic message data.
skipping to change at page 23, line 34 skipping to change at page 22, line 20
| Token Length ... | Token Length ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| : | :
: Token : : Token :
: | : |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
where: where:
Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value ==
7. 7. Frame type, set to 7 for NEW_TOKEN frames.
Frame type, set to 7 for NEW_TOKEN frames.
Token Length (TL): 1 Variable Length Integer Encoding. A variable- Token Length (TL): 1 Variable Length Integer Encoding. A variable-
length integer specifying the length of the token in bytes. length integer specifying the length of the token in bytes.
Token: TL.Value bytes. An opaque blob that the client may use with a Token: TL.Value bytes. An opaque blob that the client may use with a
future Initial packet. future Initial packet.
8.8. STREAM frame 8.8. STREAM frame
A STREAM Frame is formatted as follows: A STREAM Frame is formatted as follows:
skipping to change at page 24, line 39 skipping to change at page 23, line 18
LEN bit (L): 1 bit. Set to indicate that there is a Length field LEN bit (L): 1 bit. Set to indicate that there is a Length field
present. present.
FIN bit (F): 1 bit. Set only on frames that contain the final size FIN bit (F): 1 bit. Set only on frames that contain the final size
of the stream. of the stream.
Stream ID: 1 Variable Length Integer Encoding. A variable-length Stream ID: 1 Variable Length Integer Encoding. A variable-length
integer indicating the stream ID of the stream. integer indicating the stream ID of the stream.
Offset: 1 Variable Length Integer Encoding; present only when O == Offset: 1 Variable Length Integer Encoding; present only when O ==
1. 1. A variable-length integer specifying the byte offset in the
A variable-length integer specifying the byte offset in the stream stream for the data in this STREAM frame.
for the data in this STREAM frame.
Length: 1 Variable Length Integer Encoding; present only when L == Length: 1 Variable Length Integer Encoding; present only when L ==
1. 1. A variable-length integer specifying the length of the Stream
A variable-length integer specifying the length of the Stream Data Data field in this STREAM frame. This field is present when the
field in this STREAM frame. This field is present when the LEN LEN bit is set to 1. When the LEN bit is set to 0, the Stream
bit is set to 1. When the LEN bit is set to 0, the Stream Data Data field consumes all the remaining bytes in the packet.
field consumes all the remaining bytes in the packet.
Stream Data: Length.Value bytes. The bytes from the designated Stream Data: Length.Value bytes. The bytes from the designated
stream to be delivered. stream to be delivered.
8.9. MAX_DATA frame 8.9. MAX_DATA frame
A MAX_DATA Frame is formatted as follows: A MAX_DATA Frame is formatted as follows:
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 16 | | 16 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Maximum Data ... | Maximum Data ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
where: where:
Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value ==
16. 16. Frame type, set to 16 for MAX_DATA frames.
Frame type, set to 16 for MAX_DATA frames.
Maximum Data: 1 Variable Length Integer Encoding. A variable-length Maximum Data: 1 Variable Length Integer Encoding. A variable-length
integer indicating the maximum amount of data that can be sent on integer indicating the maximum amount of data that can be sent on
the entire connection, in units of bytes. the entire connection, in units of bytes.
8.10. MAX_STREAM_DATA frame 8.10. MAX_STREAM_DATA frame
A MAX_STREAM_DATA Frame is formatted as follows: A MAX_STREAM_DATA Frame is formatted as follows:
0 1 2 3 0 1 2 3
skipping to change at page 25, line 44 skipping to change at page 24, line 22
| 17 | | 17 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Stream ID ... | Stream ID ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Maximum Stream Data ... | Maximum Stream Data ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
where: where:
Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value ==
17. 17. Frame type, set to 17 for MAX_STREAM_DATA frames.
Frame type, set to 17 for MAX_STREAM_DATA frames.
Stream ID: 1 Variable Length Integer Encoding. The stream ID of the Stream ID: 1 Variable Length Integer Encoding. The stream ID of the
stream that is affected encoded as a variable-length integer. stream that is affected encoded as a variable-length integer.
Maximum Stream Data: 1 Variable Length Integer Encoding. A variable- Maximum Stream Data: 1 Variable Length Integer Encoding. A variable-
length integer indicating the maximum amount of data that can be length integer indicating the maximum amount of data that can be
sent on the identified stream, in units of bytes. sent on the identified stream, in units of bytes.
8.11. MAX_STREAMS frame 8.11. MAX_STREAMS frame
skipping to change at page 26, line 20 skipping to change at page 24, line 46
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 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| FT | | FT |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Maximum Streams ... | Maximum Streams ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
where: where:
Frame Type (FT): 1 Variable Length Integer Encoding; (FT.Value == Frame Type (FT): 1 Variable Length Integer Encoding; (FT.Value ==
18) || (FT.Value == 19). 18) || (FT.Value == 19). Frame type, set to 18 or 19 for MAX_STREAMS
Frame type, set to 18 or 19 for MAX_STREAMS frames. frames.
Maximum Streams: 1 Variable Length Integer Encoding. A count of the Maximum Streams: 1 Variable Length Integer Encoding. A count of the
cumulative number of streams of the corresponding type that can be cumulative number of streams of the corresponding type that can be
opened over the lifetime of the connection. opened over the lifetime of the connection.
8.12. DATA_BLOCKED frame 8.12. DATA_BLOCKED frame
A DATA_BLOCKED Frame is formatted as follows: A DATA_BLOCKED Frame is formatted as follows:
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 20 | | 20 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data Limit ... | Data Limit ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
where: where:
Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value ==
20. 20. Frame type, set to 20 for DATA_BLOCKED frames.
Frame type, set to 20 for DATA_BLOCKED frames.
Data Limit: 1 Variable Length Integer Encoding. A variable-length Data Limit: 1 Variable Length Integer Encoding. A variable-length
integer indicating the connection-level limit at which blocking integer indicating the connection-level limit at which blocking
occurred. occurred.
8.13. STREAM_DATA_BLOCKED frame 8.13. STREAM_DATA_BLOCKED frame
A STREAM_DATA_BLOCKED Frame is formatted as follows: A STREAM_DATA_BLOCKED Frame is formatted as follows:
0 1 2 3 0 1 2 3
skipping to change at page 27, line 18 skipping to change at page 25, line 43
| 21 | | 21 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Stream ID ... | Stream ID ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Stream Data Limit ... | Stream Data Limit ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
where: where:
Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value ==
21. 21. Frame type, set to 21 for STREAM_DATA_BLOCKED frames.
Frame type, set to 21 for STREAM_DATA_BLOCKED frames.
Stream ID: 1 Variable Length Integer Encoding. A variable-length Stream ID: 1 Variable Length Integer Encoding. A variable-length
integer indicating the stream which is flow control blocked. integer indicating the stream which is flow control blocked.
Maximum Stream Data: 1 Variable Length Integer Encoding. A variable- Maximum Stream Data: 1 Variable Length Integer Encoding. A variable-
length integer indicating the offset of the stream at which the length integer indicating the offset of the stream at which the
blocking occurred. blocking occurred.
8.14. STREAMS_BLOCKED frame 8.14. STREAMS_BLOCKED frame
skipping to change at page 27, line 43 skipping to change at page 26, line 20
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 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| FT | | FT |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Stream Limit ... | Stream Limit ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
where: where:
Frame Type (FT): 1 Variable Length Integer Encoding; (FT.Value == Frame Type (FT): 1 Variable Length Integer Encoding; (FT.Value ==
22) || (FT.Value == 23). 22) || (FT.Value == 23). Frame type, set to 22 or 23 for
Frame type, set to 22 or 23 for STREAMS_BLOCKED frames. STREAMS_BLOCKED frames.
Stream Limit: 1 Variable Length Integer Encoding. A variable-length Stream Limit: 1 Variable Length Integer Encoding. A variable-length
integer indicating the stream limit at the time the frame was integer indicating the stream limit at the time the frame was
sent. sent.
8.15. NEW_CONNECTION_ID frame 8.15. NEW_CONNECTION_ID frame
A NEW_CONNECTION_ID Frame is formatted as follows: A NEW_CONNECTION_ID Frame is formatted as follows:
0 1 2 3 0 1 2 3
skipping to change at page 28, line 34 skipping to change at page 27, line 8
| | | |
+ Stateless Reset Token + + Stateless Reset Token +
| | | |
+ + + +
| | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
where: where:
Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value ==
24. 24. Frame type, set to 24 for NEW_CONNECTION_ID frames.
Frame type, set to 24 for NEW_CONNECTION_ID frames.
Sequence Number: 1 Variable Length Integer Encoding. The sequence Sequence Number: 1 Variable Length Integer Encoding. The sequence
number assigned to the connection ID by the sender. number assigned to the connection ID by the sender.
Retire Prior To: 1 Variable Length Integer Encoding. A variable- Retire Prior To: 1 Variable Length Integer Encoding. A variable-
length integer indicating which connection IDs should be retired. length integer indicating which connection IDs should be retired.
Length: 1 byte. An 8-bit unsigned integer containing the length of Length: 1 byte. An 8-bit unsigned integer containing the length of
the connection ID. Values less than 1 and greater than 20 are the connection ID. Values less than 1 and greater than 20 are
invalid and MUST be treated as a connection error of type invalid and MUST be treated as a connection error of type
skipping to change at page 29, line 20 skipping to change at page 27, line 42
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 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 25 | | 25 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number ... | Sequence Number ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
where: where:
Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value ==
25. 25. Frame type, set to 25 for RETIRE_CONNECTION_ID frames.
Frame type, set to 25 for RETIRE_CONNECTION_ID frames.
Sequence Number: 1 Variable Length Integer Encoding. The sequence Sequence Number: 1 Variable Length Integer Encoding. The sequence
number of the connection ID being retired. number of the connection ID being retired.
8.17. PATH_CHALLENGE frame 8.17. PATH_CHALLENGE frame
A PATH_CHALLENGE Frame is formatted as follows: A PATH_CHALLENGE Frame is formatted as follows:
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 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
skipping to change at page 29, line 43 skipping to change at page 28, line 18
| 26 | | 26 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | | |
+ Data + + Data +
| | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
where: where:
Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value ==
26. 26. Frame type, set to 26 for PATH_CHALLENGE frames.
Frame type, set to 26 for PATH_CHALLENGE frames.
Data: 64 bits. This 8-byte field contains arbitrary data. Data: 64 bits. This 8-byte field contains arbitrary data.
8.18. PATH_RESPONSE frame 8.18. PATH_RESPONSE frame
A PATH_RESPONSE Frame is formatted as follows: A PATH_RESPONSE Frame is formatted as follows:
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 27 | | 27 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | | |
+ Data + + Data +
| | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
where: where:
Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value ==
27. 27. Frame type, set to 27 for PATH_RESPONSE frames.
Frame type, set to 27 for PATH_RESPONSE frames.
Data: 64 bits. This 8-byte field contains arbitrary data. Data: 64 bits. This 8-byte field contains arbitrary data.
8.19. CONNECTION_CLOSE frame 8.19. CONNECTION_CLOSE frame
A CONNECTION_CLOSE Frame is formatted as follows: A CONNECTION_CLOSE Frame is formatted as follows:
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
skipping to change at page 30, line 46 skipping to change at page 29, line 24
| Phrase Length ... | Phrase Length ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| : | :
: Reason Phrase : : Reason Phrase :
: | : |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
where: where:
Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value ==
28 || FT.Value == 29. 28 || FT.Value == 29. Frame type, set to 28 or 29 for
Frame type, set to 28 or 29 for CONNECTION_CLOSE frames. CONNECTION_CLOSE frames.
Error Code: 1 Variable Length Integer Encoding. A variable length Error Code: 1 Variable Length Integer Encoding. A variable length
integer error code which indicates the reason for closing this integer error code which indicates the reason for closing this
connection. connection.
Frame Type: 1 Variable Length Integer Encoding; present only when Frame Type: 1 Variable Length Integer Encoding; present only when
FT.Value == 28. FT.Value == 28. A variable-length integer encoding the type of frame
A variable-length integer encoding the type of frame that that triggered the error.
triggered the error.
Phrase Length (Length): 1 Variable Length Integer Encoding. A variab Phrase Length (Length): 1 Variable Length Integer Encoding. A variab
le-length integer specifying the length of the reason phrase in le-length integer specifying the length of the reason phrase in
bytes. bytes.
Reason Phrase: Length.Value bytes. A human-readable explanation for Reason Phrase: Length.Value bytes. A human-readable explanation for
why the connection was closed. why the connection was closed.
8.20. HANDSHAKE_DONE frame 8.20. HANDSHAKE_DONE frame
skipping to change at page 31, line 30 skipping to change at page 30, line 6
0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 30 | | 30 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
where: where:
Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value == Frame Type (FT): 1 Variable Length Integer Encoding; FT.Value ==
30. 30. Frame type, set to 30 for HANDSHAKE_DONE frames.
Frame type, set to 30 for HANDSHAKE_DONE frames.
9. Informative References 9. Informative References
[QUIC-TRANSPORT] [QUIC-TRANSPORT]
Iyengar, J. and M. Thomson, "QUIC: A UDP-Based Multiplexed Iyengar, J. and M. Thomson, "QUIC: A UDP-Based Multiplexed
and Secure Transport", Work in Progress, Internet-Draft, and Secure Transport", Work in Progress, Internet-Draft,
draft-ietf-quic-transport-27, 21 February 2020, draft-ietf-quic-transport-27, 21 February 2020,
<http://www.ietf.org/internet-drafts/draft-ietf-quic- <http://www.ietf.org/internet-drafts/draft-ietf-quic-
transport-27.txt>. transport-27.txt>.
[AUGMENTED-DIAGRAMS] [AUGMENTED-DIAGRAMS]
McQuistin, S., Band, V., Jacob, D., and C. S. Perkins, McQuistin, S., Band, V., Jacob, D., and C. S. Perkins,
"Describing Protocol Data Units with Augmented Packet "Describing Protocol Data Units with Augmented Packet
Header Diagrams", Work in Progress, Internet-Draft, draft- Header Diagrams", Work in Progress, Internet-Draft, draft-
mcquistin-augmented-ascii-diagrams-04, 24 April 2020, mcquistin-augmented-ascii-diagrams-05, 17 June 2020,
<http://www.ietf.org/internet-drafts/draft-mcquistin- <http://www.ietf.org/internet-drafts/draft-mcquistin-
augmented-ascii-diagrams-04.txt>. augmented-ascii-diagrams-05.txt>.
Appendix A. Source code repository Appendix A. Source code repository
The source for this draft is available from https://github.com/ The source for this draft is available from https://github.com/
glasgow-ipl/draft-mcquistin-quic-augmented-diagrams. glasgow-ipl/draft-mcquistin-quic-augmented-diagrams.
The source code for tooling that can be used to parse this document The source code for tooling that can be used to parse this document
is available from https://github.com/glasgow-ipl/ips-protodesc-code. is available from https://github.com/glasgow-ipl/ips-protodesc-code.
Authors' Addresses Authors' Addresses
 End of changes. 40 change blocks. 
111 lines changed or deleted 89 lines changed or added

This html diff was produced by rfcdiff 1.46. The latest version is available from http://tools.ietf.org/tools/rfcdiff/