| Internet-Draft | Export of QUIC Information in IPFIX | September 2026 |
| Lin, et al. | Expires 1 April 2027 | [Page] |
This document defines IP Flow Information Export (IPFIX) Information Elements and export profiles for QUIC packet, header, frame, aggregate, and connection observations. It distinguishes wire-visible information from values requiring version-specific parsing, packet-protection processing, or endpoint state, and reports observation provenance, processing outcome, and export completeness.¶
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 1 April 2027.¶
Copyright (c) 2026 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 Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
QUIC packets are carried in UDP datagrams and exchanged for communication of QUIC endpoints [RFC9000]. A QUIC packet normally consists of a QUIC header and a QUIC payload.¶
The QUIC header is divided into the Long Header and the Short Header. While some properties (e.g., header form bit) are version-independent per [RFC8999], the overall structure, especially the interpretation of packet type bits, is version-specific. The Long Header contains an 8-bit first octet, a 32-bit QUIC Version, a variable-length Destination Connection ID, and a variable-length Source Connection ID. In a Version Negotiation packet, only the Header Form bit of the first octet has invariant meaning; the other seven bits are arbitrary. In QUIC versions 1 and 2 packets other than Version Negotiation, the first octet contains the Header Form bit, Fixed Bit, packet-type bits, and type-specific bits, and fields following the Connection IDs vary by packet type, for example the Token in Initial and Retry packets [RFC9000]. For QUIC versions 1 and 2, Version Negotiation, Initial, 0-RTT, Handshake, and Retry packets use the Long Header, while 1-RTT packets use the Short Header. A sender can continue to send Long Header packets while the corresponding encryption levels remain in use; availability of 1-RTT keys does not by itself imply that all Long Header traffic has stopped. The Short Header includes an 8-bit first octet, a variable-length Destination Connection ID and a Packet Number.¶
The QUIC payload MAY contain a sequence of Frames which begin with a Frame Type. In the generic Frame Layout, the Frame Type is followed by additional type-dependent fields. A Stream provides a lightweight, ordered byte-stream abstraction to an application. A QUIC connection can carry many concurrent Streams, so the Stream ID carried by a Frame is important: it identifies the Stream whose data the Frame carries (e.g., a STREAM frame), or the Stream that the Frame affects (e.g., RESET_STREAM, STOP_SENDING, or MAX_STREAM_DATA frame).¶
QUIC packets provide varying levels of cryptographic protection depending on their type [RFC9001]. Version Negotiation packets have no cryptographic protection. Retry packets are neither encrypted nor header-protected, but carry a version-specific Retry Integrity Tag. Initial packets use packet-protection keys that are publicly derivable from the Destination Connection ID of the applicable client Initial packet. Handshake, 0-RTT, and 1-RTT packets use keys derived from TLS. Header fields that remain visible on the wire can nevertheless be authenticated as AEAD associated data; this document therefore distinguishes fields that are encrypted, fields that are masked by header protection, and fields that are wire-visible.¶
This document specifies several new IPFIX Information Elements (IEs) within the "IPFIX Information Elements" registry [RFC7012] for purposes of getting QUIC related information. These IEs are used to export the main fields of the QUIC header and payload in a QUIC packet. Some values are normally available only to QUIC endpoints or authorized devices holding the applicable traffic keys. For supported QUIC versions, an observer with the required connection context can also derive Initial keys and process Initial packets; successful Initial processing is not peer authentication.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
This document makes use of the terms defined in [RFC7011] and [RFC9000].¶
The following terms are used as defined in [RFC7011]:¶
The following terms are used as defined in [RFC9000]:¶
The term "flow" in this document aligns with the IPFIX definition, not the QUIC definition.¶
QUIC introduces multiple layers of encapsulation that do not map one-to-one to traditional IPFIX flow records. A UDP datagram can contain multiple QUIC packets (via coalescing), a QUIC packet can contain multiple frames, and frames can belong to different streams. This section defines explicit export profiles to clarify the observation hierarchy and avoid semantic ambiguity.¶
The following hierarchy describes the relationship between observed QUIC entities:¶
IP Flow: A sequence of IP packets sharing common properties (e.g., 5-tuple). An IP flow may carry multiple UDP datagrams.¶
UDP Datagram: A single UDP payload that may contain one or more QUIC packets (coalesced).¶
QUIC Packet: A QUIC-layer unit with its own header and payload. Multiple QUIC packets can be coalesced into one UDP datagram. Initial, 0-RTT, Handshake, and 1-RTT packets belong to a packet number space. Version Negotiation and Retry packets do not carry packet numbers, and a confirmed Stateless Reset has no semantic packet number.¶
QUIC Frame: A structured protocol element carried in a QUIC packet payload. A QUIC packet can contain multiple frames of different types (e.g., STREAM, ACK, CRYPTO).¶
QUIC Stream: An ordered byte stream multiplexed within a QUIC connection. Multiple streams can be interleaved via STREAM frames within a single QUIC packet.¶
In the unsampled variants, each top-level Data Record defined by the export profiles in Section 3.3 represents exactly one entity of the hierarchy above: one IP/UDP datagram (Network-Wire Observation Profile), one QUIC packet (Endpoint Packet Observation Profile), one IP Flow or aggregation window (Flow-Aggregate Profile), or one QUIC connection (Connection-State Profile). When PSAMP packet selection is active, the sampled Network-Wire and Endpoint variants instead emit exactly one Extended Packet Report for each selected outer IP packet. Ordered child records within that report preserve the one-record-per-inner-QUIC-packet semantics and identify each child with quicPacketOffset.¶
RFC 7012 specifies that a non-key Information Element whose value varies within a Flow is, by default, taken from the first observed packet of the Flow (Section 5 of [RFC7012]). For packet-derived QUIC IEs this default is insufficient, because "the first observed packet" does not identify which QUIC packet supplies the value when the datagram carries multiple coalesced QUIC packets, or which frame occurrence supplies the value when a QUIC packet contains multiple frames or references multiple streams. This document therefore defines, per profile, the observation unit of each Data Record and the explicit ordinal or offset fields that identify each occurrence: quicPacketOffset (TBD15) locates an inner QUIC packet within its UDP payload, quicFrameOffset (TBD13) locates a frame within its packet payload, and sub-templates are ordered by these offsets. Where a scalar IE with per-observation cardinality would otherwise be reported at a coarser granularity, the profile either reports every occurrence (as list entries) or excludes the IE from that profile; "first observed value" is used only where a profile explicitly states it (e.g., the Flow-Aggregate Profile).¶
Existing IPFIX packet counters (for example, packetDeltaCount and droppedPacketDeltaCount) describe the outer IP/Flow packet layer and cannot implicitly count coalesced inner QUIC packets. Likewise, forwardingStatus (89) [RFC7270] describes forwarding disposition at that outer layer. If counting at the QUIC packet layer is required, exporters MUST use the dedicated quicPacketDeltaCount Information Element (TBD16, defined in Section 4) rather than packetDeltaCount. Discard-related monitoring (e.g., why QUIC-carrying packets are forwarded or dropped) aligns with the broader discard monitoring framework [discardmodel] and its associated IPFIX IEs [ipfix-discard-class-ie].¶
As noted in Section 3.1 of [RFC9312], there is no general passive method to distinguish QUIC from arbitrary UDP traffic, and the QUIC fixed bit is subject to greasing [RFC9287]. A UDP datagram that looks like QUIC may not be QUIC, and an exporter that relies on a fixed-bit or port heuristic MUST NOT treat that classification as authoritative.¶
Observation provenance and processing outcome are independent. Each packet observation in the Network-Wire and Endpoint Packet profiles therefore carries both quicObservationSource (TBD17) and quicProcessingStatus (TBD18). quicObservationSource states whether the values came from passive wire observation, endpoint protocol state, or an authorized cooperating device. quicProcessingStatus states what processing was completed or why it stopped. quicExportFlags (TBD24) independently reports whether otherwise available information was suppressed by configured export policy or truncated by a local resource or size limit. The processing result is not overwritten by an export-completeness condition. The status values are not an ordered confidence scale. In particular, endpoint-originated Version Negotiation and Retry observations do not require decryption, and a passive observer can successfully process a supported-version Initial packet when it has the required context. The Flow-Aggregate and Connection-State profiles carry the same two IEs to identify the particular admission evidence that first caused the exporter to classify the flow or connection as QUIC.¶
A Data Record encoded by a Template contains a value for every Field Specifier in that Template [RFC7011]. Consequently, an exporter cannot omit one field from an individual record while continuing to use the same Template. A profile in this document handles a field that is absent or unavailable in one of two ways:¶
use another announced Template that does not contain the field; or¶
include quicFieldPresence (TBD21) in the record. When the bit assigned to an accompanying field is clear, the exporter encodes the canonical placeholder required by the fixed Template (zero for a numeric field, an empty value for an octetArray, or an empty list), and the collector MUST ignore that placeholder. When the bit is set, the encoded value is semantically present; an empty octetArray can therefore represent a genuine zero-length QUIC field without being confused with absence.¶
quicPacketType uses its Unknown value when a type cannot be determined. Malformed, capture-truncated, unsupported-version, and authentication-failed observations use distinct quicProcessingStatus values; local suppression or truncation uses quicExportFlags. An exporter MUST NOT mark fields derived from an unsuccessful parse or failed packet-protection operation as present. Successful Initial packet protection processing under publicly derivable keys indicates that the packet is internally consistent under those keys; it is not peer authentication and does not provide integrity against an active on-path attacker.¶
Template IDs are dynamically scoped to the (Observation Domain ID, Exporting Process, Transport Session) tuple in which they were announced. Collectors MUST NOT infer record content, provenance, or validation result from a numeric Template ID. These properties are carried in-band by the IEs defined above and, for Destination Connection ID length context, by quicDestinationConnectionIdLengthSource (TBD19).¶
This document defines the following export profiles. Each profile specifies its Flow Keys, granularity, sampling behavior, observation time, direction, and unavailable-field behavior, and provides an illustrative Template field layout and Data Record example. Where more than one encapsulation layer is reported (inner QUIC packets within a UDP datagram, frames within a QUIC packet), a subTemplateList [RFC6313] is used so that the hierarchy remains explicit. Except for fields whose first-observed aggregation is explicitly defined by the Flow-Aggregate Profile, per-packet scalar values are not flattened into fields of a record that covers several such objects. The Template IDs shown in the figures are examples only; actual Template IDs are dynamically assigned, and collectors MUST NOT infer the content or provenance of a record from its Template ID (see Section 3.2). The figures list fields and abstract data types, not byte-level Template encodings. An exporter MUST encode the actual Template Field Specifiers as required by [RFC7011]. In the illustrated profiles, octetArray, basicList, and subTemplateList fields use the variable-length Field Length 65535. A numeric Field Length, including any reduced-size encoding, MUST accommodate every value sent with that Template.¶
Except for the order of elements within an ordered structured-data list, the order of Information Elements in a Template is not significant. Exporters MAY add other Information Elements or export records using other Templates. A collector that supports a profile in this document MUST accept reordered fields, additional Information Elements, and unrelated Data Records.¶
Every ordinary Data Record in these profiles is scoped by the Observation Domain ID in the IPFIX Message Header. It is not repeated as observationDomainId (149) in an ordinary Data Template and is not a packet-derived Flow Key. The Connection-State Options Template uses observationDomainId as an Options Scope field, as explicitly shown. For purposes of flowId correlation, the Observation Domain ID is the Message Header value for an Endpoint Packet record and the explicit Options Scope value for a Connection-State record.¶
Every basicList and subTemplateList in these profiles that preserves wire order MUST use the ordered structured-data semantic defined by [RFC6313]. The field-presence and processing-status IEs are part of the record contract and are not inferred from the selected Template ID. quicExportFlags is zero when export is complete under the profile and carries independent bits when local policy suppresses otherwise available values or a local resource/size limit truncates export.¶
This profile is intended for passive on-path observation. It reports wire-visible fields and packet boundaries; although an exporter can process supported-version Initial protection when it has the required context, this profile does not export packet numbers or frame contents.¶
Illustrative field layout (example Template ID 258):
sourceIPv4Address (8) ipv4Address
destinationIPv4Address (12) ipv4Address
protocolIdentifier (4) unsigned8
udpSourcePort (180) unsigned16
udpDestinationPort (181) unsigned16
ipClassOfService (5) unsigned8
octetDeltaCount (1) unsigned64
packetDeltaCount (2) unsigned64 (set to 1)
observationTimeMilliseconds (323) dateTimeMilliseconds
flowDirection (61) unsigned8
quicDatagramParseStatus (TBD22) unsigned8
quicExportFlags (TBD24) unsigned8
subTemplateList (292) subTemplateList
Illustrative child layout (example Sub-Template ID 259):
quicPacketOffset (TBD15) unsigned32
quicPacketLength (TBD23) unsigned32
quicObservationSource (TBD17) unsigned8
quicProcessingStatus (TBD18) unsigned8
quicExportFlags (TBD24) unsigned8
quicFieldPresence (TBD21) unsigned32
quicFirstOctet (TBD1) unsigned8
quicPacketType (TBD3) unsigned8
quicVersion (TBD2) unsigned32
quicSupportedVersion (TBD4) basicList
quicDestinationConnectionIdLengthSource (TBD19) unsigned8
quicDestinationConnectionId (TBD6) octetArray
quicSourceConnectionId (TBD7) octetArray
quicToken (TBD20) octetArray
Data Record (Template ID 258), two coalesced QUIC packets:
sourceIPv4Address 203.0.113.7
destinationIPv4Address 192.0.2.1
protocolIdentifier 17
udpSourcePort 443
udpDestinationPort 53924
ipClassOfService 0
octetDeltaCount 1284
packetDeltaCount 1
observationTimeMilliseconds 1726200000100
flowDirection 0 (ingress)
quicDatagramParseStatus 1 (Complete)
quicExportFlags 0 (Complete)
subTemplateList, 2 entries of Sub-Template 259:
entry 0: quicPacketOffset 0, quicPacketLength 1180,
quicObservationSource 1 (Passive wire),
quicProcessingStatus 4 (Initial processed),
quicExportFlags 0 (Complete),
quicFieldPresence 0x0000009D
(Version, Destination CID, Source CID, Token,
Packet Length),
quicFirstOctet 0xC3, quicPacketType 2 (Initial),
quicVersion 0x00000001, quicSupportedVersion (empty),
quicDestinationConnectionIdLengthSource 1 (explicit
length field),
quicDestinationConnectionId 0x0001020304050607,
quicSourceConnectionId 0x2021222324252627,
quicToken (empty, zero-length Initial Token)
entry 1: quicPacketOffset 1180, quicPacketLength 76,
quicObservationSource 1 (Passive wire),
quicProcessingStatus 3
(Supported-version packet structure parsed),
quicExportFlags 0 (Complete),
quicFieldPresence 0x00000084
(Destination CID, Packet Length),
quicFirstOctet 0x43, quicPacketType 0 (Unknown),
quicVersion 0 (placeholder),
quicSupportedVersion (empty),
quicDestinationConnectionIdLengthSource 2 (learned
connection context),
quicDestinationConnectionId 0x0001020304050607,
quicSourceConnectionId (empty placeholder),
quicToken (empty placeholder)
¶
This profile is intended for QUIC endpoints, authorized devices that legitimately possess the relevant traffic keys, and passive observers that successfully process supported-version Initial packets with the required context. It exports fields available after successful packet processing or directly from endpoint protocol state.¶
Illustrative sampled parent (example Template ID 265):
selectionSequenceId (301) unsigned64
sourceIPv4Address (8) ipv4Address
destinationIPv4Address (12) ipv4Address
protocolIdentifier (4) unsigned8
udpSourcePort (180) unsigned16
udpDestinationPort (181) unsigned16
observationTimeMilliseconds (323) dateTimeMilliseconds
quicDatagramParseStatus (TBD22) unsigned8
quicExportFlags (TBD24) unsigned8
subTemplateList (292) subTemplateList
Illustrative sampled QUIC-packet child (example Sub-Template
ID 266):
quicPacketOffset (TBD15) unsigned32
flowId (148) unsigned64
quicSenderDirection (TBD11) unsigned8
quicPacketNumberSpace (TBD12) unsigned8
quicPacketNumber (TBD8) unsigned64
quicObservationSource (TBD17) unsigned8
quicProcessingStatus (TBD18) unsigned8
quicExportFlags (TBD24) unsigned8
quicFieldPresence (TBD21) unsigned32
quicFirstOctet (TBD1) unsigned8
quicPacketType (TBD3) unsigned8
quicVersion (TBD2) unsigned32
quicDestinationConnectionId (TBD6) octetArray
quicSourceConnectionId (TBD7) octetArray
quicToken (TBD20) octetArray
quicPacketLength (TBD23) unsigned32
subTemplateList (292) subTemplateList (frames)
¶
Illustrative field layout (example Template ID 260):
flowId (148) unsigned64
quicSenderDirection (TBD11) unsigned8
quicPacketNumberSpace (TBD12) unsigned8
quicPacketNumber (TBD8) unsigned64
quicObservationSource (TBD17) unsigned8
quicProcessingStatus (TBD18) unsigned8
quicExportFlags (TBD24) unsigned8
quicFieldPresence (TBD21) unsigned32
quicFirstOctet (TBD1) unsigned8
quicPacketType (TBD3) unsigned8
quicVersion (TBD2) unsigned32
quicDestinationConnectionId (TBD6) octetArray
quicSourceConnectionId (TBD7) octetArray
quicToken (TBD20) octetArray
quicPacketLength (TBD23) unsigned32
observationTimeMilliseconds (323) dateTimeMilliseconds
subTemplateList (292) subTemplateList
Child layout (example Sub-Template ID 261, packet order):
quicFieldPresence (TBD21) unsigned32
quicFrameType (TBD9) unsigned64
quicStreamId (TBD10) unsigned64
quicFrameOffset (TBD13) unsigned32
quicFrameLength (TBD14) unsigned32
Data Record (Template ID 260):
flowId 4096
quicSenderDirection 0 (client-to-server)
quicPacketNumberSpace 2 (Application Data)
quicPacketNumber 1847
quicObservationSource 2 (Endpoint protocol state)
quicProcessingStatus 5 (Protected content available)
quicExportFlags 0 (Complete)
quicFieldPresence 0x00000084
(Destination CID, Packet Length)
quicFirstOctet 0x40
quicPacketType 5 (1-RTT)
quicVersion 0 (placeholder; no Version field
in Short Header)
quicDestinationConnectionId 0x0001020304050607
quicSourceConnectionId (empty placeholder)
quicToken (empty placeholder)
quicPacketLength 492
observationTimeMilliseconds 1726200000400
subTemplateList, 3 entries of Sub-Template 261:
entry 0: quicFieldPresence 0x00000020 (Stream ID),
quicFrameType 0x0E (STREAM), quicStreamId 0x02,
quicFrameOffset 0, quicFrameLength 400
entry 1: quicFieldPresence 0, quicFrameType 0x02 (ACK),
quicStreamId 0 (placeholder),
quicFrameOffset 400, quicFrameLength 48
entry 2: quicFieldPresence 0x00000020 (Stream ID),
quicFrameType 0x0E (STREAM), quicStreamId 0x04,
quicFrameOffset 448, quicFrameLength 18
¶
This profile is intended for aggregated statistics over a flow lifetime or a fixed time window, reducing export overhead. It carries counters, timing, explicitly identified first-observed context, and the evidence used to classify the flow as QUIC; other per-packet scalar fields are not exported.¶
Existing IPFIX packet counters count the packets of the defined Flow at the Observation Point; they do not implicitly count the QUIC packets coalesced within a UDP datagram. The semantics below make each counter's layer explicit:¶
Illustrative field layout (example Template ID 262):
sourceIPv6Address (27) ipv6Address
destinationIPv6Address (28) ipv6Address
protocolIdentifier (4) unsigned8
udpSourcePort (180) unsigned16
udpDestinationPort (181) unsigned16
quicFieldPresence (TBD21) unsigned32
quicObservationSource (TBD17) unsigned8
quicProcessingStatus (TBD18) unsigned8
quicExportFlags (TBD24) unsigned8
packetDeltaCount (2) unsigned64 (sum)
quicPacketDeltaCount (TBD16) unsigned64 (sum)
octetDeltaCount (1) unsigned64 (sum)
quicVersion (TBD2) unsigned32 (first)
quicSourceConnectionId (TBD7) octetArray (first)
quicDestinationConnectionId (TBD6) octetArray (first)
flowStartMilliseconds (152) dateTimeMilliseconds
flowEndMilliseconds (153) dateTimeMilliseconds
flowEndReason (136) unsigned8
flowDirection (61) unsigned8
Data Record (Template ID 262):
sourceIPv6Address 2001:db8::1
destinationIPv6Address 2001:db8::2
protocolIdentifier 17
udpSourcePort 53924
udpDestinationPort 443
quicFieldPresence 0x0000004D
(Version, Source CID,
Destination CID,
QUIC Packet Count)
quicObservationSource 1 (Passive wire)
quicProcessingStatus 3 (Supported-version parsed)
quicExportFlags 0 (Complete)
packetDeltaCount 912
quicPacketDeltaCount 947
octetDeltaCount 402118
quicVersion 0x00000001
quicSourceConnectionId 0x2021222324252627
quicDestinationConnectionId 0x0001020304050607
flowStartMilliseconds 1726200000000
flowEndMilliseconds 1726200030000
flowEndReason 2 (active timeout; fixed window)
flowDirection 0 (ingress)
¶
This optional profile uses an Options Template [RFC7011] to export connection-level metadata that does not fit into per-packet or per-flow records.¶
Illustrative layout (example Options Template ID 264):
Options Scope:
observationDomainId (149) unsigned32
sourceIPv6Address (27) ipv6Address
destinationIPv6Address (28) ipv6Address
protocolIdentifier (4) unsigned8
udpSourcePort (180) unsigned16
udpDestinationPort (181) unsigned16
flowId (148) unsigned64
Non-Scope:
quicFieldPresence (TBD21) unsigned32
quicObservationSource (TBD17) unsigned8
quicProcessingStatus (TBD18) unsigned8
quicExportFlags (TBD24) unsigned8
quicVersion (TBD2) unsigned32
quicPacketDeltaCount (TBD16) unsigned64
flowStartMilliseconds (152) dateTimeMilliseconds
flowEndMilliseconds (153) dateTimeMilliseconds
flowEndReason (136) unsigned8
Options Record:
Scope: observationDomainId 1, 2001:db8::1 -> 2001:db8::2,
protocolIdentifier 17, udpSourcePort 53924,
udpDestinationPort 443, flowId 4096
quicFieldPresence 0x00000041
(Version, QUIC Packet Count)
quicObservationSource 2 (Endpoint protocol state)
quicProcessingStatus 5 (Protected content available)
quicExportFlags 0 (Complete)
quicVersion 0x00000001
quicPacketDeltaCount 1894
flowStartMilliseconds 1726200000000
flowEndMilliseconds 1726200030000
flowEndReason 3 (end of Flow detected)
¶
This section specifies the new IPFIX QUIC IEs.¶
The security of the exported data depends on the security of the IPFIX protocol and its transport. As described in Section 11 of [RFC7011], the IPFIX protocol relies on the transport layer for confidentiality and integrity, and it does not define an in-band session authentication mechanism. Authentication of the exporter by the collector MUST therefore be provided by the underlying transport (e.g., IPFIX over TLS) or by a security gateway, and the transport session SHOULD be protected against disclosure and tampering. Beyond in-flight protection, deployments SHOULD apply authentication and authorization to the collector itself: only authorized consumers SHOULD be permitted to query, store, or forward the exported Data Records, and the access controls applied to the collector SHOULD reflect the sensitivity of the QUIC-specific values exported through it.¶
QUIC packet types have different protection properties. Version Negotiation has no intrinsic confidentiality or integrity protection. Retry is neither encrypted nor header-protected; its version-specific Retry Integrity Tag detects accidental corruption and limits valid generation to an entity that observed the relevant Initial packet, but does not authenticate the server against an active on-path attacker. Initial uses packet protection under publicly derivable keys and is not considered to provide confidentiality or integrity protection against attackers. Handshake, 0-RTT, and 1-RTT packets use traffic secrets or keys derived from TLS. Visible header bytes of a successfully protected packet can still be authenticated as AEAD associated data. These distinctions are described in [RFC9001]. See the Security and Privacy Considerations of [RFC9000] and the manageability considerations of [RFC9312].¶
A sufficiently captured Long Header exposes both Connection IDs. A Short Header exposes Destination Connection ID octets only to an observer that knows the connection-specific length; it carries no Source Connection ID. Connection IDs are useful, bounded correlation evidence, but they are not a stable connection key: a QUIC endpoint may maintain several active Connection IDs and may change the Destination Connection ID it uses for a peer at any time during a connection, for example during connection migration [RFC9000]. CID-based correlation is additionally limited by Connection ID rotation, address and port migration (the same connection may be observed under different CIDs before and after a path change), zero-length Connection IDs (which provide no correlation evidence at all), and multiple observation points (which may not agree on which packets belong to the same connection). Exporting these identifiers can therefore create additional linkability: a collector can use them to correlate packets belonging to the same QUIC connection before and after an address or port change, including across NAT rebinding and path migration. Deployments exporting these identifiers SHOULD apply access control and retention policies appropriate for identifiers that can correlate traffic belonging to the same QUIC connection. Where endpoint-derived association is available, flowId (148) provides the registered, explicitly scoped correlation mechanism used by this document. An exporter MUST assign flowId from its connection-observation state and MUST NOT derive it solely from a 5-tuple or wire-visible Connection ID. Endpoint- or key-derived quicStreamId and quicPacketNumber values likewise require access controls appropriate to their additional linkability.¶
quicToken (TBD20) exports the raw Token octets of an Initial or Retry packet. A Token is chosen by the server and can carry or index address-validation state. Its content is opaque to an exporter or collector that lacks the server's token-protection context, so exporting it does not by itself enable the collector to interpret or validate that state. Depending on the server's token construction, address binding, and token lifetime, disclosure can nevertheless enable replay that bypasses address validation and can contribute to amplification attacks; see Sections 8.1.4 and 21.3 of [RFC9000]. Nevertheless, repeated raw Token values and combinations with other observations can add correlation capability across packets, connections, or observation points. Deployments exporting quicToken SHOULD treat it as sensitive correlation data and SHOULD apply access control, minimization, and retention policies accordingly; where token contents are not needed for the operational purpose, exporters SHOULD NOT export quicToken.¶
Cross-observation-point correlation extends the linkability described above. Because Connection IDs are wire-visible, the same QUIC connection can be observed under the same or different Connection IDs at multiple observation points (for example, at the network edge and at a datacenter ingress, or before and after a client moves behind a different NAT), and a collector that aggregates records from several points can correlate the same connection across those points and combine it with other data sources. flowId mitigates this by providing a correlation value assigned from exporter connection state rather than from wire-visible identifiers. It is unique only within its Observation Domain, as specified by the registered IE definition, and is non-reversible under [RFC5103]. Collectors combining records from different Exporting Processes or Observation Domains MUST NOT assume that equal flowId values identify the same connection.¶
The Information Elements specified in this document can weaken this protection when they are populated from plaintext QUIC content. In particular, quicPacketNumber and quicFrameType can be obtained from a supported-version Initial packet by a passive observer that has the applicable client Initial Destination Connection ID, complete capture, direction and packet-number context, and successful packet processing. Processing Handshake, 0-RTT, and 1-RTT content requires the corresponding traffic secrets or derived keys. Stream-related frames are not permitted in Initial packets, so quicStreamId remains endpoint- or traffic-key-derived. Exporting these values may reveal information about user activity that QUIC is designed to protect, and may make user activity linkable across flows and observation points.¶
Operators deploying these IEs SHOULD apply data minimization: export only the Information Elements required for the intended use, limit the retention period of exported QUIC-specific values (Connection IDs, packet numbers, stream identifiers), and restrict access to the exported records. Exporters MUST NOT export QUIC secrets or keying material, including handshake secrets, traffic keys, Initial secrets, header-protection keys, or Stateless Reset tokens.¶
Stateless reset tokens allow termination of the associated connection and are therefore sensitive connection state. An exporter that confirms a Stateless Reset MUST protect stored tokens, MUST perform the comparison without leaking token values as required by Section 10.3.1 of [RFC9000], and MUST NOT export the matched token as quicToken. quicToken represents only the Initial or Retry Token field.¶
Several of the Information Elements defined in this document carry variable-length or list data: quicDestinationConnectionId and quicSourceConnectionId (octetArray), quicToken (octetArray), quicSupportedVersion (basicList), and the nested frame sub-template records (subTemplateList). Unbounded values in these fields could be used to consume excessive resources at the collector or to smuggle arbitrary data through the export channel. Exporters SHOULD therefore impose local limits on total structured-data bytes, the number of version entries, frames and inner packets, nesting, and parser work. A 20-octet Connection ID limit applies to packets encoded by QUIC v1 and v2, but the invariant Long Header format of [RFC8999] permits Connection ID lengths from 0 through 255 octets in Version Negotiation or an unknown or future version. Version Negotiation has no separate protocol-defined entry-count maximum; its complete 32-bit entries occupy the packet remainder after the Source Connection ID. A Token is bounded by the bytes remaining in the observed packet. When a parser-work or processing-resource limit prevents complete parsing of an emitted packet observation, that observation uses quicProcessingStatus 13. If that limit also prevents complete packet-boundary enumeration in the Network-Wire profile, the parent record uses quicDatagramParseStatus 5. When otherwise available information exceeds a local export or representation limit, the exporter MUST report local truncation through quicExportFlags and clear any affected presence bit. It MUST NOT label the packet malformed solely because of either local limit. Collectors SHOULD validate the lengths declared in templates and reject records whose implied size is implausible, in order to protect against a misconfigured or malicious exporter.¶
This document requests IANA to add new IPFIX QUIC IEs to the "IPFIX Information Elements" registry [RFC7012] available at [IANA-IPFIX]. The registration of each IE follows the process and format specified in [RFC7012], and the encoding of list-typed elements (e.g., quicSupportedVersion) follows [RFC6313]. The IE definitions in this document were written following the guidelines in [RFC7013]. Each IE description in this document independently states its derivation, applicability, scope, aggregation behavior, range/length, and the behavior when the value is unavailable, so that a reader can understand the IE from its registry entry alone.¶
IANA is requested to assign the lowest available Element IDs in the range specified by [RFC7013], replace every TBD label appearing in Table 1 throughout these registrations, set the Status of every new IE to current, set its initial Revision to 0, and set its Date to the date on which the registration is made. The RFC Editor is requested to replace each remaining such TBD label in this document with the corresponding Element ID assigned by IANA.¶
Table 1 lists the new IPFIX QUIC IEs:¶
+============+==========================================+ | Element ID | Name | +============+==========================================+ | TBD1 | quicFirstOctet | +------------+------------------------------------------+ | TBD2 | quicVersion | +------------+------------------------------------------+ | TBD3 | quicPacketType | +------------+------------------------------------------+ | TBD4 | quicSupportedVersion | +------------+------------------------------------------+ | TBD5 | quicSupportedVersionValue | +------------+------------------------------------------+ | TBD6 | quicDestinationConnectionId | +------------+------------------------------------------+ | TBD7 | quicSourceConnectionId | +------------+------------------------------------------+ | TBD8 | quicPacketNumber | +------------+------------------------------------------+ | TBD9 | quicFrameType | +------------+------------------------------------------+ | TBD10 | quicStreamId | +------------+------------------------------------------+ | TBD11 | quicSenderDirection | +------------+------------------------------------------+ | TBD12 | quicPacketNumberSpace | +------------+------------------------------------------+ | TBD13 | quicFrameOffset | +------------+------------------------------------------+ | TBD14 | quicFrameLength | +------------+------------------------------------------+ | TBD15 | quicPacketOffset | +------------+------------------------------------------+ | TBD16 | quicPacketDeltaCount | +------------+------------------------------------------+ | TBD17 | quicObservationSource | +------------+------------------------------------------+ | TBD18 | quicProcessingStatus | +------------+------------------------------------------+ | TBD19 | quicDestinationConnectionIdLengthSource | +------------+------------------------------------------+ | TBD20 | quicToken | +------------+------------------------------------------+ | TBD21 | quicFieldPresence | +------------+------------------------------------------+ | TBD22 | quicDatagramParseStatus | +------------+------------------------------------------+ | TBD23 | quicPacketLength | +------------+------------------------------------------+ | TBD24 | quicExportFlags | +------------+------------------------------------------+ Table 1: New QUIC IEs in the "IPFIX Information Elements" Registry¶
In accordance with Section 4.7 of [RFC7013], IANA is requested to create the following subregistries under the "IPFIX Information Elements" registry. An enumeration registry has Value, Name, and Reference columns. A flags registry has Bit, Mask, Name (or Accompanying Information Element), and Reference columns. Only entries or bit positions marked Unassigned are available for future assignment; each such assignment requires Expert Review as defined by [RFC8126] and a stable public reference. An entry marked Reserved is not available under that policy. The designated experts are requested to verify that a new assignment has a stable, interoperable meaning, does not duplicate an existing value, and, where it interprets a QUIC protocol construct, is supported by an appropriate QUIC specification. The initial assigned and Reserved entries below have this document as their reference; two hyphens identify an Unassigned range that has no reference.¶
An exporter MUST NOT emit an enumeration value marked Unassigned or Reserved. A collector that does not yet recognize a subsequently assigned value MUST preserve its numeric value and MUST NOT reinterpret it as the registry's Unknown value.¶
Value Name Reference 0 Unknown [this document] 1 Version Negotiation [this document] 2 Initial [this document] 3 0-RTT [this document] 4 Handshake [this document] 5 1-RTT [this document] 6 Stateless Reset [this document] 7 Retry [this document] 8-254 Unassigned -- 255 Reserved [this document]¶
Value Name Reference 0 Unknown [this document] 1 Passive wire observation [this document] 2 Endpoint protocol state [this document] 3 Authorized cooperating non-endpoint device [this document] 4-254 Unassigned -- 255 Reserved [this document]¶
Value Name Reference 0 Unknown/not attempted/not applicable [this document] 1 Heuristic classification only [this document] 2 Version-independent fields parsed [this document] 3 Supported-version structure parsed [this document] 4 Initial protection processed [this document] 5 Protected content available [this document] 6 Retry Integrity Tag validated [this document] 7 Unsupported version [this document] 8 Structurally malformed packet [this document] 9 Capture truncated [this document] 10 Packet/payload authentication failure [this document] 11 Retry Integrity Tag validation failure [this document] 12 Unsupported frame type or format [this document] 13 Local parser or processing-resource limit [this document] 14 Stateless Reset datagram confirmed [this document] 15-254 Unassigned -- 255 Reserved [this document]¶
Value Name Reference 0 Not applicable [this document] 1 Explicit Long Header length field [this document] 2 Learned connection context [this document] 3 Management configuration [this document] 4 Unknown [this document] 5-254 Unassigned -- 255 Reserved [this document]¶
Value Name Reference 0 Initial [this document] 1 Handshake [this document] 2 Application Data [this document] 3-254 Unassigned -- 255 Reserved [this document]¶
Value Name Reference 0 Client-to-server [this document] 1 Server-to-client [this document] 2-254 Unassigned -- 255 Reserved [this document]¶
Value Name Reference 0 Unknown or not reported [this document] 1 Complete [this document] 2 Partial: unsupported version [this document] 3 Partial: capture blocked delimitation [this document] 4 Partial: malformed input blocked delimitation [this document] 5 Partial: local parser/resource limit [this document] 6-254 Unassigned -- 255 Reserved [this document]¶
Bit Mask Accompanying IE Reference 0 0x00000001 quicVersion [this document] 1 0x00000002 quicSupportedVersion [this document] 2 0x00000004 quicDestinationConnectionId [this document] 3 0x00000008 quicSourceConnectionId [this document] 4 0x00000010 quicToken [this document] 5 0x00000020 quicStreamId [this document] 6 0x00000040 quicPacketDeltaCount [this document] 7 0x00000080 quicPacketLength [this document] 8-31 Unassigned --¶
Bit Mask Name Reference 0 0x01 Local export-resource/size truncation [this document] 1 0x02 Configured export-policy suppression [this document] 2-7 Unassigned --¶
A Short Header does not encode its Destination Connection ID length. Therefore, an exporter can report a Short Header Destination Connection ID only when it has already associated the packet with a connection and knows the length selected by the receiving endpoint. During connection establishment, a peer's Source Connection ID can supply a Connection ID that the other peer subsequently uses as a Destination Connection ID, but an exporter MUST establish the applicable connection and direction before using that information. It MUST NOT treat an arbitrary prior Long Header Destination Connection ID as the length context for a later Short Header. Connection ID rotation can introduce values in protected NEW_CONNECTION_ID frames, so following later rotations generally requires endpoint protocol state, the applicable traffic keys, or deployment configuration. If the exporter lacks reliable connection and length context, it MUST clear the Destination Connection ID presence bit and MUST NOT guess the value.¶
Availability of QUIC fields depends on packet type and processing context. Version Negotiation packets have neither packet protection nor header protection. Retry packets also have neither packet protection nor header protection and carry no packet number; their version-specific Retry Integrity Tag is a separate integrity mechanism. Initial packets use packet protection and header protection, but for QUIC versions 1 and 2 the keys are derived from public version-specific constants and the Destination Connection ID of the client's Initial packet. Consequently, a passive observer can process a supported-version Initial packet when it has that Destination Connection ID, direction and packet-number context, and sufficient captured bytes. Successful Initial processing does not authenticate the peer and does not provide confidentiality from an on-path observer. Processing Handshake, 0-RTT, and 1-RTT packets requires the corresponding traffic secrets or keys derived from them. A Stateless Reset has no semantic packet number or frame sequence.¶
quicFirstOctet is available only when the first packet octet was captured. quicVersion and the two Connection ID length fields are invariant only in a sufficiently complete Long Header [RFC8999]. A Short Header Destination Connection ID requires the connection-specific length context described above. quicPacketType requires the applicable version-specific mapping, except that a zero Long Header Version field identifies Version Negotiation. An exporter MUST classify a Short Header as Unknown unless endpoint state or successful packet-protection processing establishes 1-RTT, and it MUST classify a possible Stateless Reset as Unknown unless the entire UDP datagram satisfies the token-matching procedure in Section 10.3.1 of [RFC9000]. A confirmed Stateless Reset consumes the entire datagram and has no semantic Destination Connection ID, Source Connection ID, Version, packet number, or frame sequence.¶
In a successfully processed supported-version Initial packet, a passive observer can reconstruct quicPacketNumber and decode permitted Initial frame types, offsets, and lengths. Valid Initial packets do not carry stream-related frames, so Initial processing does not make quicStreamId available. Values from other protected packets require endpoint protocol state or the corresponding traffic keys. An endpoint can also export sender-side semantic values from protocol state before wire protection is applied; such values are not raw observations and MUST be marked with the corresponding quicObservationSource and quicProcessingStatus.¶
quicObservationSource records where exported semantic values originated, and quicProcessingStatus records the processing result. The two IEs are independent and neither is an ordered confidence score. Exporters MUST preserve failure outcomes such as unsupported version, malformed input, capture truncation, packet-protection failure, and Retry Integrity Tag failure instead of reporting them as successful lower-level processing. A device that receives traffic secrets through a deployment-specific mechanism MUST protect them and MUST NOT log or export them in IPFIX records, as noted in Section 5.¶
The authors would like to thank Mohamed Boucadair, Benoit Claise, Chongfeng Xie, Jing Wang, Yarong Wang, Yanrong Liang, Winnie, Saumya Dikshit, Wisdom Tan, Jiangbo Wang, Bing Liu, Xueyan Song, Xiao Min, Gao Xing, Liyan Gong, David Wright, Yujia Gao, Qian Cao, Alex Lee, Shengnan Yue, Yimi Zhang, Guozhen Dong, Hongwei Li, Allan Michael, JunFang Wang, Paul Aitken, Haiyang Zhang, and Liurubing for their support and detailed reviews.¶