RFC 8200

Internet Protocol, Version 6 (IPv6) Specification

๐Ÿ“… published July 2017, from ietf

๐ŸŽ€ Internet Protocol, Version 6 (IPv6) Specification ๐ŸŽ€

Okay bestie, get ready, because this is the RFC that defines IPv6, the successor to IPv4 and the protocol that's keeping the internet's addresses from running out ๐Ÿ’…โœจ. It's RFC 8200, published July 2017 as an Internet Standards Track document (it's STD 86 too ๐Ÿงš), and it obsoletes RFC 2460 ๐Ÿฆ‹. The authors are S. Deering and R. Hinden from Check Point Software (Hinden's listed with that affiliation, and Deering's listed as Retired). It's part of the IETF stream and the ISSN is 2070-1721 ๐ŸŒˆ.

This is part 1 of 9, so stay tuned, more is coming ๐Ÿซถ.


Status of This Memo โœจ

Okay so this is an Internet Standards Track document ๐Ÿ’–. It's a product of the Internet Engineering Task Force (IETF), it represents the consensus of the whole IETF community ๐ŸŒธ, it got public review, and the Internet Engineering Steering Group (IESG) approved it for publication. If you want more on Internet Standards, check out Section 2 of RFC 7841 ๐Ÿ“. For the current status, errata, or to send feedback, the info lives at http://www.rfc-editor.org/info/rfc8200 ๐Ÿ’….

Copyright (c) 2017 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 (http://trustee.ietf.org/license-info) as they were on the publication date, so read them carefully because they spell out your rights and restrictions ๐Ÿ™ˆ. Code Components pulled from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions, and they come without warranty as the Simplified BSD License describes ๐Ÿ’œ.

This document may contain material from IETF Documents or IETF Contributions published or made publicly available before November 10, 2008 ๐Ÿ˜ญ. The people controlling copyright in some of that older material may not have given the IETF Trust permission to allow modifications outside the IETF Standards Process. Without an adequate license from those copyright holders, this document may not be modified outside the IETF Standards Process, and derivative works may not be created outside it, except to format it for publication as an RFC or to translate it into languages other than English ๐ŸŒˆ.

Table of Contents โœจ

1.  Introduction  . . . . . . . . . . . . . . . . . . . . . . . .   4
2.  Terminology . . . . . . . . . . . . . . . . . . . . . . . . .   5
3.  IPv6 Header Format  . . . . . . . . . . . . . . . . . . . . .   6
4.  IPv6 Extension Headers  . . . . . . . . . . . . . . . . . . .   7
  4.1.  Extension Header Order  . . . . . . . . . . . . . . . . .  10
  4.2.  Options . . . . . . . . . . . . . . . . . . . . . . . . .  11
  4.3.  Hop-by-Hop Options Header . . . . . . . . . . . . . . . .  13
  4.4.  Routing Header  . . . . . . . . . . . . . . . . . . . . .  14
  4.5.  Fragment Header . . . . . . . . . . . . . . . . . . . . .  15
  4.6.  Destination Options Header  . . . . . . . . . . . . . . .  23
  4.7.  No Next Header  . . . . . . . . . . . . . . . . . . . . .  24
  4.8.  Defining New Extension Headers and Options  . . . . . . .  24
5.  Packet Size Issues  . . . . . . . . . . . . . . . . . . . . .  25
6.  Flow Labels . . . . . . . . . . . . . . . . . . . . . . . . .  26
7.  Traffic Classes . . . . . . . . . . . . . . . . . . . . . . .  26
8.  Upper-Layer Protocol Issues . . . . . . . . . . . . . . . . .  27
  8.1.  Upper-Layer Checksums . . . . . . . . . . . . . . . . . .  27
  8.2.  Maximum Packet Lifetime . . . . . . . . . . . . . . . . .  28
  8.3.  Maximum Upper-Layer Payload Size  . . . . . . . . . . . .  29
  8.4.  Responding to Packets Carrying Routing Headers  . . . . .  29
9.  IANA Considerations . . . . . . . . . . . . . . . . . . . . .  29
10. Security Considerations . . . . . . . . . . . . . . . . . . .  30
11. References  . . . . . . . . . . . . . . . . . . . . . . . . .  32
  11.1.  Normative References . . . . . . . . . . . . . . . . . .  32
  11.2.  Informative References . . . . . . . . . . . . . . . . .  33
Appendix A.  Formatting Guidelines for Options  . . . . . . . . .  36
Appendix B.  Changes Since RFC 2460 . . . . . . . . . . . . . . .  39
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . .  42
Authors' Addresses  . . . . . . . . . . . . . . . . . . . . . . .  42

1. Introduction ๐ŸŒธ

Okay so IP version 6 (IPv6) is a brand-new version of the Internet Protocol (IP), and it's designed as the successor to IP version 4 (IPv4) [RFC791] ๐Ÿ’–. The big changes from IPv4 to IPv6 fall into these categories, and honestly they're all iconic ๐Ÿ‘‘:

  • Expanded Addressing Capabilities ๐ŸŒ

IPv6 bumps the IP address size from 32 bits up to 128 bits ๐Ÿ˜ญ. That gets you more levels of addressing hierarchy, a way bigger number of addressable nodes, and simpler autoconfiguration of addresses. Multicast routing scales better too, because there's now a "scope" field on multicast addresses โœจ. And there's a new kind of address called an "anycast address," which is used to send a packet to any one node in a group ๐Ÿงš.

  • Header Format Simplification ๐Ÿ’…

Some IPv4 header fields got dropped or made optional. The point is to cut the processing cost of handling packets in the common case, and to limit how much bandwidth the IPv6 header eats ๐Ÿ“.

  • Improved Support for Extensions and Options ๐Ÿ”ฅ

The way IP header options get encoded changed, which allows for more efficient forwarding, less strict limits on option length, and way more flexibility for introducing new options later ๐Ÿฆ‹.

  • Flow Labeling Capability ๐Ÿท๏ธ

There's a brand-new capability that lets you label sequences of packets the sender wants treated as a single flow in the network ๐Ÿ’œ.

  • Authentication and Privacy Capabilities ๐Ÿ”

Extensions for authentication, data integrity, and (optional) data confidentiality are specified for IPv6 ๐Ÿซถ.

This document specifies the basic IPv6 header and the initially defined IPv6 extension headers and options ๐ŸŽ€. It also talks about packet size issues, the semantics of flow labels and traffic classes, and how IPv6 affects upper-layer protocols ๐ŸŒˆ. The format and semantics of IPv6 addresses are specified separately in [RFC4291] ๐Ÿงš. The IPv6 version of ICMP, which every IPv6 implementation is required to include, is specified in [RFC4443] โœจ.

The data transmission order for IPv6 is the same as for IPv4, as defined in Appendix B of [RFC791] ๐Ÿ’–.

Note: As this document obsoletes [RFC2460], any document referenced in this document that includes pointers to RFC 2460 should be interpreted as referencing this document ๐Ÿ’….

2. Terminology ๐Ÿง 

Okay, so let's get our vocab straight, bestie ๐Ÿ’–.

  • node is a device that implements IPv6 ๐ŸŒธ.
  • router is a node that forwards IPv6 packets not explicitly addressed to itself. (See Note below.) ๐Ÿฆ‹
  • host is any node that is not a router. (See Note below.) ๐Ÿซถ
  • upper layer is a protocol layer immediately above IPv6. Examples are transport protocols like TCP and UDP, control protocols like ICMP, routing protocols like OSPF, and internet-layer or lower-layer protocols being "tunneled" over (i.e., encapsulated in) IPv6, such as Internetwork Packet Exchange (IPX), AppleTalk, or IPv6 itself ๐Ÿ“.
  • link is a communication facility or medium over which nodes can communicate at the link layer, i.e., the layer immediately below IPv6. Examples are Ethernets (simple or bridged), PPP links, X.25, Frame Relay, or ATM networks, and internet-layer or higher-layer "tunnels," such as tunnels over IPv4 or IPv6 itself ๐ŸŒˆ.
  • neighbors are nodes attached to the same link ๐Ÿ’œ.
  • interface is a node's attachment to a link โœจ.
  • address is an IPv6-layer identifier for an interface or a set of interfaces ๐ŸŽ€.
  • packet is an IPv6 header plus payload ๐Ÿงš.
  • link MTU is the maximum transmission unit, i.e., maximum packet size in octets, that can be conveyed over a link ๐Ÿ”ฅ.
  • path MTU is the minimum link MTU of all the links in a path between a source node and a destination node ๐Ÿ‘‘.
Note: it is possible for a device with multiple interfaces to be configured to forward non-self-destined packets arriving from some set (fewer than all) of its interfaces and to discard non-self-destined packets arriving from its other interfaces. Such a device MUST obey the protocol requirements for routers when receiving packets from, and interacting with neighbors over, the former (forwarding) interfaces. It MUST obey the protocol requirements for hosts when receiving packets from, and interacting with neighbors over, the latter (non-forwarding) interfaces ๐Ÿ™ˆ.

This is the end of part 1 of 9. Part 2 picks up with Section 3, the IPv6 Header Format ๐Ÿฆ‹๐Ÿ’–

3. IPv6 Header Format โœจ

okay bestie, this is the IPv6 header, and it's giving minimalism ๐Ÿฆ‹ Here's the fixed layout. Every row is 32 bits wide, so the fields line up perfectly:

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Version| Traffic Class |           Flow Label                  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |         Payload Length        |  Next Header  |   Hop Limit   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   +                                                               +
   |                                                               |
   +                         Source Address                        +
   |                                                               |
   +                                                               +
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   +                                                               +
   |                                                               |
   +                      Destination Address                      +
   |                                                               |
   +                                                               +
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Now let's meet the fields, one by one ๐Ÿ’–

  • Version: a 4-bit Internet Protocol version number = 6. Iconic, obviously ๐Ÿ‘‘
  • Traffic Class: an 8-bit Traffic Class field. See Section 7 ๐ŸŒธ
  • Flow Label: a 20-bit flow label. See Section 6 ๐Ÿงš
  • Payload Length: a 16-bit unsigned integer. It's the length of the IPv6 payload, aka the rest of the packet following this IPv6 header, in octets. ngl this one is so specific ๐Ÿ˜ญ Also, any extension headers (see Section 4) that are present count as part of the payload, so they're included in the length count. Tea ๐Ÿต
  • Next Header: an 8-bit selector that identifies the type of header immediately following the IPv6 header. It uses the same values as the IPv4 Protocol field [IANA-PN]. Literally the same numbers, which is so efficient ๐Ÿ™Œ
  • Hop Limit: an 8-bit unsigned integer. Each node that forwards the packet decrements it by 1. When forwarding, the packet is discarded if the Hop Limit was zero when received, or if it gets decremented to zero. Now the plot twist: a node that is the destination of a packet SHOULD NOT discard a packet with Hop Limit equal to zero, and it SHOULD process the packet normally ๐Ÿ™ˆ
  • Source Address: a 128-bit address of the originator of the packet. See [RFC4291] ๐Ÿฆ‹
  • Destination Address: a 128-bit address of the intended recipient of the packet. It might not be the ultimate recipient if a Routing header is present. See [RFC4291] and Section 4.4 ๐Ÿ’…

4. IPv6 Extension Headers ๐ŸŽ€

In IPv6, optional internet-layer information lives in separate headers. They can sit between the IPv6 header and the upper-layer header in a packet, kind of like accessories ๐Ÿ‘œ There's a small number of them, and each one is identified by its own distinct Next Header value.

Extension headers get their numbers from IANA IP Protocol Numbers [IANA-PN], the same values used for IPv4 and IPv6. When you process a sequence of Next Header values in a packet, the first one that isn't an extension header [IANA-EH] tells you the next item is the matching upper-layer header. There's also a special "No Next Header" value for when there's no upper-layer header at all ๐Ÿซถ

Here's the vibe check. An IPv6 packet can carry zero, one, or more extension headers, and each one is flagged by the Next Header field of the header before it โœจ

   +---------------+------------------------
   |  IPv6 header  | TCP header + data
   |               |
   | Next Header = |
   |      TCP      |
   +---------------+------------------------

   +---------------+----------------+------------------------
   |  IPv6 header  | Routing header | TCP header + data
   |               |                |
   | Next Header = |  Next Header = |
   |    Routing    |      TCP       |
   +---------------+----------------+------------------------

   +---------------+----------------+-----------------+-----------------
   |  IPv6 header  | Routing header | Fragment header | fragment of TCP
   |               |                |                 |  header + data
   | Next Header = |  Next Header = |  Next Header =  |
   |    Routing    |    Fragment    |       TCP       |
   +---------------+----------------+-----------------+-----------------

Extension headers (except for the Hop-by-Hop Options header) are not processed, inserted, or deleted by any node along a packet's delivery path. They stay untouched until the packet reaches the node identified in the Destination Address field of the IPv6 header. In multicast, that means each node in the set of nodes ๐Ÿ”’

The Hop-by-Hop Options header is different. It's not inserted or deleted, but any node along the delivery path MAY examine or process it, until the packet reaches the node (or each node in the set, for multicast) identified in the Destination Address field of the IPv6 header. When it's present, the Hop-by-Hop Options header MUST immediately follow the IPv6 header. You can spot it because the Next Header field of the IPv6 header is zero ๐Ÿง

NOTE: While [RFC2460] required that all nodes MUST examine and process the Hop-by-Hop Options header, it is now expected that nodes along a packet's delivery path only examine and process the Hop-by-Hop Options header if explicitly configured to do so. Glow-up energy ๐ŸŒˆ

At the destination node, normal demultiplexing on the Next Header field of the IPv6 header calls the module that processes the first extension header. If there's no extension header, it goes straight to the upper-layer header. What each extension header contains and means decides whether the node moves on to the next one. So extension headers MUST be processed strictly in the order they appear in the packet. A receiver MUST NOT, for example, scan through a packet looking for one particular kind of extension header and process it before handling all the ones in front of it. No skipping the line, bestie ๐Ÿ™…โ€โ™€๏ธ

If, after processing a header, the destination node has to move on to the next header, but the Next Header value in the current header isn't recognized by that node, it SHOULD discard the packet. It SHOULD also send an ICMP Parameter Problem message to the source of the packet, with an ICMP Code value of 1 ("unrecognized Next Header type encountered"). The ICMP Pointer field holds the offset of the unrecognized value within the original packet. The same action SHOULD be taken if a node encounters a Next Header value of zero in any header other than an IPv6 header ๐Ÿ’€

Every extension header is an integer multiple of 8 octets long. That keeps 8-octet alignment for the headers that come after it ๐Ÿ“ Multi-octet fields inside each extension header are aligned on their natural boundaries. In other words, a field that is n octets wide sits at an integer multiple of n octets from the start of the header, for n = 1, 2, 4, or 8.

A full implementation of IPv6 includes these extension headers:

  • Hop-by-Hop Options
  • Fragment
  • Destination Options
  • Routing
  • Authentication
  • Encapsulating Security Payload

The first four are specified in this document. The last two are specified in [RFC4302] and [RFC4303], respectively. You can find the current list of IPv6 extension headers at [IANA-EH] ๐Ÿ—‚๏ธ

4.1. Extension Header Order ๐Ÿ’…

When more than one extension header is used in the same packet, it is RECOMMENDED that those headers appear in the following order:

   IPv6 header
   Hop-by-Hop Options header
   Destination Options header (note 1)
   Routing header
   Fragment header
   Authentication header (note 2)
   Encapsulating Security Payload header (note 2)
   Destination Options header (note 3)
   Upper-Layer header

   note 1: for options to be processed by the first destination that
           appears in the IPv6 Destination Address field plus
           subsequent destinations listed in the Routing header.

   note 2: additional recommendations regarding the relative order of
           the Authentication and Encapsulating Security Payload
           headers are given in [RFC4303].

   note 3: for options to be processed only by the final destination
           of the packet.

Each extension header SHOULD occur at most once. The exception is the Destination Options header, which SHOULD occur at most twice: once before a Routing header and once before the upper-layer header ๐Ÿ‘ฏ

If the upper-layer header is another IPv6 header (which happens when IPv6 is tunneled over or encapsulated in IPv6), it MAY be followed by its own extension headers. Those are separately subject to the same ordering recommendations ๐Ÿช†

If and when other extension headers get defined, their ordering constraints relative to the headers listed above MUST be specified.

IPv6 nodes MUST accept and attempt to process extension headers in any order, and occurring any number of times in the same packet. The one exception is the Hop-by-Hop Options header, which is restricted to appear immediately after an IPv6 header only. Nonetheless, it is strongly advised that sources of IPv6 packets adhere to the above recommended order until and unless subsequent specifications revise that recommendation. Follow the order, babe ๐Ÿ’–

4.2. Options ๐ŸŽ€

okay bestie, so two of the extension headers in this doc, the Hop-by-Hop Options header and the Destination Options header, can carry a bunch of "options" ๐Ÿง. Each option is TLV encoded (type, length, value) and looks like this:

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -
   |  Option Type  |  Opt Data Len |  Option Data
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -
  • Option Type: an 8-bit ID for what kind of option it is.
  • Opt Data Len: an 8-bit unsigned integer giving the length of the Option Data in octets.
  • Option Data: a variable-length field holding whatever data that option type needs.

Options in a header have to be processed strictly in the order they show up โœจ. A receiver must not skip around, like hunting for one particular option and handling it before handling the ones that come before it. No cutting in line, periodt ๐Ÿ’…

The top 2 bits of the Option Type actually tell you what to do if you don't recognize that option type ๐Ÿ‘€:

  • 00: skip over this option and keep processing the header.
  • 01: discard the packet.
  • 10: discard the packet. Whether or not the packet's Destination Address was a multicast address, send an ICMP Parameter Problem, Code 2, message to the packet's Source Address, pointing to the unrecognized Option Type.
  • 11: discard the packet. But only if the packet's Destination Address was not a multicast address, send an ICMP Parameter Problem, Code 2, message to the packet's Source Address, pointing to the unrecognized Option Type.

The third-highest bit of the Option Type says whether the Option Data can change on the way to the packet's final destination ๐Ÿ›ฃ๏ธ. If an Authentication header is in the packet, then for any option whose data might change en route, the entire Option Data field must be treated as zero-valued octets when computing or verifying the packet's authenticating value. Very important, do not skip this one ๐Ÿ™ˆ

  • 0: Option Data does not change en route.
  • 1: Option Data may change en route.

Those three high-order bits are part of the Option Type, not separate from it. So an option is identified by the full 8-bit Option Type, not only the low-order 5 bits ๐Ÿ’œ

Both the Hop-by-Hop Options header and the Destination Options header share the same Option Type numbering space. A particular option's spec is allowed to restrict it to just one of the two headers, though ๐Ÿซถ

Some options need specific alignment, so multi-octet values inside Option Data land on natural boundaries. Alignment is written as xn+y, which means the Option Type must sit at an integer multiple of x octets from the start of the header, plus y octets. Examples:

   2n     means any 2-octet offset from the start of the header.
   8n+2   means any 8-octet offset from the start of the header, plus
          2 octets.

There are two padding options. They're used to line up later options and to pad the whole header out to a multiple of 8 octets. Every IPv6 implementation must recognize these padding options ๐ŸŒˆ

Pad1 option (alignment requirement: none)

   +-+-+-+-+-+-+-+-+
   |       0       |
   +-+-+-+-+-+-+-+-+
NOTE! Pad1 is the special case here. It has no length and no value fields at all ๐Ÿ™ƒ

Pad1 adds 1 octet of padding to the Options area of a header. If you need more than one octet of padding, you should use the PadN option (up next) instead of stacking a bunch of Pad1s ๐Ÿง

PadN option (alignment requirement: none)

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -
   |       1       |  Opt Data Len |  Option Data
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -

PadN adds two or more octets of padding to the Options area. For N octets of padding, the Opt Data Len field holds N-2, and the Option Data is N-2 zero-valued octets. Math bestie ๐Ÿงฎ

Appendix A has formatting guidelines if you ever want to design a brand new option ๐Ÿฆ‹

4.3. Hop-by-Hop Options Header ๐ŸŒธ

The Hop-by-Hop Options header carries optional info that every node along a packet's delivery path may look at and process ๐Ÿ‘€. It's identified by a Next Header value of 0 in the IPv6 header, and it looks like this:

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |  Next Header  |  Hdr Ext Len  |                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
    |                                                               |
    .                                                               .
    .                            Options                            .
    .                                                               .
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • Next Header: an 8-bit selector for the type of header right after the Hop-by-Hop Options header. It uses the same values as the IPv4 Protocol field [IANA-PN].
  • Hdr Ext Len: an 8-bit unsigned integer for the length of the Hop-by-Hop Options header in 8-octet units. The first 8 octets don't count.
  • Options: a variable-length field, sized so the whole Hop-by-Hop Options header is an integer multiple of 8 octets long. It holds one or more TLV-encoded options, as described in Section 4.2.

The only hop-by-hop options defined in this document are the Pad1 and PadN options from Section 4.2 โœจ

4.4. Routing Header ๐Ÿ—บ๏ธ

The Routing header lets an IPv6 source list one or more intermediate nodes to "visit" on the way to a packet's destination. This is pretty similar to IPv4's Loose Source and Record Route option, so if you know that one, you're already halfway there ๐Ÿ˜Ž It's identified by a Next Header value of 43 in the immediately preceding header, and it looks like this:

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |  Next Header  |  Hdr Ext Len  |  Routing Type | Segments Left |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                                                               |
    .                                                               .
    .                       type-specific data                      .
    .                                                               .
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • Next Header: an 8-bit selector for the type of header right after the Routing header. It uses the same values as the IPv4 Protocol field [IANA-PN].
  • Hdr Ext Len: an 8-bit unsigned integer for the length of the Routing header in 8-octet units. The first 8 octets don't count.
  • Routing Type: an 8-bit identifier for a particular Routing header variant.
  • Segments Left: an 8-bit unsigned integer for the number of route segments still left, meaning the explicitly listed intermediate nodes that still need to be visited before the final destination.
  • type-specific data: a variable-length field whose format depends on the Routing Type. Its length is such that the whole Routing header is an integer multiple of 8 octets long.

If a node is processing a received packet and runs into a Routing header with a Routing Type value it doesn't recognize, what it does depends on the Segments Left field ๐Ÿค”

  • If Segments Left is zero, the node must ignore the Routing header and move on to process the next header in the packet. That next header's type is given by the Next Header field in the Routing header.
  • If Segments Left is non-zero, the node must discard the packet and send an ICMP Parameter Problem, Code 0, message to the packet's Source Address, pointing to the unrecognized Routing Type.
Also, after processing a Routing header in a received packet, if an intermediate node finds that the packet is about to be forwarded onto a link whose link MTU is smaller than the packet, the node must discard the packet and send an ICMP Packet Too Big message to the packet's Source Address ๐Ÿšซ

You can find the current IPv6 Routing Headers and their status at [IANA-RH]. Allocation guidelines for IPv6 Routing Headers live in [RFC5871] ๐Ÿ“š

4.5. Fragment Header ๐Ÿงฉ

The Fragment header lets an IPv6 source send a packet that's bigger than the path MTU to its destination ๐Ÿ“ฆ. (Quick note: unlike IPv4, fragmentation in IPv6 is only done by source nodes, not by routers along a packet's delivery path. See Section 5 for more on that ๐Ÿ’…) It's identified by a Next Header value of 44 in the immediately preceding header, and it looks like this:

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Next Header  |   Reserved    |      Fragment Offset    |Res|M|
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         Identification                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • Next Header: an 8-bit selector for the initial header type of the Fragmentable Part of the original packet, which is defined below. It uses the same values as the IPv4 Protocol field [IANA-PN].
  • Reserved: an 8-bit reserved field. It's set to zero when sent and ignored when received.
  • Fragment Offset: a 13-bit unsigned integer. It's the offset, in 8-octet units, of the data following this header, relative to the start of the Fragmentable Part of the original packet.
  • Res: a 2-bit reserved field. It's set to zero when sent and ignored when received.
  • M flag: 1 means more fragments are coming, and 0 means this is the last fragment.
  • Identification: 32 bits. See the description below.

So if a packet is too big to fit in the MTU of the path to its destination, a source node may chop it into fragments, send each fragment as its own packet, and let the receiver put them back together ๐Ÿซถ

Okay bestie, so for every packet that's gonna get fragmented, the source node has to make up an Identification value ๐ŸŽ€. It must be different from any other fragmented packet sent recently with the same Source Address and Destination Address ๐Ÿ’…. And if there's a Routing header, the Destination Address we care about is the final destination ๐Ÿงš.

  • "recently" means within the maximum likely lifetime of a packet, including transit time from source to destination and time spent waiting for reassembly with other fragments of the same packet. But a source node doesn't have to know the maximum packet lifetime ๐Ÿ™ˆ. It's assumed the requirement can be met by using an algorithm that gives a low identification reuse frequency. Examples of algorithms that can do this are described in [RFC7739] โœจ.

The big unfragmented packet is called the "original packet", and it has three parts ๐Ÿฆ‹. Here's the vibe:

original packet:

+------------------+-------------------------+---//----------------+
|  Per-Fragment    | Extension & Upper-Layer |   Fragmentable      |
|    Headers       |       Headers           |      Part           |
+------------------+-------------------------+---//----------------+

The Per-Fragment headers are the IPv6 header plus any extension headers that have to be processed by nodes along the way to the destination. That means all headers up to and including the Routing header if there is one, else the Hop-by-Hop Options header if there is one, else no extension headers at all ๐ŸŒธ.

The Extension headers are all the other extension headers that aren't in the Per-Fragment headers part. For this purpose, the Encapsulating Security Payload (ESP) is not considered an extension header, so it's not lumped in there ๐Ÿ™ˆ. The Upper-Layer header is the first upper-layer header that isn't an IPv6 extension header. Examples of upper-layer headers are TCP, UDP, IPv4, IPv6, ICMPv6, and, as noted, ESP ๐Ÿ“.

The Fragmentable Part is the rest of the packet after the upper-layer header, or after any header (the initial IPv6 header or an extension header) that has a Next Header value of No Next Header ๐Ÿ‘‘.

The Fragmentable Part of the original packet gets split into fragments ๐Ÿ”ฅ. The lengths of the fragments must be picked so the resulting fragment packets fit within the MTU of the path to the packet's destination(s). Every complete fragment, except maybe the last ("rightmost") one, must be an integer multiple of 8 octets long ๐Ÿ’–.

The fragments get sent in separate "fragment packets", like this:

original packet:

+-----------------+-----------------+--------+--------+-//-+--------+
|  Per-Fragment   |Ext & Upper-Layer|  first | second |    |  last  |
|    Headers      |    Headers      |fragment|fragment|....|fragment|
+-----------------+-----------------+--------+--------+-//-+--------+

fragment packets:

+------------------+---------+-------------------+----------+
|  Per-Fragment    |Fragment | Ext & Upper-Layer |  first   |
|    Headers       | Header  |   Headers         | fragment |
+------------------+---------+-------------------+----------+

+------------------+--------+-------------------------------+
|  Per-Fragment    |Fragment|    second                     |
|    Headers       | Header |   fragment                    |
+------------------+--------+-------------------------------+
                      o
                      o
                      o
+------------------+--------+----------+
|  Per-Fragment    |Fragment|   last   |
|    Headers       | Header | fragment |
+------------------+--------+----------+

The first fragment packet is put together like this โญ:

  1. The Per-Fragment headers of the original packet, with the Payload Length of the original IPv6 header changed to hold the length of this fragment packet only (not counting the length of the IPv6 header itself), and the Next Header field of the last header in the Per-Fragment headers changed to 44.
  2. A Fragment header containing:
    • The Next Header value that identifies the first header after the Per-Fragment headers of the original packet.
    • A Fragment Offset holding the offset of the fragment, in 8-octet units, relative to the start of the Fragmentable Part of the original packet. The Fragment Offset of the first ("leftmost") fragment is 0.
    • An M flag value of 1, since this is the first fragment.
    • The Identification value generated for the original packet.
  3. Extension headers, if there are any, and the Upper-Layer header. These headers must be in the first fragment. Heads up: this means the headers all the way through the Upper-Layer header have to fit within the MTU of the path to the packet's destination(s) ๐Ÿซถ.
  4. The first fragment.

The subsequent fragment packets are put together like this ๐Ÿง:

  1. The Per-Fragment headers of the original packet, with the Payload Length of the original IPv6 header changed to hold the length of this fragment packet only (not counting the length of the IPv6 header itself), and the Next Header field of the last header in the Per-Fragment headers changed to 44.
  2. A Fragment header containing:
    • The Next Header value that identifies the first header after the Per-Fragment headers of the original packet.
    • A Fragment Offset holding the offset of the fragment, in 8-octet units, relative to the start of the Fragmentable Part of the original packet.
    • An M flag value of 0 if the fragment is the last ("rightmost") one, else an M flag value of 1.
    • The Identification value generated for the original packet.
  3. The fragment itself.

Fragments must not be created that overlap with any other fragments created from the original packet. No overlapping allowed, periodt ๐Ÿšซ.

At the destination, the fragment packets get reassembled back into their original, unfragmented form ๐ŸŒˆ:

reassembled original packet:

+---------------+-----------------+---------+--------+-//--+--------+
| Per-Fragment  |Ext & Upper-Layer|  first  | second |     | last   |
|    Headers    |     Headers     |frag data|fragment|.....|fragment|
+---------------+-----------------+---------+--------+-//--+--------+

These rules run the reassembly show ๐ŸŽฌ:

  • An original packet is reassembled only from fragment packets that have the same Source Address, Destination Address, and Fragment Identification.
  • The Per-Fragment headers of the reassembled packet consist of all headers up to, but not including, the Fragment header of the first fragment packet (that's the packet whose Fragment Offset is zero), with these two changes:
    • The Next Header field of the last header in the Per-Fragment headers is taken from the Next Header field of the first fragment's Fragment header.
    • The Payload Length of the reassembled packet is computed from the length of the Per-Fragment headers and the length and offset of the last fragment. For example, a formula for computing the Payload Length of the reassembled original packet is:
PL.orig = PL.first - FL.first - 8 + (8 * FO.last) + FL.last

where
PL.orig  =  Payload Length field of reassembled packet.
PL.first =  Payload Length field of first fragment packet.
FL.first =  length of fragment following Fragment header of
            first fragment packet.
FO.last  =  Fragment Offset field of Fragment header of last
            fragment packet.
FL.last  =  length of fragment following Fragment header of
            last fragment packet.
  • The Fragmentable Part of the reassembled packet is built from the fragments that follow the Fragment headers in each of the fragment packets. The length of each fragment is worked out by subtracting, from the packet's Payload Length, the length of the headers between the IPv6 header and the fragment itself. Its relative position in the Fragmentable Part is worked out from its Fragment Offset value.
  • The Fragment header is not present in the final, reassembled packet ๐Ÿ™….
  • If the fragment is a whole datagram (meaning both the Fragment Offset field and the M flag are zero), then it doesn't need any more reassembly and should be processed as a fully reassembled packet (so update Next Header, adjust Payload Length, remove the Fragment header, and so on). Any other fragments that match this packet (that is, the same IPv6 Source Address, IPv6 Destination Address, and Fragment Identification) should be processed independently ๐Ÿ’œ.

Now the error conditions that can pop up when reassembling fragmented packets. Buckle up ๐Ÿ˜ญ:

  • If insufficient fragments are received to complete reassembly of a packet within 60 seconds of receiving the first-arriving fragment of that packet, reassembly of that packet must be abandoned, and all the fragments that have been received for that packet must be discarded. If the first fragment (the one with a Fragment Offset of zero) has been received, an ICMP Time Exceeded -- Fragment Reassembly Time Exceeded message should be sent to the source of that fragment โฐ.
  • If the length of a fragment, as derived from the fragment packet's Payload Length field, is not a multiple of 8 octets and the M flag of that fragment is 1, then that fragment must be discarded, and an ICMP Parameter Problem, Code 0, message should be sent to the source of the fragment, pointing to the Payload Length field of the fragment packet ๐Ÿ“.
  • If the length and offset of a fragment are such that the Payload Length of the packet reassembled from that fragment would exceed 65,535 octets, then that fragment must be discarded, and an ICMP Parameter Problem, Code 0, message should be sent to the source of the fragment, pointing to the Fragment Offset field of the fragment packet ๐Ÿ’€.
  • If the first fragment does not include all headers through an Upper-Layer header, then that fragment should be discarded, and an ICMP Parameter Problem, Code 3, message should be sent to the source of the fragment, with the Pointer field set to zero ๐Ÿ™ˆ.
  • If any of the fragments being reassembled overlap with any other fragments being reassembled for the same packet, reassembly of that packet must be abandoned, and all the fragments that have been received for that packet must be discarded. And no ICMP error messages should be sent ๐Ÿšจ.

It should be noted that fragments may be duplicated in the network. Instead of treating these exact duplicate fragments as overlapping fragments, an implementation may choose to detect this case and drop exact duplicate fragments while keeping the other fragments belonging to the same packet ๐Ÿฆ‹.

The following conditions are not expected to occur frequently, but they are not considered errors if they do:

Okay so the headers sitting in front of the Fragment header can be totally different from fragment to fragment of the same original packet ๐Ÿงฉ Whatever headers show up before the Fragment header in each fragment packet get processed the moment the packets arrive, before the fragments get queued up for reassembly ๐Ÿ“ฆ And only the headers from the Offset zero fragment packet survive into the reassembled packet, so that one is the VIP ๐Ÿ‘‘

The Next Header values in the Fragment headers can also be different across fragments of the same packet ๐Ÿ™ˆ But only the value from the Offset zero fragment packet gets used for reassembly. Main character energy, zero debate ๐Ÿ’…

Other fields in the IPv6 header can vary across the fragments being reassembled too ๐ŸŒธ Specs that use those fields might come with extra instructions if just copying the values from the Offset zero fragment isn't enough. Like, Section 5.3 of [RFC3168] explains how to combine the Explicit Congestion Notification (ECN) bits from the different fragments to work out the ECN bits of the reassembled packet ๐Ÿฆ‹

4.6. Destination Options Header โœจ

The Destination Options header carries optional information that only needs to be looked at by the packet's destination node(s) ๐ŸŽ€ It's identified by a Next Header value of 60 in the header right before it, and it looks like this:

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |  Next Header  |  Hdr Ext Len  |                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
    |                                                               |
    .                                                               .
    .                            Options                            .
    .                                                               .
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • Next Header: an 8-bit selector ๐Ÿ”– It tells you what type of header comes right after the Destination Options header. It uses the same values as the IPv4 Protocol field [IANA-PN].
  • Hdr Ext Len: an 8-bit unsigned integer ๐Ÿ”ข It's the length of the Destination Options header in 8-octet units, not counting the first 8 octets.
  • Options: a variable-length field, sized so the whole Destination Options header is an integer multiple of 8 octets long โœจ It holds one or more TLV-encoded options, as described in Section 4.2.

The only destination options defined in this document are the Pad1 and PadN options from Section 4.2 ๐Ÿงธ

Quick tea โ˜• There are two ways to encode optional destination info in an IPv6 packet: as an option inside the Destination Options header, or as a separate extension header. The Fragment header and the Authentication header are examples of the second approach ๐Ÿ’œ Which one you pick depends on what you want a destination node to do if it doesn't understand the info:

  • If you want the destination node to discard the packet and, only if the packet's Destination Address is not a multicast address, send an ICMP Unrecognized Type message to the packet's Source Address, then the info can go either as a separate header or as an option in the Destination Options header whose Option Type has the value 11 in its highest-order 2 bits ๐Ÿ™ƒ Picking between them might come down to which takes fewer octets, or which gives better alignment or more efficient parsing ๐Ÿ“
  • If you want any other action, the info must be encoded as an option in the Destination Options header whose Option Type has the value 00, 01, or 10 in its highest-order 2 bits, specifying the action you want (see Section 4.2) ๐Ÿซถ

4.7. No Next Header ๐ŸŒ™

The value 59 in the Next Header field of an IPv6 header or any extension header means there's nothing following that header ๐Ÿ›‘ If the Payload Length field of the IPv6 header says there are octets past the end of a header whose Next Header field contains 59, those octets must be ignored and passed on unchanged if the packet gets forwarded. Ignore them, don't touch them, send them along ๐Ÿค

4.8. Defining New Extension Headers and Options ๐Ÿ› ๏ธ

Defining new IPv6 extension headers is not recommended, unless there aren't any existing extension headers that can do the job by defining a new option for one of them ๐Ÿ™…โ€โ™€๏ธ A proposal to specify a new IPv6 extension header must include a detailed technical explanation of why an existing extension header can not be used for the desired new function. For more background, check out [RFC6564] ๐Ÿ“š

Note: New extension headers that require hop-by-hop behavior must not be defined, because (as Section 4 of this document says) the only extension header with hop-by-hop behavior is the Hop-by-Hop Options header ๐Ÿšซ

New hop-by-hop options are not recommended either ๐Ÿ˜ฌ Nodes might be configured to ignore the Hop-by-Hop Options header, drop packets containing one, or send packets with one down a slow processing path. If you're designing new hop-by-hop options, you need to be aware of this likely behavior. There has to be a very clear justification for why any new hop-by-hop option is needed before it gets standardized ๐Ÿ’€

Instead of defining new extension headers, it is recommended that you use the Destination Options header to carry optional information that must be examined only by a packet's destination node(s), because it gives better handling and backward compatibility ๐Ÿ’–

If new extension headers are defined, they need to use the following format:

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |  Next Header  |  Hdr Ext Len  |                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
    |                                                               |
    .                                                               .
    .                  Header-Specific Data                         .
    .                                                               .
    |                                                               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • Next Header: an 8-bit selector ๐Ÿ”– It identifies the type of header immediately following the extension header. It uses the same values as the IPv4 Protocol field [IANA-PN].
  • Hdr Ext Len: an 8-bit unsigned integer ๐Ÿ”ข It's the length of the Destination Options header in 8-octet units, not including the first 8 octets. (Yes, the original says "Destination Options header" here too, so that's what I'm keeping ๐Ÿ˜…)
  • Header Specific Data: a variable-length field ๐Ÿง It holds the fields specific to the extension header.

5. Packet Size Issues ๐Ÿ“

IPv6 requires that every link in the Internet have an MTU of 1280 octets or greater ๐Ÿ’œ This is known as the IPv6 minimum link MTU. On any link that can't convey a 1280-octet packet in one piece, link-specific fragmentation and reassembly must be provided at a layer below IPv6 ๐Ÿงฑ

Links with a configurable MTU (for example, PPP links [RFC1661]) must be configured to have an MTU of at least 1280 octets. It is recommended that they be configured with an MTU of 1500 octets or greater, so they can handle possible encapsulations (i.e., tunneling) without IPv6-layer fragmentation ๐ŸŽ

From each link a node is directly attached to, the node must be able to accept packets as large as that link's MTU ๐Ÿ“ฌ

It is strongly recommended that IPv6 nodes implement Path MTU Discovery [RFC8201], so they can discover and take advantage of path MTUs greater than 1280 octets ๐Ÿš€ However, a minimal IPv6 implementation (e.g., in a boot ROM) may simply restrict itself to sending packets no larger than 1280 octets, and skip implementing Path MTU Discovery ๐Ÿงธ

To send a packet larger than a path's MTU, a node may use the IPv6 Fragment header to fragment the packet at the source and have it reassembled at the destination(s) โœ‚๏ธ However, using fragmentation is discouraged in any application that can adjust its packets to fit the measured path MTU (i.e., down to 1280 octets) ๐Ÿ™ƒ

A node must be able to accept a fragmented packet that, after reassembly, is as large as 1500 octets ๐Ÿ’ช A node is permitted to accept fragmented packets that reassemble to more than 1500 octets ๐ŸŒˆ An upper-layer protocol or application that depends on IPv6 fragmentation to send packets larger than a path's MTU should not send packets larger than 1500 octets unless it has assurance that the destination can reassemble packets of that larger size ๐Ÿซถ

6. Flow Labels ๐Ÿท๏ธ

The 20-bit Flow Label field in the IPv6 header is used by a source to label sequences of packets that should be treated in the network as a single flow ๐Ÿฆ‹

The current definition of the IPv6 Flow Label can be found in [RFC6437] ๐Ÿ“–

7. Traffic Classes ๐Ÿšฆ

The 8-bit Traffic Class field in the IPv6 header is used by the network for traffic management โœจ The value of the Traffic Class bits in a received packet or fragment might be different from the value the packet's source sent ๐Ÿ‘€

The current use of the Traffic Class field for Differentiated Services and Explicit Congestion Notification is specified in [RFC2474] and [RFC3168] ๐Ÿ’…

8. Upper-Layer Protocol Issues ๐Ÿง 

8.1. Upper-Layer Checksums ๐ŸŽ€

Okay bestie, so any transport or other upper-layer protocol that puts the IP addresses into its checksum math has to be modified for IPv6. It has to include the 128-bit IPv6 addresses instead of the 32-bit IPv4 ones ๐Ÿ˜ญ the addresses just got a glow-up. Here's the TCP and UDP "pseudo-header" for IPv6 โœจ:

  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                                                               |
  +                                                               +
  |                                                               |
  +                         Source Address                        +
  |                                                               |
  +                                                               +
  |                                                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                                                               |
  +                                                               +
  |                                                               |
  +                      Destination Address                      +
  |                                                               |
  +                                                               +
  |                                                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                   Upper-Layer Packet Length                   |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                      zero                     |  Next Header  |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Some key tea about how it works ๐Ÿซถ:

  • If the IPv6 packet has a Routing header, the Destination Address used in the pseudo-header is the final destination. At the originating node, that address is in the last element of the Routing header. At the recipient(s), that address is in the Destination Address field of the IPv6 header.
  • The Next Header value in the pseudo-header tells you which upper-layer protocol you're dealing with (e.g., 6 for TCP or 17 for UDP). It'll be different from the Next Header value in the IPv6 header if there are extension headers between the IPv6 header and the upper-layer header ๐ŸŒธ.
  • The Upper-Layer Packet Length in the pseudo-header is the length of the upper-layer header and data (e.g., TCP header plus TCP data). Some upper-layer protocols carry their own length info, like the Length field in the UDP header. For those, that's the length used in the pseudo-header. Other protocols (like TCP) don't carry their own length, so the length used is the Payload Length from the IPv6 header, minus the length of any extension headers between the IPv6 header and the upper-layer header. Lowkey a lot of math, but it's giving precision ๐Ÿงฎ.
  • Unlike IPv4, UDP over IPv6 is not optional for checksums by default. Whenever an IPv6 node originates a UDP packet, it must compute a UDP checksum over the packet and the pseudo-header. If that computation comes out to zero, it must be changed to hex FFFF before going into the UDP header. IPv6 receivers must discard UDP packets with a zero checksum, and they should log the error ๐Ÿ’€. No zero checksums allowed, periodt.
  • As an exception to that default, protocols that use UDP as a tunnel encapsulation may turn on zero-checksum mode for a specific port (or set of ports) for sending and/or receiving. Any node running zero-checksum mode must follow the requirements in "Applicability Statement for the Use of IPv6 UDP Datagrams with Zero Checksums" [RFC6936] ๐Ÿฆ‹.

The IPv6 version of ICMP [RFC4443] includes the pseudo-header above in its checksum computation. That's a change from the IPv4 version of ICMP, which doesn't include a pseudo-header at all ๐Ÿ‘‘. The reason is to protect ICMP from misdelivery or corruption of the IPv6 header fields it depends on. Unlike IPv4, those fields aren't covered by an internet-layer checksum, so ICMP needs the extra protection. The Next Header field in the pseudo-header for ICMP contains the value 58, which identifies the IPv6 version of ICMP ๐Ÿงš.


8.2. Maximum Packet Lifetime โณ

Unlike IPv4, IPv6 nodes are not required to enforce maximum packet lifetime. That's why the IPv4 "Time-to-Live" field got renamed "Hop Limit" in IPv6 ๐Ÿ’…. In practice, very few IPv4 implementations (if any) actually follow the requirement to limit packet lifetime, so this isn't really a change in practice. Still, any upper-layer protocol that relies on the internet layer (IPv4 or IPv6) to limit packet lifetime ought to be upgraded to provide its own mechanisms for detecting and discarding obsolete packets. Don't outsource your timing to the network, bestie ๐Ÿ™ˆ.


8.3. Maximum Upper-Layer Payload Size ๐Ÿ“

When you compute the maximum payload size available for upper-layer data, an upper-layer protocol must take into account that the IPv6 header is bigger than the IPv4 header. For example, in IPv4, TCP's Maximum Segment Size (MSS) option is computed as the maximum packet size (a default value or a value learned through Path MTU Discovery) minus 40 octets. That's 20 octets for the minimum-length IPv4 header and 20 octets for the minimum-length TCP header.

When using TCP over IPv6, the MSS must be computed as the maximum packet size minus 60 octets. The reason is that the minimum-length IPv6 header (an IPv6 header with no extension headers) is 20 octets longer than a minimum-length IPv4 header. So yes, the math changes, iykyk ๐ŸŒˆ.


8.4. Responding to Packets Carrying Routing Headers ๐Ÿšฆ

When an upper-layer protocol sends one or more packets in response to a received packet that included a Routing header, the response packet(s) must not include a Routing header that was automatically derived by "reversing" the received Routing header. The only exception is when the integrity and authenticity of the received Source Address and Routing header have been verified (e.g., via the use of an Authentication header in the received packet). This is a big deal, so pay attention ๐Ÿ˜ค.

In other words, only these kinds of packets are allowed in response to a received packet bearing a Routing header:

  • Response packets that do not carry Routing headers. Simple and safe ๐Ÿ’–.
  • Response packets that carry Routing headers that were NOT derived by reversing the Routing header of the received packet (for example, a Routing header supplied by local configuration). Totally fine, no cap ๐Ÿซถ.
  • Response packets that carry Routing headers that were derived by reversing the Routing header of the received packet IF AND ONLY IF the integrity and authenticity of the Source Address and Routing header from the received packet have been verified by the responder. So only if the responder has actually verified that stuff. No verification, no reversing, no drama ๐Ÿ”ฅ.

9. IANA Considerations ๐Ÿ“‹

RFC 2460 is referenced in a number of IANA registries. These include:

  • Internet Protocol Version 6 (IPv6) Parameters [IANA-6P]
  • Assigned Internet Protocol Numbers [IANA-PN]
  • ONC RPC Network Identifiers (netids) [IANA-NI]
  • Network Layer Protocol Identifiers (NLPIDs) of Interest [IANA-NL]
  • Protocol Registries [IANA-PR]

The IANA has updated these references to point to this document. So the registries now point at the new RFC, and everything is lined up โœจ๐ŸŽ€.

10. Security Considerations ๐Ÿ”

Okay bestie, security time, and it's lowkey serious ๐Ÿ’€ From the basic packet format and transmission point of view, IPv6 has security stuff that's basically the same vibe as IPv4 ๐Ÿซถ The main issues are:

  • Eavesdropping, where on-path elements can observe the whole packet (including both contents and metadata) of each IPv6 datagram. ๐Ÿ‘€
  • Replay, where the attacker records a sequence of packets off of the wire and plays them back to the party that originally received them. ๐Ÿ”
  • Packet insertion, where the attacker forges a packet with some chosen set of properties and injects it into the network. ๐Ÿ˜ค
  • Packet deletion, where the attacker removes a packet from the wire. ๐Ÿ—‘๏ธ
  • Packet modification, where the attacker removes a packet from the wire, modifies it, and reinjects it into the network. ๐Ÿ™ˆ
  • Man-in-the-middle (MITM) attacks, where the attacker subverts the communication stream in order to pose as the sender to receiver and the receiver to the sender. ๐Ÿ•ต๏ธโ€โ™€๏ธ
  • Denial-of-service (DoS) attacks, where the attacker sends large amounts of legitimate traffic to a destination to overwhelm it. ๐Ÿ’€

IPv6 packets can be protected from eavesdropping, replay, packet insertion, packet modification, and MITM attacks by using the "Security Architecture for the Internet Protocol" [RFC4301]. It's giving full protection energy ๐Ÿ›ก๏ธ On top of that, upper-layer protocols like Transport Layer Security (TLS) or Secure Shell (SSH) can protect the application-layer traffic running on top of IPv6. ๐Ÿ”โœจ

โš ๏ธ Bestie, read this part twice: there is not any mechanism to protect against DoS attacks. Defending against these type of attacks is outside the scope of this specification. So this doc does NOT fix DoS, it's just not its job ๐Ÿฅฒ

IPv6 addresses are significantly larger than IPv4 addresses, which makes it way harder to scan the address space across the Internet and even on a single network link (e.g., Local Area Network). Big addresses, big energy ๐Ÿงš See [RFC7707] for more information.

IPv6 node addresses are expected to be more visible on the Internet than IPv4 addresses, since the use of address translation technology is reduced. This creates some extra privacy issues, such as making it easier to tell endpoints apart. ๐Ÿ‘๏ธ See [RFC7721] for more information.

The design of the IPv6 extension header architecture adds a lot of flexibility, but it also creates new security challenges. ๐Ÿงฉ As noted below, issues relating to the Fragment extension header have been resolved, but it's clear that for any new extension header designed in the future, the security implications need to be examined thoroughly. That includes how the new extension header works with existing extension headers. See [RFC7045] for more information. ๐Ÿ”

This version of the IPv6 specification resolves a number of security issues that were found in the previous version [RFC2460] of the IPv6 specification. The fixes include:

  • Revised the text to handle the case of fragments that are whole datagrams (i.e., both the Fragment Offset field and the M flag are zero). If received, they should be processed as a reassembled packet. Any other fragments that match should be processed independently. The Fragment creation process was modified to not create whole datagram fragments (Fragment Offset field and the M flag are zero). See [RFC6946] and [RFC8021] for more information. ๐Ÿงต
  • Removed the paragraph in Section 5 that required including a Fragment header to outgoing packets if an ICMP Packet Too Big message reporting a Next-Hop MTU is less than 1280. See [RFC6946] for more information. ๐Ÿ—‘๏ธ
  • Changed the text to require that IPv6 nodes must not create overlapping fragments. Also, when reassembling an IPv6 datagram, if one or more of its constituent fragments is determined to be an overlapping fragment, the entire datagram (and any constituent fragments) must be silently discarded. It also clarifies that no ICMP error message should be sent if overlapping fragments are received. See [RFC5722] for more information. ๐Ÿšซ
  • Revised the text to require that all headers through the first upper-layer header are in the first fragment. See [RFC7112] for more information. ๐Ÿ“ฆ
  • Incorporated the updates from [RFC5095] and [RFC5871] to remove the description of the Routing Header type 0 (RH0), state that the allocation guidelines for Routing headers are specified in RFC 5871, and remove RH0 from the list of required extension headers. ๐Ÿ‘‹

Security issues relating to other parts of IPv6, including addressing, ICMPv6, Path MTU Discovery, etc., are discussed in the appropriate specifications. ๐Ÿ“š


11. References ๐Ÿ“–

11.1. Normative References

[RFC791] Postel, J., "Internet Protocol", STD 5, RFC 791, DOI 10.17487/RFC0791, September 1981, http://www.rfc-editor.org/info/rfc791.

[RFC2474] Nichols, K., Blake, S., Baker, F., and D. Black, "Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers", RFC 2474, DOI 10.17487/RFC2474, December 1998, http://www.rfc-editor.org/info/rfc2474.

[RFC3168] Ramakrishnan, K., Floyd, S., and D. Black, "The Addition of Explicit Congestion Notification (ECN) to IP", RFC 3168, DOI 10.17487/RFC3168, September 2001, http://www.rfc-editor.org/info/rfc3168.

[RFC4291] Hinden, R. and S. Deering, "IP Version 6 Addressing Architecture", RFC 4291, DOI 10.17487/RFC4291, February 2006, http://www.rfc-editor.org/info/rfc4291.

[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, http://www.rfc-editor.org/info/rfc4443.

[RFC6437] Amante, S., Carpenter, B., Jiang, S., and J. Rajahalme, "IPv6 Flow Label Specification", RFC 6437, DOI 10.17487/RFC6437, November 2011, http://www.rfc-editor.org/info/rfc6437.

11.2. Informative References

[Err2541] RFC Errata, Erratum ID 2541, RFC 2460.

[Err4279] RFC Errata, Erratum ID 4279, RFC 2460.

[Err4657] RFC Errata, Erratum ID 4657, RFC 2460.

[Err4662] RFC Errata, Erratum ID 4662, RFC 2460.

[IANA-6P] IANA, "Internet Protocol Version 6 (IPv6) Parameters", https://www.iana.org/assignments/ipv6-parameters.

[IANA-EH] IANA, "IPv6 Extension Header Types", https://www.iana.org/assignments/ipv6-parameters.

[IANA-NI] IANA, "ONC RPC Network Identifiers (netids)", https://www.iana.org/assignments/rpc-netids.

[IANA-NL] IANA, "Network Layer Protocol Identifiers (NLPIDs) of Interest", https://www.iana.org/assignments/nlpids.

[IANA-PN] IANA, "Protocol Numbers", https://www.iana.org/assignments/protocol-numbers.

[IANA-PR] IANA, "Protocol Registries", https://www.iana.org/protocols.

[IANA-RH] IANA, "Routing Types", https://www.iana.org/assignments/ipv6-parameters.

[RFC1661] Simpson, W., Ed., "The Point-to-Point Protocol (PPP)", STD 51, RFC 1661, DOI 10.17487/RFC1661, July 1994, http://www.rfc-editor.org/info/rfc1661.

[RFC2460] Deering, S. and R. Hinden, "Internet Protocol, Version 6 (IPv6) Specification", RFC 2460, DOI 10.17487/RFC2460, December 1998, http://www.rfc-editor.org/info/rfc2460.

[RFC4301] Kent, S. and K. Seo, "Security Architecture for the Internet Protocol", RFC 4301, DOI 10.17487/RFC4301, December 2005, http://www.rfc-editor.org/info/rfc4301.

[RFC4302] Kent, S., "IP Authentication Header", RFC 4302, DOI 10.17487/RFC4302, December 2005, http://www.rfc-editor.org/info/rfc4302.

[RFC4303] Kent, S., "IP Encapsulating Security Payload (ESP)", RFC 4303, DOI 10.17487/RFC4303, December 2005, http://www.rfc-editor.org/info/rfc4303.

[RFC5095] Abley, J., Savola, P., and G. Neville-Neil, "Deprecation of Type 0 Routing Headers in IPv6", RFC 5095, DOI 10.17487/RFC5095, December 2007, http://www.rfc-editor.org/info/rfc5095.

[RFC5722] Krishnan, S., "Handling of Overlapping IPv6 Fragments", RFC 5722, DOI 10.17487/RFC5722, December 2009, http://www.rfc-editor.org/info/rfc5722.

[RFC5871] Arkko, J. and S. Bradner, "IANA Allocation Guidelines for the IPv6 Routing Header", RFC 5871, DOI 10.17487/RFC5871, May 2010, http://www.rfc-editor.org/info/rfc5871.

[RFC6564] Krishnan, S., Woodyatt, J., Kline, E., Hoagland, J., and M. Bhatia, "A Uniform Format for IPv6 Extension Headers", RFC 6564, DOI 10.17487/RFC6564, April 2012, http://www.rfc-editor.org/info/rfc6564.

[RFC6936] Fairhurst, G. and M. Westerlund, "Applicability Statement for the Use of IPv6 UDP Datagrams with Zero Checksums", RFC 6936, DOI 10.17487/RFC6936, April 2013, http://www.rfc-editor.org/info/rfc6936.

[RFC6946] Gont, F., "Processing of IPv6 "Atomic" Fragments", RFC 6946, DOI 10.17487/RFC6946, May 2013, http://www.rfc-editor.org/info/rfc6946.

[RFC7045] Carpenter, B. and S. Jiang, "Transmission and Processing of IPv6 Extension Headers", RFC 7045, DOI 10.17487/RFC7045, December 2013, http://www.rfc-editor.org/info/rfc7045.

[RFC7112] Gont, F., Manral, V., and R. Bonica, "Implications of Oversized IPv6 Header Chains", RFC 7112, DOI 10.17487/RFC7112, January 2014, http://www.rfc-editor.org/info/rfc7112.

[RFC7707] Gont, F. and T. Chown, "Network Reconnaissance in IPv6 Networks", RFC 7707, DOI 10.17487/RFC7707, March 2016, http://www.rfc-editor.org/info/rfc7707.

[RFC7721] Cooper, A., Gont, F., and D. Thaler, "Security and Privacy Considerations for IPv6 Address Generation Mechanisms", RFC 7721, DOI 10.17487/RFC7721, March 2016, http://www.rfc-editor.org/info/rfc7721.

[RFC7739] Gont, F., "Security Implications of Predictable Fragment Identification Values", RFC 7739, DOI 10.17487/RFC7739, February 2016, http://www.rfc-editor.org/info/rfc7739.

[RFC8021] Gont, F., Liu, W., and T. Anderson, "Generation of IPv6 Atomic Fragments Considered Harmful", RFC 8021, DOI 10.17487/RFC8021, January 2017, http://www.rfc-editor.org/info/rfc8021.

[RFC8201] McCann, J., Deering, S., Mogul, J., and R. Hinden, "Path MTU Discovery for IP version 6", STD 87, RFC 8201, DOI 10.17487/RFC8201, July 2017, http://www.rfc-editor.org/info/rfc8201. โœจ

Appendix A. Formatting Guidelines for Options ๐ŸŽ€

okay so this appendix is basically a cute little style guide for designing new options ๐Ÿ’… the kind you'd put in the Hop-by-Hop Options header or the Destination Options header, which we covered in Section 4.2. ๐Ÿฆ‹ these tips come from three assumptions:

  • one thing we really want is for any multi-octet fields inside an option's Option Data area to sit on their natural boundaries ๐Ÿ’– so a field that's n octets wide should start at an integer multiple of n octets from the start of the Hop-by-Hop or Destination Options header, for n = 1, 2, 4, or 8.
  • another desirable thing is for the Hop-by-Hop or Destination Options header to take up as little space as possible ๐Ÿงš, but it still has to be an integer multiple of 8 octets long.
  • it's fine to assume that when either option-bearing header shows up, it's carrying a very small number of options, usually just one โœจ

those assumptions lead to a super simple move: order the fields from smallest to largest, with no interior padding ๐Ÿ“ then work out the alignment requirement for the whole option based on the biggest field (capped at a maximum alignment of 8 octets). let's see it in action ๐Ÿ‘‘


Example 1

okay so if an option X needed two data fields, one 8 octets long and one 4 octets long, it would be laid out like this:

                                   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                                   | Option Type=X |Opt Data Len=12|
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         4-octet field                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   +                         8-octet field                         +
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

its alignment requirement is 8n+2 ๐ŸŒธ which makes sure the 8-octet field starts at a multiple-of-8 offset from the start of the enclosing header. โœจ a complete Hop-by-Hop or Destination Options header with just this one option looks like this:

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Next Header  | Hdr Ext Len=1 | Option Type=X |Opt Data Len=12|
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         4-octet field                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   +                         8-octet field                         +
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Example 2

now option Y ๐Ÿฆ‹ if it needed three data fields, one 4 octets long, one 2 octets long, and one 1 octet long, it would be laid out like this:

                                                   +-+-+-+-+-+-+-+-+
                                                   | Option Type=Y |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Opt Data Len=7 | 1-octet field |         2-octet field         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         4-octet field                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

its alignment requirement is 4n+3 ๐Ÿ’œ which makes sure the 4-octet field starts at a multiple-of-4 offset from the start of the enclosing header. โœจ a complete Hop-by-Hop or Destination Options header with just this one option looks like this:

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Next Header  | Hdr Ext Len=1 | Pad1 Option=0 | Option Type=Y |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Opt Data Len=7 | 1-octet field |         2-octet field         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         4-octet field                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   | PadN Option=1 |Opt Data Len=2 |       0       |       0       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Example 3

okay this is where it gets spicy ๐Ÿ”ฅ a Hop-by-Hop or Destination Options header containing both options X and Y from Examples 1 and 2 would have one of the two following formats, depending on which option showed up first:

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Next Header  | Hdr Ext Len=3 | Option Type=X |Opt Data Len=12|
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         4-octet field                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   +                         8-octet field                         +
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   | PadN Option=1 |Opt Data Len=1 |       0       | Option Type=Y |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Opt Data Len=7 | 1-octet field |         2-octet field         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         4-octet field                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   | PadN Option=1 |Opt Data Len=2 |       0       |       0       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Next Header  | Hdr Ext Len=3 | Pad1 Option=0 | Option Type=Y |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Opt Data Len=7 | 1-octet field |         2-octet field         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         4-octet field                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   | PadN Option=1 |Opt Data Len=4 |       0       |       0       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |       0       |       0       | Option Type=X |Opt Data Len=12|
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         4-octet field                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   +                         8-octet field                         +
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Appendix B. Changes Since RFC 2460 ๐Ÿ’…

Okay bestie, this is the glow-up log! ๐Ÿฆ‹ Here's everything that changed from RFC 2460 to this memo.

  • Removed IP Next Generation from the Abstract. ๐ŸŒธ
  • Added text in Section 1 that the data transmission order is the same as IPv4 as defined in RFC 791. ๐Ÿ“
  • Clarified the text in Section 3 about decrementing the Hop Limit. ๐Ÿงš
  • Clarified that extension headers (except for the Hop-by-Hop Options header) are not processed, inserted, or deleted by any node along a packet's delivery path. ๐Ÿซถ
  • Changed requirement for the Hop-by-Hop Options header to a "may", and added a note to indicate what is expected regarding the Hop-by-Hop Options header. โœจ
  • Added a paragraph to Section 4 to clarify how extension headers are numbered and which are upper-layer headers. ๐Ÿ’œ
  • Added a reference to the end of Section 4 to the "IPv6 Extension Header Types" IANA registry. ๐Ÿ“š
  • Incorporated the updates from RFCs 5095 and 5871 to remove the description of RH0, that the allocations guidelines for routing headers are specified in RFC 5871, and removed RH0 from the list of required extension headers. ๐Ÿ”ฅ
  • Revised Section 4.5 on IPv6 fragmentation based on updates from RFCs 5722, 6946, 7112, and 8021. This includes: ๐Ÿงฉ
    • Revised the text to handle the case of fragments that are whole datagrams (i.e., both the Fragment Offset field and the M flag are zero). If received, they should be processed as a reassembled packet. Any other fragments that match should be processed independently. The revised Fragment creation process was modified to not create whole datagram fragments (Fragment Offset field and the M flag are zero). ๐ŸŒˆ
    • Changed the text to require that IPv6 nodes must not create overlapping fragments. Also, when reassembling an IPv6 datagram, if one or more its constituent fragments is determined to be an overlapping fragment, the entire datagram (and any constituent fragments) must be silently discarded. Includes a clarification that no ICMP error message should be sent if overlapping fragments are received. ๐Ÿ™ˆ
    • Revised the text to require that all headers through the first Upper-Layer header are in the first fragment. This changed the text describing how packets are fragmented and reassembled and added a new error case. ๐ŸŽ€
    • Added text to the Fragment header process on handling exact duplicate fragments. ๐Ÿ’–
    • Updated the Fragmentation header text to correct the inclusion of an Authentication Header (AH) and noted No Next Header case. ๐ŸŒธ
    • Changed terminology in the Fragment header section from "Unfragmentable Headers" to "Per-Fragment headers". ๐Ÿฆ‹
    • Removed the paragraph in Section 5 that required including a Fragment header to outgoing packets if an ICMP Packet Too Big message reports a Next-Hop MTU less than 1280. ๐Ÿ’…
    • Changed the text to clarify MTU restriction and 8-byte restrictions, and noted the restriction on headers in the first fragment. โญ
  • In Section 4.5, added clarification noting that some fields in the IPv6 header may also vary across the fragments being reassembled, and that other specifications may provide additional instructions for how they should be reassembled. See, for example, Section 5.3 of [RFC3168]. ๐Ÿซง
  • Incorporated the update from RFC 6564 to add a new Section 4.8 that describes recommendations for defining new extension headers and options. ๐Ÿงš
  • Added text to Section 5 to define "IPv6 minimum link MTU". ๐Ÿ’œ
  • Simplified the text in Section 6 about Flow Labels and removed what was Appendix A ("Semantics and Usage of the Flow Label Field"); instead, pointed to the current specifications of the IPv6 Flow Label field in [RFC6437] and the Traffic Class field in [RFC2474] and [RFC3168]. ๐ŸŒท
  • Incorporated the update made by RFC 6935 ("IPv6 and UDP Checksums for Tunneled Packets") in Section 8. Added an exception to the default behavior for the handling of UDP packets with zero checksums for tunnels. ๐Ÿญ
  • Added instruction to Section 9, "IANA Considerations", to change references to RFC 2460 to this document. ๐Ÿ“
  • Revised and expanded Section 10, "Security Considerations". ๐Ÿ”
  • Added a paragraph to the Acknowledgments section acknowledging the authors of the updating documents. ๐Ÿซถ
  • Updated references to current versions and assigned references to normative and informative. ๐Ÿ“–
  • Made changes to resolve the errata on RFC 2460. These are: ๐Ÿ› ๏ธ

Erratum ID 2541 [Err2541]: This erratum notes that RFC 2460 didn't update RFC 2205 when the length of the flow label was changed from 24 to 20 bits from RFC 1883. This issue was resolved in RFC 6437 where the flow label is defined. This specification now references RFC 6437. No change is required.

Erratum ID 4279 [Err4279]: This erratum noted that the specification doesn't handle the case of a forwarding node receiving a packet with a zero Hop Limit. This is fixed in Section 3 of this specification.

Erratum ID 4657 [Err4657]: This erratum proposed text that extension headers must never be inserted by any node other than the source of the packet. This was resolved in Section 4, "IPv6 Extension Headers".

Erratum ID 4662 [Err4662]: This erratum proposed text that extension headers, with one exception, are not examined, processed, modified, inserted, or deleted by any node along a packet's delivery path. This was resolved in Section 4, "IPv6 Extension Headers".

Erratum ID 2843: This erratum is marked "Rejected". No change was made.


Acknowledgments ๐Ÿซถ

The authors gratefully acknowledge the many helpful suggestions of the members of the IPng Working Group, the End-to-End Protocols research group, and the Internet community at large. ๐Ÿ’–

The authors would also like to acknowledge the authors of the updating RFCs that were incorporated in this document to move the IPv6 specification to Internet Standard. They are Joe Abley, Shane Amante, Jari Arkko, Manav Bhatia, Ronald P. Bonica, Scott Bradner, Brian Carpenter, P.F. Chimento, Marshall Eubanks, Fernando Gont, James Hoagland, Sheng Jiang, Erik Kline, Suresh Krishnan, Vishwas Manral, George Neville-Neil, Jarno Rajahalme, Pekka Savola, Magnus Westerlund, and James Woodyatt. ๐Ÿ‘‘

Authors' Addresses ๐ŸŽ€

Stephen E. Deering
Retired
Vancouver, British Columbia
Canada


Robert M. Hinden
Check Point Software
959 Skyway Road
San Carlos, CA  94070
United States of America

Email: bob.hinden@gmail.com
๐Ÿ“ฆ where this page comes from