RFC 2675

IPv6 Jumbograms

πŸ“… published August 1999, from ietf

RFC 2675: IPv6 Jumbograms πŸŽ€

okay bestie, this is RFC 2675 and it's all about IPv6 Jumbograms πŸ¦‹ it's a Standards Track doc from the Network Working Group, so it's an actual spec people build against πŸ’…

Who wrote it: D. Borman (Berkeley Software Design), S. Deering (Cisco), and R. Hinden (Nokia). Iconic squad πŸ‘‘

Date: August 1999 Category: Standards Track It obsoletes 2147 πŸ’€ (the old RFC 2147 is replaced by this one)


Status of this Memo ✨

this doc specifies an Internet standards track protocol for the Internet community, and it's literally asking for discussion and suggestions for improvements 🫢 check the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. distribution of this memo is unlimited, so share it freely πŸ’œ

Copyright (C) The Internet Society (1999). All Rights Reserved.

Abstract πŸ¦‹

okay so a "jumbogram" is an IPv6 packet with a payload longer than 65,535 octets 😭 this doc describes the IPv6 Jumbo Payload option, which is the way you specify those huge payload lengths. it also explains the changes TCP and UDP need so they can actually use jumbograms ✨

jumbograms only matter for IPv6 nodes that might be attached to links with a link MTU greater than 65,575 octets. nodes that don't support attaching to links with MTUs that big don't need to implement or understand them πŸ™ˆ

1. Introduction πŸ’–

let's start with the vibes, bestie. here's the dictionary definition of "jumbo":

      jumbo (jum'bO),

          n., pl. -bos, adj.
          -n.
          1. a person, animal, or thing very large of its kind.
          -adj.
          2. very large: the jumbo box of cereal.

          [1800-10; orig. uncert.; popularized as the name of a large
           elephant purchased and exhibited by P.T. Barnum in 1882]

                                              -- www.infoplease.com

so the IPv6 header [IPv6] has a 16-bit Payload Length field, which means it only supports payloads up to 65,535 octets long 😀 this doc specifies an IPv6 hop-by-hop option called the Jumbo Payload option. it carries a 32-bit length field, so you can send IPv6 packets with payloads between 65,536 and 4,294,967,295 octets in length πŸŽ€ packets with payloads that long are called "jumbograms" πŸ”₯

the Jumbo Payload option is only relevant for IPv6 nodes that might be attached to links with a link MTU greater than 65,575 octets (that's 65,535 + 40, where 40 octets is the size of the IPv6 header). nodes that don't support attaching to links with an MTU greater than 65,575 don't need to implement or understand the Jumbo Payload option 🌈

now, on links with configurable MTUs, the MTU must not be configured to a value greater than 65,575 octets if there are nodes attached to that link that don't support the Jumbo Payload option, and it can not be guaranteed that the Jumbo Payload option won't be sent to those nodes. this part is important, bestie, don't skip it πŸ™ˆ

the UDP header [UDP] has a 16-bit Length field, which stops it from using jumbograms. the TCP header [TCP] doesn't have a Length field, but both the TCP MSS option and the TCP Urgent field are limited to 16 bits. this doc specifies some simple enhancements to TCP and UDP so they can use jumbograms ✨ an implementation of TCP or UDP on an IPv6 node that supports the Jumbo Payload option must include the enhancements specified here πŸ’…

Note: The 16 bit checksum used by UDP and TCP becomes less accurate as the length of the data being checksummed is increased. Application designers may want to take this into consideration.

1.1 Document History πŸ“œ

this doc merges and updates stuff that was previously published in two separate documents:

  • the Jumbo Payload option spec used to be part of the IPv6 specification in RFC 1883. RFC 1883 has been superseded by RFC 2460, which no longer includes the Jumbo Payload option spec πŸ’€
  • the TCP and UDP enhancements for jumbograms used to be RFC 2147. RFC 2147 is obsoleted by this document 🫢

2. Format of the Jumbo Payload Option πŸŽ€

the Jumbo Payload option is carried in an IPv6 Hop-by-Hop Options header, right after the IPv6 header. this option has an alignment requirement of 4n + 2. (check [IPv6, Section 4.2] for the discussion of option alignment πŸ™ˆ) here's the format:

                                   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                                   |  Option Type  |  Opt Data Len |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                     Jumbo Payload Length                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

and here's what each field means:

   Option Type           8-bit value C2 (hexadecimal).

   Opt Data Len          8-bit value 4.

   Jumbo Payload Length  32-bit unsigned integer.  Length of the IPv6
                         packet in octets, excluding the IPv6 header
                         but including the Hop-by-Hop Options header
                         and any other extension headers present.
                         Must be greater than 65,535.

3. Usage of the Jumbo Payload Option πŸ’…

the Payload Length field in the IPv6 header must be set to zero in every packet that carries the Jumbo Payload option πŸ”₯

if a node that understands the Jumbo Payload option gets a packet whose IPv6 header has a Payload Length of zero and a Next Header value of zero (meaning a Hop-by-Hop Options header follows), and whose link-layer framing shows there are octets beyond the IPv6 header, the node must proceed to process the Hop-by-Hop Options header. that's how it figures out the actual payload length from the Jumbo Payload option 🧚

the Jumbo Payload option must not be used in a packet that carries a Fragment header. no exceptions, bestie πŸ’€

higher-layer protocols that use the IPv6 Payload Length field to compute the Upper-Layer Packet Length field in the checksum pseudo-header (described in [IPv6, Section 8.1]) must use the Jumbo Payload Length field for that computation instead, for packets that carry the Jumbo Payload option ✨

nodes that understand the Jumbo Payload option are required to detect a number of possible format errors. if the erroneous packet wasn't destined for a multicast address, the node reports the error by sending an ICMP Parameter Problem message [ICMPv6] to the packet's source. the list below says which values go in the Code and Pointer fields of the Parameter Problem message 🌸

      error: IPv6 Payload Length = 0 and
             IPv6 Next Header = Hop-by-Hop Options and
             Jumbo Payload option not present

             Code: 0
             Pointer: high-order octet of the IPv6 Payload Length

      error: IPv6 Payload Length != 0 and
             Jumbo Payload option present

             Code: 0
             Pointer: Option Type field of the Jumbo Payload option

      error: Jumbo Payload option present and
             Jumbo Payload Length < 65,536

             Code: 0
             Pointer: high-order octet of the Jumbo Payload Length

      error: Jumbo Payload option present and
             Fragment header present

             Code: 0
             Pointer: high-order octet of the Fragment header.

a node that doesn't understand the Jumbo Payload option is expected to respond to erroneously-received jumbograms as follows, according to the IPv6 specification πŸ™ˆ

      error: IPv6 Payload Length = 0 and
             IPv6 Next Header = Hop-by-Hop Options

             Code: 0
             Pointer: high-order octet of the IPv6 Payload Length

      error: IPv6 Payload Length != 0 and
             Jumbo Payload option present

             Code: 2
             Pointer: Option Type field of the Jumbo Payload option

4. UDP Jumbograms πŸ¦‹

the 16-bit Length field of the UDP header limits the total length of a UDP packet (that's the UDP header plus data) to no greater than 65,535 octets 😭 this doc specifies the following change to UDP to relax that limit: UDP packets longer than 65,535 octets may be sent by setting the UDP Length field to zero, and letting the receiver work out the actual UDP packet length from the IPv6 payload length 🌈 (fun fact: before this change, zero wasn't a legal value for the UDP Length field, because the UDP packet length includes the UDP header and so has a minimum value of 8 πŸ€“)

here are the specific requirements for sending a UDP jumbogram:

  • when sending a UDP packet, if and only if the length of the UDP header plus UDP data is greater than 65,535, set the Length field in the UDP header to zero.
  • the IPv6 packet carrying a UDP packet that large will necessarily include a Jumbo Payload option in a Hop-by-Hop Options header. set the Jumbo Payload Length field of that option to the actual length of the UDP header plus data, plus the length of all IPv6 extension headers present between the IPv6 header and the UDP header.
  • for generating the UDP checksum, use the actual length of the UDP header plus data, NOT zero, in the checksum pseudo-header [IPv6, Section 8.1].

and here are the specific requirements for receiving a UDP jumbogram:

  • when receiving a UDP packet, if and only if the Length field in the UDP header is zero, calculate the actual length of the UDP header plus data from the IPv6 Jumbo Payload Length field, minus the length of all extension headers present between the IPv6 header and the UDP header.
  • in the unexpected case that the UDP Length field is zero but no Jumbo Payload option is present (meaning the IPv6 packet isn't a jumbogram), use the Payload Length field in the IPv6 header, in place of the Jumbo Payload Length field, in the calculation above πŸ™ˆ
  • for verifying the received UDP checksum, use the calculated length of the UDP header plus data, NOT zero, in the checksum pseudo-header.

5. TCP Jumbograms πŸ’–

because there's no length field in the TCP header, nothing limits the length of an individual TCP packet on its own 🌸 however, the MSS value negotiated at the start of the connection limits the largest TCP packet that can be sent, and the Urgent Pointer can't reference data beyond 65,535 bytes 😭

5.1 TCP MSS πŸŽ€

when deciding what MSS value to send, if the MTU of the directly attached interface minus 60 ([IPv6, Section 8.3]) is greater than or equal to 65,535, then set the MSS value to 65,535 ✨

when an MSS value of 65,535 is received, it's to be treated as infinity 🧚 the actual MSS is determined by subtracting 60 from the value learned by performing Path MTU Discovery [MTU-DISC] over the path to the TCP peer πŸ”₯

5.2. TCP Urgent Pointer ✨

okay bestie, the Urgent Pointer problem could be fixed by adding a brand new TCP Urgent Pointer Option πŸ’…. But apps using jumbograms probably won't also be using Urgent Pointers πŸ™ˆ, so a less intrusive change, kinda like the MSS one, will do the job 🫢.

When a TCP packet is about to go out with an Urgent Pointer (aka the URG bit is set) πŸ¦‹, first figure out the offset from the Sequence Number to the Urgent Pointer. If that offset is less than 65,535, fill in the Urgent field and carry on with normal TCP processing ✨. If the offset is greater than 65,535, and it's also greater than or equal to the length of the TCP data, fill in the Urgent Pointer with 65,535 and keep going with normal TCP processing πŸ’–. Otherwise 😭, the TCP packet has to be split into two pieces. Piece one holds data up to, but not including, the data the Urgent Pointer points to, and the Urgent field gets set to 65,535 to signal that the Urgent Pointer is beyond the end of this packet πŸ’€. Piece two can then go out with the Urgent field set normally πŸŽ€.

Note: piece one doesn't have to include all the data up to the Urgent Pointer 🌸. It can be shorter, as long as it ends within 65,534 bytes of the Urgent Pointer, so the offset to the Urgent Pointer in piece two will be less than 65,535 bytes.

For TCP input processing, when a TCP packet comes in with the URG bit set and an Urgent field of 65,535, the Urgent Pointer gets calculated using an offset equal to the length of the TCP data, not the offset in the Urgent field 🧚.

Also, even though the TCP window is only 16 bits, bigger windows can be used through the TCP Window Scale option [TCP-EXT] 🌈.


6. Security Considerations πŸ”

The Jumbo Payload option and TCP/UDP jumbograms do not introduce any known new security concerns πŸ’œ. No new drama here, bestie 😌.

7. Authors' Addresses πŸ’Œ

David A. Borman
Berkeley Software Design, Inc.
4719 Weston Hills Drive
Eagan, MN 55123
USA

Phone: +1 612 405 8194
EMail: dab@bsdi.com


Stephen E. Deering
Cisco Systems, Inc.
170 West Tasman Drive
San Jose, CA 95134-1706
USA

Phone: +1 408 527 8213
EMail: deering@cisco.com


Robert M. Hinden
Nokia
313 Fairchild Drive
Mountain View, CA 94043
USA

Phone: +1 650 625 2004
EMail: hinden@iprg.nokia.com

8. References πŸ“š

[ICMPv6]   Conta, A. and S. Deering, "ICMP for the Internet Protocol
           Version 6 (IPv6)", RFC 2463, December 1998.

[IPv6]     Deering, S. and R. Hinden, "Internet Protocol Version 6
           (IPv6) Specification", RFC 2460, December 1998.

[MTU-DISC] McCann, J., Deering, S. and J. Mogul, "Path MTU Discovery
           for IP Version 6", RFC 1981, August 1986.

[TCP]      Postel, J., "Transmission Control Protocol", STD 7, RFC
           793, September 1981.

[TCP-EXT]  Jacobson, V., Braden, R. and D. Borman, "TCP Extensions
           for High Performance", RFC 1323, May 1992.

[UDP]      Postel, J., "User Datagram Protocol", STD 6, RFC 768,
           August 1980.

Copyright (C) The Internet Society (1999). All Rights Reserved. πŸ¦‹

This document and translations of it can be copied and handed out to others, and derivative works that comment on or explain it, or help with implementing it, can be made, copied, published and distributed, in whole or in part, with no restrictions at all 🫢. The only condition is that the above copyright notice and this paragraph are included on all copies and derivative works. However, this document itself can't be modified in any way, like removing the copyright notice or the references to the Internet Society or other Internet organizations 🚫. The exception is when it's needed for developing Internet standards, in which case the copyright procedures in the Internet Standards process must be followed, or when it's needed to translate it into languages other than English 🌍.

The limited permissions above are perpetual and will not be revoked by the Internet Society or its successors or assigns ♾️.

This document and the information in it is provided on an "AS IS" basis, and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE πŸ’€.

Acknowledgement πŸŽ€

Funding for the RFC Editor function is currently provided by the Internet Society πŸ’–.

πŸ“¦ where this page comes from