RFC 7122

Datagram Convergence Layers for the Delay- and Disruption-Tolerant Networking (DTN) Bundle Protocol and Licklider Transmission Protocol (LTP)

๐Ÿ“… published March 2014, from ietf

Okay bestie, this is the doc that sets up how DTN bundles and LTP segments travel over the Internet using datagrams ๐Ÿฆ‹. It's an Experimental IRTF document, not a Standards Track spec, and it's March 2014 (ISSN 2070-1721) ๐ŸŒธ. It was written by H. Kruse (Ohio University), S. Jero (Purdue University), and S. Ostermann (Ohio University) ๐Ÿ’…. The title block doesn't list anything it obsoletes or updates, so it doesn't replace or change any earlier RFC โœจ. Its stream is the IRTF, and it's a product of the Delay-Tolerant Networking Research Group (DTNRG) ๐Ÿงš.

Here's the full title, no cap:

Datagram Convergence Layers for
  the Delay- and Disruption-Tolerant Networking (DTN) Bundle Protocol
               and Licklider Transmission Protocol (LTP)

Abstract โœจ

Okay so this doc spells out the preferred way to send DTN protocol data across the Internet using datagrams ๐Ÿซถ. It covers convergence layers for the Bundle Protocol ([RFC5050]), plus moving LTP segments with the Licklider Transmission Protocol ([RFC5326]) ๐ŸŽ€. The two datagram candidates it looks at are UDP and the Datagram Congestion Control Protocol (DCCP) ๐Ÿ’œ. UDP can only be used on a local network, or where the DTN node has its own explicit congestion control ๐Ÿ™ˆ. DCCP handles the congestion control problem, so it's recommended whenever possible ๐Ÿ‘‘. This doc is a product of the Delay-Tolerant Networking Research Group (DTNRG), and it reflects DTNRG consensus ๐Ÿ’–.

Status of This Memo โœจ

This doc isn't an Internet Standards Track spec, so it's published for examination, experimental implementation, and evaluation ๐Ÿงš.

It defines an Experimental Protocol for the Internet community ๐Ÿฆ‹. It's a product of the Internet Research Task Force (IRTF), which publishes Internet-related research and development results ๐ŸŒธ. Those results might not be suitable for deployment, fr fr โญ. It represents the consensus of the Delay-Tolerant Networking Research Group of the IRTF ๐Ÿซถ. Anything the IRSG approves for publication isn't a candidate for any level of Internet Standard, see Section 2 of RFC 5741 ๐Ÿ’….

For the current status, any errata, and how to give feedback, check http://www.rfc-editor.org/info/rfc7122 ๐Ÿ”ฅ.

Copyright (c) 2014 IETF Trust and the persons identified as the document authors. All rights reserved ๐Ÿ’–.

This doc is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) as they stand on the publication date. Read those carefully, bestie, because they explain your rights and restrictions for this doc ๐ŸŽ€.

Table of Contents โœจ

1.  Introduction  . . . . . . . . . . . . . . . . . . . . . . . .   3
  1.1.  Requirements Language . . . . . . . . . . . . . . . . . .   4
2.  General Recommendation  . . . . . . . . . . . . . . . . . . .   4
3.  Recommendations for Implementers  . . . . . . . . . . . . . .   6
  3.1.  How and Where to Deal with Fragmentation  . . . . . . . .   6
    3.1.1.  DCCP  . . . . . . . . . . . . . . . . . . . . . . . .   6
    3.1.2.  UDP . . . . . . . . . . . . . . . . . . . . . . . . .   6
  3.2.  Bundle Protocol over a Datagram Convergence Layer . . . .   6
    3.2.1.  DCCP  . . . . . . . . . . . . . . . . . . . . . . . .   7
    3.2.2.  UDP . . . . . . . . . . . . . . . . . . . . . . . . .   7
  3.3.  LTP over Datagrams  . . . . . . . . . . . . . . . . . . .   7
    3.3.1.  DCCP  . . . . . . . . . . . . . . . . . . . . . . . .   7
    3.3.2.  UDP . . . . . . . . . . . . . . . . . . . . . . . . .   7
  3.4.  Keep-Alive Option . . . . . . . . . . . . . . . . . . . .   7
  3.5.  Checksums . . . . . . . . . . . . . . . . . . . . . . . .   8
    3.5.1.  DCCP  . . . . . . . . . . . . . . . . . . . . . . . .   8
    3.5.2.  UDP . . . . . . . . . . . . . . . . . . . . . . . . .   8
  3.6.  DCCP Congestion Control Modules . . . . . . . . . . . . .   8
4.  IANA Considerations . . . . . . . . . . . . . . . . . . . . .   9
5.  Security Considerations . . . . . . . . . . . . . . . . . . .   9
6.  References  . . . . . . . . . . . . . . . . . . . . . . . . .   9
  6.1.  Normative References  . . . . . . . . . . . . . . . . . .   9
  6.2.  Informative References  . . . . . . . . . . . . . . . . .  10

1. Introduction โœจ

DTN communication protocols include the Bundle Protocol from RFC 5050 [RFC5050] ๐Ÿงš. It carries application data blocks ("bundles") and can use optional intermediate custody transfer ๐ŸŒธ. There's also the Licklider Transmission Protocol (LTP), which is covered by the LTP Motivation [RFC5325], LTP Specification [RFC5326], and LTP Security [RFC5327] docs ๐Ÿ’œ. LTP can send bundles reliably and efficiently over a point-to-point link ๐Ÿ”ฅ. People often want to test these over Internet Protocol links, which is literally the whole point of this doc ๐Ÿซถ. The "Delay Tolerant Networking TCP Convergence Layer Protocol" [CLAYER] explains how to move bundles over TCP ๐Ÿ’…. This doc is the preferred method for sending bundles or LTP blocks across the Internet with datagrams instead of TCP ๐ŸŽ€. Figure 1 shows the general protocol layering from the DTN docs: DTN Applications talk to the Bundle Protocol Layer, which then uses a Convergence Layer to get a bundle ready to send ๐Ÿฆ‹. The Convergence Layer usually depends on a lower-level protocol to do the actual transmission ๐Ÿ‘‘.

        +-----------------------------------------+
        |                                         |
        |             DTN Application             |
        |                                         |
        +-----------------------------------------+
        +-----------------------------------------+
        |                                         |
        |           Bundle Protocol (BP)          |
        |                                         |
        +-----------------------------------------+
        +-----------------------------------------+
        |                                         |
        |      Convergence Layer Adapter (CL)     |
        |                                         |
        +-----------------------------------------+
        +-----------------------------------------+
        |                                         |
        |    Local Data-Link Layer (Transport)    |
        |                                         |
        +-----------------------------------------+

              Figure 1: Generic Protocol Stack for DTN

This doc gives implementation guidance for the two stacks in Figure 2 ๐ŸŒˆ. In Figure 2(a), the Convergence Layer Adapter is UDP or DCCP, so bundles go straight over the Internet โœจ. In Figure 2(b), the Convergence Layer Adapter is LTP, and LTP then uses UDP or DCCP as its local data-link layer ๐Ÿ’–.

    +-------------+         +-------------+
    |             |         |             |
    |   DTN App   |         |   DTN App   |
    |             |         |             |
    +-------------+         +-------------+
    +-------------+         +-------------+
    |             |         |             |
    |      BP     |         |      BP     |
    |             |         |             |
    +-------------+         +-------------+
    +-------------+         +-------------+
    |             |         |             |
    |  UDP/DCCP   |         |      LTP    |
    |             |         |             |
    +-------------+         +-------------+
                            +-------------+
                            |             |
                            |  UDP/DCCP   |
                            |             |
                            +-------------+

          (a)                     (b)

        Figure 2: Protocol Stacks Addressed in this Document

1.1. Requirements Language โœจ

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 [RFC2119] ๐ŸŽ€.

2. General Recommendation โœจ

To use DTN protocols across the Internet, whether for testing or as part of a bigger network path, you have to wrap them in a standard Internet Protocol so they travel easily across the Internet ๐Ÿงš. This matters a lot for LTP, since LTP has no endpoint addressing at all ๐ŸŒธ. The encapsulation choice has to be made carefully so you don't end up with redundancy, because DTN protocols may already bring their own reliability mechanisms ๐Ÿ’œ.

Congestion control is vital to the Internet staying healthy, especially when data could be sent at arbitrarily fast rates ๐Ÿ”ฅ. The Bundle Protocol hands off reliable delivery, and implicitly congestion control, to whichever convergence layer you use (Section 7.2 of RFC 5050 [RFC5050]) ๐Ÿซถ. If TCP works well between a pair of DTN nodes, the TCP convergence layer [CLAYER] gives you the reliability and congestion control bundles need, so it's the default pick on the Internet ๐Ÿ’…. Sending bundles straight in datagrams with UDP or DCCP isn't generally appropriate, because they offer limited reliability and, for UDP, no congestion control at all ๐Ÿ™ˆ.

LTP has its own form of reliability ๐ŸŽ€. For testing especially, running LTP over something like TCP that's already reliable makes no sense ๐Ÿฆ‹. Running LTP over TCP would also cut the flexibility users have, since LTP lets you control which data is delivered reliably and which is best effort, and TCP can't do that ๐Ÿ‘‘. So running LTP over an unreliable protocol is the better move ๐ŸŒˆ.

UDP is one option. It gives no reliability, so LTP can handle that itself โœจ. But UDP also has no congestion control ๐Ÿ’–. LTP is built for fixed-rate radio links, so it does rate control but not congestion control ๐ŸŽ€. Missing congestion control on network connections is a big problem, since it can cause artificially high loss rates and serious fairness issues ๐Ÿ’€. Earlier standards docs all agree that protocols used on the Internet should have congestion control: see "Congestion Control Principles" [RFC2914], "Unicast UDP Usage Guidelines" [RFC5405], and "Queue Management and Congestion Avoidance" [RFC2309], among others ๐Ÿงš. RFC 5405 specifically calls congestion control "vital" for "applications that can operate at higher, potentially unbounded data rates" ๐Ÿ”ฅ. So any Bundle Protocol implementation that lets UDP carry LTP segments or bundles outside an isolated network, for any non-trivial amount of data, MUST implement congestion control consistent with RFC 5405 ๐Ÿ˜ญ.

The other option is the Datagram Congestion Control Protocol (DCCP) [RFC4340]. It was designed specifically to give congestion control without reliability, for apps that cross the Internet but don't want to retransmit lost data ๐Ÿ’œ. So, RECOMMENDED and not optional-optional: if it's possible, DCCP SHOULD be used to carry LTP segments across the Internet ๐Ÿ‘‘. Wait, I mean the doc says it is RECOMMENDED that, if possible, DCCP be used to transport LTP segments across the Internet ๐Ÿ’….

3. Recommendations for Implementers โœจ


3.1. How and Where to Deal with Fragmentation โœจ

okay so bundles can be as big as the node's resources allow ๐Ÿงš In IPv4, a UDP datagram tops out at nearly 64 KB ๐Ÿ’… With IPv6 jumbograms [RFC2675], UDP datagrams can technically hit 4 GB [RFC2147], but honestly that option is rarely used ๐Ÿ’€ (Note: RFC 2147 was obsoleted by RFC 2675.) It is well understood that sending big IP datagrams that must be fragmented by the network has enormous efficiency penalties [Kent87], which is so not it ๐Ÿ˜ญ The Bundle Protocol specification has a bundle fragmentation concept [RFC5050] that lets a large bundle get split into bundle fragments ๐ŸŽ€ If the Bundle Protocol is being encapsulated in DCCP or UDP, it therefore SHOULD create each fragment small enough that it can be wrapped in a datagram that won't need fragmenting at the IP layer ๐Ÿซถ

IP fragmentation can be avoided with IP Path MTU Discovery [RFC1191] [RFC1981], which depends on routers reliably delivering ICMP Packet Too Big (PTB) messages ๐Ÿฆ‹ To get around a condition called a black hole [RFC2923], there's a newer spec in [RFC4821] that works out the IP Path MTU without PTB messages โœจ This document doesn't try to pick one fragmentation avoidance mechanism over another. This section is here for the implementers ๐Ÿ’œ

3.1.1. DCCP

Because DCCP implementations aren't required to support IP fragmentation and aren't allowed to switch it on by default, a DCCP Convergence Layer (we'll say "CL" from here on) MUST NOT accept data segments that can't be sent as a single MTU-sized datagram ๐Ÿ’–

3.1.2. UDP

When an LTP CL is using UDP for datagram delivery, it SHOULD NOT create segments that will result in UDP datagrams that will need to be fragmented, as discussed above ๐ŸŒธ

3.2. Bundle Protocol over a Datagram Convergence Layer ๐Ÿ“

Generally, using the Bundle Protocol over a datagram CL is discouraged in IP networks ๐Ÿ™ˆ Bundles can be of (almost) arbitrary length, and the Bundle Protocol doesn't come with an effective retransmission mechanism ๐Ÿ˜ฌ Whenever possible, the Bundle Protocol SHOULD be operated over the TCP Convergence Layer or over LTP ๐Ÿ’…

If a datagram CL is used for transmission of bundles, every datagram MUST contain exactly one bundle or 4 octets of zero bits as a keep-alive. Bundles that are too large for the path MTU SHOULD be fragmented and reassembled at the Bundle Protocol layer to prevent IP fragmentation ๐Ÿ”ฅ

3.2.1. DCCP

The DCCP CL for Bundle Protocol use SHOULD use the IANA-assigned port 4556/DCCP and service code 1685351985. The use of other port numbers and service codes is implementation specific ๐ŸŽ€

3.2.2. UDP

The UDP CL for Bundle Protocol use SHOULD use the IANA-assigned port 4556/UDP. The use of other port numbers is implementation specific ๐ŸŒˆ

3.3. LTP over Datagrams ๐Ÿงš

LTP is designed as a point-to-point protocol within DTN, and it has intrinsic acknowledgement and retransmission facilities built in ๐Ÿ’œ LTP segments are carried over a "local data-link layer" (RFC 5325 [RFC5325]), so we'll say "transport" from here on. Carrying LTP in datagrams is an appropriate choice โœจ When a datagram transport is used to send LTP segments, every datagram MUST contain exactly one LTP segment or 4 octets of zero bits as a keep-alive. LTP MUST perform segmentation in such a way as to ensure that every LTP segment fits into a single packet that won't require IP fragmentation, as discussed above ๐Ÿซถ

3.3.1. DCCP

The DCCP transport for LTP SHOULD use the IANA-assigned port 1113/DCCP and service code 7107696. The use of other port numbers and service codes is implementation specific ๐Ÿ’ซ

3.3.2. UDP

The UDP transport for LTP SHOULD use the IANA-assigned port 1113/UDP. The use of other port numbers is implementation specific ๐ŸŒŸ

3.4. Keep-Alive Option ๐ŸŒธ

A UDP or DCCP CL or transport might want to send "keep-alive" packets during long idle stretches ๐Ÿ’ค This might be needed to refresh a contact table entry at the destination, or to keep an address mapping in a NAT or a dynamic access rule in a firewall alive ๐Ÿ”ฅ So the CL or transport MAY send a datagram containing exactly 4 octets of zero bits. The CL or transport receiving such a packet MUST discard this packet. The receiver can then do local maintenance on its state tables, but those maintenance functions aren't covered in this document ๐Ÿ’… Note that packets carrying bundles or segments will always contain more than 4 octets of information (either the bundle or the LTP header), so keep-alive packets will never get mistaken for actual data packets ๐Ÿ™ˆ If UDP or DCCP is being used for communication in both directions between a pair of bundle agents, transmission and processing of keep-alives in the two directions happen independently ๐Ÿฆ‹ Keep-alive intervals SHOULD be configurable, SHOULD default to 15 seconds, and MUST NOT be configured shorter than 15 seconds โฐ

3.5. Checksums ๐Ÿซถ

Both the core Bundle Protocol specification and core LTP specification assume they're transmitting over an erasure channel, i.e., a channel that either delivers packets correctly or not at all ๐Ÿ’…

3.5.1. DCCP

A DCCP transmitter MUST, therefore, ensure that the entire packet is checksummed by setting the Checksum Coverage to zero. Likewise, the DCCP receiver MUST ignore all packets with partial checksum coverage ๐Ÿ”ฅ

3.5.2. UDP

A UDP transmitter, therefore, MUST NOT disable UDP checksums, and the UDP receiver MUST NOT disable the checking of received UDP checksums ๐Ÿ’€

Even when UDP checksums are enabled, a small probability of UDP packet corruption remains. In some environments, it may be acceptable for LTP or the Bundle Protocol to occasionally receive corrupted input. In general, however, a UDP implementation SHOULD use optional security extensions available in the Bundle Protocol or LTP to protect against message corruption ๐Ÿซถ

3.6. DCCP Congestion Control Modules ๐ŸŒˆ

DCCP supports pluggable congestion control modules so it can be optimized for particular environments โœจ The two most common congestion control modules (CCIDs) are TCP-like Congestion Control (CCID2) [RFC4341] and TCP-Friendly Rate Control (CCID3) [RFC4342]. TCP-like Congestion Control is designed to emulate TCP's congestion control as much as possible. It is recommended for applications that want to send data as quickly as possible, while TCP-Friendly Rate Control is aimed at applications that want to avoid sudden changes in sending rate ๐ŸŽ๏ธ DTN use cases seem to fit more into the first case, so DCCP CL's and transports SHOULD use TCP-like Congestion Control (CCID2) by default ๐Ÿ‘‘

4. IANA Considerations ๐Ÿฆ‹

Port number assignments 1113/UDP and 4556/UDP have been registered with IANA. The assignment for 1113/UDP referenced [RFC5326]; this entry has been changed to add the present document in addition to [RFC5326]. The assignment of 4556/UDP had no reference; this entry has been changed to point to the present document. The service name for 4556/UDP has been changed from dtn-bundle-udp to dtn-bundle. Port number 1113/DCCP (ltp-deepspace) with Service Code 7107696 has been assigned for the transport of LTP. Port number 4556/DCCP (dtn-bundle) with Service Code 1685351985 has been assigned for the transport of bundles. The port number assignment for 4556/TCP is addressed in the [CLAYER] document. ๐Ÿ“ฎ

5. Security Considerations ๐Ÿ’€

This memo describes the use of datagrams to transport DTN application data. Hosts may be in the position of having to accept and process packets from unknown sources, and the DTN Endpoint ID can only be discovered after the bundle has been retrieved from the DCCP or UDP packet. Hosts SHOULD use authentication methods available in the DTN specifications to prevent malicious hosts from inserting unknown data into the application.

Hosts need to listen for and process DCCP or UDP data on the known LTP or Bundle Protocol ports. A denial-of-service scenario exists where a malicious host sends datagrams at a high rate, forcing the receiving hosts to use their resources to process and attempt to authenticate this data. Whenever possible, hosts SHOULD use IP address filtering to limit the origin of packets to known hosts.

๐Ÿšจ bestie, the denial-of-service thing is serious. A flood of datagrams can drain a host's resources before it ever gets to the good stuff, so filtering by IP address is a big deal.

6. References ๐Ÿ“š

6.1. Normative References

   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119, March 1997.

   [RFC2147]  Borman, D., "TCP and UDP over IPv6 Jumbograms", RFC 2147,
              May 1997.

   [RFC2675]  Borman, D., Deering, S., and R. Hinden, "IPv6 Jumbograms",
              RFC 2675, August 1999.

   [RFC4340]  Kohler, E., Handley, M., and S. Floyd, "Datagram
              Congestion Control Protocol (DCCP)", RFC 4340, March 2006.

   [RFC4341]  Floyd, S. and E. Kohler, "Profile for Datagram Congestion
              Control Protocol (DCCP) Congestion Control ID 2: TCP-like
              Congestion Control", RFC 4341, March 2006.

   [RFC5050]  Scott, K. and S. Burleigh, "Bundle Protocol
              Specification", RFC 5050, November 2007.

   [RFC5325]  Burleigh, S., Ramadas, M., and S. Farrell, "Licklider
              Transmission Protocol - Motivation", RFC 5325, September
              2008.

   [RFC5326]  Ramadas, M., Burleigh, S., and S. Farrell, "Licklider
              Transmission Protocol - Specification", RFC 5326,
              September 2008.

   [RFC5327]  Farrell, S., Ramadas, M., and S. Burleigh, "Licklider
              Transmission Protocol - Security Extensions", RFC 5327,
              September 2008.

6.2. Informative References

   [CLAYER]   Demmer, M., Ott, J., and S. Perreault, "Delay Tolerant
              Networking TCP Convergence Layer Protocol", Work in
              Progress, January 2014.

   [Kent87]   Kent, C. and J. Mogul, "Fragmentation considered harmful",
              SIGCOMM '87, Proceedings of the ACM workshop on Frontiers
              in computer communications technology, 1987,
              <http://doi.acm.org/10.1145/55482.55524>.

   [RFC1191]  Mogul, J. and S. Deering, "Path MTU discovery", RFC 1191,
              November 1990.

   [RFC1981]  McCann, J., Deering, S., and J. Mogul, "Path MTU Discovery
              for IP version 6", RFC 1981, August 1996.

   [RFC2309]  Braden, B., Clark, D., Crowcroft, J., Davie, B., Deering,
              S., Estrin, D., Floyd, S., Jacobson, V., Minshall, G.,
              Partridge, C., Peterson, L., Ramakrishnan, K., Shenker,
              S., Wroclawski, J., and L. Zhang, "Recommendations on
              Queue Management and Congestion Avoidance in the
              Internet", RFC 2309, April 1998.

   [RFC2914]  Floyd, S., "Congestion Control Principles", BCP 41, RFC
              2914, September 2000.

   [RFC2923]  Lahey, K., "TCP Problems with Path MTU Discovery", RFC
              2923, September 2000.

   [RFC4342]  Floyd, S., Kohler, E., and J. Padhye, "Profile for
              Datagram Congestion Control Protocol (DCCP) Congestion
              Control ID 3: TCP-Friendly Rate Control (TFRC)", RFC 4342,
              March 2006.

   [RFC4821]  Mathis, M. and J. Heffner, "Packetization Layer Path MTU
              Discovery", RFC 4821, March 2007.

   [RFC5405]  Eggert, L. and G. Fairhurst, "Unicast UDP Usage Guidelines
              for Application Designers", BCP 145, RFC 5405, November
              2008.

Authors' Addresses โœจ

okay bestie, these are the humans who wrote this one ๐Ÿซถ here's who to find if you have questions, and where to find them ๐ŸŽ€

Hans Kruse
Ohio University
31 S. Court Street, Rm 150
Athens, OH  45701
United States

Phone: +1 740 593 4891
EMail: kruse@ohio.edu


Samuel Jero
Purdue University
West Lafayette, IN  47907
United States

EMail: sjero@purdue.edu


Shawn Ostermann
Ohio University
Stocker Engineering Center
Athens, OH  45701
United States

Phone: +1 740 593 1566
EMail: ostermann@eecs.ohiou.edu

that's the whole doc, babe ๐Ÿ’– the authors are literally the brains behind this, so if you ever get stuck on the TCP-vs-DCCP-vs-UDP stuff, you know who to hit up ๐Ÿงš๐Ÿ’…

๐Ÿ“ฆ where this page comes from