diff options
Diffstat (limited to 'doc/rfc/rfc9171.txt')
-rw-r--r-- | doc/rfc/rfc9171.txt | 2990 |
1 files changed, 2990 insertions, 0 deletions
diff --git a/doc/rfc/rfc9171.txt b/doc/rfc/rfc9171.txt new file mode 100644 index 0000000..62ecea8 --- /dev/null +++ b/doc/rfc/rfc9171.txt @@ -0,0 +1,2990 @@ + + + + +Internet Engineering Task Force (IETF) S. Burleigh +Request for Comments: 9171 IPNGROUP +Category: Standards Track K. Fall +ISSN: 2070-1721 Roland Computing Services + E. Birrane, III + APL, Johns Hopkins University + January 2022 + + + Bundle Protocol Version 7 + +Abstract + + This document presents a specification for the Bundle Protocol, + adapted from the experimental Bundle Protocol specification developed + by the Delay-Tolerant Networking Research Group of the Internet + Research Task Force and documented in RFC 5050. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + https://www.rfc-editor.org/info/rfc9171. + +Copyright Notice + + Copyright (c) 2022 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Revised BSD License text as described in Section 4.e of the + Trust Legal Provisions and are provided without warranty as described + in the Revised BSD License. + +Table of Contents + + 1. Introduction + 2. Conventions Used in This Document + 3. Service Description + 3.1. Definitions + 3.2. Discussion of BP Concepts + 3.3. Services Offered by Bundle Protocol Agents + 4. Bundle Format + 4.1. Bundle Structure + 4.2. BP Fundamental Data Structures + 4.2.1. CRC Type + 4.2.2. CRC + 4.2.3. Bundle Processing Control Flags + 4.2.4. Block Processing Control Flags + 4.2.5. Identifiers + 4.2.5.1. Endpoint ID + 4.2.5.1.1. The dtn URI Scheme + 4.2.5.1.2. The ipn URI Scheme + 4.2.5.2. Node ID + 4.2.6. DTN Time + 4.2.7. Creation Timestamp + 4.2.8. Block-Type-Specific Data + 4.3. Block Structures + 4.3.1. Primary Bundle Block + 4.3.2. Canonical Bundle Block Format + 4.4. Extension Blocks + 4.4.1. Previous Node + 4.4.2. Bundle Age + 4.4.3. Hop Count + 5. Bundle Processing + 5.1. Generation of Administrative Records + 5.2. Bundle Transmission + 5.3. Bundle Dispatching + 5.4. Bundle Forwarding + 5.4.1. Forwarding Contraindicated + 5.4.2. Forwarding Failed + 5.5. Bundle Expiration + 5.6. Bundle Reception + 5.7. Local Bundle Delivery + 5.8. Bundle Fragmentation + 5.9. Application Data Unit Reassembly + 5.10. Bundle Deletion + 5.11. Discarding a Bundle + 5.12. Canceling a Transmission + 6. Administrative Record Processing + 6.1. Administrative Records + 6.1.1. Bundle Status Reports + 6.2. Generation of Administrative Records + 7. Services Required of the Convergence Layer + 7.1. The Convergence Layer + 7.2. Summary of Convergence-Layer Services + 8. Security Considerations + 9. IANA Considerations + 9.1. Bundle Block Types + 9.2. Primary Bundle Protocol Version + 9.3. Bundle Processing Control Flags + 9.4. Block Processing Control Flags + 9.5. Bundle Status Report Reason Codes + 9.6. Bundle Protocol URI Scheme Types + 9.7. dtn URI Scheme + 9.8. ipn URI Scheme + 10. References + 10.1. Normative References + 10.2. Informative References + Appendix A. Significant Changes from RFC 5050 + Appendix B. CDDL Expression + Acknowledgments + Authors' Addresses + +1. Introduction + + Since the publication of the Bundle Protocol specification + (Experimental RFC 5050 [RFC5050]) in 2007, the Delay-Tolerant + Networking (DTN) Bundle Protocol (BP) has been implemented in + multiple programming languages and deployed to a wide variety of + computing platforms. This implementation and deployment experience + has identified opportunities for making the protocol simpler, more + capable, and easier to use. The present document, standardizing the + Bundle Protocol, is adapted from RFC 5050 in that context, reflecting + lessons learned. Significant changes from the Bundle Protocol + specification defined in RFC 5050 are listed in Appendix A. + + This document describes BP version 7 (BPv7). + + Delay-Tolerant Networking is a network architecture providing + communications in and/or through highly stressed environments. + Stressed networking environments include those with intermittent + connectivity, large and/or variable delays, and high bit error rates. + To provide its services, BP may be viewed as sitting at the + application layer of some number of constituent networks, forming a + store-carry-forward overlay network. Key capabilities of BP include: + + * Ability to use physical motility for the movement of data. + + * Ability to move the responsibility for error control from one node + to another. + + * Ability to cope with intermittent connectivity, including cases + where the sender and receiver are not concurrently present in the + network. + + * Ability to take advantage of scheduled, predicted, and + opportunistic connectivity, whether bidirectional or + unidirectional, in addition to continuous connectivity. + + * Late binding of overlay-network endpoint identifiers to underlying + constituent network addresses. + + For descriptions of these capabilities and the rationale for the DTN + architecture, see [ARCH] and [SIGC]. + + BP's location within the standard protocol stack is as shown in + Figure 1. BP uses underlying "integrated" transport and/or network + protocols for communications within a given constituent network. The + layer at which those underlying protocols are located is here termed + the "convergence layer", and the interface between the Bundle + Protocol and a specific underlying protocol is termed a "convergence- + layer adapter". + + Figure 1 shows three distinct transport and network protocols + (denoted T1/N1, T2/N2, and T3/N3). + + +-----------+ +-----------+ + | BP app | | BP app | + +---------v-| +->>>>>>>>>>v-+ +->>>>>>>>>>v-+ +-^---------+ + | BP v | | ^ BP v | | ^ BP v | | ^ BP | + +---------v-+ +-^---------v-+ +-^---------v-+ +-^---------+ + | T1 v | + ^ T1/T2 v | + ^ T2/T3 v | | ^ T3 | + +---------v-+ +-^---------v-+ +-^---------v + +-^---------+ + | N1 v | | ^ N1/N2 v | | ^ N2/N3 v | | ^ N3 | + +---------v-+ +-^---------v + +-^---------v-+ +-^---------+ + | >>>>>>>>^ >>>>>>>>>>^ >>>>>>>>^ | + +-----------+ +-------------+ +-------------+ +-----------+ + | | | | + |<---- A network ---->| |<---- A network ---->| + | | | | + + Figure 1: The Bundle Protocol in the Protocol Stack Model + + This document describes the format of the protocol data units (PDUs) + (called "bundles") passed between entities participating in BP + communications. + + The entities are referred to as "bundle nodes". This document does + not address: + + * Operations in the convergence-layer adapters that bundle nodes use + to transport data through specific types of internets. (However, + the document does discuss the services that must be provided by + each adapter at the convergence layer.) + + * The bundle route computation algorithm. + + * Mechanisms for populating the routing or forwarding information + bases of bundle nodes. + + * The mechanisms for securing bundles en route. + + * The mechanisms for managing bundle nodes. + + Note that implementations of the specification presented in this + document will not be interoperable with implementations of RFC 5050. + +2. Conventions Used in This Document + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. + +3. Service Description + +3.1. Definitions + + Bundle: A bundle is a PDU of BP, so named because negotiation of the + parameters of a data exchange may be impractical in a delay- + tolerant network: it is often better practice to "bundle" with a + unit of application data all metadata that might be needed in + order to make the data immediately usable when delivered to the + application. Each bundle comprises a sequence of two or more + "blocks" of protocol data, which serve various purposes. + + Block: A Bundle Protocol block is one of the protocol data + structures that together constitute a well-formed bundle. + + Application Data Unit: An application data unit (ADU) is the unit of + data whose conveyance to the bundle's destination is the purpose + for the transmission of some bundle that is not a fragment (as + defined below). + + Bundle payload: A bundle payload (or simply "payload") is the + content of the bundle's payload block. The terms "bundle + content", "bundle payload", and "payload" are used interchangeably + in this document. For a bundle that is not a fragment (as defined + below), the payload is an ADU. + + Partial payload: A partial payload is a payload that comprises + either the first N bytes or the last N bytes of some other payload + of length M, such that 0 < N < M. Note that every partial payload + is a payload and therefore can be further subdivided into partial + payloads. + + Fragment: A fragment, a.k.a. "fragmentary bundle", is a bundle whose + payload block contains a partial payload. + + Bundle node: A bundle node (or, in the context of this document, + simply a "node") is any entity that can send and/or receive + bundles. Each bundle node has three conceptual components, + defined below, as shown in Figure 2: a "Bundle Protocol Agent", a + set of zero or more "convergence-layer adapters", and an + "application agent". ("CL1 PDUs" are the PDUs of the convergence- + layer protocol used in network 1.) + + +-----------------------------------------------------------+ + |Node | + | | + | +-------------------------------------------------------+ | + | |Application Agent | | + | | | | + | | +--------------------------+ +----------------------+ | | + | | |Administrative element | |Application-specific | | | + | | | | |element | | | + | | | | | | | | + | | +--------------------------+ +----------------------+ | | + | | ^ ^ | | + | | Admin|records Application|data | | + | | | | | | + | +----------------v--------------------------v-----------+ | + | ^ | + | | ADUs | + | | | + | +-----------------------------v-------------------------+ | + | |Bundle Protocol Agent | | + | | | | + | | | | + | +-------------------------------------------------------+ | + | ^ ^ ^ | + | | Bundles | Bundles Bundles | | + | | | | | + | +------v-----+ +-----v------+ +-----v-----+ | + | |CLA 1 | |CLA 2 | |CLA n | | + | | | | | . . . | | | + | | | | | | | | + +-+------------+-----+------------+-----------+-----------+-+ + ^ ^ ^ + CL1|PDUs CL2|PDUs CLn|PDUs + | | | + +------v-----+ +-----v------+ +-----v-----+ + Network 1 Network 2 Network n + + Figure 2: Components of a Bundle Node + + Bundle Protocol Agent: The Bundle Protocol Agent (BPA) of a node is + the node component that offers the BP services and executes the + procedures of the Bundle Protocol. + + Convergence-layer adapter: A convergence-layer adapter (CLA) is a + node component that sends and receives bundles on behalf of the + BPA, utilizing the services of some "integrated" protocol stack + that is supported in one of the networks within which the node is + functionally located. + + Application agent: The application agent (AA) of a node is the node + component that utilizes the BP services to effect communication + for some user purpose. The application agent in turn has two + elements: an administrative element and an application-specific + element. + + Application-specific element: The application-specific element of an + AA is the node component that constructs, requests transmission + of, accepts delivery of, and processes units of user application + data. + + Administrative element: The administrative element of an AA is the + node component that constructs and requests transmission of + administrative records (defined below), including status reports, + and accepts delivery of and processes any administrative records + that the node receives. + + Administrative record: A BP administrative record is an ADU that is + exchanged between the administrative elements of nodes' + application agents for some BP administrative purpose. The only + administrative record defined in this specification is the status + report, discussed later. + + Bundle endpoint: A bundle endpoint (or simply "endpoint") is a set + of zero or more bundle nodes that all identify themselves for BP + purposes by some common identifier, called a "bundle endpoint ID" + (or, in this document, simply "endpoint ID"); endpoint IDs are + described in detail in Section 4.2.5.1. + + Singleton endpoint: A singleton endpoint is an endpoint that always + contains exactly one member. + + Registration: A registration is the state machine characterizing a + given node's membership in a given endpoint. Any single + registration has an associated delivery failure action as defined + below and must at any time be in one of two states: Active or + Passive. Registrations are local; information about a node's + registrations is not expected to be available at other nodes, and + the Bundle Protocol does not include a mechanism for distributing + information about registrations. + + Delivery: A bundle is considered to have been delivered at a node + subject to a registration as soon as the ADU that is the payload + of the bundle, together with any relevant metadata (an + implementation matter), has been presented to the node's + application agent in a manner consistent with the state of that + registration. + + Deliverability: A bundle is considered "deliverable" subject to a + registration if and only if (a) the bundle's destination endpoint + is the endpoint with which the registration is associated, (b) the + bundle has not yet been delivered subject to this registration, + and (c) the bundle has not yet been "abandoned" (as defined below) + subject to this registration. + + Abandonment: To abandon a bundle subject to some registration is to + assert that the bundle is not deliverable subject to that + registration. + + Delivery failure action: The delivery failure action of a + registration is the action that is to be taken when a bundle that + is "deliverable" subject to that registration is received at a + time when the registration is in the Passive state. + + Destination: The destination of a bundle is the endpoint comprising + the node(s) at which the bundle is to be delivered (as defined + above). + + Transmission: A transmission is an attempt by a node's BPA to cause + copies of a bundle to be delivered to one or more of the nodes + that are members of some endpoint (the bundle's destination) in + response to a transmission request issued by the node's + application agent. + + Forwarding: To forward a bundle to a node is to invoke the services + of one or more CLAs in a sustained effort to cause a copy of the + bundle to be received by that node. + + Discarding: To discard a bundle is to cease all operations on the + bundle and functionally erase all references to it. The specific + procedures by which this is accomplished are an implementation + matter. + + Retention constraint: A retention constraint is an element of the + state of a bundle that prevents the bundle from being discarded. + That is, a bundle cannot be discarded while it has any retention + constraints. + + Deletion: To delete a bundle is to remove unconditionally all of the + bundle's retention constraints, enabling the bundle to be + discarded. + +3.2. Discussion of BP Concepts + + Multiple instances of the same bundle (the same unit of DTN protocol + data) might exist concurrently in different parts of a network -- + possibly differing in some blocks -- in the memory local to one or + more bundle nodes and/or in transit between nodes. In the context of + the operation of a bundle node, a bundle is an instance (copy), in + that node's local memory, of some bundle that is in the network. + + The payload for a bundle forwarded in response to a bundle + transmission request is the ADU whose location is provided as a + parameter to that request. The payload for a bundle forwarded in + response to reception of a bundle is the payload of the received + bundle. + + In the most familiar case, a bundle node is instantiated as a single + process running on a general-purpose computer, but in general the + definition is meant to be broader: a bundle node might alternatively + be a thread, an object in an object-oriented operating system, a + special-purpose hardware device, etc. + + The manner in which the functions of the BPA are performed is wholly + an implementation matter. For example, BPA functionality might be + coded into each node individually; it might be implemented as a + shared library that is used in common by any number of bundle nodes + on a single computer; it might be implemented as a daemon whose + services are invoked via inter-process or network communication by + any number of bundle nodes on one or more computers; it might be + implemented in hardware. + + Every CLA implements its own thin layer of protocol, interposed + between BP and the (usually "top") protocol(s) of the underlying + integrated protocol stack; this "CL protocol" may only serve to + multiplex and demultiplex bundles to and from the underlying + integrated protocol, or it may offer additional CL-specific + functionality. The manner in which a CLA sends and receives bundles, + as well as the definitions of CLAs and CL protocols, are beyond the + scope of this specification. + + Note that the administrative element of a node's application agent + may itself, in some cases, function as a CLA. That is, outgoing + bundles may be "tunneled" through encapsulating bundles: + + * An outgoing bundle constitutes a byte array. This byte array may, + like any other, be presented to the BPA as an ADU that is to be + transmitted to some endpoint. + + * The original bundle thus forms the payload of an encapsulating + bundle that is forwarded using some other convergence-layer + protocol(s). + + * When the encapsulating bundle is received, its payload is + delivered to the peer application agent administrative element, + which then instructs the BPA to dispatch that original bundle in + the usual way. + + The purposes for which this technique may be useful (such as cross- + domain security) are beyond the scope of this specification. + + The only interface between the BPA and the application-specific + element of the AA is the BP service interface. But between the BPA + and the administrative element of the AA there is a (conceptual) + private control interface in addition to the BP service interface. + This private control interface enables the BPA and the administrative + element of the AA to direct each other to take action under specific + circumstances. + + In the case of a node that serves simply as a BP "router", the AA may + have no application-specific element at all. The application- + specific elements of other nodes' AAs may perform arbitrarily complex + application functions, perhaps even offering multiplexed DTN + communication services to a number of other applications. As with + the BPA, the manner in which the AA performs its functions is wholly + an implementation matter. + + Singletons are the most familiar sort of endpoint, but in general the + endpoint notion is meant to be broader. For example, the nodes in a + sensor network might constitute a set of bundle nodes that are all + registered in a single common endpoint and will all receive any data + delivered at that endpoint. *Note* too that any given bundle node + might be registered in multiple bundle endpoints and receive all data + delivered at each of those endpoints. + + Recall that every node, by definition, includes an application agent, + which in turn includes an administrative element, which exchanges + administrative records with the administrative elements of other + nodes. As such, every node is permanently, structurally registered + in the singleton endpoint at which administrative records received + from other nodes are delivered. Registration in no other endpoint + can ever be assumed to be permanent. This endpoint, termed the + node's "administrative endpoint", is therefore uniquely and + permanently associated with the node, and for this reason the ID of a + node's administrative endpoint may always serve as the "node ID" (see + Section 4.2.5.2) of the node. + + The destination of every bundle is an endpoint, which may or may not + be singleton. The source of every bundle is a node, identified by + node ID. Note, though, that the source node ID asserted in a given + bundle may be the null endpoint ID (as described later) rather than + the ID of the source node; bundles for which the asserted source node + ID is the null endpoint ID are termed "anonymous" bundles. + + Any number of transmissions may be concurrently undertaken by the BPA + of a given node. + + When the BPA of a node determines that it must forward a bundle + either to a node that is a member of the bundle's destination + endpoint or to some intermediate forwarding node, the BPA invokes the + services of one or more CLAs in a sustained effort to cause a copy of + the bundle to be received by that node. + + Upon reception, the processing of a bundle depends on whether or not + the receiving node is registered in the bundle's destination + endpoint. If it is, and if the payload of the bundle is non- + fragmentary (possibly as a result of successful payload reassembly + from fragmentary payloads, including the original payload of the + newly received bundle), then the bundle is normally delivered to the + node's application agent subject to the registration characterizing + the node's membership in the destination endpoint. + + The Bundle Protocol itself does not ensure delivery of a bundle to + its destination. Data loss along the path to the destination node + can be minimized by utilizing reliable convergence-layer protocols + between neighbors on all segments of the end-to-end path; however, + for end-to-end bundle delivery assurance it will be necessary to + develop extensions to the Bundle Protocol and/or application-layer + mechanisms. + + The Bundle Protocol is designed for extensibility. Bundle Protocol + extensions, documented elsewhere, may extend this specification by + defining additional: + + * blocks + + * administrative records + + * bundle processing control flags + + * block processing control flags + + * types of bundle status reports + + * bundle status report reason codes + + * mandates and constraints on processing that conformant BPAs must + perform at specified points in the inbound and outbound bundle + processing cycles + +3.3. Services Offered by Bundle Protocol Agents + + The BPA of each node is expected to provide the following services to + the node's application agent: + + * commencing a registration (registering the node in an endpoint). + + * terminating a registration. + + * switching a registration between Active and Passive states. + + * transmitting a bundle to an identified bundle endpoint. + + * canceling a transmission. + + * polling a registration that is in the Passive state. + + * delivering a received bundle. + + Note that the details of registration functionality are an + implementation matter and are beyond the scope of this specification. + +4. Bundle Format + +4.1. Bundle Structure + + The format of bundles SHALL conform to the Concise Binary Object + Representation (CBOR) [RFC8949]. + + Cryptographic verification of a block is possible only if the + sequence of octets on which the verifying node computes its hash -- + the canonicalized representation of the block -- is identical to the + sequence of octets on which the hash declared for that block was + computed. To ensure that blocks are always in canonical + representation when they are transmitted and received, the CBOR + encodings of the values of all fields in all blocks MUST conform to + the core deterministic encoding requirements as specified in + [RFC8949], except that indefinite-length items are not prohibited. + + Each bundle SHALL be a concatenated sequence of at least two blocks, + represented as a CBOR indefinite-length array. The first block in + the sequence (the first item of the array) MUST be a primary bundle + block in CBOR encoding as described below; the bundle MUST have + exactly one primary bundle block. The primary block MUST be followed + by one or more canonical bundle blocks (additional array items) in + CBOR encoding as described in Section 4.3.2. Every block following + the primary block SHALL be the CBOR encoding of a canonical block. + The last such block MUST be a payload block; the bundle MUST have + exactly one payload block. The payload block SHALL be followed by a + CBOR "break" stop code, terminating the array. + + | (Note that, while CBOR permits considerable flexibility in the + | encoding of bundles, this flexibility must not be interpreted + | as inviting increased complexity in PDU structure.) + + Associated with each block of a bundle is a block number. The block + number uniquely identifies the block within the bundle, enabling + blocks (notably Bundle Protocol Security blocks) to reference other + blocks in the same bundle without ambiguity. The block number of the + primary block is implicitly zero; the block numbers of all other + blocks are explicitly stated in block headers as noted below. Block + numbering is unrelated to the order in which blocks are sequenced in + the bundle. The block number of the payload block is always 1. + + An implementation of the Bundle Protocol MAY discard any sequence of + bytes that does not conform to the Bundle Protocol specification. + + An implementation of the Bundle Protocol MAY accept a sequence of + bytes that does not conform to the Bundle Protocol specification + (e.g., one that represents data elements in fixed-length arrays + rather than indefinite-length arrays) and transform it into + conformant BP structure before processing it. Procedures for + accomplishing such a transformation are beyond the scope of this + specification. + +4.2. BP Fundamental Data Structures + +4.2.1. CRC Type + + CRC type is an unsigned integer type code for which the following + values (and no others) are valid: + + * 0 indicates "no Cyclic Redundancy Check (CRC) is present." + + * 1 indicates "a standard X-25 CRC-16 is present." [CRC16] + + * 2 indicates "a standard CRC32C (Castagnoli) CRC-32 is present." + [RFC4960] + + CRC type SHALL be represented as a CBOR unsigned integer. + + For examples of CRC32C CRCs, see Appendix A.4 of [RFC7143]. + + Note that more robust protection of BP data integrity, as needed, may + be provided by means of Block Integrity Blocks (BIBs) as defined in + the Bundle Protocol Security specification [BPSEC]. + +4.2.2. CRC + + The CRC SHALL be omitted from a block if and only if the block's CRC + type code is zero. + + When not omitted, the CRC SHALL be represented as a CBOR byte string + of two bytes (that is, CBOR additional information 2, if CRC type is + 1) or of four bytes (that is, CBOR additional information 4, if CRC + type is 2); in each case, the sequence of bytes SHALL constitute an + unsigned integer value (of 16 or 32 bits, respectively) in network + byte order. + +4.2.3. Bundle Processing Control Flags + + Bundle processing control flags assert properties of the bundle as a + whole rather than of any particular block of the bundle. They are + conveyed in the primary block of the bundle. + + The following properties are asserted by the bundle processing + control flags: + + * The bundle is a fragment. (Boolean) + + * The bundle's payload is an administrative record. (Boolean) + + * The bundle must not be fragmented. (Boolean) + + * Acknowledgment by the user application is requested. (Boolean) + + * Status time is requested in all status reports. (Boolean) + + * Flags requesting types of status reports (all Boolean): + + - Request reporting of bundle reception. + + - Request reporting of bundle forwarding. + + - Request reporting of bundle delivery. + + - Request reporting of bundle deletion. + + If the bundle processing control flags indicate that the bundle's ADU + is an administrative record, then all status report request flag + values MUST be zero. + + If the bundle's source node is omitted (i.e., the source node ID is + the ID of the null endpoint, which has no members as discussed below; + this option enables anonymous bundle transmission), then the bundle + is not uniquely identifiable and all Bundle Protocol features that + rely on bundle identity must therefore be disabled: the "Bundle must + not be fragmented" flag value MUST be 1, and all status report + request flag values MUST be zero. + + Bundle processing control flags that are unrecognized MUST be + ignored, as future definitions of additional flags might not be + integrated simultaneously into the Bundle Protocol implementations + operating at all nodes. + + The bundle processing control flags SHALL be represented as a CBOR + unsigned integer item, the value of which SHALL be processed as a bit + field indicating the control flag values as follows (note that bit + numbering in this instance is reversed from the usual practice, + beginning with the low-order bit instead of the high-order bit, in + recognition of the potential definition of additional control flag + values in the future): + + Bit 0 (the low-order bit, 0x000001): Bundle is a fragment. + + Bit 1 (0x000002): ADU is an administrative record. + + Bit 2 (0x000004): Bundle must not be fragmented. + + Bit 3 (0x000008): Reserved. + + Bit 4 (0x000010): Reserved. + + Bit 5 (0x000020): Acknowledgement by application is requested. + + Bit 6 (0x000040): Status time requested in reports. + + Bit 7 (0x000080): Reserved. + + Bit 8 (0x000100): Reserved. + + Bit 9 (0x000200): Reserved. + + Bit 10 (0x000400): Reserved. + + Bit 11 (0x000800): Reserved. + + Bit 12 (0x001000): Reserved. + + Bit 13 (0x002000): Reserved. + + Bit 14 (0x004000): Request reporting of bundle reception. + + Bit 15 (0x008000): Reserved. + + Bit 16 (0x010000): Request reporting of bundle forwarding. + + Bit 17 (0x020000): Request reporting of bundle delivery. + + Bit 18 (0x040000): Request reporting of bundle deletion. + + Bits 19-20: Reserved. + + Bits 21-63: Unassigned. + +4.2.4. Block Processing Control Flags + + The block processing control flags assert properties of canonical + bundle blocks. They are conveyed in the header of the block to which + they pertain. + + Block processing control flags that are unrecognized MUST be ignored, + as future definitions of additional flags might not be integrated + simultaneously into the Bundle Protocol implementations operating at + all nodes. + + The block processing control flags SHALL be represented as a CBOR + unsigned integer item, the value of which SHALL be processed as a bit + field indicating the control flag values as follows (note that bit + numbering in this instance is reversed from the usual practice, + beginning with the low-order bit instead of the high-order bit, for + agreement with the bit numbering of the bundle processing control + flags): + + Bit 0 (the low-order bit, 0x01): Block must be replicated in every + fragment. + + Bit 1 (0x02): Transmit status report if block can't be processed. + + Bit 2 (0x04): Delete bundle if block can't be processed. + + Bit 3 (0x08): Reserved. + + Bit 4 (0x10): Discard block if it can't be processed. + + Bit 5 (0x20): Reserved. + + Bit 6 (0x40): Reserved. + + Bits 7-63: Unassigned. + + For each bundle whose bundle processing control flags indicate that + the bundle's ADU is an administrative record, or whose source node ID + is the null endpoint ID as defined below, the value of the "Transmit + status report if block can't be processed" flag in every canonical + block of the bundle MUST be zero. + +4.2.5. Identifiers + +4.2.5.1. Endpoint ID + + The destinations of bundles are bundle endpoints, identified by text + strings termed "endpoint IDs" (see Section 3.1). Each endpoint ID + (EID) is a Uniform Resource Identifier [URI]. As such, each endpoint + ID can be characterized as having this general structure: + + < scheme name > : < scheme-specific part, or "SSP" > + + The scheme identified by the < scheme name > in an endpoint ID is a + set of syntactic and semantic rules that fully explain how to parse + and interpret the scheme-specific part (SSP). Each scheme that may + be used to form a BP endpoint ID must be added to the "Bundle + Protocol URI Scheme Types" registry, maintained by IANA as described + in Section 9.6; association of a unique URI scheme code number with + each scheme name in this registry helps to enable compact + representation of endpoint IDs in bundle blocks. Note that the set + of allowable schemes is effectively unlimited. Any scheme conforming + to [URIREG] may be added to the registry of URI scheme code numbers + and thereupon used in a Bundle Protocol endpoint ID. + + Each entry in the registry of URI scheme code numbers MUST contain a + reference to a scheme code number definition document, which defines + the manner in which the scheme-specific part of any URI formed in + that scheme is parsed and interpreted and MUST be CBOR encoded for + transmission as a BP endpoint ID. The scheme code number definition + document may also contain information as to (a) which convergence- + layer protocol(s) may be used to forward a bundle to a BP destination + endpoint identified by such an ID and (b) how the ID of the + convergence-layer protocol endpoint to use for that purpose can be + inferred from that destination endpoint ID. + + Note that, although endpoint IDs are URIs, implementations of the BP + service interface may support expression of endpoint IDs in some + internationalized manner (e.g., Internationalized Resource + Identifiers (IRIs); see [RFC3987]). + + Each BP endpoint ID (EID) SHALL be represented as a CBOR array + comprising two items. + + The first item of the array SHALL be the code number identifying the + endpoint ID's URI scheme, as defined in the registry of URI scheme + code numbers for the Bundle Protocol. Each URI scheme code number + SHALL be represented as a CBOR unsigned integer. + + The second item of the array SHALL be the applicable CBOR encoding of + the scheme-specific part of the EID, defined as noted in the + references(s) for the URI scheme code number registry entry for the + EID's URI scheme. + +4.2.5.1.1. The dtn URI Scheme + + The "dtn" scheme supports the identification of BP endpoints by + arbitrarily expressive character strings. It is specified as + follows: + + Scheme syntax: This specification uses the Augmented Backus-Naur + Form (ABNF) notation of [RFC5234]. + + dtn-uri = "dtn:" ("none" / dtn-hier-part) + + dtn-hier-part = "//" node-name name-delim demux ; a path-rootless + + node-name = reg-name + + name-delim = "/" + + demux = *VCHAR + + Scheme semantics: URIs of the dtn scheme are used as endpoint + identifiers in the Delay-Tolerant Networking (DTN) Bundle Protocol + (BP) as described in the present document. + + The endpoint ID "dtn:none" identifies the "null endpoint", the + endpoint that by definition never has any members. + + All BP endpoints identified by all other dtn-scheme endpoint IDs for + which the first character of demux is a character other than '~' + (tilde) are singleton endpoints. All BP endpoints identified by dtn- + scheme endpoint IDs for which the first character *is* '~' (tilde) + are *not* singleton endpoints. + + A dtn-scheme endpoint ID for which the demux is of length zero MAY + identify the administrative endpoint for the node identified by node- + name, and as such may serve as a node ID. No dtn-scheme endpoint ID + for which the demux is of non-zero length may do so. + + Note that these syntactic rules impose constraints on dtn-scheme + endpoint IDs that were not imposed by the original specification of + the dtn scheme as provided in [RFC5050]. It is believed that the + dtn-scheme endpoint IDs employed by BP applications conforming to + [RFC5050] are in most cases unlikely to be in violation of these + rules, but the developers of such applications are advised of the + potential for compromised interoperation. + + Encoding considerations: For transmission as a BP endpoint ID, the + scheme-specific part of a URI of the dtn scheme SHALL be + represented as a CBOR text string unless the EID's SSP is "none", + in which case the SSP SHALL be represented as a CBOR unsigned + integer with the value zero. For all other purposes, URIs of the + dtn scheme are encoded exclusively in US-ASCII characters. + + Interoperability considerations: None. + + Security considerations: + + Reliability and consistency: None of the BP endpoints identified + by the URIs of the dtn scheme are guaranteed to be reachable at + any time, and the identity of the processing entities operating + on those endpoints is never guaranteed by the Bundle Protocol + itself. Verification of the signature provided by the Block + Integrity Block targeting the bundle's primary block, as + defined by Bundle Protocol Security [BPSEC], is required for + this purpose. + + Malicious construction: Malicious construction of a conformant + dtn-scheme URI is limited to the malicious selection of node + names and the malicious selection of demux strings. That is, a + maliciously constructed dtn-scheme URI could be used to direct + a bundle to an endpoint that might be damaged by the arrival of + that bundle or, alternatively, to declare a false source for a + bundle and thereby cause incorrect processing at a node that + receives the bundle. In both cases (and indeed in all bundle + processing), the node that receives a bundle should verify its + authenticity and validity before operating on it in any way. + + Back-end transcoding: The limited expressiveness of URIs of the + dtn scheme effectively eliminates the possibility of threat due + to errors in back-end transcoding. + + Rare IP address formats: Not relevant, as IP addresses do not + appear anywhere in conformant dtn-scheme URIs. + + Sensitive information: Because dtn-scheme URIs are used only to + represent the identities of Bundle Protocol endpoints, the risk + of disclosure of sensitive information due to interception of + these URIs is minimal. Examination of dtn-scheme URIs could be + used to support traffic analysis; where traffic analysis is a + plausible danger, bundles should be conveyed by secure + convergence-layer protocols that do not expose endpoint IDs. + + Semantic attacks: The simplicity of dtn-scheme URI syntax + minimizes the possibility of misinterpretation of a URI by a + human user. + +4.2.5.1.2. The ipn URI Scheme + + The "ipn" scheme supports the identification of BP endpoints by pairs + of unsigned integers, for compact representation in bundle blocks. + It is specified as follows: + + Scheme syntax: This specification uses the Augmented Backus-Naur + Form (ABNF) notation of [RFC5234], including the core ABNF syntax + rule for DIGIT defined by that specification. + + ipn-uri = "ipn:" ipn-hier-part + + ipn-hier-part = node-nbr nbr-delim service-nbr ; a path-rootless + + node-nbr = 1*DIGIT + + nbr-delim = "." + + service-nbr = 1*DIGIT + + Scheme semantics: URIs of the ipn scheme are used as endpoint + identifiers in the Delay-Tolerant Networking (DTN) Bundle Protocol + (BP) as described in the present document. + + All BP endpoints identified by ipn-scheme endpoint IDs are singleton + endpoints. + + An ipn-scheme endpoint ID for which service-nbr is zero MAY identify + the administrative endpoint for the node identified by node-nbr, and + as such may serve as a node ID. No ipn-scheme endpoint ID for which + service-nbr is non-zero may do so. + + Encoding considerations: For transmission as a BP endpoint ID, the + scheme-specific part of a URI of the ipn scheme SHALL be + represented as a CBOR array comprising two items. The first item + of this array SHALL be the EID's node number (a number that + identifies the node) represented as a CBOR unsigned integer. The + second item of this array SHALL be the EID's service number (a + number that identifies some application service) represented as a + CBOR unsigned integer. For all other purposes, URIs of the ipn + scheme are encoded exclusively in US-ASCII characters. + + Interoperability considerations: None. + + Security considerations: + + Reliability and consistency: None of the BP endpoints identified + by the URIs of the ipn scheme are guaranteed to be reachable at + any time, and the identity of the processing entities operating + on those endpoints is never guaranteed by the Bundle Protocol + itself. Verification of the signature provided by the Block + Integrity Block targeting the bundle's primary block, as + defined by Bundle Protocol Security [BPSEC], is required for + this purpose. + + Malicious construction: Malicious construction of a conformant + ipn-scheme URI is limited to the malicious selection of node + numbers and the malicious selection of service numbers. That + is, a maliciously constructed ipn-scheme URI could be used to + direct a bundle to an endpoint that might be damaged by the + arrival of that bundle or, alternatively, to declare a false + source for a bundle and thereby cause incorrect processing at a + node that receives the bundle. In both cases (and indeed in + all bundle processing), the node that receives a bundle should + verify its authenticity and validity before operating on it in + any way. + + Back-end transcoding: The limited expressiveness of URIs of the + ipn scheme effectively eliminates the possibility of threat due + to errors in back-end transcoding. + + Rare IP address formats: Not relevant, as IP addresses do not + appear anywhere in conformant ipn-scheme URIs. + + Sensitive information: Because ipn-scheme URIs are used only to + represent the identities of Bundle Protocol endpoints, the risk + of disclosure of sensitive information due to interception of + these URIs is minimal. Examination of ipn-scheme URIs could be + used to support traffic analysis; where traffic analysis is a + plausible danger, bundles should be conveyed by secure + convergence-layer protocols that do not expose endpoint IDs. + + Semantic attacks: The simplicity of ipn-scheme URI syntax + minimizes the possibility of misinterpretation of a URI by a + human user. + +4.2.5.2. Node ID + + For many purposes of the Bundle Protocol, it is important to identify + the node that is operative in some context. + + As discussed in Section 3.1, nodes are distinct from endpoints; + specifically, an endpoint is a set of zero or more nodes. But rather + than define a separate namespace for node identifiers, we instead use + endpoint identifiers to identify nodes as discussed in Section 3.2. + Formally: + + * Every node is, by definition, permanently registered in the + singleton endpoint at which administrative records are delivered + to its application agent's administrative element, termed the + node's "administrative endpoint". + + * As such, the EID of a node's administrative endpoint SHALL + uniquely identify that node. + + * The EID of any singleton endpoint is allowed to serve as a "node + ID" identifying the node that is the sole member of that endpoint. + +4.2.6. DTN Time + + A DTN time is an unsigned integer indicating the number of + milliseconds that have elapsed since the DTN Epoch, 2000-01-01 + 00:00:00 +0000 (UTC). DTN time is not affected by leap seconds. + + Each DTN time SHALL be represented as a CBOR unsigned integer item. + Implementers need to be aware that DTN time values conveyed in CBOR + encoding in bundles will nearly always exceed (2^32 - 1); the manner + in which a DTN time value is represented in memory is an + implementation matter. The DTN time value zero indicates that the + time is unknown. + +4.2.7. Creation Timestamp + + Each bundle's creation timestamp SHALL be represented as a CBOR array + comprising two items. + + The first item of the array, termed "bundle creation time", SHALL be + the DTN time at which the transmission request was received that + resulted in the creation of the bundle, represented as a CBOR + unsigned integer. + + The second item of the array, termed the creation timestamp's + "sequence number", SHALL be the latest value (as of the time at which + the transmission request was received) of a monotonically increasing + positive integer counter managed by the source node's BPA, + represented as a CBOR unsigned integer. The sequence counter MAY be + reset to zero whenever the current time advances by one millisecond. + + For nodes that lack accurate clocks, it is recommended that bundle + creation time be set to zero and that the counter used as the source + of the bundle sequence count never be reset to zero. + + Note that, in general, the creation of two distinct bundles with the + same source node ID and bundle creation timestamp may result in + unexpected network behavior and/or suboptimal performance. The + combination of source node ID and bundle creation timestamp serves to + identify a single transmission request, enabling it to be + acknowledged by the receiving application (provided the source node + ID is not the null endpoint ID). + +4.2.8. Block-Type-Specific Data + + Block-type-specific data in each block (other than the primary block) + SHALL be the applicable CBOR encoding of the content of the block. + Details of this representation are included in the specification + defining the block type. + +4.3. Block Structures + + This section describes the primary block in detail and non-primary + blocks in general. Rules for processing these blocks appear in + Section 5. + + Note that supplementary DTN protocol specifications (including, but + not restricted to, Bundle Protocol Security [BPSEC]) may require that + BP implementations conforming to those protocols construct and + process additional blocks. + +4.3.1. Primary Bundle Block + + The primary bundle block contains the basic information needed to + forward bundles to their destinations. + + Each primary block SHALL be represented as a CBOR array; the number + of elements in the array SHALL be 8 (if the bundle is not a fragment + and the block has no CRC), 9 (if the block has a CRC and the bundle + is not a fragment), 10 (if the bundle is a fragment and the block has + no CRC), or 11 (if the bundle is a fragment and the block has a CRC). + + The primary block of each bundle SHALL be immutable. The CBOR- + encoded values of all fields in the primary block MUST remain + unchanged from the time the block is created to the time it is + delivered. + + The fields of the primary bundle block SHALL be as follows, listed in + the order in which they MUST appear: + + Version: An unsigned integer value indicating the version of the + Bundle Protocol that constructed this block. The present document + describes BPv7. This version number SHALL be represented as a + CBOR unsigned integer item. + + Bundle Processing Control Flags: The bundle processing control flags + are discussed in Section 4.2.3. + + CRC Type: CRC type codes are discussed in Section 4.2.1. The CRC + type code for the primary block MAY be zero if the bundle contains + a BPSec Block Integrity Block [BPSEC] whose target is the primary + block; otherwise, the CRC type code for the primary block MUST be + non-zero. + + Destination EID: The Destination EID field identifies the bundle + endpoint that is the bundle's destination, i.e., the endpoint that + contains the node(s) at which the bundle is to be delivered. + + Source node ID: The Source node ID field identifies the bundle node + at which the bundle was initially transmitted, except that source + node ID may be the null endpoint ID in the event that the bundle's + source chooses to remain anonymous. + + Report-to EID: The Report-to EID field identifies the bundle + endpoint to which status reports pertaining to the forwarding and + delivery of this bundle are to be transmitted. + + Creation Timestamp: The creation timestamp comprises two unsigned + integers that, together with the source node ID and (if the bundle + is a fragment) the fragment offset and payload length, serve to + identify the bundle. See Section 4.2.7 for the definition of this + field. + + Lifetime: The Lifetime field is an unsigned integer that indicates + the time at which the bundle's payload will no longer be useful, + encoded as a number of milliseconds past the creation time. (For + high-rate deployments with very brief disruptions, fine-grained + expression of bundle lifetime may be useful.) When a bundle's age + exceeds its lifetime, bundle nodes need no longer retain or + forward the bundle; the bundle SHOULD be deleted from the network. + + If the asserted lifetime for a received bundle is so lengthy that + retention of the bundle until its expiration time might degrade + operation of the node at which the bundle is received, or if the + BPA of that node determines that the bundle must be deleted in + order to prevent network performance degradation (e.g., the bundle + appears to be part of a denial-of-service attack), then that BPA + MAY impose a temporary overriding lifetime of shorter duration; + such an overriding lifetime SHALL NOT replace the lifetime + asserted in the bundle but SHALL serve as the bundle's effective + lifetime while the bundle resides at that node. Procedures for + imposing lifetime overrides are beyond the scope of this + specification. + + For bundles originating at nodes that lack accurate clocks, it is + recommended that bundle age be obtained from the Bundle Age + extension block (see Section 4.4.2) rather than from the + difference between current time and bundle creation time. Bundle + lifetime SHALL be represented as a CBOR unsigned integer item. + + Fragment offset: If and only if the bundle processing control flags + of this primary block indicate that the bundle is a fragment, + fragment offset SHALL be present in the primary block. Fragment + offset SHALL be represented as a CBOR unsigned integer indicating + the offset from the start of the original ADU at which the bytes + comprising the payload of this bundle were located. + + Total Application Data Unit Length: If and only if the bundle + processing control flags of this primary block indicate that the + bundle is a fragment, total application data unit length SHALL be + present in the primary block. Total application data unit length + SHALL be represented as a CBOR unsigned integer indicating the + total length of the original ADU of which this bundle's payload is + a part. + + CRC: A CRC SHALL be present in the primary block unless the bundle + includes a BPSec Block Integrity Block [BPSEC] whose target is the + primary block, in which case a CRC MAY be present in the primary + block. The length and nature of the CRC SHALL be as indicated by + the CRC type. The CRC SHALL be computed over the concatenation of + all bytes (including CBOR "break" characters) of the primary block + including the CRC field itself, which, for this purpose, SHALL be + temporarily populated with all bytes set to zero. + +4.3.2. Canonical Bundle Block Format + + Every block other than the primary block (all such blocks are termed + "canonical" blocks) SHALL be represented as a CBOR array; the number + of elements in the array SHALL be 5 (if CRC type is zero) or 6 + (otherwise). + + The fields of every canonical block SHALL be as follows, listed in + the order in which they MUST appear: + + Block type code: An unsigned integer. Bundle block type code 1 + indicates that the block is a Bundle Payload Block. Other block + type codes are described in Section 9.1. Block type codes 192 + through 255 are not reserved and are available for private and/or + experimental use. All other block type code values are reserved + for future use. + + Block number: An unsigned integer as discussed in Section 4.1. The + block number SHALL be represented as a CBOR unsigned integer. + + Block processing control flags: As discussed in Section 4.2.4. + + CRC type: As discussed in Section 4.2.1. + + Block-type-specific data: Represented as a single definite-length + CBOR byte string, i.e., a CBOR byte string that is not of + indefinite length. For each type of block, the block-type- + specific data byte string is the serialization, in a block-type- + specific manner, of the data conveyed by that type of block; + definitions of blocks are required to define the manner in which + block-type-specific data are serialized within the block-type- + specific data field. For the Bundle Payload Block in particular + (block type 1), the block-type-specific data field, termed the + "payload", SHALL be an ADU, or some contiguous extent thereof, + represented as a definite-length CBOR byte string. + + If and only if the value of the CRC type field of this block is + non-zero: A CRC. If present, the length and nature of the CRC SHALL + be as indicated by the CRC type and the CRC SHALL be computed over + the concatenation of all bytes of the block (including CBOR + "break" characters) including the CRC field itself, which, for + this purpose, SHALL be temporarily populated with all bytes set to + zero. + +4.4. Extension Blocks + + "Extension blocks" are all blocks other than the primary and payload + blocks. Three types of extension blocks are defined below. All + implementations of the Bundle Protocol specification (the present + document) MUST include procedures for recognizing, parsing, and + acting on, but not necessarily producing, these types of extension + blocks. + + The specifications for additional types of extension blocks must + indicate whether or not BP implementations conforming to those + specifications must recognize, parse, act on, and/or produce blocks + of those types. As not all nodes will necessarily instantiate BP + implementations that conform to those additional specifications, it + is possible for a node to receive a bundle that includes extension + blocks that the node cannot process. The values of the block + processing control flags indicate the action to be taken by the BPA + when this is the case. + + No mandated procedure in this specification is unconditionally + dependent on the absence or presence of any extension block. + Therefore, any BPA MAY insert or remove any extension block in any + bundle, subject to all mandates in the Bundle Protocol specification + and all extension block specifications to which the node's BP + implementation conforms. Note that removal of an extension block + will probably disable one or more elements of bundle processing that + were intended by the BPA that inserted that block. In particular, + note that removal of an extension block that is one of the targets of + a BPSec security block may render the bundle unverifiable. + + The following extension blocks are defined in the current document. + +4.4.1. Previous Node + + The Previous Node Block, block type 6, identifies the node that + forwarded this bundle to the local node (i.e., to the node at which + the bundle currently resides); its block-type-specific data is the + node ID of that forwarder node. That node ID SHALL conform to + Section 4.2.5.2. If the local node is the source of the bundle, then + the bundle MUST NOT contain any Previous Node Block. Otherwise, the + bundle SHOULD contain one (1) occurrence of this type of block and + MUST NOT contain more than one. + +4.4.2. Bundle Age + + The Bundle Age Block, block type 7, contains the number of + milliseconds that have elapsed between the time the bundle was + created and the time at which it was most recently forwarded. It is + intended for use by nodes lacking access to an accurate clock, to aid + in determining the time at which a bundle's lifetime expires. The + block-type-specific data of this block is an unsigned integer + containing the age of the bundle in milliseconds, which SHALL be + represented as a CBOR unsigned integer item. (The age of the bundle + is the sum of all known intervals of the bundle's residence at + forwarding nodes, up to the time at which the bundle was most + recently forwarded, plus the summation of signal propagation time + over all episodes of transmission between forwarding nodes. + Determination of these values is an implementation matter.) If the + bundle's creation time is zero, then the bundle MUST contain exactly + one (1) occurrence of this type of block; otherwise, the bundle MAY + contain at most one (1) occurrence of this type of block. A bundle + MUST NOT contain multiple occurrences of the Bundle Age Block, as + this could result in processing anomalies. + +4.4.3. Hop Count + + The Hop Count Block, block type 10, contains two unsigned integers: + hop limit and hop count. A "hop" is here defined as an occasion on + which a bundle was forwarded from one node to another node. The hop + limit MUST be in the range 1 through 255. The hop limit value SHOULD + NOT be changed at any time after creation of the Hop Count Block; the + hop count value SHOULD initially be zero and SHOULD be increased by 1 + on each hop. + + The Hop Count Block is mainly intended as a safety mechanism, a means + of identifying bundles for removal from the network that can never be + delivered due to a persistent forwarding error. The hop count is + particularly valuable as a defense against routing anomalies that + might cause a bundle to be forwarded in a cyclical "ping-pong" + fashion between two nodes. When a bundle's hop count exceeds its hop + limit, the bundle SHOULD be deleted for the reason "Hop limit + exceeded", following the Bundle Deletion procedure defined in + Section 5.10. + + Procedures for determining the appropriate hop limit for a bundle are + beyond the scope of this specification. + + The block-type-specific data in a Hop Count Block SHALL be + represented as a CBOR array comprising two items. The first item of + this array SHALL be the bundle's hop limit, represented as a CBOR + unsigned integer. The second item of this array SHALL be the + bundle's hop count, represented as a CBOR unsigned integer. A bundle + MAY contain one occurrence of this type of block but MUST NOT contain + more than one. + +5. Bundle Processing + + The bundle-processing procedures mandated in this section and in + Section 6 govern the operation of the BPA and the application agent + administrative element of each bundle node. They are neither + exhaustive nor exclusive. Supplementary DTN protocol specifications + (including, but not restricted to, Bundle Protocol Security [BPSEC]) + may augment, override, or supersede the mandates of this document. + +5.1. Generation of Administrative Records + + All transmission of bundles is in response to bundle transmission + requests presented by nodes' application agents. When required to + "generate" an administrative record (such as a bundle status report), + the BPA itself is responsible for causing a new bundle to be + transmitted, conveying that record. In concept, the BPA discharges + this responsibility by directing the administrative element of the + node's application agent to construct the record and request its + transmission as detailed in Section 6. In practice, the manner in + which administrative record generation is accomplished is an + implementation matter, provided the constraints noted in Section 6 + are observed. + + Status reports are relatively small bundles. Moreover, even when the + generation of status reports is enabled, the decision on whether or + not to generate a requested status report is left to the discretion + of the BPA. Nonetheless, note that requesting status reports for any + single bundle might easily result in the generation of (1 + (2 + *(N-1))) status report bundles, where N is the number of nodes on the + path from the bundle's source to its destination, inclusive. That + is, the requesting of status reports for large numbers of bundles + could result in an unacceptable increase in the bundle traffic in the + network. For this reason, the generation of status reports MUST be + disabled by default and enabled only when the risk of excessive + network traffic is deemed acceptable. Mechanisms that could assist + in assessing and mitigating this risk, such as pre-placed agreements + authorizing the generation of status reports under specified + circumstances, are beyond the scope of this specification. + + Notes on administrative record terminology: + + * A "bundle reception status report" is a bundle status report with + the "Reporting node received bundle" flag set to 1. + + * A "bundle forwarding status report" is a bundle status report with + the "Reporting node forwarded the bundle" flag set to 1. + + * A "bundle delivery status report" is a bundle status report with + the "Reporting node delivered the bundle" flag set to 1. + + * A "bundle deletion status report" is a bundle status report with + the "Reporting node deleted the bundle" flag set to 1. + +5.2. Bundle Transmission + + The steps in processing a bundle transmission request are as follows: + + Step 1: Transmission of the bundle is initiated. An outbound bundle + MUST be created per the parameters of the bundle + transmission request, with the retention constraint + "Dispatch pending". The source node ID of the bundle MUST + be either (a) the null endpoint ID, indicating that the + source of the bundle is anonymous or (b) the EID of a + singleton endpoint whose only member is the node of which + the BPA is a component. + + Step 2: Processing proceeds from Step 1 of Section 5.4. + +5.3. Bundle Dispatching + + (Note that this procedure is initiated only following completion of + Step 4 of Section 5.6.) + + The steps in dispatching a bundle are as follows: + + Step 1: If the bundle's destination endpoint is an endpoint of which + the node is a member, the Bundle Delivery procedure defined + in Section 5.7 MUST be followed and, for the purposes of all + subsequent processing of this bundle at this node, the + node's membership in the bundle's destination endpoint SHALL + be disavowed; specifically, even though the node is a member + of the bundle's destination endpoint, the node SHALL NOT + undertake to forward the bundle to itself in the course of + performing the procedure described in Section 5.4. + + Step 2: Processing proceeds from Step 1 of Section 5.4. + +5.4. Bundle Forwarding + + The steps in forwarding a bundle are as follows: + + Step 1: The retention constraint "Forward pending" MUST be added to + the bundle, and the bundle's "Dispatch pending" retention + constraint MUST be removed. + + Step 2: The BPA MUST determine whether or not forwarding is + contraindicated (that is, rendered inadvisable) for any of + the reasons listed in the IANA "Bundle Status Report Reason + Codes" registry (see Section 9.5), whose initial contents + are listed in Table 1. In particular: + + * The BPA MAY choose to either forward the bundle directly + to its destination node(s) (if possible) or forward the + bundle to some other node(s) for further forwarding. The + manner in which this decision is made may depend on the + scheme name in the destination endpoint ID and/or on + other state but in any case is beyond the scope of this + document; one possible mechanism is described in [SABR]. + If the BPA elects to forward the bundle to some other + node(s) for further forwarding but finds it impossible to + select any node(s) to forward the bundle to, then + forwarding is contraindicated. + + * Provided the BPA succeeded in selecting the node or nodes + to forward the bundle to, the BPA MUST subsequently + select the CLA(s) whose services will enable the node to + send the bundle to those nodes. The manner in which + specific appropriate CLAs are selected is beyond the + scope of this document; the TCP CLA [TCPCL] MUST be + implemented when some or all of the bundles forwarded by + the BPA must be forwarded via the Internet but may not be + appropriate for the forwarding of any particular bundle. + If the agent finds it impossible to select any + appropriate CLA(s) to use in forwarding this bundle, then + forwarding is contraindicated. + + Step 3: If forwarding of the bundle is determined to be + contraindicated for any of the reasons listed in the IANA + "Bundle Status Report Reason Codes" registry (see + Section 9.5), then the Forwarding Contraindicated procedure + defined in Section 5.4.1 MUST be followed; the remaining + steps of this Bundle Forwarding procedure are skipped at + this time. + + Step 4: For each node selected for forwarding, the BPA MUST invoke + the services of the selected CLA(s) in order to effect the + sending of the bundle to that node. Determining the time at + which the BPA invokes CLA services is a BPA implementation + matter. Determining the time at which each CLA subsequently + responds to this service invocation by sending the bundle is + a CLA implementation matter. Note that: + + * If the bundle has a Previous Node Block, as defined in + Section 4.4.1, then that block MUST be removed from the + bundle before the bundle is forwarded. + + * If the BPA is configured to attach Previous Node Blocks + to forwarded bundles, then a Previous Node Block + containing the node ID of the forwarding node MUST be + inserted into the bundle before the bundle is forwarded. + + * If the bundle has a Bundle Age Block, as defined in + Section 4.4.2, then at the last possible moment before + the CLA initiates conveyance of the bundle via the CL + protocol the bundle age value MUST be increased by the + difference between the current time and the time at which + the bundle was received (or, if the local node is the + source of the bundle, created). + + Step 5: When all selected CLAs have informed the BPA that they have + concluded their data-sending procedures with regard to this + bundle, processing may depend on the results of those + procedures. + + If completion of the data-sending procedures by all selected CLAs has + not resulted in successful forwarding of the bundle (an + implementation-specific determination that is beyond the scope of + this specification), then the BPA MAY choose (in an implementation- + specific manner, again beyond the scope of this specification) to + initiate another attempt to forward the bundle. In that event, + processing proceeds from Step 4. The minimum number of times a given + node will initiate another forwarding attempt for any single bundle + in this event (a number that may be zero) is a node configuration + parameter that must be exposed to other nodes in the network to the + extent that this is required by the operating environment. + + If completion of the data-sending procedures by all selected CLAs + *HAS* resulted in successful forwarding of the bundle, or if it has + not but the BPA does not choose to initiate another attempt to + forward the bundle, then: + + * If the "request reporting of bundle forwarding" flag in the + bundle's status report request field is set to 1 and status + reporting is enabled, then a bundle forwarding status report + SHOULD be generated, destined for the bundle's report-to endpoint + ID. The reason code on this bundle forwarding status report MUST + be "no additional information". + + * If any applicable Bundle Protocol extensions mandate generation of + status reports upon conclusion of convergence-layer data-sending + procedures, all such status reports SHOULD be generated with + extension-mandated reason codes. + + * The bundle's "Forward pending" retention constraint MUST be + removed. + +5.4.1. Forwarding Contraindicated + + The steps in responding to contraindication of forwarding are as + follows: + + Step 1: The BPA MUST determine whether or not to declare failure in + forwarding the bundle. Note: This decision is likely to be + influenced by the reason for which forwarding is + contraindicated. + + Step 2: If forwarding failure is declared, then the Forwarding + Failed procedure defined in Section 5.4.2 MUST be followed. + + Otherwise, when -- at some future time -- the forwarding of this + bundle ceases to be contraindicated, processing proceeds from Step 4 + of Section 5.4. + +5.4.2. Forwarding Failed + + The steps in responding to a declaration of forwarding failure are as + follows: + + Step 1: The BPA MAY forward the bundle back to the node that sent + it, as identified by the Previous Node Block, if present. + This forwarding, if performed, SHALL be accomplished by + performing Step 4 and Step 5 of Section 5.4 where the sole + node selected for forwarding SHALL be the node that sent the + bundle. + + Step 2: If the bundle's destination endpoint is an endpoint of which + the node is a member, then the bundle's "Forward pending" + retention constraint MUST be removed. Otherwise, the bundle + MUST be deleted: the Bundle Deletion procedure defined in + Section 5.10 MUST be followed, citing the reason for which + forwarding was determined to be contraindicated. + +5.5. Bundle Expiration + + A bundle expires when the bundle's age exceeds its lifetime as + specified in the primary bundle block or as overridden by the BPA. + Bundle age MAY be determined by subtracting the bundle's creation + timestamp time from the current time if (a) that timestamp time is + not zero and (b) the local node's clock is known to be accurate; + otherwise, bundle age MUST be obtained from the Bundle Age extension + block. Bundle expiration MAY occur at any point in the processing of + a bundle. When a bundle expires, the BPA MUST delete the bundle for + the reason "Lifetime expired" (when the expired lifetime is the + lifetime as specified in the primary block) or "Traffic pared" (when + the expired lifetime is a lifetime override as imposed by the BPA): + the Bundle Deletion procedure defined in Section 5.10 MUST be + followed. + +5.6. Bundle Reception + + The steps in processing a bundle that has been received from another + node are as follows: + + Step 1: The retention constraint "Dispatch pending" MUST be added to + the bundle. + + Step 2: If the "request reporting of bundle reception" flag in the + bundle's status report request field is set to 1 and status + reporting is enabled, then a bundle reception status report + with reason code "No additional information" SHOULD be + generated, destined for the bundle's report-to endpoint ID. + + Step 3: CRCs SHOULD be computed for every block of the bundle that + has an attached CRC. If any block of the bundle is + malformed according to this specification (including + syntactically invalid CBOR), or if any block has an attached + CRC and the CRC computed for this block upon reception + differs from that attached CRC, then the BPA MUST delete the + bundle for the reason "Block unintelligible". The Bundle + Deletion procedure defined in Section 5.10 MUST be followed, + and all remaining steps of the Bundle Reception procedure + MUST be skipped. + + Step 4: For each block in the bundle that is an extension block that + the BPA cannot process: + + * If the block processing control flags in that block + indicate that a status report is requested in this event + and if status reporting is enabled, then a bundle + reception status report with reason code "Block + unsupported" SHOULD be generated, destined for the + bundle's report-to endpoint ID. + + * If the block processing control flags in that block + indicate that the bundle must be deleted in this event, + then the BPA MUST delete the bundle for the reason "Block + unsupported"; the Bundle Deletion procedure defined in + Section 5.10 MUST be followed, and all remaining steps of + the Bundle Reception procedure MUST be skipped. + + * If the block processing control flags in that block do + *NOT* indicate that the bundle must be deleted in this + event but do indicate that the block must be discarded, + then the BPA MUST remove this block from the bundle. + + * If the block processing control flags in that block + neither indicate that the bundle must be deleted nor + indicate that the block must be discarded, then + processing continues with the next extension block that + the BPA cannot process, if any; otherwise, processing + proceeds from Step 5. + + Step 5: Processing proceeds from Step 1 of Section 5.3. + +5.7. Local Bundle Delivery + + The steps in processing a bundle that is destined for an endpoint of + which this node is a member are as follows: + + Step 1: If the received bundle is a fragment, the ADU Reassembly + procedure described in Section 5.9 MUST be followed. If + this procedure results in reassembly of the entire original + ADU, processing of the fragmentary bundle whose payload has + been replaced by the reassembled ADU (whether this bundle or + a previously received fragment) proceeds from Step 2; + otherwise, the retention constraint "Reassembly pending" + MUST be added to the bundle, and all remaining steps of this + procedure MUST be skipped. + + Step 2: Delivery depends on the state of the registration whose + endpoint ID matches that of the destination of the bundle: + + * An additional implementation-specific delivery deferral + procedure MAY optionally be associated with the + registration. + + * If the registration is in the Active state, then the + bundle MUST be delivered automatically as soon as it is + the next bundle that is due for delivery according to the + BPA's bundle delivery scheduling policy (an + implementation matter). + + * If the registration is in the Passive state, or if + delivery of the bundle fails for some implementation- + specific reason, then the registration's delivery failure + action MUST be taken. The delivery failure action MUST + be one of the following: + + - Defer delivery of the bundle subject to this + registration until (a) this bundle is the least + recently received of all bundles currently deliverable + subject to this registration and (b) either the + registration is polled or the registration is in the + Active state, and also perform any additional delivery + deferral procedure associated with the registration, + or + + - Abandon delivery of the bundle subject to this + registration (as defined in Section 3.1). + + Step 3: As soon as the bundle has been delivered, if the "request + reporting of bundle delivery" flag in the bundle's status + report request field is set to 1 and bundle status reporting + is enabled, then a bundle delivery status report SHOULD be + generated, destined for the bundle's report-to endpoint ID. + Note that this status report only states that the payload + has been delivered to the application agent, not that the + application agent has processed that payload. + +5.8. Bundle Fragmentation + + It may at times be advantageous for BPAs to reduce the sizes of + bundles in order to forward them. This might be the case, for + example, if a node to which a bundle is to be forwarded is accessible + only via intermittent contacts and no upcoming contact is long enough + to enable the forwarding of the entire bundle. + + The size of a bundle can be reduced by "fragmenting" the bundle. To + fragment a bundle whose payload is of size M is to replace it with + two "fragments" -- new bundles with the same source node ID and + creation timestamp as the original bundle -- whose payloads MUST be + the first N and the last (M - N) bytes of the original bundle's + payload, where 0 < N < M. + + Note that fragments are bundles and therefore may themselves be + fragmented, so multiple episodes of fragmentation may in effect + replace the original bundle with more than two fragments. (However, + there is only one "level" of fragmentation, as in IP fragmentation.) + + Any bundle whose primary block's bundle processing control flags do + *NOT* indicate that it must not be fragmented MAY be fragmented at + any time, for any purpose, at the discretion of the BPA. *NOTE*, + however, that some combinations of bundle fragmentation, replication, + and routing might result in unexpected traffic patterns. + + Fragmentation SHALL be constrained as follows: + + * The concatenation of the payloads of all fragments produced by + fragmentation MUST always be identical to the payload of the + fragmented bundle (that is, the bundle that is being fragmented). + Note that the payloads of fragments resulting from different + fragmentation episodes, in different parts of the network, may be + overlapping subsets of the fragmented bundle's payload. + + * The primary block of each fragment MUST differ from that of the + fragmented bundle, in that the bundle processing control flags of + the fragment MUST indicate that the bundle is a fragment and both + fragment offset and total application data unit length must be + provided. Additionally, the CRC of the primary block of the + fragmented bundle, if any, MUST be replaced in each fragment by a + new CRC computed for the primary block of that fragment. + + * The payload blocks of fragments will differ from that of the + fragmented bundle as noted above. + + * If the fragmented bundle is not a fragment or is the fragment with + offset zero, then all extension blocks of the fragmented bundle + MUST be replicated in the fragment whose offset is zero. + + * Each of the fragmented bundle's extension blocks whose "Block must + be replicated in every fragment" flag is set to 1 MUST be + replicated in every fragment. + + * Beyond these rules, rules for the replication of extension blocks + in the fragments must be defined in the specifications for those + extension block types. + +5.9. Application Data Unit Reassembly + + Note that the Bundle Fragmentation procedure described in Section 5.8 + may result in the replacement of a single original bundle with an + arbitrarily large number of fragmentary bundles. In order to be + delivered at a destination node, the original bundle's payload must + be reassembled from the payloads of those fragments. + + The "material extents" of a received fragment's payload are all + continuous sequences of bytes in that payload that do not overlap + with the material extents of the payloads of any previously received + fragments with the same source node ID and creation timestamp. If + the concatenation -- as informed by fragment offsets and payload + lengths -- of the material extents of the payloads of this fragment + and all previously received fragments with the same source node ID + and creation timestamp as this fragment forms a continuous byte array + whose length is equal to the total application data unit length noted + in the fragment's primary block, then: + + * This byte array -- the reassembled ADU -- MUST replace the payload + of that fragment whose material extents include the extent at + offset zero. Note that this will enable delivery of the + reconstituted original bundle as described in Step 1 of + Section 5.7. + + * The "Reassembly pending" retention constraint MUST be removed from + every other fragment with the same source node ID and creation + timestamp as this fragment. + + Note: Reassembly of ADUs from fragments occurs at the nodes that are + members of destination endpoints as necessary; an ADU MAY also be + reassembled at some other node on the path to the destination. + +5.10. Bundle Deletion + + The steps in deleting a bundle are as follows: + + Step 1: If the "request reporting of bundle deletion" flag in the + bundle's status report request field is set to 1 and if + status reporting is enabled, then a bundle deletion status + report citing the reason for deletion SHOULD be generated, + destined for the bundle's report-to endpoint ID. + + Step 2: All of the bundle's retention constraints MUST be removed. + +5.11. Discarding a Bundle + + As soon as a bundle has no remaining retention constraints, it MAY be + discarded, thereby releasing any persistent storage that may have + been allocated to it. + +5.12. Canceling a Transmission + + When requested to cancel a specified transmission, where the bundle + created upon initiation of the indicated transmission has not yet + been discarded, the BPA MUST delete that bundle for the reason + "Transmission canceled". For this purpose, the procedure defined in + Section 5.10 MUST be followed. + +6. Administrative Record Processing + +6.1. Administrative Records + + Administrative records are standard ADUs that are used in providing + some of the features of the Bundle Protocol. Bundle Protocol + administrative record types are registered in the IANA "Bundle + Administrative Record Types" registry [RFC5050]; of these, only + administrative record type 1, "Bundle status report", is defined for + BPv7 at this time. Note that additional types of administrative + records may be defined by supplementary DTN protocol specification + documents. + + Every administrative record consists of: + + * A record type code (an unsigned integer for which valid values are + as defined below). + + * Record content in type-specific format. + + Each BP administrative record SHALL be represented as a CBOR array + comprising two items. + + The first item of the array SHALL be a record type code, which SHALL + be represented as a CBOR unsigned integer. + + The second element of this array SHALL be the applicable CBOR + encoding of the content of the record. Details of the CBOR encoding + of administrative record type 1 are provided below. Details of the + CBOR encoding of other types of administrative records are included + in the specifications defining those records. + +6.1.1. Bundle Status Reports + + The transmission of "bundle status reports" under specified + conditions is an option that can be invoked when transmission of a + bundle is requested. These reports are intended to provide + information about how bundles are progressing through the system, + including notices of receipt, forwarding, final delivery, and + deletion. They are transmitted to the report-to endpoints of + bundles. + + Each bundle status report SHALL be represented as a CBOR array. The + number of elements in the array SHALL be either 6 (if the subject + bundle is a fragment) or 4 (otherwise). + + The first element of the bundle status report SHALL be bundle status + information represented as a CBOR array of at least four elements. + The first four elements of the bundle status information shall + provide information on the following four status assertions, in this + order: + + * Reporting node received bundle. + + * Reporting node forwarded the bundle. + + * Reporting node delivered the bundle. + + * Reporting node deleted the bundle. + + Each element of the bundle status information SHALL be a bundle + status item encoded as a CBOR array. + + The number of elements in each bundle status item SHALL be either 2 + (if the value of the first element of the bundle status item is 1 AND + the "Report status time" flag was set to 1 in the bundle processing + control flags of the bundle whose status is being reported) or 1 + (otherwise). + + The first element of each bundle status item SHALL be a status + indicator, a Boolean value indicating whether or not the + corresponding bundle status is asserted, encoded as a CBOR Boolean + value. If present, the second element of each bundle status item + SHALL indicate the time (as reported by the local system clock; this + is an implementation matter) at which the indicated status was + asserted for this bundle, represented as a DTN time as described in + Section 4.2.6. + + The second element of the bundle status report SHALL be the bundle + status report reason code explaining the value of the status + indicator, represented as a CBOR unsigned integer. Valid status + report reason codes are registered in the IANA "Bundle Status Report + Reason Codes" subregistry in the "Bundle Protocol" registry (see + Section 9.5). The initial contents of that registry are listed in + Table 1, but the list of status report reason codes provided here is + neither exhaustive nor exclusive; supplementary DTN protocol + specifications (including, but not restricted to, Bundle Protocol + Security [BPSEC]) may define additional reason codes. + + +========+============================================+ + | Value | Meaning | + +========+============================================+ + | 0 | No additional information. | + +--------+--------------------------------------------+ + | 1 | Lifetime expired. | + +--------+--------------------------------------------+ + | 2 | Forwarded over unidirectional link. | + +--------+--------------------------------------------+ + | 3 | Transmission canceled. | + +--------+--------------------------------------------+ + | 4 | Depleted storage. | + +--------+--------------------------------------------+ + | 5 | Destination endpoint ID unavailable. | + +--------+--------------------------------------------+ + | 6 | No known route to destination from here. | + +--------+--------------------------------------------+ + | 7 | No timely contact with next node on route. | + +--------+--------------------------------------------+ + | 8 | Block unintelligible. | + +--------+--------------------------------------------+ + | 9 | Hop limit exceeded. | + +--------+--------------------------------------------+ + | 10 | Traffic pared (e.g., status reports). | + +--------+--------------------------------------------+ + | 11 | Block unsupported. | + +--------+--------------------------------------------+ + | 17-254 | Unassigned | + +--------+--------------------------------------------+ + | 255 | Reserved | + +--------+--------------------------------------------+ + + Table 1: Status Report Reason Codes + + The third element of the bundle status report SHALL be the source + node ID identifying the source of the bundle whose status is being + reported, represented as described in Section 4.2.5.1.1. + + The fourth element of the bundle status report SHALL be the creation + timestamp of the bundle whose status is being reported, represented + as described in Section 4.2.7. + + The fifth element of the bundle status report SHALL be present if and + only if the bundle whose status is being reported contained a + fragment offset. If present, it SHALL be the subject bundle's + fragment offset represented as a CBOR unsigned integer item. + + The sixth element of the bundle status report SHALL be present if and + only if the bundle whose status is being reported contained a + fragment offset. If present, it SHALL be the length of the subject + bundle's payload represented as a CBOR unsigned integer item. + + Note that the forwarding parameters (such as lifetime, applicable + security measures, etc.) of the bundle whose status is being reported + MAY be reflected in the parameters governing the forwarding of the + bundle that conveys a status report, but this is an implementation + matter. Bundle Protocol deployment experience to date has not been + sufficient to suggest any clear guidance on this topic. + +6.2. Generation of Administrative Records + + Whenever the application agent's administrative element is directed + by the BPA to generate an administrative record, the following + procedure must be followed: + + Step 1: The administrative record must be constructed. If the + administrative record references a bundle and the referenced + bundle is a fragment, the administrative record MUST contain + the fragment offset and fragment length. + + Step 2: A request for transmission of a bundle whose payload is this + administrative record MUST be presented to the BPA. + +7. Services Required of the Convergence Layer + +7.1. The Convergence Layer + + The successful operation of the end-to-end Bundle Protocol depends on + the operation of underlying protocols at what is termed the + "convergence layer"; these protocols accomplish communication between + nodes. A wide variety of protocols may serve this purpose, so long + as each CLA provides a defined minimal set of services to the BPA. + This convergence-layer service specification enumerates those + services. + +7.2. Summary of Convergence-Layer Services + + Each CLA is expected to provide the following services to the BPA: + + * sending a bundle to a bundle node that is reachable via the + convergence-layer protocol. + + * notifying the BPA of the disposition of its data-sending + procedures with regard to a bundle, upon concluding those + procedures. + + * delivering to the BPA a bundle that was sent by a bundle node via + the convergence-layer protocol. + + The convergence-layer service interface specified here is neither + exhaustive nor exclusive. That is, supplementary DTN protocol + specifications (including, but not restricted to, Bundle Protocol + Security [BPSEC]) may expect CLAs that serve BP implementations + conforming to those protocols to provide additional services such as + reporting on the transmission and/or reception progress of individual + bundles (at completion and/or incrementally), retransmitting data + that were lost in transit, discarding bundle-conveying data units + that the convergence-layer protocol determines are corrupt or + inauthentic, or reporting on the integrity and/or authenticity of + delivered bundles. + + In addition, the Bundle Protocol relies on the capabilities of + protocols at the convergence layer to minimize congestion in the + store-carry-forward overlay network. The potentially long round-trip + times characterizing delay-tolerant networks are incompatible with + end-to-end, reactive congestion-control mechanisms, so convergence- + layer protocols MUST provide rate limiting or congestion control. + +8. Security Considerations + + The Bundle Protocol security architecture and the available security + services are specified in an accompanying document, the Bundle + Protocol Security (BPSec) specification [BPSEC]. Whenever Bundle + Protocol security services (as opposed to the security services + provided by overlying application protocols or underlying + convergence-layer protocols) are required, those services SHALL be + provided by BPSec rather than by some other mechanism with the same + or similar scope. + + A Bundle Protocol Agent (BPA) that sources, cryptographically + verifies, and/or accepts a bundle MUST implement support for BPSec. + Use of BPSec for any single bundle is optional. + + The BPSec extensions to the Bundle Protocol enable each block of a + bundle (other than a BPSec extension block) to be individually + authenticated by a signature block (Block Integrity Block, or BIB) + and also enable each block of a bundle other than the primary block + (and the BPSec extension blocks themselves) to be individually + encrypted by a Block Confidentiality Block (BCB). + + Because the security mechanisms are extension blocks that are + themselves inserted into the bundle, the protections they afford + apply while the bundle is at rest, awaiting transmission at the next + forwarding opportunity, as well as in transit. + + Additionally, convergence-layer protocols that ensure authenticity of + communication between adjacent nodes in a BP network topology SHOULD + be used where available, to minimize the ability of unauthenticated + nodes to introduce inauthentic traffic into the network. + Convergence-layer protocols that ensure confidentiality of + communication between adjacent nodes in a BP network topology SHOULD + also be used where available, to minimize exposure of the bundle's + primary block and other cleartext blocks, thereby offering some + defense against traffic analysis. + + In order to provide authenticity and/or confidentiality of + communication between BP nodes, the convergence-layer protocol + requires as input the name or names of the expected communication + peer(s). These must be supplied by the CLA. Details of the means by + which the CLA determines which CL endpoint name(s) must be provided + to the CL protocol are out of scope for this specification. Note, + though, that when the CL endpoint names are a function of BP endpoint + IDs, the correctness and authenticity of that mapping will be vital + to the overall security properties that the CL provides to the + system. + + Note that, while the primary block must remain in the clear for + routing purposes, the Bundle Protocol could be protected against + traffic analysis to some extent by using bundle-in-bundle + encapsulation [BIBE] to tunnel bundles to a safe forward distribution + point: the encapsulated bundle could form the payload of an + encapsulating bundle, and that payload block could be encrypted by a + BCB. + + Note that the generation of bundle status reports is disabled by + default because malicious initiation of bundle status reporting could + result in the transmission of extremely large numbers of bundles, + effecting a denial-of-service attack. Imposing bundle lifetime + overrides would constitute one defense against such an attack. + + Note also that the reception of large numbers of fragmentary bundles + with very long lifetimes could constitute a denial-of-service attack, + occupying storage while pending reassembly that will never occur. + Imposing bundle lifetime overrides would, again, constitute one + defense against such an attack. + + This protocol makes use of absolute timestamps for several purposes. + Provisions are included for nodes without accurate clocks to retain + most of the protocol functionality, but nodes that are unaware that + their clock is inaccurate may exhibit unexpected behavior. + +9. IANA Considerations + + The Bundle Protocol includes fields requiring registries managed by + IANA. + +9.1. Bundle Block Types + + The "Bundle Block Types" subregistry in the "Bundle Protocol" + registry has been augmented by adding a column identifying the + version of the Bundle Protocol (Bundle Protocol Version) that applies + to the values. IANA has added the following values, as described in + Section 4.3.1, to the "Bundle Block Types" registry with a value of + "7" for the Bundle Protocol Version. IANA has set the Bundle + Protocol Version to "6" or "6,7" for preexisting values in the + "Bundle Block Types" registry, as shown below. + + +=================+=========+=========================+===========+ + | Bundle Protocol | Value | Description | Reference | + | Version | | | | + +=================+=========+=========================+===========+ + | none | 0 | Reserved | [RFC6255] | + +-----------------+---------+-------------------------+-----------+ + | 6,7 | 1 | Bundle Payload Block | [RFC5050] | + | | | | [RFC9171] | + +-----------------+---------+-------------------------+-----------+ + | 6 | 2 | Bundle Authentication | [RFC6257] | + | | | Block | | + +-----------------+---------+-------------------------+-----------+ + | 6 | 3 | Payload Integrity Block | [RFC6257] | + +-----------------+---------+-------------------------+-----------+ + | 6 | 4 | Payload Confidentiality | [RFC6257] | + | | | Block | | + +-----------------+---------+-------------------------+-----------+ + | 6 | 5 | Previous-Hop Insertion | [RFC6259] | + | | | Block | | + +-----------------+---------+-------------------------+-----------+ + | 7 | 6 | Previous node | [RFC9171] | + | | | (proximate sender) | | + +-----------------+---------+-------------------------+-----------+ + | 7 | 7 | Bundle age (in | [RFC9171] | + | | | milliseconds) | | + +-----------------+---------+-------------------------+-----------+ + | 6 | 8 | Metadata Extension | [RFC6258] | + | | | Block | | + +-----------------+---------+-------------------------+-----------+ + | 6 | 9 | Extension Security | [RFC6257] | + | | | Block | | + +-----------------+---------+-------------------------+-----------+ + | 7 | 10 | Hop count (#prior xmit | [RFC9171] | + | | | attempts) | | + +-----------------+---------+-------------------------+-----------+ + | 7 | 11-191 | Unassigned | | + +-----------------+---------+-------------------------+-----------+ + | 6,7 | 192-255 | Reserved for Private | [RFC5050] | + | | | and/or Experimental Use | [RFC9171] | + +-----------------+---------+-------------------------+-----------+ + + Table 2: "Bundle Block Types" Registry + +9.2. Primary Bundle Protocol Version + + IANA has added the following value to the "Primary Bundle Protocol + Version" subregistry in the "Bundle Protocol" registry. + + +=======+=============+===========+ + | Value | Description | Reference | + +=======+=============+===========+ + | 7 | Assigned | [RFC9171] | + +-------+-------------+-----------+ + + Table 3: "Primary Bundle + Protocol Version" Registry + + Values 8-255 (rather than 7-255) are now Unassigned. + +9.3. Bundle Processing Control Flags + + The "Bundle Processing Control Flags" subregistry in the "Bundle + Protocol" registry has been augmented by adding a column identifying + the version of the Bundle Protocol (Bundle Protocol Version) that + applies to the new values. IANA has added the following values, as + described in Section 4.2.3, to the "Bundle Processing Control Flags" + registry with a value of "7" for the Bundle Protocol Version. IANA + has set the Bundle Protocol Version to the value "6" or "6,7" for + preexisting values in the "Bundle Processing Control Flags" registry, + as shown below. + + +=================+=================+===================+===========+ + | Bundle Protocol | Bit Position | Description | Reference | + | Version | (right to | | | + | | left) | | | + +=================+=================+===================+===========+ + | 6,7 | 0 | Bundle is a | [RFC5050] | + | | | fragment | [RFC9171] | + +-----------------+-----------------+-------------------+-----------+ + | 6,7 | 1 | ADU is an | [RFC5050] | + | | | administrative | [RFC9171] | + | | | record | | + +-----------------+-----------------+-------------------+-----------+ + | 6,7 | 2 | Bundle must not | [RFC5050] | + | | | be fragmented | [RFC9171] | + +-----------------+-----------------+-------------------+-----------+ + | 6 | 3 | Custody transfer | [RFC5050] | + | | | is requested | | + +-----------------+-----------------+-------------------+-----------+ + | 6 | 4 | Destination | [RFC5050] | + | | | endpoint is a | | + | | | singleton | | + +-----------------+-----------------+-------------------+-----------+ + | 6,7 | 5 | Acknowledgement | [RFC5050] | + | | | by application is | [RFC9171] | + | | | requested | | + +-----------------+-----------------+-------------------+-----------+ + | 7 | 6 | Status time | [RFC9171] | + | | | requested in | | + | | | reports | | + +-----------------+-----------------+-------------------+-----------+ + | 6 | 7-8 | Class of service: | [RFC5050] | + | | | priority | | + +-----------------+-----------------+-------------------+-----------+ + | 6 | 9-13 | Class of service: | [RFC5050] | + | | | reserved | | + +-----------------+-----------------+-------------------+-----------+ + | 6,7 | 14 | Request reporting | [RFC5050] | + | | | of bundle | [RFC9171] | + | | | reception | | + +-----------------+-----------------+-------------------+-----------+ + | 6 | 15 | Request reporting | [RFC5050] | + | | | of custody | | + | | | acceptance | | + +-----------------+-----------------+-------------------+-----------+ + | 6,7 | 16 | Request reporting | [RFC5050] | + | | | of bundle | [RFC9171] | + | | | forwarding | | + +-----------------+-----------------+-------------------+-----------+ + | 6,7 | 17 | Request reporting | [RFC5050] | + | | | of bundle | [RFC9171] | + | | | delivery | | + +-----------------+-----------------+-------------------+-----------+ + | 6,7 | 18 | Request reporting | [RFC5050] | + | | | of bundle | [RFC9171] | + | | | deletion | | + +-----------------+-----------------+-------------------+-----------+ + | 6,7 | 19 | Reserved | [RFC5050] | + | | | | [RFC9171] | + +-----------------+-----------------+-------------------+-----------+ + | 6,7 | 20 | Reserved | [RFC5050] | + | | | | [RFC9171] | + +-----------------+-----------------+-------------------+-----------+ + | | 21-63 | Unassigned | | + +-----------------+-----------------+-------------------+-----------+ + + Table 4: "Bundle Processing Control Flags" Registry + +9.4. Block Processing Control Flags + + The "Block Processing Control Flags" subregistry in the "Bundle + Protocol" registry has been augmented by adding a column identifying + the version of the Bundle Protocol (Bundle Protocol Version) that + applies to the related BP version. IANA has set the Bundle Protocol + Version to the value "6" or "6,7" for preexisting values in the + "Bundle Processing Control Flags" registry, as shown below. + + +=================+==============+====================+===========+ + | Bundle Protocol | Bit Position | Description | Reference | + | Version | (right to | | | + | | left) | | | + +=================+==============+====================+===========+ + | 6,7 | 0 | Block must be | [RFC5050] | + | | | replicated in | [RFC9171] | + | | | every fragment | | + +-----------------+--------------+--------------------+-----------+ + | 6,7 | 1 | Transmit status | [RFC5050] | + | | | report if block | [RFC9171] | + | | | can't be processed | | + +-----------------+--------------+--------------------+-----------+ + | 6,7 | 2 | Delete bundle if | [RFC5050] | + | | | block can't be | [RFC9171] | + | | | processed | | + +-----------------+--------------+--------------------+-----------+ + | 6 | 3 | Last block | [RFC5050] | + +-----------------+--------------+--------------------+-----------+ + | 6,7 | 4 | Discard block if | [RFC5050] | + | | | it can't be | [RFC9171] | + | | | processed | | + +-----------------+--------------+--------------------+-----------+ + | 6 | 5 | Block was | [RFC5050] | + | | | forwarded without | | + | | | being processed | | + +-----------------+--------------+--------------------+-----------+ + | 6 | 6 | Block contains an | [RFC5050] | + | | | EID-reference | | + | | | field | | + +-----------------+--------------+--------------------+-----------+ + | | 7-63 | Unassigned | | + +-----------------+--------------+--------------------+-----------+ + + Table 5: "Block Processing Control Flags" Registry + +9.5. Bundle Status Report Reason Codes + + The "Bundle Status Report Reason Codes" subregistry in the "Bundle + Protocol" registry has been augmented by adding a column identifying + the version of the Bundle Protocol (Bundle Protocol Version) that + applies to the new values. IANA has added the following values, as + described in Section 6.1.1, to the "Bundle Status Report Reason + Codes" registry with a value of "7" for the Bundle Protocol Version. + IANA has set the Bundle Protocol Version to the value "6,7" for + preexisting values in the "Bundle Status Report Reason Codes" + registry, as shown below. + + +=================+========+========================+===========+ + | Bundle Protocol | Value | Description | Reference | + | Version | | | | + +=================+========+========================+===========+ + | 6,7 | 0 | No additional | [RFC5050] | + | | | information | [RFC9171] | + +-----------------+--------+------------------------+-----------+ + | 6,7 | 1 | Lifetime expired | [RFC5050] | + | | | | [RFC9171] | + +-----------------+--------+------------------------+-----------+ + | 6,7 | 2 | Forwarded over | [RFC5050] | + | | | unidirectional link | [RFC9171] | + +-----------------+--------+------------------------+-----------+ + | 6,7 | 3 | Transmission canceled | [RFC5050] | + | | | | [RFC9171] | + +-----------------+--------+------------------------+-----------+ + | 6,7 | 4 | Depleted storage | [RFC5050] | + | | | | [RFC9171] | + +-----------------+--------+------------------------+-----------+ + | 6,7 | 5 | Destination endpoint | [RFC5050] | + | | | ID unavailable | [RFC9171] | + +-----------------+--------+------------------------+-----------+ + | 6,7 | 6 | No known route to | [RFC5050] | + | | | destination from here | [RFC9171] | + +-----------------+--------+------------------------+-----------+ + | 6,7 | 7 | No timely contact with | [RFC5050] | + | | | next node on route | [RFC9171] | + +-----------------+--------+------------------------+-----------+ + | 6,7 | 8 | Block unintelligible | [RFC5050] | + | | | | [RFC9171] | + +-----------------+--------+------------------------+-----------+ + | 7 | 9 | Hop limit exceeded | [RFC9171] | + +-----------------+--------+------------------------+-----------+ + | 7 | 10 | Traffic pared | [RFC9171] | + +-----------------+--------+------------------------+-----------+ + | 7 | 11 | Block unsupported | [RFC9171] | + +-----------------+--------+------------------------+-----------+ + | | 17-254 | Unassigned | | + +-----------------+--------+------------------------+-----------+ + | 6,7 | 255 | Reserved | [RFC6255] | + | | | | [RFC9171] | + +-----------------+--------+------------------------+-----------+ + + Table 6: "Bundle Status Report Reason Codes" Registry + +9.6. Bundle Protocol URI Scheme Types + + The Bundle Protocol has a URI scheme type field -- an unsigned + integer of indefinite length -- for which IANA has created, and will + maintain, a new "Bundle Protocol URI Scheme Types" subregistry in the + "Bundle Protocol" registry. The "Bundle Protocol URI Scheme Types" + registry governs a namespace of unsigned integers. Initial values + for the "Bundle Protocol URI Scheme Types" registry are given below. + + The registration policy for this registry is Standards Action + [RFC8126]. The allocation should only be granted for a Standards + Track RFC approved by the IESG. + + The range of values is provided as unsigned integers. + + Each assignment consists of a URI scheme type name and its associated + description, a reference to the document that defines the URI scheme, + and a reference to the document that defines the use of this URI + scheme in BP endpoint IDs (including the CBOR encoding of those + endpoint IDs in transmitted bundles). + + +===========+==============+================+================+ + | Value | Description | BP Utilization | URI Definition | + | | | Reference | Reference | + +===========+==============+================+================+ + | 0 | Reserved | n/a | | + +-----------+--------------+----------------+----------------+ + | 1 | dtn | [RFC9171] | [RFC9171] | + +-----------+--------------+----------------+----------------+ + | 2 | ipn | [RFC9171] | [RFC6260] | + | | | | [RFC9171] | + +-----------+--------------+----------------+----------------+ + | 3-254 | Unassigned | n/a | | + +-----------+--------------+----------------+----------------+ + | 255-65535 | Reserved | n/a | | + +-----------+--------------+----------------+----------------+ + | >65535 | Reserved for | n/a | | + | | Private Use | | | + +-----------+--------------+----------------+----------------+ + + Table 7: "Bundle Protocol URI Scheme Types" Registry + +9.7. dtn URI Scheme + + In the "Uniform Resource Identifier (URI) Schemes" (uri-schemes) + registry, IANA has updated the registration of the URI scheme with + the string "dtn" as the scheme name, as follows: + + URI scheme name: "dtn" + + Status: Permanent + + Applications and/or protocols that use this URI scheme name: The + Delay-Tolerant Networking (DTN) Bundle Protocol (BP). + + Contact: Scott Burleigh <sburleig.sb@gmail.com> + + Change controller: IETF (iesg@ietf.org) + + Reference: [RFC9171] + +9.8. ipn URI Scheme + + In the "Uniform Resource Identifier (URI) Schemes" (uri-schemes) + registry, IANA has updated the registration of the URI scheme with + the string "ipn" as the scheme name, originally documented in RFC + 6260 [RFC6260], as follows. + + URI scheme name: "ipn" + + Status: Permanent + + Applications and/or protocols that use this URI scheme name: The + Delay-Tolerant Networking (DTN) Bundle Protocol (BP). + + Contact: Scott Burleigh <sburleig.sb@gmail.com> + + Change controller: IETF (iesg@ietf.org) + + Reference: [RFC9171] + +10. References + +10.1. Normative References + + [BPSEC] Birrane, III, E. and K. McKeever, "Bundle Protocol + Security (BPSec)", RFC 9172, DOI 10.17487/RFC9172, January + 2022, <https://www.rfc-editor.org/info/rfc9172>. + + [CRC16] ITU-T, "X.25: Interface between Data Terminal Equipment + (DTE) and Data Circuit-terminating Equipment (DCE) for + terminals operating in the packet mode and connected to + public data networks by dedicated circuit", p. 9, + Section 2.2.7.4, ITU-T Recommendation X.25, October 1996, + <https://www.itu.int/rec/T-REC-X.25-199610-I/>. + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + <https://www.rfc-editor.org/info/rfc2119>. + + [RFC4960] Stewart, R., Ed., "Stream Control Transmission Protocol", + RFC 4960, DOI 10.17487/RFC4960, September 2007, + <https://www.rfc-editor.org/info/rfc4960>. + + [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", STD 68, RFC 5234, + DOI 10.17487/RFC5234, January 2008, + <https://www.rfc-editor.org/info/rfc5234>. + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, <https://www.rfc-editor.org/info/rfc8174>. + + [RFC8949] Bormann, C. and P. Hoffman, "Concise Binary Object + Representation (CBOR)", STD 94, RFC 8949, + DOI 10.17487/RFC8949, December 2020, + <https://www.rfc-editor.org/info/rfc8949>. + + [SABR] Consultative Committee for Space Data Systems, "Schedule- + Aware Bundle Routing", CCSDS Recommended + Standard 734.3-B-1, July 2019, + <https://public.ccsds.org/Pubs/734x3b1.pdf>. + + [TCPCL] Sipos, B., Demmer, M., Ott, J., and S. Perreault, "Delay- + Tolerant Networking TCP Convergence-Layer Protocol Version + 4", RFC 9174, DOI 10.17487/RFC9174, January 2022, + <https://www.rfc-editor.org/info/rfc9174>. + + [URI] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform + Resource Identifier (URI): Generic Syntax", STD 66, + RFC 3986, DOI 10.17487/RFC3986, January 2005, + <https://www.rfc-editor.org/info/rfc3986>. + + [URIREG] Thaler, D., Ed., Hansen, T., and T. Hardie, "Guidelines + and Registration Procedures for URI Schemes", BCP 35, + RFC 7595, DOI 10.17487/RFC7595, June 2015, + <https://www.rfc-editor.org/info/rfc7595>. + +10.2. Informative References + + [ARCH] Cerf, V., Burleigh, S., Hooke, A., Torgerson, L., Durst, + R., Scott, K., Fall, K., and H. Weiss, "Delay-Tolerant + Networking Architecture", RFC 4838, DOI 10.17487/RFC4838, + April 2007, <https://www.rfc-editor.org/info/rfc4838>. + + [BIBE] Burleigh, S., "Bundle-in-Bundle Encapsulation", Work in + Progress, Internet-Draft, draft-ietf-dtn-bibect-03, 18 + February 2020, <https://datatracker.ietf.org/doc/html/ + draft-ietf-dtn-bibect-03>. + + [RFC3987] Duerst, M. and M. Suignard, "Internationalized Resource + Identifiers (IRIs)", RFC 3987, DOI 10.17487/RFC3987, + January 2005, <https://www.rfc-editor.org/info/rfc3987>. + + [RFC5050] Scott, K. and S. Burleigh, "Bundle Protocol + Specification", RFC 5050, DOI 10.17487/RFC5050, November + 2007, <https://www.rfc-editor.org/info/rfc5050>. + + [RFC6255] Blanchet, M., "Delay-Tolerant Networking Bundle Protocol + IANA Registries", RFC 6255, DOI 10.17487/RFC6255, May + 2011, <https://www.rfc-editor.org/info/rfc6255>. + + [RFC6257] Symington, S., Farrell, S., Weiss, H., and P. Lovell, + "Bundle Security Protocol Specification", RFC 6257, + DOI 10.17487/RFC6257, May 2011, + <https://www.rfc-editor.org/info/rfc6257>. + + [RFC6258] Symington, S., "Delay-Tolerant Networking Metadata + Extension Block", RFC 6258, DOI 10.17487/RFC6258, May + 2011, <https://www.rfc-editor.org/info/rfc6258>. + + [RFC6259] Symington, S., "Delay-Tolerant Networking Previous-Hop + Insertion Block", RFC 6259, DOI 10.17487/RFC6259, May + 2011, <https://www.rfc-editor.org/info/rfc6259>. + + [RFC6260] Burleigh, S., "Compressed Bundle Header Encoding (CBHE)", + RFC 6260, DOI 10.17487/RFC6260, May 2011, + <https://www.rfc-editor.org/info/rfc6260>. + + [RFC7143] Chadalapaka, M., Satran, J., Meth, K., and D. Black, + "Internet Small Computer System Interface (iSCSI) Protocol + (Consolidated)", RFC 7143, DOI 10.17487/RFC7143, April + 2014, <https://www.rfc-editor.org/info/rfc7143>. + + [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for + Writing an IANA Considerations Section in RFCs", BCP 26, + RFC 8126, DOI 10.17487/RFC8126, June 2017, + <https://www.rfc-editor.org/info/rfc8126>. + + [SIGC] Fall, K., "A Delay-Tolerant Network Architecture for + Challenged Internets", SIGCOMM 2003, + DOI 10.1145/863955.863960, August 2003, + <https://dl.acm.org/doi/10.1145/863955.863960>. + +Appendix A. Significant Changes from RFC 5050 + + This document makes the following significant changes from RFC 5050: + + * Clarifies the difference between transmission and forwarding. + + * Migrates custody transfer to the bundle-in-bundle encapsulation + specification [BIBE]. + + * Introduces the concept of "node ID" as functionally distinct from + endpoint ID, while having the same syntax. + + * Restructures primary block, making it immutable. Adds optional + CRC. + + * Adds optional CRCs to non-primary blocks. + + * Adds block ID number to canonical block format (to support BPSec). + + * Adds definition of Bundle Age extension block. + + * Adds definition of Previous Node extension block. + + * Adds definition of Hop Count extension block. + + * Removes Quality of Service markings. + + * Changes from Self-Delimiting Numeric Values (SDNVs) to CBOR + encoding. + + * Adds lifetime overrides. + + * Clarifies that time values are denominated in milliseconds, not + seconds. + +Appendix B. CDDL Expression + + For informational purposes, Carsten Bormann and Brian Sipos have + kindly provided an expression of the Bundle Protocol specification in + the Concise Data Definition Language (CDDL). That CDDL expression is + presented below. Note that wherever the CDDL expression is in + disagreement with the textual representation of the BP specification + presented in the earlier sections of this document, the textual + representation rules. + + bpv7_start = bundle / #6.55799(bundle) + + ; Times before 2000 are invalid + + dtn-time = uint + + ; CRC enumerated type + + crc-type = &( + + crc-none: 0, + + crc-16bit: 1, + + crc-32bit: 2 + + ) + + ; Either 16-bit or 32-bit + + crc-value = (bstr .size 2) / (bstr .size 4) + + creation-timestamp = [ + + dtn-time, ; absolute time of creation + + sequence: uint ; sequence within the time + + ] + + eid = $eid .within eid-structure + + eid-structure = [ + + uri-code: uint, + + SSP: any + + ] + + $eid /= [ + + uri-code: 1, + + SSP: (tstr / 0) + + ] + + $eid /= [ + + uri-code: 2, + + SSP: [ + + nodenum: uint, + + servicenum: uint + + ] + + ] + + ; The root bundle array + + bundle = [primary-block, *extension-block, payload-block] + + primary-block = [ + + version: 7, + + bundle-control-flags, + + crc-type, + + destination: eid, + + source-node: eid, + + report-to: eid, + + creation-timestamp, + + lifetime: uint, + + ? ( + + fragment-offset: uint, + + total-application-data-length: uint + + ), + + ? crc-value, + + ] + + bundle-control-flags = uint .bits bundleflagbits + + bundleflagbits = &( + + reserved: 20, + + reserved: 19, + + bundle-deletion-status-reports-are-requested: 18, + + bundle-delivery-status-reports-are-requested: 17, + + bundle-forwarding-status-reports-are-requested: 16, + + reserved: 15, + + bundle-reception-status-reports-are-requested: 14, + + reserved: 13, + + reserved: 12, + + reserved: 11, + + reserved: 10, + + reserved: 9, + + reserved: 8, + + reserved: 7, + + status-time-is-requested-in-all-status-reports: 6, + + user-application-acknowledgement-is-requested: 5, + + reserved: 4, + + reserved: 3, + + bundle-must-not-be-fragmented: 2, + + payload-is-an-administrative-record: 1, + + bundle-is-a-fragment: 0 + + ) + + ; Abstract shared structure of all non-primary blocks + + canonical-block-structure = [ + + block-type-code: uint, + + block-number: uint, + + block-control-flags, + + crc-type, + + ; Each block type defines the content within the byte string + + block-type-specific-data, + + ? crc-value + + ] + + block-control-flags = uint .bits blockflagbits + + blockflagbits = &( + + reserved: 7, + + reserved: 6, + + reserved: 5, + + block-must-be-removed-from-bundle-if-it-cannot-be-processed: 4, + + reserved: 3, + + bundle-must-be-deleted-if-block-cannot-be-processed: 2, + + status-report-must-be-transmitted-if-block-cannot-be-processed: + 1, + + block-must-be-replicated-in-every-fragment: 0 + + ) + + block-type-specific-data = bstr / #6.24(bstr) + + ; Actual CBOR data embedded in a byte string, with optional tag to + indicate so. + + ; Additional plain bstr allows ciphertext data. + + embedded-cbor<Item> = (bstr .cbor Item) / #6.24(bstr .cbor Item) / + bstr + + ; Extension block type, which does not specialize other than the + code/number + + extension-block = + $extension-block .within canonical-block-structure + + ; Generic shared structure of all non-primary blocks + + extension-block-use<CodeValue, BlockData> = [ + + block-type-code: CodeValue, + + block-number: (uint .gt 1), + + block-control-flags, + + crc-type, + + BlockData, + + ? crc-value + + ] + + ; Payload block type + + payload-block = payload-block-structure .within canonical-block- + structure + + payload-block-structure = [ + + block-type-code: 1, + + block-number: 1, + + block-control-flags, + + crc-type, + + $payload-block-data, + + ? crc-value + + ] + + ; Arbitrary payload data, including non-CBOR byte string + + $payload-block-data /= block-type-specific-data + + ; Administrative record as a payload data specialization + + $payload-block-data /= embedded-cbor<admin-record> + + admin-record = $admin-record .within admin-record-structure + + admin-record-structure = [ + + record-type-code: uint, + + record-content: any + + ] + + ; Only one defined record type + + $admin-record /= [1, status-record-content] + + status-record-content = [ + + bundle-status-information, + + status-report-reason-code: uint, + + source-node-eid: eid, + + subject-creation-timestamp: creation-timestamp, + + ? ( + + subject-payload-offset: uint, + + subject-payload-length: uint + + ) + + ] + + bundle-status-information = [ + + reporting-node-received-bundle: status-info-content, + + reporting-node-forwarded-bundle: status-info-content, + + reporting-node-delivered-bundle: status-info-content, + + reporting-node-deleted-bundle: status-info-content + + ] + + status-info-content = [ + + status-indicator: bool, + + ? timestamp: dtn-time + + ] + + ; Previous Node extension block + + $extension-block /= + + extension-block-use<6, embedded-cbor<ext-data-previous-node>> + + ext-data-previous-node = eid + + ; Bundle Age extension block + + $extension-block /= + + extension-block-use<7, embedded-cbor<ext-data-bundle-age>> + + ext-data-bundle-age = uint + + ; Hop Count extension block + + $extension-block /= + + extension-block-use<10, embedded-cbor<ext-data-hop-count>> + + ext-data-hop-count = [ + + hop-limit: uint, + + hop-count: uint + + ] + +Acknowledgments + + This work is freely adapted from RFC 5050, which was an effort of the + Delay-Tolerant Networking Research Group. The following DTNRG + participants contributed significant technical material and/or inputs + to that document: Dr. Vinton Cerf of Google; Scott Burleigh, Adrian + Hooke, and Leigh Torgerson of the Jet Propulsion Laboratory; Michael + Demmer of the University of California at Berkeley; Robert Durst, + Keith Scott, and Susan Symington of The MITRE Corporation; Kevin Fall + of Carnegie Mellon University; Stephen Farrell of Trinity College + Dublin; Howard Weiss and Peter Lovell of SPARTA, Inc.; and Manikantan + Ramadas of Ohio University. + + Scott Burleigh would like to thank the Jet Propulsion Laboratory, + California Institute of Technology, for its generous and sustained + support of this work. + +Authors' Addresses + + Scott Burleigh + IPNGROUP + 1435 Woodhurst Blvd. + McLean, VA 22102 + United States of America + + Email: sburleig.sb@gmail.com + + + Kevin Fall + Roland Computing Services + 3871 Piedmont Ave. Suite 8 + Oakland, CA 94611 + United States of America + + Email: kfall+rcs@kfall.com + + + Edward J. Birrane, III + Johns Hopkins University Applied Physics Laboratory + 11100 Johns Hopkins Rd + Laurel, MD 20723 + United States of America + + Phone: +1 443 778 7423 + Email: Edward.Birrane@jhuapl.edu |