IP Fragmentation Considered Fragile
Why splitting IP packets into fragments breaks so often on the real Internet, and what to do instead.
Bonica, R., Baker, F., Huston, G., Hinden, R., Troan, O., and F. Gont, "IP Fragmentation Considered Fragile", BCP 230, RFC 8900, DOI 10.17487/RFC8900, September 2020, <https://www.rfc-editor.org/info/rfc8900>.
@misc{rfc8900,
series = {Request for Comments},
number = 8900,
howpublished = {RFC 8900},
publisher = {RFC Editor},
doi = {10.17487/RFC8900},
url = {https://www.rfc-editor.org/info/rfc8900},
author = {R. Bonica and F. Baker and G. Huston and R. Hinden and O. Troan and F. Gont},
title = {{IP Fragmentation Considered Fragile}},
pagetotal = 23,
year = 2020,
month = sep,
} RFC text
Contents
Internet Engineering Task Force (IETF) R. Bonica
Request for Comments: 8900 Juniper Networks
BCP: 230 F. Baker
Category: Best Current Practice Unaffiliated
ISSN: 2070-1721 G. Huston
APNIC
R. Hinden
Check Point Software
O. Troan
Cisco
F. Gont
SI6 Networks
September 2020
IP Fragmentation Considered Fragile
Abstract
This document describes IP fragmentation and explains how it
introduces fragility to Internet communication.
This document also proposes alternatives to IP fragmentation and
provides recommendations for developers and network operators.
Status of This Memo
This memo documents an Internet Best Current Practice.
This document is a product of the Internet Engineering Task Force
(IETF). It represents the consensus of the IETF community. It has
received public review and has been approved for publication by the
Internet Engineering Steering Group (IESG). Further information on
BCPs is available in Section 2 of RFC 7841.
Information about the current status of this document, any errata,
and how to provide feedback on it may be obtained at
https://www.rfc-editor.org/info/rfc8900.
Copyright Notice
Copyright (c) 2020 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.
Table of Contents
1. Introduction
1.1. Requirements Language
2. IP Fragmentation
2.1. Links, Paths, MTU, and PMTU
2.2. Fragmentation Procedures
2.3. Upper-Layer Reliance on IP Fragmentation
3. Increased Fragility
3.1. Virtual Reassembly
3.2. Policy-Based Routing
3.3. Network Address Translation (NAT)
3.4. Stateless Firewalls
3.5. Equal-Cost Multipath, Link Aggregate Groups, and Stateless
Load Balancers
3.6. IPv4 Reassembly Errors at High Data Rates
3.7. Security Vulnerabilities
3.8. PMTU Black-Holing Due to ICMP Loss
3.8.1. Transient Loss
3.8.2. Incorrect Implementation of Security Policy
3.8.3. Persistent Loss Caused by Anycast
3.8.4. Persistent Loss Caused by Unidirectional Routing
3.9. Black-Holing Due to Filtering or Loss
4. Alternatives to IP Fragmentation
4.1. Transport-Layer Solutions
4.2. Application-Layer Solutions
5. Applications That Rely on IPv6 Fragmentation
5.1. Domain Name Service (DNS)
5.2. Open Shortest Path First (OSPF)
5.3. Packet-in-Packet Encapsulations
5.4. UDP Applications Enhancing Performance
6. Recommendations
6.1. For Application and Protocol Developers
6.2. For System Developers
6.3. For Middlebox Developers
6.4. For ECMP, LAG, and Load-Balancer Developers And Operators
6.5. For Network Operators
7. IANA Considerations
8. Security Considerations
9. References
9.1. Normative References
9.2. Informative References
Acknowledgements
Authors' Addresses
1. Introduction
Operational experience [Kent] [Huston] [RFC7872] reveals that IP
fragmentation introduces fragility to Internet communication. This
document describes IP fragmentation and explains the fragility it
introduces. It also proposes alternatives to IP fragmentation and
provides recommendations for developers and network operators.
While this document identifies issues associated with IP
fragmentation, it does not recommend deprecation. Legacy protocols
that depend upon IP fragmentation would do well to be updated to
remove that dependency. However, some applications and environments
(see Section 5) require IP fragmentation. In these cases, the
protocol will continue to rely on IP fragmentation, but the designer
should be aware that fragmented packets may result in black holes. A
design should include appropriate safeguards.
Rather than deprecating IP fragmentation, this document recommends
that upper-layer protocols address the problem of fragmentation at
their layer, reducing their reliance on IP fragmentation to the
greatest degree possible.
1.1. Requirements Language
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.
2. IP Fragmentation
2.1. Links, Paths, MTU, and PMTU
An Internet path connects a source node to a destination node. A
path may contain links and routers. If a path contains more than one
link, the links are connected in series, and a router connects each
link to the next.
Internet paths are dynamic. Assume that the path from one node to
another contains a set of links and routers. If a link or a router
fails, the path can also change so that it includes a different set
of links and routers.
Each link is constrained by the number of octets that it can convey
in a single IP packet. This constraint is called the link Maximum
Transmission Unit (MTU). IPv4 [RFC0791] requires every link to
support an MTU of 68 octets or greater (see NOTE 1). IPv6 [RFC8200]
similarly requires every link to support an MTU of 1280 octets or
greater. These are called the IPv4 and IPv6 minimum link MTUs.
Some links, and some ways of using links, result in additional
variable overhead. For the simple case of tunnels, this document
defers to other documents. For other cases, such as MPLS, this
document considers the link MTU to include appropriate allowance for
any such overhead.
Likewise, each Internet path is constrained by the number of octets
that it can convey in a single IP packet. This constraint is called
the Path MTU (PMTU). For any given path, the PMTU is equal to the
smallest of its link MTUs. Because Internet paths are dynamic, PMTU
is also dynamic.
For reasons described below, source nodes estimate the PMTU between
themselves and destination nodes. A source node can produce
extremely conservative PMTU estimates in which:
* The estimate for each IPv4 path is equal to the IPv4 minimum link
MTU.
* The estimate for each IPv6 path is equal to the IPv6 minimum link
MTU.
While these conservative estimates are guaranteed to be less than or
equal to the actual PMTU, they are likely to be much less than the
actual PMTU. This may adversely affect upper-layer protocol
performance.
By executing Path MTU Discovery (PMTUD) procedures [RFC1191]
[RFC8201], a source node can maintain a less conservative estimate of
the PMTU between itself and a destination node. In PMTUD, the source
node produces an initial PMTU estimate. This initial estimate is
equal to the MTU of the first link along the path to the destination
node. It can be greater than the actual PMTU.
Having produced an initial PMTU estimate, the source node sends non-
fragmentable IP packets to the destination node (see NOTE 2). If one
of these packets is larger than the actual PMTU, a downstream router
will not be able to forward the packet through the next link along
the path. Therefore, the downstream router drops the packet and
sends an Internet Control Message Protocol (ICMP) [RFC0792] [RFC4443]
Packet Too Big (PTB) message to the source node (see NOTE 3). The
ICMP PTB message indicates the MTU of the link through which the
packet could not be forwarded. The source node uses this information
to refine its PMTU estimate.
PMTUD produces a running estimate of the PMTU between a source node
and a destination node. Because PMTU is dynamic, the PMTU estimate
can be larger than the actual PMTU. In order to detect PMTU
increases, PMTUD occasionally resets the PMTU estimate to its initial
value and repeats the procedure described above.
Ideally, PMTUD operates as described above. However, in some
scenarios, PMTUD fails. For example:
* PMTUD relies on the network's ability to deliver ICMP PTB messages
to the source node. If the network cannot deliver ICMP PTB
messages to the source node, PMTUD fails.
* PMTUD is susceptible to attack because ICMP messages are easily
forged [RFC5927] and not authenticated by the receiver. Such
attacks can cause PMTUD to produce unnecessarily conservative PMTU
estimates.
NOTE 1: In IPv4, every host must be able to reassemble a packet
whose length is less than or equal to 576 octets. However, the
IPv4 minimum link MTU is not 576. Section 3.2 of RFC 791
[RFC0791] explicitly states that the IPv4 minimum link MTU is 68
octets.
NOTE 2: A non-fragmentable packet can be fragmented at its source.
However, it cannot be fragmented by a downstream node. An IPv4
packet whose Don't Fragment (DF) bit is set to 0 is fragmentable.
An IPv4 packet whose DF bit is set to 1 is non-fragmentable. All
IPv6 packets are also non-fragmentable.
NOTE 3: The ICMP PTB message has two instantiations. In ICMPv4
[RFC0792], the ICMP PTB message is a Destination Unreachable
message with Code equal to 4 (fragmentation needed and DF set).
This message was augmented by [RFC1191] to indicate the MTU of the
link through which the packet could not be forwarded. In ICMPv6
[RFC4443], the ICMP PTB message is a Packet Too Big Message with
Code equal to 0. This message also indicates the MTU of the link
through which the packet could not be forwarded.
2.2. Fragmentation Procedures
When an upper-layer protocol submits data to the underlying IP
module, and the resulting IP packet's length is greater than the
PMTU, the packet is divided into fragments. Each fragment includes
an IP header and a portion of the original packet.
[RFC0791] describes IPv4 fragmentation procedures. An IPv4 packet
whose DF bit is set to 1 may be fragmented by the source node, but
may not be fragmented by a downstream router. An IPv4 packet whose
DF bit is set to 0 may be fragmented by the source node or by a
downstream router. When an IPv4 packet is fragmented, all IP options
(which are within the IPv4 header) appear in the first fragment, but
only options whose "copy" bit is set to 1 appear in subsequent
fragments.
[RFC8200], notably in Section 4.5, describes IPv6 fragmentation
procedures. An IPv6 packet may be fragmented only at the source
node. When an IPv6 packet is fragmented, all extension headers
appear in the first fragment, but only per-fragment headers appear in
subsequent fragments. Per-fragment headers include the following:
* The IPv6 header.
* The Hop-by-Hop Options header (if present).
* The Destination Options header (if present and if it precedes a
Routing header).
* The Routing header (if present).
* The Fragment header.
In IPv4, the upper-layer header usually appears in the first
fragment, due to the sizes of the headers involved. In IPv6, the
upper-layer header must appear in the first fragment.
2.3. Upper-Layer Reliance on IP Fragmentation
Upper-layer protocols can operate in the following modes:
* Do not rely on IP fragmentation.
* Rely on IP fragmentation by the source node only.
* Rely on IP fragmentation by any node.
Upper-layer protocols running over IPv4 can operate in all of the
above-mentioned modes. Upper-layer protocols running over IPv6 can
operate in the first and second modes only.
Upper-layer protocols that operate in the first two modes (above)
require access to the PMTU estimate. In order to fulfill this
requirement, they can:
* Estimate the PMTU to be equal to the IPv4 or IPv6 minimum link
MTU.
* Access the estimate that PMTUD produced.
* Execute PMTUD procedures themselves.
* Execute Packetization Layer PMTUD (PLPMTUD) procedures [RFC4821]
[RFC8899].
According to PLPMTUD procedures, the upper-layer protocol maintains a
running PMTU estimate. It does so by sending probe packets of
various sizes to its upper-layer peer and receiving acknowledgements.
This strategy differs from PMTUD in that it relies on acknowledgement
of received messages, as opposed to ICMP PTB messages concerning
dropped messages. Therefore, PLPMTUD does not rely on the network's
ability to deliver ICMP PTB messages to the source.
3. Increased Fragility
This section explains how IP fragmentation introduces fragility to
Internet communication.
3.1. Virtual Reassembly
Virtual reassembly is a procedure in which a device conceptually
reassembles a packet, forwards its fragments, and discards the
reassembled copy. In Address plus Port (A+P) [RFC6346] and Carrier
Grade NAT (CGN) [RFC6888], virtual reassembly is required in order to
correctly translate fragment addresses. It could be useful to
address the problems in Sections 3.2, 3.3, 3.4, and 3.5.
Virtual reassembly is computationally expensive and holds state for
indeterminate periods of time. Therefore, it is prone to errors and
attacks (Section 3.7).
3.2. Policy-Based Routing
IP fragmentation causes problems for routers that implement policy-
based routing.
When a router receives a packet, it identifies the next hop on route
to the packet's destination and forwards the packet to that next hop.
In order to identify the next hop, the router interrogates a local
data structure called the Forwarding Information Base (FIB).
Normally, the FIB contains destination-based entries that map a
destination prefix to a next hop. Policy-based routing allows
destination-based and policy-based entries to coexist in the same
FIB. A policy-based FIB entry maps multiple fields, drawn from
either the IP or transport-layer header, to a next hop.
+=====+===================+=================+=======+===============+
|Entry| Type | Dest. Prefix | Next | Next Hop |
| | | | Hdr / | |
| | | | Dest. | |
| | | | Port | |
+=====+===================+=================+=======+===============+
| 1 | Destination-based | 2001:db8::1/128 | Any / | 2001:db8:2::2 |
| | | | Any | |
+-----+-------------------+-----------------+-------+---------------+
| 2 | Policy-based | 2001:db8::1/128 | TCP / | 2001:db8:3::3 |
| | | | 80 | |
+-----+-------------------+-----------------+-------+---------------+
Table 1: Policy-Based Routing FIB
Assume that a router maintains the FIB in Table 1. The first FIB
entry is destination-based. It maps a destination prefix
2001:db8::1/128 to a next hop 2001:db8:2::2. The second FIB entry is
policy-based. It maps the same destination prefix 2001:db8::1/128
and a destination port (TCP / 80) to a different next hop
(2001:db8:3::3). The second entry is more specific than the first.
When the router receives the first fragment of a packet that is
destined for TCP port 80 on 2001:db8::1, it interrogates the FIB.
Both FIB entries satisfy the query. The router selects the second
FIB entry because it is more specific and forwards the packet to
2001:db8:3::3.
When the router receives the second fragment of the packet, it
interrogates the FIB again. This time, only the first FIB entry
satisfies the query, because the second fragment contains no
indication that the packet is destined for TCP port 80. Therefore,
the router selects the first FIB entry and forwards the packet to
2001:db8:2::2.
Policy-based routing is also known as filter-based forwarding.
3.3. Network Address Translation (NAT)
IP fragmentation causes problems for Network Address Translation
(NAT) devices. When a NAT device detects a new, outbound flow, it
maps that flow's source port and IP address to another source port
and IP address. Having created that mapping, the NAT device
translates:
* The source IP address and source port on each outbound packet.
* The destination IP address and destination port on each inbound
packet.
A+P [RFC6346] and Carrier Grade NAT (CGN) [RFC6888] are two common
NAT strategies. In both approaches, the NAT device must virtually
reassemble fragmented packets in order to translate and forward each
fragment.
3.4. Stateless Firewalls
As discussed in more detail in Section 3.7, IP fragmentation causes
problems for stateless firewalls whose rules include TCP and UDP
ports. Because port information is only available in the first
fragment and not available in the subsequent fragments, the firewall
is limited to the following options:
* Accept all subsequent fragments, possibly admitting certain
classes of attack.
* Block all subsequent fragments, possibly blocking legitimate
traffic.
Neither option is attractive.
3.5. Equal-Cost Multipath, Link Aggregate Groups, and Stateless Load
Balancers
IP fragmentation causes problems for Equal-Cost Multipath (ECMP),
Link Aggregate Groups (LAG), and other stateless load-distribution
technologies. In order to assign a packet or packet fragment to a
link, an intermediate node executes a hash (i.e., load-distributing)
algorithm. The following paragraphs describe a commonly deployed
hash algorithm.
If the packet or packet fragment contains a transport-layer header,
the algorithm accepts the following 5-tuple as input:
* IP Source Address.
* IP Destination Address.
* IPv4 Protocol or IPv6 Next Header.
* transport-layer source port.
* transport-layer destination port.
If the packet or packet fragment does not contain a transport-layer
header, the algorithm accepts only the following 3-tuple as input:
* IP Source Address.
* IP Destination Address.
* IPv4 Protocol or IPv6 Next Header.
Therefore, non-fragmented packets belonging to a flow can be assigned
to one link while fragmented packets belonging to the same flow can
be divided between that link and another. This can cause suboptimal
load distribution.
[RFC6438] offers a partial solution to this problem for IPv6 devices
only. According to [RFC6438]:
| At intermediate routers that perform load distribution, the hash
| algorithm used to determine the outgoing component-link in an ECMP
| and/or LAG toward the next hop MUST minimally include the 3-tuple
| {dest addr, source addr, flow label} and MAY also include the
| remaining components of the 5-tuple.
If the algorithm includes only the 3-tuple {dest addr, source addr,
flow label}, it will assign all fragments belonging to a packet to
the same link. (See [RFC6437] and [RFC7098]).
In order to avoid the problem described above, implementations SHOULD
implement the recommendations provided in Section 6.4 of this
document.
3.6. IPv4 Reassembly Errors at High Data Rates
IPv4 fragmentation is not sufficiently robust for use under some
conditions in today's Internet. At high data rates, the 16-bit IP
identification field is not large enough to prevent duplicate IDs,
resulting in frequent incorrectly assembled IP fragments, and the TCP
and UDP checksums are insufficient to prevent the resulting corrupted
datagrams from being delivered to upper-layer protocols. [RFC4963]
describes some easily reproduced experiments demonstrating the
problem and discusses some of the operational implications of these
observations.
These reassembly issues do not occur as frequently in IPv6 because
the IPv6 identification field is 32 bits long.
3.7. Security Vulnerabilities
Security researchers have documented several attacks that exploit IP
fragmentation. The following are examples:
* Overlapping fragment attacks [RFC1858] [RFC3128] [RFC5722].
* Resource exhaustion attacks.
* Attacks based on predictable fragment identification values
[RFC7739].
* Evasion of Network Intrusion Detection Systems (NIDS)
[Ptacek1998].
In the overlapping fragment attack, an attacker constructs a series
of packet fragments. The first fragment contains an IP header, a
transport-layer header, and some transport-layer payload. This
fragment complies with local security policy and is allowed to pass
through a stateless firewall. A second fragment, having a nonzero
offset, overlaps with the first fragment. The second fragment also
passes through the stateless firewall. When the packet is
reassembled, the transport-layer header from the first fragment is
overwritten by data from the second fragment. The reassembled packet
does not comply with local security policy. Had it traversed the
firewall in one piece, the firewall would have rejected it.
A stateless firewall cannot protect against the overlapping fragment
attack. However, destination nodes can protect against the
overlapping fragment attack by implementing the procedures described
in RFC 1858, RFC 3128, and RFC 8200. These reassembly procedures
detect the overlap and discard the packet.
The fragment reassembly algorithm is a stateful procedure in an
otherwise stateless protocol. Therefore, it can be exploited by
resource exhaustion attacks. An attacker can construct a series of
fragmented packets with one fragment missing from each packet so that
the reassembly is impossible. Thus, this attack causes resource
exhaustion on the destination node, possibly denying reassembly
services to other flows. This type of attack can be mitigated by
flushing fragment reassembly buffers when necessary, at the expense
of possibly dropping legitimate fragments.
Each IP fragment contains an "Identification" field that destination
nodes use to reassemble fragmented packets. Some implementations set
the Identification field to a predictable value, thus making it easy
for an attacker to forge malicious IP fragments that would cause the
reassembly procedure for legitimate packets to fail.
NIDS aims at identifying malicious activity by analyzing network
traffic. Ambiguity in the possible result of the fragment reassembly
process may allow an attacker to evade these systems. Many of these
systems try to mitigate some of these evasion techniques (e.g., by
computing all possible outcomes of the fragment reassembly process,
at the expense of increased processing requirements).
3.8. PMTU Black-Holing Due to ICMP Loss
As mentioned in Section 2.3, upper-layer protocols can be configured
to rely on PMTUD. Because PMTUD relies upon the network to deliver
ICMP PTB messages, those protocols also rely on the networks to
deliver ICMP PTB messages.
According to [RFC4890], ICMPv6 PTB messages must not be filtered.
However, ICMP PTB delivery is not reliable. It is subject to both
transient and persistent loss.
Transient loss of ICMP PTB messages can cause transient PMTU black
holes. When the conditions contributing to transient loss abate, the
network regains its ability to deliver ICMP PTB messages and
connectivity between the source and destination nodes is restored.
Section 3.8.1 of this document describes conditions that lead to
transient loss of ICMP PTB messages.
Persistent loss of ICMP PTB messages can cause persistent black
holes. Sections 3.8.2, 3.8.3, and 3.8.4 of this document describe
conditions that lead to persistent loss of ICMP PTB messages.
The problem described in this section is specific to PMTUD. It does
not occur when the upper-layer protocol obtains its PMTU estimate
from PLPMTUD or from any other source.
3.8.1. Transient Loss
The following factors can contribute to transient loss of ICMP PTB
messages:
* Network congestion.
* Packet corruption.
* Transient routing loops.
* ICMP rate limiting.
The effect of rate limiting may be severe, as RFC 4443 recommends
strict rate limiting of ICMPv6 traffic.
3.8.2. Incorrect Implementation of Security Policy
Incorrect implementation of security policy can cause persistent loss
of ICMP PTB messages.
For example, assume that a Customer Premises Equipment (CPE) router
implements the following zone-based security policy:
* Allow any traffic to flow from the inside zone to the outside
zone.
* Do not allow any traffic to flow from the outside zone to the
inside zone unless it is part of an existing flow (i.e., it was
elicited by an outbound packet).
When a correct implementation of the above-mentioned security policy
receives an ICMP PTB message, it examines the ICMP PTB payload in
order to determine whether the original packet (i.e., the packet that
elicited the ICMP PTB message) belonged to an existing flow. If the
original packet belonged to an existing flow, the implementation
allows the ICMP PTB to flow from the outside zone to the inside zone.
If not, the implementation discards the ICMP PTB message.
When an incorrect implementation of the above-mentioned security
policy receives an ICMP PTB message, it discards the packet because
its source address is not associated with an existing flow.
The security policy described above has been implemented incorrectly
on many consumer CPE routers.
3.8.3. Persistent Loss Caused by Anycast
Anycast can cause persistent loss of ICMP PTB messages. Consider the
example below:
A DNS client sends a request to an anycast address. The network
routes that DNS request to the nearest instance of that anycast
address (i.e., a DNS server). The DNS server generates a response
and sends it back to the DNS client. While the response does not
exceed the DNS server's PMTU estimate, it does exceed the actual
PMTU.
A downstream router drops the packet and sends an ICMP PTB message
the packet's source (i.e., the anycast address). The network routes
the ICMP PTB message to the anycast instance closest to the
downstream router. That anycast instance may not be the DNS server
that originated the DNS response. It may be another DNS server with
the same anycast address. The DNS server that originated the
response may never receive the ICMP PTB message and may never update
its PMTU estimate.
3.8.4. Persistent Loss Caused by Unidirectional Routing
Unidirectional routing can cause persistent loss of ICMP PTB
messages. Consider the example below:
A source node sends a packet to a destination node. All intermediate
nodes maintain a route to the destination node but do not maintain a
route to the source node. In this case, when an intermediate node
encounters an MTU issue, it cannot send an ICMP PTB message to the
source node.
3.9. Black-Holing Due to Filtering or Loss
In RFC 7872, researchers sampled Internet paths to determine whether
they would convey packets that contain IPv6 extension headers.
Sampled paths terminated at popular Internet sites (e.g., popular
web, mail, and DNS servers).
The study revealed that at least 28% of the sampled paths did not
convey packets containing the IPv6 Fragment extension header. In
most cases, fragments were dropped in the destination autonomous
system. In other cases, the fragments were dropped in transit
autonomous systems.
Another study [Huston] confirmed this finding. It reported that 37%
of sampled endpoints used IPv6-capable DNS resolvers that were
incapable of receiving a fragmented IPv6 response.
It is difficult to determine why network operators drop fragments.
Possible causes follow:
* Hardware inability to process fragmented packets.
* Failure to change vendor defaults.
* Unintentional misconfiguration.
* Intentional configuration (e.g., network operators consciously
chooses to drop IPv6 fragments in order to address the issues
raised in Sections 3.2 through 3.8, above.)
4. Alternatives to IP Fragmentation
4.1. Transport-Layer Solutions
The Transport Control Protocol (TCP) [RFC0793]) can be operated in a
mode that does not require IP fragmentation.
Applications submit a stream of data to TCP. TCP divides that stream
of data into segments, with no segment exceeding the TCP Maximum
Segment Size (MSS). Each segment is encapsulated in a TCP header and
submitted to the underlying IP module. The underlying IP module
prepends an IP header and forwards the resulting packet.
If the TCP MSS is sufficiently small, then the underlying IP module
never produces a packet whose length is greater than the actual PMTU.
Therefore, IP fragmentation is not required.
TCP offers the following mechanisms for MSS management:
* Manual configuration.
* PMTUD.
* PLPMTUD.
Manual configuration is always applicable. If the MSS is configured
to a sufficiently low value, the IP layer will never produce a packet
whose length is greater than the protocol minimum link MTU. However,
manual configuration prevents TCP from taking advantage of larger
link MTUs.
Upper-layer protocols can implement PMTUD in order to discover and
take advantage of larger Path MTUs. However, as mentioned in
Section 2.1, PMTUD relies upon the network to deliver ICMP PTB
messages. Therefore, PMTUD can only provide an estimate of the PMTU
in environments where the risk of ICMP PTB loss is acceptable (e.g.,
known to not be filtered).
By contrast, PLPMTUD does not rely upon the network's ability to
deliver ICMP PTB messages. It utilizes probe messages sent as TCP
segments to determine whether the probed PMTU can be successfully
used across the network path. In PLPMTUD, probing is separated from
congestion control, so that loss of a TCP probe segment does not
cause a reduction of the congestion control window. [RFC4821]
defines PLPMTUD procedures for TCP.
While TCP will never knowingly cause the underlying IP module to emit
a packet that is larger than the PMTU estimate, it can cause the
underlying IP module to emit a packet that is larger than the actual
PMTU. For example, if routing changes and as a result the PMTU
becomes smaller, TCP will not know until the ICMP PTB message
arrives. If this occurs, the packet is dropped, the PMTU estimate is
updated, the segment is divided into smaller segments, and each
smaller segment is submitted to the underlying IP module.
The Datagram Congestion Control Protocol (DCCP) [RFC4340] and the
Stream Control Transmission Protocol (SCTP) [RFC4960] also can be
operated in a mode that does not require IP fragmentation. They both
accept data from an application and divide that data into segments,
with no segment exceeding a maximum size.
DCCP offers manual configuration, PMTUD, and PLPMTUD as mechanisms
for managing that maximum size. Datagram protocols can also
implement PLPMTUD to estimate the PMTU via [RFC8899]. This proposes
procedures for performing PLPMTUD with UDP, UDP options, SCTP, QUIC,
and other datagram protocols.
Currently, User Datagram Protocol (UDP) [RFC0768] lacks a
fragmentation mechanism of its own and relies on IP fragmentation.
However, [UDP-OPTIONS] proposes a fragmentation mechanism for UDP.
4.2. Application-Layer Solutions
[RFC8085] recognizes that IP fragmentation reduces the reliability of
Internet communication. It also recognizes that UDP lacks a
fragmentation mechanism of its own and relies on IP fragmentation.
Therefore, [RFC8085] offers the following advice regarding
applications the run over the UDP:
| An application SHOULD NOT send UDP datagrams that result in IP
| packets that exceed the Maximum Transmission Unit (MTU) along the
| path to the destination. Consequently, an application SHOULD
| either use the path MTU information provided by the IP layer or
| implement Path MTU Discovery (PMTUD) itself [RFC1191] [RFC1981]
| [RFC4821] to determine whether the path to a destination will
| support its desired message size without fragmentation.
RFC 8085 continues:
| Applications that do not follow the recommendation to do PMTU/
| PLPMTUD discovery SHOULD still avoid sending UDP datagrams that
| would result in IP packets that exceed the path MTU. Because the
| actual path MTU is unknown, such applications SHOULD fall back to
| sending messages that are shorter than the default effective MTU
| for sending (EMTU_S in [RFC1122]). For IPv4, EMTU_S is the
| smaller of 576 bytes and the first-hop MTU [RFC1122]. For IPv6,
| EMTU_S is 1280 bytes [RFC2460]. The effective PMTU for a directly
| connected destination (with no routers on the path) is the
| configured interface MTU, which could be less than the maximum
| link payload size. Transmission of minimum-sized UDP datagrams is
| inefficient over paths that support a larger PMTU, which is a
| second reason to implement PMTU discovery.
RFC 8085 assumes that for IPv4 an EMTU_S of 576 is sufficiently small
to be supported by most current Internet paths, even though the IPv4
minimum link MTU is 68 octets.
This advice applies equally to any application that runs directly
over IP.
5. Applications That Rely on IPv6 Fragmentation
The following applications rely on IPv6 fragmentation:
* DNS [RFC1035].
* OSPFv2 [RFC2328].
* OSPFv3 [RFC5340].
* Packet-in-packet encapsulations.
Each of these applications relies on IPv6 fragmentation to a varying
degree. In some cases, that reliance is essential and cannot be
broken without fundamentally changing the protocol. In other cases,
that reliance is incidental, and most implementations already take
appropriate steps to avoid fragmentation.
This list is not comprehensive, and other protocols that rely on IP
fragmentation may exist. They are not specifically considered in the
context of this document.
5.1. Domain Name Service (DNS)
DNS relies on UDP for efficiency, and the consequence is the use of
IP fragmentation for large responses, as permitted by the Extension
Mechanisms for DNS (EDNS0) options in the query. It is possible to
mitigate the issue of fragmentation-based packet loss by having
queries use smaller EDNS0 UDP buffer sizes or by having the DNS
server limit the size of its UDP responses to some self-imposed
maximum packet size that may be less than the preferred EDNS0 UDP
buffer size. In both cases, large responses are truncated in the
DNS, signaling to the client to re-query using TCP to obtain the
complete response. However, the operational issue of the partial
level of support for DNS over TCP, particularly in the case where
IPv6 transport is being used, becomes a limiting factor of the
efficacy of this approach [Damas].
Larger DNS responses can normally be avoided by aggressively pruning
the Additional section of DNS responses. One scenario where such
pruning is ineffective is in the use of DNSSEC, where large key sizes
act to increase the response size to certain DNS queries. There is
no effective response to this situation within the DNS other than
using smaller cryptographic keys and adopting of DNSSEC
administrative practices that attempt to keep DNS response as short
as possible.
5.2. Open Shortest Path First (OSPF)
OSPF implementations can emit messages large enough to cause
fragmentation. However, in order to optimize performance, most OSPF
implementations restrict their maximum message size to a value that
will not cause fragmentation.
5.3. Packet-in-Packet Encapsulations
This document acknowledges that in some cases, packets must be
fragmented within IP-in-IP tunnels. Therefore, this document makes
no additional recommendations regarding IP-in-IP tunnels.
In this document, packet-in-packet encapsulations include IP-in-IP
[RFC2003], Generic Routing Encapsulation (GRE) [RFC2784], GRE-in-UDP
[RFC8086], and Generic Packet Tunneling in IPv6 [RFC2473]. [RFC4459]
describes fragmentation issues associated with all of the above-
mentioned encapsulations.
The fragmentation strategy described for GRE in [RFC7588] has been
deployed for all of the above-mentioned encapsulations. This
strategy does not rely on IP fragmentation except in one corner case.
(See Section 3.3.2.2 of [RFC7588] and Section 7.1 of [RFC2473].)
Section 3.3 of [RFC7676] further describes this corner case.
See [TUNNELS] for further discussion.
5.4. UDP Applications Enhancing Performance
Some UDP applications rely on IP fragmentation to achieve acceptable
levels of performance. These applications use UDP datagram sizes
that are larger than the Path MTU so that more data can be conveyed
between the application and the kernel in a single system call.
To pick one example, the Licklider Transmission Protocol (LTP)
[RFC5326], which is in current use on the International Space Station
(ISS), uses UDP datagram sizes larger than the Path MTU to achieve
acceptable levels of performance even though this invokes IP
fragmentation. More generally, SNMP and video applications may
transmit an application-layer quantum of data, depending on the
network layer to fragment and reassemble as needed.
6. Recommendations
6.1. For Application and Protocol Developers
Developers SHOULD NOT develop new protocols or applications that rely
on IP fragmentation. When a new protocol or application is deployed
in an environment that does not fully support IP fragmentation, it
SHOULD operate correctly, either in its default configuration or in a
specified alternative configuration.
While there may be controlled environments where IP fragmentation
works reliably, this is a deployment issue and can not be known to
someone developing a new protocol or application. It is not
recommended that new protocols or applications be developed that rely
on IP fragmentation. Protocols and applications that rely on IP
fragmentation will work less reliably on the Internet.
Legacy protocols that depend upon IP fragmentation SHOULD be updated
to break that dependency. However, in some cases, there may be no
viable alternative to IP fragmentation (e.g., IPSEC tunnel mode, IP-
in-IP encapsulation). Applications and protocols cannot necessarily
know or control whether they use lower layers or network paths that
rely on such fragmentation. In these cases, the protocol will
continue to rely on IP fragmentation but should only be used in
environments where IP fragmentation is known to be supported.
Protocols may be able to avoid IP fragmentation by using a
sufficiently small MTU (e.g., The protocol minimum link MTU),
disabling IP fragmentation, and ensuring that the transport protocol
in use adapts its segment size to the MTU. Other protocols may
deploy a sufficiently reliable PMTU discovery mechanism (e.g.,
PLPMTUD).
UDP applications SHOULD abide by the recommendations stated in
Section 3.2 of [RFC8085].
6.2. For System Developers
Software libraries SHOULD include provision for PLPMTUD for each
supported transport protocol.
6.3. For Middlebox Developers
Middleboxes, which are systems that "transparently" perform policy
functions on passing traffic but do not participate in the routing
system, should process IP fragments in a manner that is consistent
with [RFC0791] and [RFC8200]. In many cases, middleboxes must
maintain state in order to achieve this goal.
Price and performance considerations frequently motivate network
operators to deploy stateless middleboxes. These stateless
middleboxes may perform suboptimally, process IP fragments in a
manner that is not compliant with RFC 791 or RFC 8200, or even
discard IP fragments completely. Such behaviors are NOT RECOMMENDED.
If a middlebox implements nonstandard behavior with respect to IP
fragmentation, then that behavior MUST be clearly documented.
6.4. For ECMP, LAG, and Load-Balancer Developers And Operators
In their default configuration, when the IPv6 Flow Label is not equal
to zero, IPv6 devices that implement Equal-Cost Multipath (ECMP)
Routing as described in OSPF [RFC2328] and other routing protocols,
Link Aggregation Grouping (LAG) [RFC7424], or other load-distribution
technologies SHOULD accept only the following fields as input to
their hash algorithm:
* IP Source Address.
* IP Destination Address.
* Flow Label.
Operators SHOULD deploy these devices in their default configuration.
These recommendations are similar to those presented in [RFC6438] and
[RFC7098]. They differ in that they specify a default configuration.
6.5. For Network Operators
Operators MUST ensure proper PMTUD operation in their network,
including making sure the network generates PTB packets when dropping
packets too large compared to outgoing interface MTU. However,
implementations MAY rate limit the generation of ICMP messages per
[RFC1812] and [RFC4443].
As per RFC 4890, network operators MUST NOT filter ICMPv6 PTB
messages unless they are known to be forged or otherwise
illegitimate. As stated in Section 3.8, filtering ICMPv6 PTB packets
causes PMTUD to fail. Many upper-layer protocols rely on PMTUD.
As per RFC 8200, network operators MUST NOT deploy IPv6 links whose
MTU is less than 1280 octets.
Network operators SHOULD NOT filter IP fragments if they are known to
have originated at a domain name server or be destined for a domain
name server. This is because domain name services are critical to
operation of the Internet.
7. IANA Considerations
This document has no IANA actions.
8. Security Considerations
This document mitigates some of the security considerations
associated with IP fragmentation by discouraging its use. It does
not introduce any new security vulnerabilities, because it does not
introduce any new alternatives to IP fragmentation. Instead, it
recommends well-understood alternatives.
9. References
9.1. Normative References
[RFC0768] Postel, J., "User Datagram Protocol", STD 6, RFC 768,
DOI 10.17487/RFC0768, August 1980,
<https://www.rfc-editor.org/info/rfc768>.
[RFC0791] Postel, J., "Internet Protocol", STD 5, RFC 791,
DOI 10.17487/RFC0791, September 1981,
<https://www.rfc-editor.org/info/rfc791>.
[RFC0792] Postel, J., "Internet Control Message Protocol", STD 5,
RFC 792, DOI 10.17487/RFC0792, September 1981,
<https://www.rfc-editor.org/info/rfc792>.
[RFC0793] Postel, J., "Transmission Control Protocol", STD 7,
RFC 793, DOI 10.17487/RFC0793, September 1981,
<https://www.rfc-editor.org/info/rfc793>.
[RFC1035] Mockapetris, P., "Domain names - implementation and
specification", STD 13, RFC 1035, DOI 10.17487/RFC1035,
November 1987, <https://www.rfc-editor.org/info/rfc1035>.
[RFC1191] Mogul, J. and S. Deering, "Path MTU discovery", RFC 1191,
DOI 10.17487/RFC1191, November 1990,
<https://www.rfc-editor.org/info/rfc1191>.
[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>.
[RFC4443] Conta, A., Deering, S., and M. Gupta, Ed., "Internet
Control Message Protocol (ICMPv6) for the Internet
Protocol Version 6 (IPv6) Specification", STD 89,
RFC 4443, DOI 10.17487/RFC4443, March 2006,
<https://www.rfc-editor.org/info/rfc4443>.
[RFC4821] Mathis, M. and J. Heffner, "Packetization Layer Path MTU
Discovery", RFC 4821, DOI 10.17487/RFC4821, March 2007,
<https://www.rfc-editor.org/info/rfc4821>.
[RFC6437] Amante, S., Carpenter, B., Jiang, S., and J. Rajahalme,
"IPv6 Flow Label Specification", RFC 6437,
DOI 10.17487/RFC6437, November 2011,
<https://www.rfc-editor.org/info/rfc6437>.
[RFC6438] Carpenter, B. and S. Amante, "Using the IPv6 Flow Label
for Equal Cost Multipath Routing and Link Aggregation in
Tunnels", RFC 6438, DOI 10.17487/RFC6438, November 2011,
<https://www.rfc-editor.org/info/rfc6438>.
[RFC8085] Eggert, L., Fairhurst, G., and G. Shepherd, "UDP Usage
Guidelines", BCP 145, RFC 8085, DOI 10.17487/RFC8085,
March 2017, <https://www.rfc-editor.org/info/rfc8085>.
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
May 2017, <https://www.rfc-editor.org/info/rfc8174>.
[RFC8200] Deering, S. and R. Hinden, "Internet Protocol, Version 6
(IPv6) Specification", STD 86, RFC 8200,
DOI 10.17487/RFC8200, July 2017,
<https://www.rfc-editor.org/info/rfc8200>.
[RFC8201] McCann, J., Deering, S., Mogul, J., and R. Hinden, Ed.,
"Path MTU Discovery for IP version 6", STD 87, RFC 8201,
DOI 10.17487/RFC8201, July 2017,
<https://www.rfc-editor.org/info/rfc8201>.
[RFC8899] Fairhurst, G., Jones, T., Tüxen, M., Rüngeler, I., and T.
Völker, "Packetization Layer Path MTU Discovery for
Datagram Transports", RFC 8899, DOI 10.17487/RFC8899,
September 2020, <https://www.rfc-editor.org/info/rfc8899>.
9.2. Informative References
[Damas] Damas, J. and G. Huston, "Measuring ATR", April 2018,
<http://www.potaroo.net/ispcol/2018-04/atr.html>.
[Huston] Huston, G., "IPv6, Large UDP Packets and the DNS", August
2017,
<http://www.potaroo.net/ispcol/2017-08/xtn-hdrs.html>.
[Kent] Kent, C. and J. Mogul, "Fragmentation Considered Harmful",
SIGCOMM '87: Proceedings of the ACM workshop on Frontiers
in computer communications technology,
DOI 10.1145/55482.55524, August 1987,
<http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-
87-3.pdf>.
[Ptacek1998]
Ptacek, T. H. and T. N. Newsham, "Insertion, Evasion and
Denial of Service: Eluding Network Intrusion Detection",
1998,
<http://www.aciri.org/vern/Ptacek-Newsham-Evasion-98.ps>.
[RFC1122] Braden, R., Ed., "Requirements for Internet Hosts -
Communication Layers", STD 3, RFC 1122,
DOI 10.17487/RFC1122, October 1989,
<https://www.rfc-editor.org/info/rfc1122>.
[RFC1812] Baker, F., Ed., "Requirements for IP Version 4 Routers",
RFC 1812, DOI 10.17487/RFC1812, June 1995,
<https://www.rfc-editor.org/info/rfc1812>.
[RFC1858] Ziemba, G., Reed, D., and P. Traina, "Security
Considerations for IP Fragment Filtering", RFC 1858,
DOI 10.17487/RFC1858, October 1995,
<https://www.rfc-editor.org/info/rfc1858>.
[RFC1981] McCann, J., Deering, S., and J. Mogul, "Path MTU Discovery
for IP version 6", RFC 1981, DOI 10.17487/RFC1981, August
1996, <https://www.rfc-editor.org/info/rfc1981>.
[RFC2003] Perkins, C., "IP Encapsulation within IP", RFC 2003,
DOI 10.17487/RFC2003, October 1996,
<https://www.rfc-editor.org/info/rfc2003>.
[RFC2328] Moy, J., "OSPF Version 2", STD 54, RFC 2328,
DOI 10.17487/RFC2328, April 1998,
<https://www.rfc-editor.org/info/rfc2328>.
[RFC2460] Deering, S. and R. Hinden, "Internet Protocol, Version 6
(IPv6) Specification", RFC 2460, DOI 10.17487/RFC2460,
December 1998, <https://www.rfc-editor.org/info/rfc2460>.
[RFC2473] Conta, A. and S. Deering, "Generic Packet Tunneling in
IPv6 Specification", RFC 2473, DOI 10.17487/RFC2473,
December 1998, <https://www.rfc-editor.org/info/rfc2473>.
[RFC2784] Farinacci, D., Li, T., Hanks, S., Meyer, D., and P.
Traina, "Generic Routing Encapsulation (GRE)", RFC 2784,
DOI 10.17487/RFC2784, March 2000,
<https://www.rfc-editor.org/info/rfc2784>.
[RFC3128] Miller, I., "Protection Against a Variant of the Tiny
Fragment Attack (RFC 1858)", RFC 3128,
DOI 10.17487/RFC3128, June 2001,
<https://www.rfc-editor.org/info/rfc3128>.
[RFC4340] Kohler, E., Handley, M., and S. Floyd, "Datagram
Congestion Control Protocol (DCCP)", RFC 4340,
DOI 10.17487/RFC4340, March 2006,
<https://www.rfc-editor.org/info/rfc4340>.
[RFC4459] Savola, P., "MTU and Fragmentation Issues with In-the-
Network Tunneling", RFC 4459, DOI 10.17487/RFC4459, April
2006, <https://www.rfc-editor.org/info/rfc4459>.
[RFC4890] Davies, E. and J. Mohacsi, "Recommendations for Filtering
ICMPv6 Messages in Firewalls", RFC 4890,
DOI 10.17487/RFC4890, May 2007,
<https://www.rfc-editor.org/info/rfc4890>.
[RFC4960] Stewart, R., Ed., "Stream Control Transmission Protocol",
RFC 4960, DOI 10.17487/RFC4960, September 2007,
<https://www.rfc-editor.org/info/rfc4960>.
[RFC4963] Heffner, J., Mathis, M., and B. Chandler, "IPv4 Reassembly
Errors at High Data Rates", RFC 4963,
DOI 10.17487/RFC4963, July 2007,
<https://www.rfc-editor.org/info/rfc4963>.
[RFC5326] Ramadas, M., Burleigh, S., and S. Farrell, "Licklider
Transmission Protocol - Specification", RFC 5326,
DOI 10.17487/RFC5326, September 2008,
<https://www.rfc-editor.org/info/rfc5326>.
[RFC5340] Coltun, R., Ferguson, D., Moy, J., and A. Lindem, "OSPF
for IPv6", RFC 5340, DOI 10.17487/RFC5340, July 2008,
<https://www.rfc-editor.org/info/rfc5340>.
[RFC5722] Krishnan, S., "Handling of Overlapping IPv6 Fragments",
RFC 5722, DOI 10.17487/RFC5722, December 2009,
<https://www.rfc-editor.org/info/rfc5722>.
[RFC5927] Gont, F., "ICMP Attacks against TCP", RFC 5927,
DOI 10.17487/RFC5927, July 2010,
<https://www.rfc-editor.org/info/rfc5927>.
[RFC6346] Bush, R., Ed., "The Address plus Port (A+P) Approach to
the IPv4 Address Shortage", RFC 6346,
DOI 10.17487/RFC6346, August 2011,
<https://www.rfc-editor.org/info/rfc6346>.
[RFC6888] Perreault, S., Ed., Yamagata, I., Miyakawa, S., Nakagawa,
A., and H. Ashida, "Common Requirements for Carrier-Grade
NATs (CGNs)", BCP 127, RFC 6888, DOI 10.17487/RFC6888,
April 2013, <https://www.rfc-editor.org/info/rfc6888>.
[RFC7098] Carpenter, B., Jiang, S., and W. Tarreau, "Using the IPv6
Flow Label for Load Balancing in Server Farms", RFC 7098,
DOI 10.17487/RFC7098, January 2014,
<https://www.rfc-editor.org/info/rfc7098>.
[RFC7424] Krishnan, R., Yong, L., Ghanwani, A., So, N., and B.
Khasnabish, "Mechanisms for Optimizing Link Aggregation
Group (LAG) and Equal-Cost Multipath (ECMP) Component Link
Utilization in Networks", RFC 7424, DOI 10.17487/RFC7424,
January 2015, <https://www.rfc-editor.org/info/rfc7424>.
[RFC7588] Bonica, R., Pignataro, C., and J. Touch, "A Widely
Deployed Solution to the Generic Routing Encapsulation
(GRE) Fragmentation Problem", RFC 7588,
DOI 10.17487/RFC7588, July 2015,
<https://www.rfc-editor.org/info/rfc7588>.
[RFC7676] Pignataro, C., Bonica, R., and S. Krishnan, "IPv6 Support
for Generic Routing Encapsulation (GRE)", RFC 7676,
DOI 10.17487/RFC7676, October 2015,
<https://www.rfc-editor.org/info/rfc7676>.
[RFC7739] Gont, F., "Security Implications of Predictable Fragment
Identification Values", RFC 7739, DOI 10.17487/RFC7739,
February 2016, <https://www.rfc-editor.org/info/rfc7739>.
[RFC7872] Gont, F., Linkova, J., Chown, T., and W. Liu,
"Observations on the Dropping of Packets with IPv6
Extension Headers in the Real World", RFC 7872,
DOI 10.17487/RFC7872, June 2016,
<https://www.rfc-editor.org/info/rfc7872>.
[RFC8086] Yong, L., Ed., Crabbe, E., Xu, X., and T. Herbert, "GRE-
in-UDP Encapsulation", RFC 8086, DOI 10.17487/RFC8086,
March 2017, <https://www.rfc-editor.org/info/rfc8086>.
[TUNNELS] Touch, J. and M. Townsley, "IP Tunnels in the Internet
Architecture", Work in Progress, Internet-Draft, draft-
ietf-intarea-tunnels-10, 12 September 2019,
<https://tools.ietf.org/html/draft-ietf-intarea-tunnels-
10>.
[UDP-OPTIONS]
Touch, J., "Transport Options for UDP", Work in Progress,
Internet-Draft, draft-ietf-tsvwg-udp-options-08, 12
September 2019, <https://tools.ietf.org/html/draft-ietf-
tsvwg-udp-options-08>.
Acknowledgements
Thanks to Mikael Abrahamsson, Brian Carpenter, Silambu Chelvan,
Lorenzo Colitti, Gorry Fairhurst, Joel Halpern, Mike Heard, Tom
Herbert, Tatuya Jinmei, Suresh Krishnan, Jen Linkova, Paolo Lucente,
Manoj Nayak, Eric Nygren, Fred Templin, and Joe Touch for their
comments.
Authors' Addresses
Ron Bonica
Juniper Networks
2251 Corporate Park Drive
Herndon, Virginia 20171
United States of America
Email: rbonica@juniper.net
Fred Baker
Unaffiliated
Santa Barbara, California 93117
United States of America
Email: FredBaker.IETF@gmail.com
Geoff Huston
APNIC
6 Cordelia St
Brisbane 4101 QLD
Australia
Email: gih@apnic.net
Robert M. Hinden
Check Point Software
959 Skyway Road
San Carlos, California 94070
United States of America
Email: bob.hinden@gmail.com
Ole Troan
Cisco
Philip Pedersens vei 1
N-1366 Lysaker
Norway
Email: ot@cisco.com
Fernando Gont
SI6 Networks
Evaristo Carriego 2644
Haedo
Provincia de Buenos Aires
Argentina
Email: fgont@si6networks.com
ISO Plain Language
On this page
§1Introduction
Operational experience shows that IP fragmentation introduces fragility to Internet communication. This document describes IP fragmentation and explains the fragility it introduces. It also proposes alternatives to IP fragmentation and provides recommendations for developers and network operators.
While the document identifies issues associated with IP fragmentation, it does not recommend deprecation. Legacy protocols that depend on IP fragmentation would do well to be updated to remove that dependency. Some applications and environments still require IP fragmentation, and in those cases the protocol will continue to rely on it, but the designer should be aware that fragmented packets may result in black holes. A design should include appropriate safeguards.
Rather than deprecating IP fragmentation, the document recommends that upper-layer protocols address the problem of fragmentation at their layer, reducing their reliance on IP fragmentation to the greatest degree possible.
The RFC does not say that IP fragmentation should be removed from the Internet. It says the same thing in a different way: new protocols should not depend on it, old ones should be fixed where that is possible, and where a protocol cannot avoid it, the design has to expect that fragments can be lost.
§2.1Links, Paths, MTU and PMTU
An Internet path connects a source node to a destination node and may contain several links and routers, with the links connected in series. Internet paths are dynamic: if a link or a router fails, the path can change to use a different set of links and routers.
Each link is constrained by the number of octets it can carry in one IP packet, which is called the link Maximum Transmission Unit, or MTU. IPv4 requires every link to support an MTU of 68 octets or greater, and IPv6 requires every link to support an MTU of 1280 octets or greater. These are the IPv4 and IPv6 minimum link MTUs.
Each path is constrained by the number of octets it can carry in one IP packet, which is called the Path MTU, or PMTU. For any given path the PMTU equals the smallest of its link MTUs, and because paths change, the PMTU changes too.
Source nodes therefore estimate the PMTU. A source can produce extremely conservative estimates in which the estimate for each IPv4 path equals the IPv4 minimum link MTU and the estimate for each IPv6 path equals the IPv6 minimum link MTU. Those estimates are guaranteed to be no larger than the real PMTU, but they are likely to be much smaller, which can hurt the performance of the protocol above.
Path MTU Discovery, or PMTUD, keeps a less conservative estimate. The source starts with an estimate equal to the MTU of the first link on the path, which can be greater than the actual PMTU, and sends non-fragmentable packets. If a packet is larger than the actual PMTU, the downstream router cannot forward it, drops it, and sends the source an ICMP Packet Too Big message carrying the MTU of the link that could not carry it. The source then refines its estimate. Because the PMTU is dynamic, the estimate can be too large, so PMTUD occasionally resets the estimate to its initial value and repeats the procedure to detect increases.
PMTUD fails in some scenarios. It relies on the network delivering ICMP Packet Too Big messages to the source, and it is susceptible to attack because ICMP messages are easily forged and are not authenticated by the receiver. Such attacks can make the estimate unnecessarily conservative.
Every link has a size limit, and the path limit is the smallest of them. A sender does not know that limit, so it estimates it. The usual method, Path MTU Discovery, sends a packet that cannot be split and waits for the router that cannot forward it to report the limit back. That method fails when those reports are lost, and it can be pushed towards a too-small estimate by forged messages.
- Non-fragmentable packetThe source sends a packet that routers may not split.
- ICMP Packet Too BigThe router reports the MTU of the link it could not use.
- Smaller packetThe source lowers its estimate and tries again.
§2.2How Fragmentation Works
When an upper-layer protocol submits data to the IP module and the resulting IP packet is longer than the PMTU, the packet is divided into fragments. Each fragment includes an IP header and a portion of the original packet.
In IPv4, a packet whose Don't Fragment bit is set to 1 may be fragmented by the source node but not by a downstream router, while a packet whose Don't Fragment bit is set to 0 may be fragmented by the source node or by a downstream router. When an IPv4 packet is fragmented, all the IP options appear in the first fragment, but only the options whose copy bit is set to 1 appear in later fragments.
In IPv6, a packet may be fragmented only at the source node. When an IPv6 packet is fragmented, all the extension headers appear in the first fragment, but only the per-fragment headers appear in later fragments. The per-fragment headers are the IPv6 header, the Hop-by-Hop Options header if present, the Destination Options header if present and if it precedes a Routing header, the Routing header if present, and the Fragment header.
In IPv4 the upper-layer header usually appears in the first fragment, because of the sizes of the headers involved. In IPv6 the upper-layer header must appear in the first fragment.
Splitting a packet means sending several smaller packets, each with its own IP header. In IPv4 any router along the path may do the splitting, unless the sender marked the packet as indivisible. In IPv6 only the sender may split, and the pieces carry only the headers that every piece needs, which is why the later pieces often no longer show which port or protocol the traffic belongs to.
§3Where Fragments Break
The RFC lists several places where fragmentation causes trouble.
Virtual reassembly is a procedure in which a device conceptually reassembles a packet, forwards its fragments and discards the reassembled copy. It is required in Address plus Port NAT and in Carrier Grade NAT to translate fragment addresses correctly. It is computationally expensive and holds state for indeterminate periods of time, so it is prone to errors and attacks.
Policy-based routing breaks because the port information is only in the first fragment. A router looks up the next hop in its forwarding information base. With the example table in the RFC, the first fragment of a packet for TCP port 80 matches both the destination-based entry and the more specific policy-based entry, so it goes to the policy next hop. The second fragment carries no port information, so only the destination-based entry matches and the fragment goes to the other next hop. The two halves of one packet then travel different ways.
Network address translation has the same root cause. A NAT device maps the source port and address of a new outbound flow and translates the headers on the way out and the way back, and it must virtually reassemble fragmented packets to translate and forward each fragment.
Stateless firewalls whose rules include TCP and UDP ports see the port only in the first fragment. The firewall can accept all the later fragments, possibly admitting certain classes of attack, or block them all, possibly blocking legitimate traffic. Neither option is attractive.
Equal-cost multipath, link aggregation groups and stateless load balancers assign each packet or fragment to a link with a hash algorithm. When the fragment contains a transport-layer header the algorithm uses the source address, destination address, protocol or next header, and the two ports. When it does not, the algorithm uses only the source address, destination address and protocol. Non-fragmented packets of one flow can therefore go to one link while the fragments of the same flow are divided between that link and another, which causes suboptimal load distribution. RFC 6438 offers a partial solution for IPv6 devices only, by requiring the hash to include at least the destination address, source address and flow label, which sends all fragments of a packet to the same link.
IPv4 reassembly errors at high data rates are the last problem. The 16-bit IPv4 identification field is not large enough at high data rates to prevent duplicate IDs, so fragments are assembled incorrectly, and the TCP and UDP checksums are not sufficient to stop the corrupted datagrams from reaching the upper layer. These issues are less frequent in IPv6, whose identification field is 32 bits long.
Most of the trouble comes from the same fact: only the first fragment carries the information that identifies the traffic. A router that forwards by port, a NAT device that rewrites addresses and ports, a firewall that filters by port, and a load balancer that hashes the flow all have to make a decision on a fragment that no longer says what it is. The result is packets that go to the wrong place, or get dropped, or get spread over links unevenly.
| Device | Why it struggles | What happens |
|---|---|---|
| Policy-based routing THIS RFC | The fragment carries no port information | The halves of one packet leave by different next hops |
| Network address translation THIS RFC | Addresses and ports must be rewritten | The device must virtually reassemble the packet |
| Stateless firewall THIS RFC | Port rules cannot be evaluated | Accept all later fragments or block them all |
| Load balancer THIS RFC | The hash input is smaller for a fragment | Fragments of one flow are spread over several links |
§3.7Attacks That Exploit Fragments
Security researchers have documented several attacks that exploit IP fragmentation. The RFC lists overlapping fragment attacks, resource exhaustion attacks, attacks based on predictable fragment identification values, and evasion of network intrusion detection systems.
In the overlapping fragment attack, an attacker constructs a series of packet fragments. The first fragment contains an IP header, a transport-layer header and some transport-layer payload, so it complies with the local security policy and is allowed through a stateless firewall. A second fragment with a nonzero offset overlaps with the first and also passes the firewall. When the packet is reassembled, the transport-layer header from the first fragment is overwritten by data from the second, and the reassembled packet no longer complies with the local security policy. Had it passed through the firewall in one piece, the firewall would have rejected it.
A stateless firewall cannot protect against the overlapping fragment attack, but destination nodes can, by implementing the reassembly procedures of RFC 1858, RFC 3128 and RFC 8200, which detect the overlap and discard the packet.
The fragment reassembly algorithm is a stateful procedure in an otherwise stateless protocol, so it can be exploited by resource exhaustion attacks. An attacker constructs a series of fragmented packets with one fragment missing from each, so the reassembly never completes. This causes resource exhaustion on the destination node, possibly denying reassembly service to other flows. The attack can be mitigated by flushing the fragment reassembly buffers when necessary, at the price of possibly dropping legitimate fragments.
Each fragment also carries an Identification field that the destination uses to reassemble. Some implementations set that field to a predictable value, which makes it easy to forge fragments that cause the reassembly procedure for legitimate packets to fail. Finally, the ambiguity of what the reassembled packet will be allows an attacker to evade network intrusion detection systems, many of which try to reduce that evasion by computing all possible reassembly outcomes at the cost of more processing.
Fragments give an attacker two useful tricks. One is to send a fragment that overlaps another one, so that the packet the firewall approved is not the packet the destination ends up with. The other is to send fragments that never complete, which ties up the memory the destination keeps for reassembly. The firewall cannot stop either, so the protection has to be at the destination, and the session itself has to be protected.
§3.8Black Holes from Lost ICMP Messages
An upper-layer protocol that relies on PMTUD also relies on the network to deliver ICMP Packet Too Big messages, and that delivery is not reliable. It is subject to both transient and persistent loss.
Transient loss causes transient PMTU black holes: when the conditions causing the loss abate, the network regains the ability to deliver the messages and connectivity is restored. The causes are network congestion, packet corruption, transient routing loops and ICMP rate limiting. Rate limiting can be severe, because RFC 4443 recommends strict rate limiting of ICMPv6 traffic.
Persistent loss causes persistent black holes, and the RFC names three causes. The first is an incorrect implementation of a security policy: a zone-based policy that allows traffic from the outside zone only if it belongs to an existing flow should check the payload of the ICMP message to see whether the original packet belonged to an existing flow, but an incorrect implementation discards the message because its source address is not associated with an existing flow. The RFC notes that this policy has been implemented incorrectly on many consumer CPE routers.
The second is anycast. A DNS client sends a request to an anycast address, which the network routes to the nearest instance. The response does not exceed that server's PMTU estimate but does exceed the actual PMTU, so a downstream router drops it and sends the ICMP message to the anycast address. The message is then routed to the anycast instance closest to that router, which may be a different server from the one that sent the response, so the server that needs the information never learns the smaller limit.
The third is unidirectional routing: if the intermediate nodes have a route to the destination but not back to the source, an intermediate node that hits an MTU problem cannot send the message to the source at all.
Fragments are also lost for other reasons. The study in RFC 7872 found that at least 28% of the sampled paths did not convey packets containing the IPv6 Fragment extension header, with the fragments usually dropped in the destination autonomous system and sometimes in transit ones. Another study reported that 37% of sampled endpoints used IPv6-capable DNS resolvers that could not receive a fragmented IPv6 response. The RFC lists possible causes: hardware inability to process fragmented packets, failure to change vendor defaults, unintentional misconfiguration, and intentional configuration.
Path MTU Discovery only works if the too-big messages get back to the sender, and they often do not. Congestion, rate limiting and broken firewall rules lose them for a while, and anycast or one-way routing loses them for good. The result is a connection that silently stops working, because both ends believe the path can carry their packets.
§4Alternatives to IP Fragmentation
Transport-layer solutions. TCP can be operated so that IP fragmentation is never needed. Applications give TCP a stream, TCP divides it into segments no larger than the TCP Maximum Segment Size, and if the MSS is small enough the IP module never produces a packet longer than the actual PMTU. TCP offers three mechanisms for managing the MSS: manual configuration, PMTUD, and PLPMTUD. Manual configuration always works but stops TCP from using larger link MTUs. PMTUD needs the network to deliver ICMP messages, so it can only be used where that risk is acceptable. PLPMTUD does not depend on ICMP messages: it sends probe messages as TCP segments and checks that they are acknowledged, and it separates probing from congestion control so that a lost probe does not shrink the congestion window.
The Datagram Congestion Control Protocol and the Stream Control Transmission Protocol can also be operated without IP fragmentation, and both offer manual configuration, PMTUD and PLPMTUD for managing their maximum segment size. UDP has no fragmentation mechanism of its own and relies on IP fragmentation, though a UDP fragmentation mechanism has been proposed.
Application-layer solutions. The UDP usage guidelines of RFC 8085 say that an application should not send UDP datagrams that would result in IP packets larger than the MTU on the path, and should either use the path MTU information from the IP layer or implement PMTU discovery itself. An application that does not do discovery should still avoid oversized datagrams and fall back to sending messages shorter than the default effective MTU for sending. For IPv4 that value is the smaller of 576 bytes and the first-hop MTU, and for IPv6 it is 1280 bytes. The same advice applies to any application running directly over IP.
Applications that still rely on IPv6 fragmentation are DNS, OSPFv2, OSPFv3 and packet-in-packet encapsulations. Some of that reliance is essential and cannot be broken without changing the protocol, while some is incidental and most implementations already avoid it. DNS relies on UDP for efficiency, which means large responses are fragmented; the mitigation is to use smaller EDNS0 buffer sizes or to limit the response size, so that large responses are truncated and the client re-queries over TCP. Most OSPF implementations restrict their maximum message size so that no fragmentation is needed.
There are two ways out. A transport protocol can keep its own segments small enough that IP never has to split anything, and it can find the real path limit by probing rather than by waiting for ICMP messages. An application using UDP can do the same thing itself, or fall back to sending small messages. Some protocols, such as DNS and OSPF, cannot avoid the issue entirely, so their operators have to make sure the fragments are not dropped.
§6Recommendations
For application and protocol developers: developers should not develop new protocols or applications that rely on IP fragmentation, and a new protocol or application deployed in an environment that does not fully support fragmentation should operate correctly, either by default or in a specified alternative configuration. Legacy protocols that depend on fragmentation should be updated to break the dependency, but where there is no viable alternative, such as in IPsec tunnel mode or IP-in-IP encapsulation, the protocol will continue to rely on fragmentation and should only be used in environments where fragmentation is known to be supported. Protocols can avoid fragmentation by using a sufficiently small MTU, disabling IP fragmentation, and making sure the transport protocol adapts its segment size to the MTU, or by deploying a sufficiently reliable PMTU discovery mechanism such as PLPMTUD. UDP applications should follow the guidance in Section 3.2 of RFC 8085.
For system developers: software libraries should include provision for PLPMTUD for each supported transport protocol.
For middlebox developers: middleboxes should process IP fragments in a manner consistent with RFC 791 and RFC 8200. Price and performance often lead operators to deploy stateless middleboxes, which may process fragments suboptimally, in a way that is not compliant with those specifications, or discard fragments completely. Such behaviour is not recommended, and any non-standard behaviour with respect to fragmentation must be clearly documented.
For ECMP, LAG and load-balancer developers and operators: in their default configuration, when the IPv6 flow label is not zero, devices that implement ECMP, link aggregation or other load-distribution technologies should accept only the IP source address, the IP destination address and the flow label as input to their hash algorithm, and operators should deploy these devices in that default configuration. The RFC notes that these recommendations are similar to those of RFC 6438 and RFC 7098, but specify a default configuration.
For network operators: operators must ensure proper PMTUD operation in their network, including making sure the network generates Packet Too Big messages when dropping packets that are too large for the outgoing interface, although implementations may rate limit the generation of ICMP messages. Operators must not filter ICMPv6 Packet Too Big messages unless they are known to be forged or otherwise illegitimate, because filtering them causes PMTUD to fail and many upper-layer protocols rely on it. Operators must not deploy IPv6 links whose MTU is less than 1280 octets, and should not filter IP fragments known to have come from or to be destined for a domain name server, because domain name services are critical to the operation of the Internet.
The recommendations are addressed to five groups. Protocol designers should not rely on fragmentation and should size their own packets instead. Library writers should build in packetization layer discovery. Middlebox writers should handle fragments correctly or say clearly that they do not. Load-balancer makers and operators should hash on the address pair and the flow label so that fragments of one packet stay together. Network operators must keep the too-big messages flowing and must not drop fragments to and from name servers.
- Protocol developersDo not rely on IP fragmentation, and adapt the transport segment size to the path instead.
- System developersProvide packetization layer PMTU discovery in the libraries for each transport protocol.
- Middlebox developersProcess fragments as RFC 791 and RFC 8200 require, or document any other behaviour.
- Load-balancer makers and operatorsHash on the address pair and the IPv6 flow label, and deploy that default configuration.
- Network operatorsKeep Packet Too Big messages flowing, keep IPv6 link MTUs at 1280 or more, and not drop fragments to or from name servers.