QUIC and HTTP/3 event definitions for qlog
draft-marx-qlog-event-definitions-quic-h3-00
This document is an Internet-Draft (I-D).
Anyone may submit an I-D to the IETF.
This I-D is not endorsed by the IETF and has no formal standing in the
IETF standards process.
The information below is for an old version of the document.
| Document | Type |
This is an older version of an Internet-Draft whose latest revision state is "Replaced".
|
|
|---|---|---|---|
| Author | Robin Marx | ||
| Last updated | 2019-07-03 | ||
| Replaced by | draft-marx-quic-qlog-quic-events, draft-marx-quic-qlog-h3-events | ||
| RFC stream | (None) | ||
| Formats | |||
| Stream | Stream state | (No stream defined) | |
| Consensus boilerplate | Unknown | ||
| RFC Editor Note | (None) | ||
| IESG | IESG state | I-D Exists | |
| Telechat date | (None) | ||
| Responsible AD | (None) | ||
| Send notices to | (None) |
draft-marx-qlog-event-definitions-quic-h3-00
QUIC R. Marx
Internet-Draft Hasselt University
Intended status: Standards Track July 03, 2019
Expires: January 4, 2020
QUIC and HTTP/3 event definitions for qlog
draft-marx-qlog-event-definitions-quic-h3-00
Abstract
This document describes concrete qlog event definitions and their
metadata for QUIC and HTTP/3-related events. These events can then
be embedded in the higher level schema defined in draft-marx-quic-
logging-main-schema-latest.
Status of This Memo
This Internet-Draft is submitted in full conformance with the
provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."
This Internet-Draft will expire on January 4, 2020.
Copyright Notice
Copyright (c) 2019 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents
(https://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents
carefully, as they describe your rights and restrictions with respect
to this document. Code Components extracted from this document must
include Simplified BSD License text as described in Section 4.e of
the Trust Legal Provisions and are provided without warranty as
described in the Simplified BSD License.
Marx Expires January 4, 2020 [Page 1]
Internet-Draft QUIC and HTTP/3 event definitions for qlog July 2019
Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1. Notational Conventions . . . . . . . . . . . . . . . . . 3
2. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3. QUIC event definitions . . . . . . . . . . . . . . . . . . . 4
3.1. CONNECTIVITY . . . . . . . . . . . . . . . . . . . . . . 4
3.1.1. CONNECTION_ATTEMPT . . . . . . . . . . . . . . . . . 4
3.1.2. CONNECTION_NEW . . . . . . . . . . . . . . . . . . . 4
3.1.3. CONNECTION_ID_UPDATE . . . . . . . . . . . . . . . . 5
3.1.4. MIGRATION-related events . . . . . . . . . . . . . . 5
3.1.5. CONNECTION_CLOSED . . . . . . . . . . . . . . . . . . 5
3.2. SECURITY . . . . . . . . . . . . . . . . . . . . . . . . 5
3.2.1. HEADER_DECRYPT_ERROR . . . . . . . . . . . . . . . . 5
3.2.2. PACKET_DECRYPT_ERROR . . . . . . . . . . . . . . . . 5
3.2.3. KEY_UPDATE . . . . . . . . . . . . . . . . . . . . . 5
3.2.4. KEY_RETIRED . . . . . . . . . . . . . . . . . . . . . 5
3.2.5. CIPHER_UPDATE . . . . . . . . . . . . . . . . . . . . 5
3.3. TRANSPORT . . . . . . . . . . . . . . . . . . . . . . . . 5
3.3.1. PACKET_SENT . . . . . . . . . . . . . . . . . . . . . 5
3.3.2. PACKET_RECEIVED . . . . . . . . . . . . . . . . . . . 6
3.3.3. PACKET_DROPPED . . . . . . . . . . . . . . . . . . . 6
3.3.4. VERSION_UPDATE . . . . . . . . . . . . . . . . . . . 7
3.3.5. TRANSPORT_PARAMETERS_UPDATE . . . . . . . . . . . . . 7
3.3.6. ALPN_UPDATE . . . . . . . . . . . . . . . . . . . . . 7
3.3.7. STREAM_STATE_UPDATE . . . . . . . . . . . . . . . . . 7
3.3.8. FLOW_CONTROL_UPDATE . . . . . . . . . . . . . . . . . 8
3.4. RECOVERY . . . . . . . . . . . . . . . . . . . . . . . . 8
3.4.1. CC_STATE_UPDATE . . . . . . . . . . . . . . . . . . . 8
3.4.2. METRIC_UPDATE . . . . . . . . . . . . . . . . . . . . 8
3.4.3. LOSS_ALARM_SET . . . . . . . . . . . . . . . . . . . 9
3.4.4. LOSS_ALARM_FIRED . . . . . . . . . . . . . . . . . . 9
3.4.5. PACKET_LOST . . . . . . . . . . . . . . . . . . . . . 9
3.4.6. PACKET_ACKNOWLEDGED . . . . . . . . . . . . . . . . . 9
3.4.7. PACKET_RETRANSMIT . . . . . . . . . . . . . . . . . . 10
4. HTTP/3 event definitions . . . . . . . . . . . . . . . . . . 10
4.1. HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4.2. QPACK . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4.3. PRIORITIZATION . . . . . . . . . . . . . . . . . . . . . 10
4.4. PUSH . . . . . . . . . . . . . . . . . . . . . . . . . . 10
5. Security Considerations . . . . . . . . . . . . . . . . . . . 10
6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 10
7. References . . . . . . . . . . . . . . . . . . . . . . . . . 10
7.1. Normative References . . . . . . . . . . . . . . . . . . 10
7.2. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Appendix A. QUIC DATA type definitions . . . . . . . . . . . . . 11
A.1. PacketType . . . . . . . . . . . . . . . . . . . . . . . 11
A.2. PacketHeader . . . . . . . . . . . . . . . . . . . . . . 11
Marx Expires January 4, 2020 [Page 2]
Internet-Draft QUIC and HTTP/3 event definitions for qlog July 2019
A.3. QUIC Frames . . . . . . . . . . . . . . . . . . . . . . . 11
A.3.1. AckFrame . . . . . . . . . . . . . . . . . . . . . . 11
A.3.2. StreamFrame . . . . . . . . . . . . . . . . . . . . . 12
A.3.3. ResetStreamFrame . . . . . . . . . . . . . . . . . . 12
A.3.4. ConnectionCloseFrame . . . . . . . . . . . . . . . . 13
A.3.5. MaxDataFrame . . . . . . . . . . . . . . . . . . . . 13
A.3.6. MaxStreamDataFrame . . . . . . . . . . . . . . . . . 13
A.3.7. UnknownFrame . . . . . . . . . . . . . . . . . . . . 13
A.3.8. TransportError . . . . . . . . . . . . . . . . . . . 13
Appendix B. HTTP/3 DATA type definitions . . . . . . . . . . . . 14
B.1. ApplicationError . . . . . . . . . . . . . . . . . . . . 14
Appendix C. Change Log . . . . . . . . . . . . . . . . . . . . . 15
C.1. Since draft-marx-qlog-event-definitions-quic-h3-00-00: . 15
Appendix D. Design Variations . . . . . . . . . . . . . . . . . 15
Appendix E. Acknowledgements . . . . . . . . . . . . . . . . . . 15
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 15
1. Introduction
Feedback and discussion welcome at https://github.com/quiclog/
internet-drafts
1.1. Notational Conventions
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in [RFC2119].
2. Overview
This document describes the values of the qlog CATEGORY, EVENT_TYPE,
TRIGGER and DATA fields and their semantics for the QUIC and HTTP/3
protocols. The definitions included in this file are assumed to be
used in qlog's "trace" containers, where the trace's "protocol_type"
field MUST be set to "QUIC_HTTP3".
This document is based on draft-20 of the QUIC and HTTP/3 I-Ds QUIC-
TRANSPORT [QUIC-HTTP].
This document uses the "TypeScript" language [1] to describe its
schema in. We use TypeScript because it is less verbose than JSON-
schema and almost as expressive. It also makes it easier to include
these definitions directly into a web-based tool. The main
conventions a reader should be aware of are:
o obj? : this object is optional
Marx Expires January 4, 2020 [Page 3]
Internet-Draft QUIC and HTTP/3 event definitions for qlog July 2019
o type1 | type2 : a union of these two types (object can be either
type1 OR type2)
o obj:type : this object has this concrete type
o obj[] : this object is an array (which can contain any type of
object)
o obj:Array<type> : this object is an array of this type
o number : identifies either an integer, float or double in
TypeScript. In this document, number always means an integer.
o Unless explicity defined, the value of an enum entry is the string
version of its name (e.g., INITIAL = "INITIAL")
o Many numerical fields have type "string" instead of "number".
This is because many JSON implementations only support integers up
to 2^53-1 (MAX_INTEGER for JavaScript without BigInt support),
which is less than QUIC's VLIE types (2^62-1). Each VLIE field is
thus a string, where a number would be semantically more correct.
Unless mentioned otherwise (e.g., for connection IDs), numerical
fields that are logged as strings (e.g., packet numbers) MUST be
logged in decimal (base-10) format. TODO: see issue 10
o TODO: list all possible triggers per event type
o TODO: make it clear which events are "normal" and which are "only
if you really need this" (normal = probably TRANSPORT TX/RX and
RECOVERY basics and HTTP basics)
3. QUIC event definitions
o TODO: flesh out the definitions for most of these
o TODO: add all definitions for HTTP3 and QPACK events
3.1. CONNECTIVITY
3.1.1. CONNECTION_ATTEMPT
TODO: specify how this works with happy eyeballs
3.1.2. CONNECTION_NEW
Marx Expires January 4, 2020 [Page 4]
Internet-Draft QUIC and HTTP/3 event definitions for qlog July 2019
3.1.3. CONNECTION_ID_UPDATE
TODO: mention that CIDs can be logged in hex
3.1.4. MIGRATION-related events
e.g., PATH_UPDATE
TODO: read up on the draft how migration works and whether to best
fit this here or in TRANSPORT
3.1.5. CONNECTION_CLOSED
3.2. SECURITY
3.2.1. HEADER_DECRYPT_ERROR
{ mask, error }
3.2.2. PACKET_DECRYPT_ERROR
{ key, error }
3.2.3. KEY_UPDATE
{ type = "Initial | handshake | 1RTT", value }
3.2.4. KEY_RETIRED
{ value } # initial encryption level is implicitly deleted
3.2.5. CIPHER_UPDATE
3.3. TRANSPORT
3.3.1. PACKET_SENT
Triggers:
o "DEFAULT"
o "RETRANSMIT_REORDERING" // draft-19 6.1.1
o "RETRANSMIT_TIMEOUT" // draft-19 6.1.2
o "RETRANSMIT_CRYPTO" // draft-19 6.2
o "RETRANSMIT_PTO" // draft-19 6.3
Marx Expires January 4, 2020 [Page 5]
Internet-Draft QUIC and HTTP/3 event definitions for qlog July 2019
o "CC_BANDWIDTH_PROBE" // needed for some CCs to figure out
bandwidth allocations when there are no normal sends
Data:
{
packet_type:PacketType,
header:PacketHeader,
frames:Array<QuicFrame>
}
Notes:
o We don't explicitly log the encryption_level or
packet_number_space: the packet_type specifies this by inference
(assuming correct implementation)
3.3.2. PACKET_RECEIVED
Triggers:
o "DEFAULT"
Data:
{
packet_type:PacketType,
header:PacketHeader,
frames:Array<QuicFrame>
}
Notes:
o We don't explicitly log the encryption_level or
packet_number_space: the packet_type specifies this by inference
(assuming correct implementation)
3.3.3. PACKET_DROPPED
Can be due to several reasons * TODO: How does this relate to
HEADER_DECRYPT_ERROR and PACKET_DECRYPT_ERROR? * TODO: if a packet is
dropped because we don't have a connection for it, how can we add it
to a given trace in the overall qlog file? Need a sort of catch-call
trace in each file? * TODO: differentiate between DATAGRAM_DROPPED
and PACKET_DROPPED? Same with PACKET_RECEIVED and DATAGRAM_RECEIVED?
Marx Expires January 4, 2020 [Page 6]
Internet-Draft QUIC and HTTP/3 event definitions for qlog July 2019
3.3.4. VERSION_UPDATE
TODO: maybe name VERSION_SELECTED ?
3.3.5. TRANSPORT_PARAMETERS_UPDATE
3.3.6. ALPN_UPDATE
TODO: should this be in HTTP?
{ alpn:string }
3.3.7. STREAM_STATE_UPDATE
{
old:string,
new:string
}
Possible values:
o IDLE
o OPEN
o CLOSED
o HALF_CLOSED_REMOTE
o HALF_CLOSED_LOCAL
o DESTROYED // memory actually freed
o Ready
o Send
o Data Sent
o Reset Sent
o Data Rcvd
o Reset Rcvd
o Recv
o Size Known
Marx Expires January 4, 2020 [Page 7]
Internet-Draft QUIC and HTTP/3 event definitions for qlog July 2019
o Data Rcvd
o Data Read
o Reset Read
TODO: do we need all of these? How do implementations actually
handle this in practice?
3.3.8. FLOW_CONTROL_UPDATE
o type = connection
o type = stream + id = streamid
TODO: check state machine in QUIC transport draft
3.4. RECOVERY
3.4.1. CC_STATE_UPDATE
{
old:string,
new:string
}
3.4.2. METRIC_UPDATE
{
cwnd?: number;
bytes_in_flight?:number;
min_rtt?:number;
smoothed_rtt?:number;
latest_rtt?:number;
max_ack_delay?:number;
rtt_variance?:number;
ssthresh?:number;
pacing_rate?:number;
}
This event SHOULD group all possible metric updates that happen at or
around the same time in a single event (e.g., if min_rtt and
smoothed_rtt change at the same time, they should be bundled in a
single METRIC_UPDATE entry, rather than split out into two).
Marx Expires January 4, 2020 [Page 8]
Internet-Draft QUIC and HTTP/3 event definitions for qlog July 2019
Consequently, a METRIC_UPDATE is only guaranteed to contain at least
one of the listed metrics.
Note: to make logging easier, implementations MAY log values even if
they are the same as previously reported values (e.g., two subsequent
METRIC_UPDATE entries can both report the exact same value for
min_rtt). However, applications SHOULD try to log only actual
updates to values.
o TODO: split these up into separate events? e.g., CWND_UPDATE,
BYTES_IN_FLIGHT_UPDATE, ...
o TODO: move things like pacing_rate, cwnd, bytes_in_flight,
ssthresh, etc. to CC_STATE_UPDATE?
o TODO: what types of CC metrics do we need to support by default
(e.g., cubic vs bbr)
3.4.3. LOSS_ALARM_SET
3.4.4. LOSS_ALARM_FIRED
3.4.5. PACKET_LOST
Data:
{
packet_number:string
}
Triggers:
o "UNKNOWN",
o "REORDERING_THRESHOLD",
o "TIME_THRESHOLD"
3.4.6. PACKET_ACKNOWLEDGED
TODO: must this be a separate event? can't we get this from logged
ACK frames? (however, explicitly indicating this and logging it in
the ack handler is a better signal that the ACK actually had the
intended effect than just logging its receipt)
Marx Expires January 4, 2020 [Page 9]
Internet-Draft QUIC and HTTP/3 event definitions for qlog July 2019
3.4.7. PACKET_RETRANSMIT
TODO: only if a packet is retransmit in-full, which many stacks don't
do. Need something more flexible.
4. HTTP/3 event definitions
4.1. HTTP
4.2. QPACK
4.3. PRIORITIZATION
4.4. PUSH
5. Security Considerations
TBD
6. IANA Considerations
TBD
7. References
7.1. Normative References
[QUIC-HTTP]
Bishop, M., Ed., "Hypertext Transfer Protocol Version 3
(HTTP/3)", draft-ietf-quic-http-20 (work in progress),
April 2019.
[QUIC-TRANSPORT]
Iyengar, J., Ed. and M. Thomson, Ed., "QUIC: A UDP-Based
Multiplexed and Secure Transport", draft-ietf-quic-
transport-20 (work in progress), April 2019.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119,
DOI 10.17487/RFC2119, March 1997,
<https://www.rfc-editor.org/info/rfc2119>.
7.2. URIs
[1] https://www.typescriptlang.org/
Marx Expires January 4, 2020 [Page 10]
Internet-Draft QUIC and HTTP/3 event definitions for qlog July 2019
Appendix A. QUIC DATA type definitions
A.1. PacketType
enum PacketType {
INITIAL,
HANDSHAKE,
ZERORTT = "0RTT",
ONERTT = "1RTT",
RETRY,
VERSION_NEGOTIATION,
UNKOWN
}
A.2. PacketHeader
class PacketHeader {
packet_number: string;
packet_size?: number;
payload_length?: number;
// only if present in the header
// if correctly using NEW_CONNECTION_ID events,
// dcid can be skipped for 1RTT packets
version?: string;
scil?: string;
dcil?: string;
scid?: string;
dcid?: string;
// Note: short vs long header is implicit through PacketType
}
A.3. QUIC Frames
type QuicFrame = AckFrame | StreamFrame | ResetStreamFrame | ConnetionCloseFrame | MaxDataFrame | MaxStreamDataFrame | UnknownFrame;
A.3.1. AckFrame
Marx Expires January 4, 2020 [Page 11]
Internet-Draft QUIC and HTTP/3 event definitions for qlog July 2019
class AckFrame{
frame_type:string = "ACK";
ack_delay:string;
// first number is "from": lowest packet number in interval
// second number is "to": up to and including // highest packet number in interval
// e.g., looks like [[1,2],[4,5]]
acked_ranges:Array<[number, number]>;
ect1?:string;
ect0?:string;
ce?:string;
}
Note: the packet ranges in AckFrame.acked_ranges do not necessarily
have to be ordered (e.g., [[5,9],[1,4]] is a valid value).
Note: the two numbers in the packet range can be the same (e.g.,
[120,120] means that packet with number 120 was ACKed). TODO: maybe
make this into just [120]?
A.3.2. StreamFrame
class StreamFrame{
frame_type:string = "STREAM";
id:string;
// These two MUST always be set
// If not present in the Frame type, log their default values
offset:string;
length:string;
// this MAY be set any time, but MUST only be set if the value is "true"
// if absent, the value MUST be assumed to be "false"
fin:boolean;
}
A.3.3. ResetStreamFrame
class ResetStreamFrame{
frame_type:string = "RESET_STREAM";
id:string;
error_code:ApplicationError | number;
final_offset:string;
}
Marx Expires January 4, 2020 [Page 12]
Internet-Draft QUIC and HTTP/3 event definitions for qlog July 2019
A.3.4. ConnectionCloseFrame
type ErrorSpace = "TRANSPORT" | "APPLICATION";
class ConnectionCloseFrame{
frame_type:string = "CONNECTION_CLOSE";
error_space:ErrorSpace;
error_code:TransportError | ApplicationError | number;
reason:string;
trigger_frame_type?:number; // TODO: should be more defined, but we don't have a FrameType enum atm...
}
A.3.5. MaxDataFrame
class MaxDataFrame{
stream_type:string = "MAX_DATA";
maximum:string;
}
A.3.6. MaxStreamDataFrame
class MaxStreamDataFrame{
stream_type:string = "MAX_STREAM_DATA";
id:string;
maximum:string;
}
A.3.7. UnknownFrame
class UnknownFrame{
frame_type:string = "UNKNOWN";
}
A.3.8. TransportError
Marx Expires January 4, 2020 [Page 13]
Internet-Draft QUIC and HTTP/3 event definitions for qlog July 2019
enum TransportError {
NO_ERROR,
INTERNAL_ERROR,
SERVER_BUSY,
APPLICATION_FLOW_CONTROL_ERROR, // 0x3
STREAM_FLOW_CONTROL_ERROR, // 0x4
STREAM_STATE_ERROR,
FINAL_SIZE_ERROR,
FRAME_ENCODING_ERROR,
TRANSPORT_PARAMETER_ERROR,
PROTOCOL_VIOLATION,
INVALID_MIGRATION,
CRYPTO_ERROR
}
Appendix B. HTTP/3 DATA type definitions
B.1. ApplicationError
enum ApplicationError{
HTTP_NO_ERROR,
HTTP_WRONG_SETTING_DIRECTION,
HTTP_PUSH_REFUSED,
HTTP_INTERNAL_ERROR,
HTTP_PUSH_ALREADY_IN_CACHE,
HTTP_REQUEST_CANCELLED,
HTTP_INCOMPLETE_REQUEST,
HTTP_CONNECT_ERROR,
HTTP_EXCESSIVE_LOAD,
HTTP_VERSION_FALLBACK,
HTTP_WRONG_STREAM,
HTTP_LIMIT_EXCEEDED,
HTTP_DUPLICATE_PUSH,
HTTP_UNKNOWN_STREAM_TYPE,
HTTP_WRONG_STREAM_COUNT,
HTTP_CLOSED_CRITICAL_STREAM,
HTTP_WRONG_STREAM_DIRECTION,
HTTP_EARLY_RESPONSE,
HTTP_MISSING_SETTINGS,
HTTP_UNEXPECTED_FRAME,
HTTP_REQUEST_REJECTED,
HTTP_GENERAL_PROTOCOL_ERROR,
HTTP_MALFORMED_FRAME
}
TODO: HTTP_MALFORMED_FRAME is not a single value, but can include the
frame type in its definition. This means we need more flexible error
Marx Expires January 4, 2020 [Page 14]
Internet-Draft QUIC and HTTP/3 event definitions for qlog July 2019
logging. Best to wait until h3-draft-21, which will include
substantial changes to error codes.
Appendix C. Change Log
C.1. Since draft-marx-qlog-event-definitions-quic-h3-00-00:
o None yet.
Appendix D. Design Variations
TBD
Appendix E. Acknowledgements
Thanks to Jana Iyengar, Brian Trammell, Dmitri Tikhonov, Stephen
Petrides, Jari Arkko, Marcus Ihlar, Victor Vasiliev, Mirja Kuehlewind
and Lucas Pardue for their feedback and suggestions.
Author's Address
Robin Marx
Hasselt University
Email: robin.marx@uhasselt.be
Marx Expires January 4, 2020 [Page 15]