rfc9174.original | rfc9174.txt | |||
---|---|---|---|---|
Delay-Tolerant Networking B. Sipos | Internet Engineering Task Force (IETF) B. Sipos | |||
Internet-Draft RKF Engineering | Request for Comments: 9174 RKF Engineering | |||
Intended status: Standards Track M. Demmer | Category: Standards Track M. Demmer | |||
Expires: 9 April 2022 UC Berkeley | ISSN: 2070-1721 | |||
J. Ott | J. Ott | |||
Aalto University | Technical University of Munich | |||
S. Perreault | S. Perreault | |||
6 October 2021 | LogMeIn | |||
January 2022 | ||||
Delay-Tolerant Networking TCP Convergence Layer Protocol Version 4 | Delay-Tolerant Networking TCP Convergence-Layer Protocol Version 4 | |||
draft-ietf-dtn-tcpclv4-28 | ||||
Abstract | Abstract | |||
This document describes a TCP-based convergence layer (TCPCL) for | This document describes a TCP convergence layer (TCPCL) for Delay- | |||
Delay-Tolerant Networking (DTN). This version of the TCPCL protocol | Tolerant Networking (DTN). This version of the TCPCL protocol | |||
resolves implementation issues in the earlier TCPCL Version 3 of | resolves implementation issues in the earlier TCPCL version 3 as | |||
RFC7242 and updates to the Bundle Protocol (BP) contents, encodings, | defined in RFC 7242 and provides updates to the Bundle Protocol (BP) | |||
and convergence layer requirements in BP Version 7. Specifically, | contents, encodings, and convergence-layer requirements in BP version | |||
the TCPCLv4 uses CBOR-encoded BPv7 bundles as its service data unit | 7 (BPv7). Specifically, TCPCLv4 uses BPv7 bundles encoded by the | |||
Concise Binary Object Representation (CBOR) as its service data unit | ||||
being transported and provides a reliable transport of such bundles. | being transported and provides a reliable transport of such bundles. | |||
This version of TCPCL also includes security and extensibility | This TCPCL version also includes security and extensibility | |||
mechanisms. | mechanisms. | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
provisions of BCP 78 and BCP 79. | ||||
Internet-Drafts are working documents of the Internet Engineering | ||||
Task Force (IETF). Note that other groups may also distribute | ||||
working documents as Internet-Drafts. The list of current Internet- | ||||
Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
Internet Standards is available in Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on 9 April 2022. | 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/rfc9174. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2022 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
extracted from this document must include Simplified BSD License text | to this document. Code Components extracted from this document must | |||
as described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
provided without warranty as described in the Simplified BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
in the Revised BSD License. | ||||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction | |||
1.1. Scope . . . . . . . . . . . . . . . . . . . . . . . . . . 5 | 1.1. Scope | |||
2. Requirements Language . . . . . . . . . . . . . . . . . . . . 5 | 2. Requirements Language | |||
2.1. Definitions Specific to the TCPCL Protocol . . . . . . . 6 | 2.1. Definitions Specific to the TCPCL Protocol | |||
3. General Protocol Description . . . . . . . . . . . . . . . . 9 | 3. General Protocol Description | |||
3.1. Convergence Layer Services . . . . . . . . . . . . . . . 9 | 3.1. Convergence-Layer Services | |||
3.2. TCPCL Session Overview . . . . . . . . . . . . . . . . . 12 | 3.2. TCPCL Session Overview | |||
3.3. TCPCL States and Transitions . . . . . . . . . . . . . . 13 | 3.3. TCPCL States and Transitions | |||
3.4. PKIX Environments and CA Policy . . . . . . . . . . . . . 19 | 3.4. PKIX Environments and CA Policy | |||
3.5. Session Keeping Policies . . . . . . . . . . . . . . . . 20 | 3.5. Session-Keeping Policies | |||
3.6. Transfer Segmentation Policies . . . . . . . . . . . . . 21 | 3.6. Transfer Segmentation Policies | |||
3.7. Example Message Exchange . . . . . . . . . . . . . . . . 22 | 3.7. Example Message Exchange | |||
4. Session Establishment . . . . . . . . . . . . . . . . . . . . 24 | 4. Session Establishment | |||
4.1. TCP Connection . . . . . . . . . . . . . . . . . . . . . 24 | 4.1. TCP Connection | |||
4.2. Contact Header . . . . . . . . . . . . . . . . . . . . . 25 | 4.2. Contact Header | |||
4.3. Contact Validation and Negotiation . . . . . . . . . . . 26 | 4.3. Contact Validation and Negotiation | |||
4.4. Session Security . . . . . . . . . . . . . . . . . . . . 28 | 4.4. Session Security | |||
4.4.1. Entity Identification . . . . . . . . . . . . . . . . 28 | 4.4.1. Entity Identification | |||
4.4.2. Certificate Profile for TCPCL . . . . . . . . . . . . 29 | 4.4.2. Certificate Profile for the TCPCL | |||
4.4.3. TLS Handshake . . . . . . . . . . . . . . . . . . . . 31 | 4.4.3. TLS Handshake | |||
4.4.4. TLS Authentication . . . . . . . . . . . . . . . . . 32 | 4.4.4. TLS Authentication | |||
4.4.5. Policy Recommendations . . . . . . . . . . . . . . . 34 | 4.4.5. Policy Recommendations | |||
4.4.6. Example TLS Initiation . . . . . . . . . . . . . . . 34 | 4.4.6. Example TLS Initiation | |||
4.5. Message Header . . . . . . . . . . . . . . . . . . . . . 36 | 4.5. Message Header | |||
4.6. Session Initialization Message (SESS_INIT) . . . . . . . 37 | 4.6. Session Initialization Message (SESS_INIT) | |||
4.7. Session Parameter Negotiation . . . . . . . . . . . . . . 39 | 4.7. Session Parameter Negotiation | |||
4.8. Session Extension Items . . . . . . . . . . . . . . . . . 40 | 4.8. Session Extension Items | |||
5. Established Session Operation . . . . . . . . . . . . . . . . 41 | 5. Established Session Operation | |||
5.1. Upkeep and Status Messages . . . . . . . . . . . . . . . 41 | 5.1. Upkeep and Status Messages | |||
5.1.1. Session Upkeep (KEEPALIVE) . . . . . . . . . . . . . 41 | 5.1.1. Session Upkeep (KEEPALIVE) | |||
5.1.2. Message Rejection (MSG_REJECT) . . . . . . . . . . . 42 | 5.1.2. Message Rejection (MSG_REJECT) | |||
5.2. Bundle Transfer . . . . . . . . . . . . . . . . . . . . . 44 | 5.2. Bundle Transfer | |||
5.2.1. Bundle Transfer ID . . . . . . . . . . . . . . . . . 45 | 5.2.1. Bundle Transfer ID | |||
5.2.2. Data Transmission (XFER_SEGMENT) . . . . . . . . . . 45 | 5.2.2. Data Transmission (XFER_SEGMENT) | |||
5.2.3. Data Acknowledgments (XFER_ACK) . . . . . . . . . . . 47 | 5.2.3. Data Acknowledgments (XFER_ACK) | |||
5.2.4. Transfer Refusal (XFER_REFUSE) . . . . . . . . . . . 49 | 5.2.4. Transfer Refusal (XFER_REFUSE) | |||
5.2.5. Transfer Extension Items . . . . . . . . . . . . . . 51 | 5.2.5. Transfer Extension Items | |||
6. Session Termination | ||||
6. Session Termination . . . . . . . . . . . . . . . . . . . . . 53 | 6.1. Session Termination Message (SESS_TERM) | |||
6.1. Session Termination Message (SESS_TERM) . . . . . . . . . 53 | 6.2. Idle Session Termination | |||
6.2. Idle Session Shutdown . . . . . . . . . . . . . . . . . . 56 | 7. Security Considerations | |||
7. Implementation Status . . . . . . . . . . . . . . . . . . . . 56 | 7.1. Threat: Passive Leak of Node Data | |||
8. Security Considerations . . . . . . . . . . . . . . . . . . . 57 | 7.2. Threat: Passive Leak of Bundle Data | |||
8.1. Threat: Passive Leak of Node Data . . . . . . . . . . . . 57 | 7.3. Threat: TCPCL Version Downgrade | |||
8.2. Threat: Passive Leak of Bundle Data . . . . . . . . . . . 57 | 7.4. Threat: Transport Security Stripping | |||
8.3. Threat: TCPCL Version Downgrade . . . . . . . . . . . . . 57 | 7.5. Threat: Weak TLS Configurations | |||
8.4. Threat: Transport Security Stripping . . . . . . . . . . 57 | 7.6. Threat: Untrusted End-Entity Certificate | |||
8.5. Threat: Weak TLS Configurations . . . . . . . . . . . . . 58 | 7.7. Threat: Certificate Validation Vulnerabilities | |||
8.6. Threat: Untrusted End-Entity Certificate . . . . . . . . 58 | 7.8. Threat: Symmetric Key Limits | |||
8.7. Threat: Certificate Validation Vulnerabilities . . . . . 58 | 7.9. Threat: BP Node Impersonation | |||
8.8. Threat: Symmetric Key Limits . . . . . . . . . . . . . . 59 | 7.10. Threat: Denial of Service | |||
8.9. Threat: BP Node Impersonation . . . . . . . . . . . . . . 59 | 7.11. Mandatory-to-Implement TLS | |||
8.10. Threat: Denial of Service . . . . . . . . . . . . . . . . 60 | 7.12. Alternate Uses of TLS | |||
8.11. Mandatory-to-Implement TLS . . . . . . . . . . . . . . . 61 | 7.12.1. TLS without Authentication | |||
8.12. Alternate Uses of TLS . . . . . . . . . . . . . . . . . . 61 | 7.12.2. Non-certificate TLS Use | |||
8.12.1. TLS Without Authentication . . . . . . . . . . . . . 61 | 7.13. Predictability of Transfer IDs | |||
8.12.2. Non-Certificate TLS Use . . . . . . . . . . . . . . 61 | 8. IANA Considerations | |||
8.13. Predictability of Transfer IDs . . . . . . . . . . . . . 62 | 8.1. Port Number | |||
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 62 | 8.2. Protocol Versions | |||
9.1. Port Number . . . . . . . . . . . . . . . . . . . . . . . 62 | 8.3. Session Extension Types | |||
9.2. Protocol Versions . . . . . . . . . . . . . . . . . . . . 63 | 8.4. Transfer Extension Types | |||
9.3. Session Extension Types . . . . . . . . . . . . . . . . . 64 | 8.5. Message Types | |||
9.4. Transfer Extension Types . . . . . . . . . . . . . . . . 64 | 8.6. XFER_REFUSE Reason Codes | |||
9.5. Message Types . . . . . . . . . . . . . . . . . . . . . . 65 | 8.7. SESS_TERM Reason Codes | |||
9.6. XFER_REFUSE Reason Codes . . . . . . . . . . . . . . . . 66 | 8.8. MSG_REJECT Reason Codes | |||
9.7. SESS_TERM Reason Codes . . . . . . . . . . . . . . . . . 67 | 8.9. Object Identifier for PKIX Module Identifier | |||
9.8. MSG_REJECT Reason Codes . . . . . . . . . . . . . . . . . 68 | 8.10. Object Identifier for PKIX Other Name Forms | |||
9.9. Object Identifier for PKIX Module Identifier . . . . . . 69 | 8.11. Object Identifier for PKIX Extended Key Usage | |||
9.10. Object Identifier for PKIX Other Name Forms . . . . . . . 69 | 9. References | |||
9.11. Object Identifier for PKIX Extended Key Usage . . . . . . 70 | 9.1. Normative References | |||
10. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 70 | 9.2. Informative References | |||
11. References . . . . . . . . . . . . . . . . . . . . . . . . . 70 | Appendix A. Significant Changes from RFC 7242 | |||
11.1. Normative References . . . . . . . . . . . . . . . . . . 70 | Appendix B. ASN.1 Module | |||
11.2. Informative References . . . . . . . . . . . . . . . . . 72 | Appendix C. Example of the BundleEID Other Name Form | |||
Appendix A. Significant changes from RFC7242 . . . . . . . . . . 74 | Acknowledgments | |||
Appendix B. ASN.1 Module . . . . . . . . . . . . . . . . . . . . 76 | Authors' Addresses | |||
Appendix C. Example of the BundleEID Other Name Form . . . . . . 78 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 78 | ||||
1. Introduction | 1. Introduction | |||
This document describes the TCP-based convergence-layer protocol for | This document describes the TCP convergence-layer protocol for Delay- | |||
Delay-Tolerant Networking. Delay-Tolerant Networking is an end-to- | Tolerant Networking (DTN). DTN is an end-to-end architecture | |||
end architecture providing communications in and/or through highly | providing communications in and/or through highly stressed | |||
stressed environments, including those with intermittent | environments, including those with intermittent connectivity, long | |||
connectivity, long and/or variable delays, and high bit error rates. | and/or variable delays, and high bit error rates. More detailed | |||
More detailed descriptions of the rationale and capabilities of these | descriptions of the rationale and capabilities of these networks can | |||
networks can be found in "Delay-Tolerant Network Architecture" | be found in "Delay-Tolerant Networking Architecture" [RFC4838]. | |||
[RFC4838]. | ||||
An important goal of the DTN architecture is to accommodate a wide | An important goal of the DTN architecture is to accommodate a wide | |||
range of networking technologies and environments. The protocol used | range of networking technologies and environments. The protocol used | |||
for DTN communications is the Bundle Protocol Version 7 (BPv7) | for DTN communications is the Bundle Protocol version 7 (BPv7) | |||
[I-D.ietf-dtn-bpbis], an application-layer protocol that is used to | [RFC9171], an application-layer protocol that is used to construct a | |||
construct a store-and-forward overlay network. BPv7 requires the | store-and-forward overlay network. BPv7 requires the services of a | |||
services of a "convergence-layer adapter" (CLA) to send and receive | "convergence-layer adapter" (CLA) to send and receive bundles using | |||
bundles using the service of some "native" link, network, or Internet | the service of some "native" link, network, or Internet protocol. | |||
protocol. This document describes one such convergence-layer adapter | This document describes one such convergence-layer adapter that uses | |||
that uses the well-known Transmission Control Protocol (TCP). This | the well-known Transmission Control Protocol (TCP). This convergence | |||
convergence layer is referred to as TCP Convergence Layer Version 4 | layer is referred to as TCP Convergence Layer version 4 (TCPCLv4). | |||
(TCPCLv4). For the remainder of this document, the abbreviation "BP" | For the remainder of this document, | |||
without the version suffix refers to BPv7. For the remainder of this | ||||
document, the abbreviation "TCPCL" without the version suffix refers | ||||
to TCPCLv4. | ||||
The locations of the TCPCL and the BP in the Internet model protocol | * the abbreviation "BP" without the version suffix refers to BPv7. | |||
stack (described in [RFC1122]) are shown in Figure 1. In particular, | ||||
when BP is using TCP as its bearer with TCPCL as its convergence | * the abbreviation "TCPCL" without the version suffix refers to | |||
layer, both BP and TCPCL reside at the application layer of the | TCPCLv4. | |||
Internet model. | ||||
The locations of the TCPCL and the Bundle Protocol in the Internet | ||||
model protocol stack (described in [RFC1122]) are shown in Figure 1. | ||||
In particular, when BP is using TCP as its bearer with the TCPCL as | ||||
its convergence layer, both BP and the TCPCL reside at the | ||||
application layer of the Internet model. | ||||
+-------------------------+ | +-------------------------+ | |||
| DTN Application | -\ | | DTN Application | -\ | |||
+-------------------------| | | +-------------------------| | | |||
| Bundle Protocol (BP) | -> Application Layer | | Bundle Protocol (BP) | -> Application Layer | |||
+-------------------------+ | | +-------------------------+ | | |||
| TCP Conv. Layer (TCPCL) | | | | TCP Conv. Layer (TCPCL) | | | |||
+-------------------------+ | | +-------------------------+ | | |||
| TLS (optional) | -/ | | TLS (optional) | -/ | |||
+-------------------------+ | +-------------------------+ | |||
skipping to change at page 5, line 15 ¶ | skipping to change at line 194 ¶ | |||
Figure 1: The Locations of the Bundle Protocol and the TCP | Figure 1: The Locations of the Bundle Protocol and the TCP | |||
Convergence-Layer Protocol above the Internet Protocol Stack | Convergence-Layer Protocol above the Internet Protocol Stack | |||
1.1. Scope | 1.1. Scope | |||
This document describes the format of the protocol data units passed | This document describes the format of the protocol data units passed | |||
between entities participating in TCPCL communications. This | between entities participating in TCPCL communications. This | |||
document does not address: | document does not address: | |||
* The format of protocol data units of the Bundle Protocol, as those | * The format of protocol data units of the Bundle Protocol, as those | |||
are defined elsewhere in [I-D.ietf-dtn-bpbis]. This includes the | are defined elsewhere in [RFC9171]. This includes the concept of | |||
concept of bundle fragmentation or bundle encapsulation. The | bundle fragmentation or bundle encapsulation. The TCPCL transfers | |||
TCPCL transfers bundles as opaque data blocks. | bundles as opaque data blocks. | |||
* Mechanisms for locating or identifying other bundle entities | * Mechanisms for locating or identifying other bundle entities | |||
(peers) within a network or across an internet. The mapping of | (peers) within a network or across an internet. The mapping of a | |||
Node ID to potential convergence layer (CL) protocol and network | node ID to a potential convergence layer (CL) protocol and network | |||
address is left to implementation and configuration of the BP | address is left to implementation and configuration of the BP | |||
Agent and its various potential routing strategies. The mapping | Agent (BPA) and its various potential routing strategies, as is | |||
of DNS name and/or address to a choice of end-entity certificate | the mapping of a DNS name and/or address to a choice of an end- | |||
to authenticate a node to its peers. | entity certificate to authenticate a node to its peers. | |||
* Logic for routing bundles along a path toward a bundle's endpoint. | * Logic for routing bundles along a path toward a bundle's endpoint. | |||
This CL protocol is involved only in transporting bundles between | This CL protocol is involved only in transporting bundles between | |||
adjacent entities in a routing sequence. | adjacent entities in a routing sequence. | |||
* Policies or mechanisms for issuing Public Key Infrastructure Using | * Policies or mechanisms for issuing Public Key Infrastructure Using | |||
X.509 (PKIX) certificates; provisioning, deploying, or accessing | X.509 (PKIX) certificates; provisioning, deploying, or accessing | |||
certificates and private keys; deploying or accessing certificate | certificates and private keys; deploying or accessing certificate | |||
revocation lists (CRLs); or configuring security parameters on an | revocation lists (CRLs); or configuring security parameters on an | |||
individual entity or across a network. | individual entity or across a network. | |||
* Uses of TLS which are not based on PKIX certificate authentication | * Uses of TLS that are not based on PKIX certificate authentication | |||
(see Section 8.12.2) or in which authentication of both entities | (see Section 7.12.2) or in which authentication of both entities | |||
is not possible (see Section 8.12.1). | is not possible (see Section 7.12.1). | |||
Any TCPCL implementation requires a BP agent to perform those above | Any TCPCL implementation requires a BPA to perform those above-listed | |||
listed functions in order to perform end-to-end bundle delivery. | functions in order to perform end-to-end bundle delivery. | |||
2. Requirements Language | 2. Requirements Language | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
2.1. Definitions Specific to the TCPCL Protocol | 2.1. Definitions Specific to the TCPCL Protocol | |||
This section contains definitions specific to the TCPCL protocol. | This section contains definitions specific to the TCPCL protocol. | |||
Network Byte Order: Most significant byte first, a.k.a., big endian. | Network Byte Order: Here, "network byte order" means most | |||
All of the integer encodings in this protocol SHALL be transmitted | significant byte first, a.k.a. big endian. All of the integer | |||
in network byte order. | encodings in this protocol SHALL be transmitted in network byte | |||
order. | ||||
TCPCL Entity: This is the notional TCPCL application that initiates | TCPCL Entity: This is the notional TCPCL application that initiates | |||
TCPCL sessions. This design, implementation, configuration, and | TCPCL sessions. This design, implementation, configuration, and | |||
specific behavior of such an entity is outside of the scope of | specific behavior of such an entity is outside of the scope of | |||
this document. However, the concept of an entity has utility | this document. However, the concept of an entity has utility | |||
within the scope of this document as the container and initiator | within the scope of this document as the container and initiator | |||
of TCPCL sessions. The relationship between a TCPCL entity and | of TCPCL sessions. The relationship between a TCPCL entity and | |||
TCPCL sessions is defined as follows: | TCPCL sessions is defined as follows: | |||
* A TCPCL Entity MAY actively initiate any number of TCPCL | * A TCPCL entity MAY actively initiate any number of TCPCL | |||
Sessions and should do so whenever the entity is the initial | sessions and should do so whenever the entity is the initial | |||
transmitter of information to another entity in the network. | transmitter of information to another entity in the network. | |||
* A TCPCL Entity MAY support zero or more passive listening | * A TCPCL entity MAY support zero or more passive listening | |||
elements that listen for connection requests from other TCPCL | elements that listen for connection requests from other TCPCL | |||
Entities operating on other entities in the network. | entities operating on other entities in the network. | |||
* A TCPCL Entity MAY passively initiate any number of TCPCL | * A TCPCL entity MAY passively initiate any number of TCPCL | |||
Sessions from requests received by its passive listening | sessions from requests received by its passive listening | |||
element(s) if the entity uses such elements. | element(s) if the entity uses such elements. | |||
These relationships are illustrated in Figure 2. For most TCPCL | These relationships are illustrated in Figure 2. For most TCPCL | |||
behavior within a session, the two entities are symmetric and | behavior within a session, the two entities are symmetric and | |||
there is no protocol distinction between them. Some specific | there is no protocol distinction between them. Some specific | |||
behavior, particularly during session establishment, distinguishes | behavior, particularly during session establishment, distinguishes | |||
between the active entity and the passive entity. For the | between the active entity and the passive entity. For the | |||
remainder of this document, the term "entity" without the prefix | remainder of this document, the term "entity" without the prefix | |||
"TCPCL" refers to a TCPCL entity. | "TCPCL" refers to a TCPCL entity. | |||
TCP Connection: The term Connection in this specification | TCP Connection: The term "connection" in this specification | |||
exclusively refers to a TCP connection and any and all behaviors, | exclusively refers to a TCP connection and any and all behaviors, | |||
sessions, and other states associated with that TCP connection. | sessions, and other states associated with that TCP connection. | |||
TCPCL Session: A TCPCL session (as opposed to a TCP connection) is a | TCPCL Session: A TCPCL session (as opposed to a TCP connection) is a | |||
TCPCL communication relationship between two TCPCL entities. A | TCPCL communication relationship between two TCPCL entities. A | |||
TCPCL session operates within a single underlying TCP connection | TCPCL session operates within a single underlying TCP connection, | |||
and the lifetime of a TCPCL session is bound to the lifetime of | and the lifetime of a TCPCL session is bound to the lifetime of | |||
that TCP connection. A TCPCL session is terminated when the TCP | that TCP connection. A TCPCL session is terminated when the TCP | |||
connection ends, due either to one or both entities actively | connection ends, due to either (1) one or both entities actively | |||
closing the TCP connection or due to network errors causing a | closing the TCP connection or (2) network errors causing a failure | |||
failure of the TCP connection. Within a single TCPCL session | of the TCP connection. Within a single TCPCL session, there are | |||
there are two possible transfer streams; one in each direction, | two possible transfer streams: one in each direction, with one | |||
with one stream from each entity being the outbound stream and the | stream from each entity being the outbound stream and the other | |||
other being the inbound stream (see Figure 3). From the | being the inbound stream (see Figure 3). From the perspective of | |||
perspective of a TCPCL session, the two transfer streams do not | a TCPCL session, the two transfer streams do not logically | |||
logically interact with each other. The streams do operate over | interact with each other. The streams do operate over the same | |||
the same TCP connection and between the same BP agents, so there | TCP connection and between the same BPAs, so there are logical | |||
are logical relationships at those layers (message and bundle | relationships at those layers (message and bundle interleaving, | |||
interleaving respectively). For the remainder of this document, | respectively). For the remainder of this document, the term | |||
the term "session" without the prefix "TCPCL" refers to a TCPCL | "session" without the prefix "TCPCL" refers to a TCPCL session. | |||
session. | ||||
Session parameters: These are a set of values used to affect the | Session Parameters: These are a set of values used to affect the | |||
operation of the TCPCL for a given session. The manner in which | operation of the TCPCL for a given session. The manner in which | |||
these parameters are conveyed to the bundle entity and thereby to | these parameters are conveyed to the bundle entity and thereby to | |||
the TCPCL is implementation dependent. However, the mechanism by | the TCPCL is implementation dependent. However, the mechanism by | |||
which two entities exchange and negotiate the values to be used | which two entities exchange and negotiate the values to be used | |||
for a given session is described in Section 4.3. | for a given session is described in Section 4.3. | |||
Transfer Stream: A Transfer stream is a uni-directional user-data | Transfer Stream: A transfer stream is a unidirectional user-data | |||
path within a TCPCL Session. Transfers sent over a transfer | path within a TCPCL session. Transfers sent over a transfer | |||
stream are serialized, meaning that one transfer must complete its | stream are serialized, meaning that one transfer must complete its | |||
transmission prior to another transfer being started over the same | transmission prior to another transfer being started over the same | |||
transfer stream. At the stream layer there is no logical | transfer stream. At the stream layer, there is no logical | |||
relationship between transfers in that stream; it's only within | relationship between transfers in that stream; it's only within | |||
the BP agent that transfers are fully decoded as bundles. Each | the BPA that transfers are fully decoded as bundles. Each | |||
uni-directional stream has a single sender entity and a single | unidirectional stream has a single sender entity and a single | |||
receiver entity. | receiver entity. | |||
Transfer: This refers to the procedures and mechanisms for | Transfer: This refers to the procedures and mechanisms for | |||
conveyance of an individual bundle from one node to another. Each | conveyance of an individual bundle from one node to another. Each | |||
transfer within TCPCL is identified by a Transfer ID number which | transfer within the TCPCL is identified by a Transfer ID number, | |||
is guaranteed to be unique only to a single direction within a | which is guaranteed to be unique only to a single direction within | |||
single Session. | a single session. | |||
Transfer Segment: A subset of a transfer of user data being | Transfer Segment: A transfer segment is a subset of a transfer of | |||
communicated over a transfer stream. | user data being communicated over a transfer stream. | |||
Idle Session: A TCPCL session is idle while there is no transmission | Idle Session: A TCPCL session is idle while there is no transmission | |||
in-progress in either direction. While idle, the only messages | in progress in either direction. While idle, the only messages | |||
being transmitted or received are KEEPALIVE messages. | being transmitted or received are KEEPALIVE messages. | |||
Live Session: A TCPCL session is live while there is a transmission | Live Session: A TCPCL session is live while there is a transmission | |||
in-progress in either direction. | in progress in either direction. | |||
Reason Codes: The TCPCL uses numeric codes to encode specific | Reason Codes: The TCPCL uses numeric codes to encode specific | |||
reasons for individual failure/error message types. | reasons for individual failure/error message types. | |||
The relationship between connections, sessions, and streams is shown | The relationship between connections, sessions, and streams is shown | |||
in Figure 3. | in Figure 3. | |||
+--------------------------------------------+ | +--------------------------------------------+ | |||
| TCPCL Entity | | | TCPCL Entity | | |||
| | +----------------+ | | | +----------------+ | |||
skipping to change at page 8, line 35 ¶ | skipping to change at line 356 ¶ | |||
| | +---------------------------------+ | | TCPCL Entity's | | | | | +---------------------------------+ | | TCPCL Entity's | | | |||
| +--->| Passively Initiated Session #1 +-------->| Active | | | | +--->| Passively Initiated Session #1 +-------->| Active | | | |||
| | +---------------------------------+ | | Initiator(s) | | | | | +---------------------------------+ | | Initiator(s) | | | |||
| | | | | | | | | | | | | | |||
| | +---------------------------------+ | | | | | | | +---------------------------------+ | | | | | |||
| +--->| Passively Initiated Session #n +-------->| | | | | +--->| Passively Initiated Session #n +-------->| | | | |||
| +---------------------------------+ | +----------------+ | | | +---------------------------------+ | +----------------+ | | |||
| | +-----------------+ | | | +-----------------+ | |||
+--------------------------------------------+ | +--------------------------------------------+ | |||
Figure 2: The relationships between TCPCL entities | Figure 2: The Relationships between TCPCL Entities | |||
+---------------------------+ +---------------------------+ | +---------------------------+ +---------------------------+ | |||
| "Own" TCPCL Session | | "Other" TCPCL Session | | | "Own" TCPCL Session | | "Other" TCPCL Session | | |||
| | | | | | | | | | |||
| +----------------------+ | | +----------------------+ | | | +----------------------+ | | +----------------------+ | | |||
| | TCP Connection | | | | TCP Connection | | | | | TCP Connection | | | | TCP Connection | | | |||
| | | | | | | | | | | | | | | | | | |||
| | +-----------------+ | | Messages | | +-----------------+ | | | | | +-----------------+ | | Messages | | +-----------------+ | | | |||
| | | Own Inbound | +--------------------+ | Peer Outbound | | | | | | | Own Inbound | +--------------------+ | Peer Outbound | | | | |||
| | | Transfer Stream | | Transfer Stream | | | | | | | Transfer Stream | | Transfer Stream | | | | |||
skipping to change at page 9, line 27 ¶ | skipping to change at line 380 ¶ | |||
| | | | | | | | | | |||
| | +-----------------+ +-----------------+ | | | | | +-----------------+ +-----------------+ | | | |||
| | | Own Outbound |-------[Seg]---[Seg]----->| Peer Inbound | | | | | | | Own Outbound |-------[Seg]---[Seg]----->| Peer Inbound | | | | |||
| | | Transfer Stream |<---[Ack]----[Ack]-[Ack]--| Transfer Stream | | | | | | | Transfer Stream |<---[Ack]----[Ack]-[Ack]--| Transfer Stream | | | | |||
| | | ----- | | ----- | | | | | | | ----- | | ----- | | | | |||
| | | SENDER | +--------------------+ | RECEIVER | | | | | | | SENDER | +--------------------+ | RECEIVER | | | | |||
| | +-----------------+ | | | | +-----------------+ | | | | | +-----------------+ | | | | +-----------------+ | | | |||
| +-----------------------+ | | +---------------------+ | | | +-----------------------+ | | +---------------------+ | | |||
+----------------------------+ +--------------------------+ | +----------------------------+ +--------------------------+ | |||
Figure 3: The relationship within a TCPCL Session of its two streams | Figure 3: The Relationship within a TCPCL Session of its Two Streams | |||
3. General Protocol Description | 3. General Protocol Description | |||
The service of this protocol is the transmission of DTN bundles via | The service of this protocol is the transmission of DTN bundles via | |||
the Transmission Control Protocol (TCP). This document specifies the | TCP. This document specifies the encapsulation of bundles, | |||
encapsulation of bundles, procedures for TCP setup and teardown, and | procedures for TCP setup and teardown, and a set of messages and | |||
a set of messages and entity requirements. The general operation of | entity requirements. The general operation of the protocol is as | |||
the protocol is as follows. | follows. | |||
3.1. Convergence Layer Services | 3.1. Convergence-Layer Services | |||
This version of the TCPCL provides the following services to support | This version of the TCPCL protocol provides the following services to | |||
the overlaying Bundle Protocol agent. In all cases, this is not an | support the overlaying BPA. In all cases, this is not an API | |||
API definition but a logical description of how the CL can interact | definition but a logical description of how the CL can interact with | |||
with the BP agent. Each of these interactions can be associated with | the BPA. Each of these interactions can be associated with any | |||
any number of additional metadata items as necessary to support the | number of additional metadata items as necessary to support the | |||
operation of the CL or BP agent. | operation of the CL or BPA. | |||
Attempt Session: The TCPCL allows a BP agent to preemptively attempt | Attempt Session: The TCPCL allows a BPA to preemptively attempt to | |||
to establish a TCPCL session with a peer entity. Each session | establish a TCPCL session with a peer entity. Each session | |||
attempt can send a different set of session negotiation parameters | attempt can send a different set of session negotiation parameters | |||
as directed by the BP agent. | as directed by the BPA. | |||
Terminate Session: The TCPCL allows a BP agent to preemptively | Terminate Session: The TCPCL allows a BPA to preemptively terminate | |||
terminate an established TCPCL session with a peer entity. The | an established TCPCL session with a peer entity. The terminate | |||
terminate request is on a per-session basis. | request is done on a per-session basis. | |||
Session State Changed: The TCPCL entity indicates to the BP agent | Session State Changed: The TCPCL entity indicates to the BPA when | |||
when the session state changes. The top-level session states | the session state changes. The top-level session states indicated | |||
indicated are: | are as follows: | |||
Connecting: A TCP connection is being established. This state | Connecting: A TCP connection is being established. This state | |||
only applies to the active entity. | only applies to the active entity. | |||
Contact Negotiating: A TCP connection has been made (as either | Contact Negotiating: A TCP connection has been made (as either | |||
active or passive entity) and contact negotiation has begun. | the active or passive entity), and contact negotiation has | |||
begun. | ||||
Session Negotiating: Contact negotiation has been completed | Session Negotiating: Contact negotiation has been completed | |||
(including possible TLS use) and session negotiation has begun. | (including possible TLS use), and session negotiation has | |||
begun. | ||||
Established: The session has been fully established and is ready | Established: The session has been fully established and is ready | |||
for its first transfer. When the session is established, the | for its first transfer. When the session is established, the | |||
peer Node ID (along with indication of whether or not it was | peer node ID (along with an indication of whether or not it was | |||
authenticated) and the negotiated session parameters (see | authenticated) and the negotiated session parameters (see | |||
Section 4.7) are also communicated to the BP agent. | Section 4.7) are also communicated to the BPA. | |||
Ending: The entity sent SESS_TERM message and is in the ending | Ending: The entity sent a SESS_TERM message and is in the Ending | |||
state. | state. | |||
Terminated: The session has finished normal termination | Terminated: The session has finished normal termination | |||
sequencing. | sequencing. | |||
Failed: The session ended without normal termination sequencing. | Failed: The session ended without normal termination sequencing. | |||
Session Idle Changed: The TCPCL entity indicates to the BP agent | Session Idle Changed: The TCPCL entity indicates to the BPA when the | |||
when the live/idle sub-state of the session changes. This occurs | Live/Idle substate of the session changes. This occurs only when | |||
only when the top-level session state is "Established". The | the top-level session state is "Established". The session | |||
session transitions from Idle to Live at the at the start of a | transitions from Idle to Live at the start of a transfer in either | |||
transfer in either transfer stream; the session transitions from | transfer stream; the session transitions from Live to Idle at the | |||
Live to Idle at the end of a transfer when the other transfer | end of a transfer when the other transfer stream does not have an | |||
stream does not have an ongoing transfer. Because TCPCL transmits | ongoing transfer. Because the TCPCL transmits serially over a TCP | |||
serially over a TCP connection it suffers from "head of queue | connection, it suffers from "head-of-queue blocking", so a | |||
blocking," so a transfer in either direction can block an | transfer in either direction can block an immediate start of a new | |||
immediate start of a new transfer in the session. | transfer in the session. | |||
Begin Transmission: The principal purpose of the TCPCL is to allow a | Begin Transmission: The principal purpose of the TCPCL is to allow a | |||
BP agent to transmit bundle data over an established TCPCL | BPA to transmit bundle data over an established TCPCL session. | |||
session. Transmission request is on a per-session basis and the | Transmission requests are done on a per-session basis, and the CL | |||
CL does not necessarily perform any per-session or inter-session | does not necessarily perform any per-session or inter-session | |||
queueing. Any queueing of transmissions is the obligation of the | queueing. Any queueing of transmissions is the obligation of the | |||
BP agent. | BPA. | |||
Transmission Success: The TCPCL entity indicates to the BP agent | Transmission Success: The TCPCL entity indicates to the BPA when a | |||
when a bundle has been fully transferred to a peer entity. | bundle has been fully transferred to a peer entity. | |||
Transmission Intermediate Progress: The TCPCL entity indicates to | Transmission Intermediate Progress: The TCPCL entity indicates to | |||
the BP agent on intermediate progress of transfer to a peer | the BPA the intermediate progress of a transfer to a peer entity. | |||
entity. This intermediate progress is at the granularity of each | This intermediate progress is at the granularity of each | |||
transferred segment. | transferred segment. | |||
Transmission Failure: The TCPCL entity indicates to the BP agent on | Transmission Failure: The TCPCL entity indicates to the BPA certain | |||
certain reasons for bundle transmission failure, notably when the | reasons for bundle transmission failure, notably when the peer | |||
peer entity rejects the bundle or when a TCPCL session ends before | entity rejects the bundle or when a TCPCL session ends before | |||
transfer success. The TCPCL itself does not have a notion of | transfer success. The TCPCL itself does not have a notion of | |||
transfer timeout. | transfer timeout. | |||
Reception Initialized: The TCPCL entity indicates to the receiving | Reception Initialized: The TCPCL entity indicates this status to the | |||
BP agent just before any transmission data is sent. This | receiving BPA just before any transmission data is sent. This | |||
corresponds to reception of the XFER_SEGMENT message with the | corresponds to reception of the XFER_SEGMENT message with the | |||
START flag of 1. | START flag set to 1. | |||
Interrupt Reception: The TCPCL entity allows a BP agent to interrupt | Interrupt Reception: The TCPCL entity allows a BPA to interrupt an | |||
an individual transfer before it has fully completed (successfully | individual transfer before it has fully completed (successfully or | |||
or not). Interruption can occur any time after the reception is | not). Interruption can occur any time after the reception is | |||
initialized. | initialized. | |||
Reception Success: The TCPCL entity indicates to the BP agent when a | Reception Success: The TCPCL entity indicates to the BPA when a | |||
bundle has been fully transferred from a peer entity. | bundle has been fully transferred from a peer entity. | |||
Reception Intermediate Progress: The TCPCL entity indicates to the | Reception Intermediate Progress: The TCPCL entity indicates to the | |||
BP agent on intermediate progress of transfer from the peer | BPA the intermediate progress of a transfer from the peer entity. | |||
entity. This intermediate progress is at the granularity of each | This intermediate progress is at the granularity of each | |||
transferred segment. Intermediate reception indication allows a | transferred segment. An indication of intermediate reception | |||
BP agent the chance to inspect bundle header contents before the | gives a BPA the chance to inspect bundle header contents before | |||
entire bundle is available, and thus supports the "Reception | the entire bundle is available and thus supports the "Interrupt | |||
Interruption" capability. | Reception" capability. | |||
Reception Failure: The TCPCL entity indicates to the BP agent on | Reception Failure: The TCPCL entity indicates to the BPA certain | |||
certain reasons for reception failure, notably when the local | reasons for reception failure, notably when the local entity | |||
entity rejects an attempted transfer for some local policy reason | rejects an attempted transfer for some local policy reason or when | |||
or when a TCPCL session ends before transfer success. The TCPCL | a TCPCL session ends before transfer success. The TCPCL itself | |||
itself does not have a notion of transfer timeout. | does not have a notion of transfer timeout. | |||
3.2. TCPCL Session Overview | 3.2. TCPCL Session Overview | |||
First, one entity establishes a TCPCL session to the other by | First, one entity establishes a TCPCL session to the other by | |||
initiating a TCP connection in accordance with [RFC0793]. After | initiating a TCP connection in accordance with [RFC0793]. After | |||
setup of the TCP connection is complete, an initial Contact Header is | setup of the TCP connection is complete, an initial Contact Header is | |||
exchanged in both directions to establish a shared TCPCL version and | exchanged in both directions to establish a shared TCPCL version and | |||
negotiate the use of TLS security (as described in Section 4). Once | negotiate the use of TLS security (as described in Section 4). Once | |||
contact negotiation is complete, TCPCL messaging is available and the | contact negotiation is complete, TCPCL messaging is available and the | |||
session negotiation is used to set parameters of the TCPCL session. | session negotiation is used to set parameters of the TCPCL session. | |||
One of these parameters is a Node ID that each TCPCL Entity is acting | One of these parameters is a node ID; each TCPCL entity is acting on | |||
as. This is used to assist in routing and forwarding messages by the | behalf of a BPA having a node ID. This is used to assist in routing | |||
BP Agent and is part of the authentication capability provided by | and forwarding messages by the BPA and is part of the authentication | |||
TLS. | capability provided by TLS. | |||
Once negotiated, the parameters of a TCPCL session cannot change and | Once negotiated, the parameters of a TCPCL session cannot change; if | |||
if there is a desire by either peer to transfer data under different | there is a desire by either peer to transfer data under different | |||
parameters then a new session must be established. This makes CL | parameters, then a new session must be established. This makes CL | |||
logic simpler but relies on the assumption that establishing a TCP | logic simpler but relies on the assumption that establishing a TCP | |||
connection is lightweight enough that TCP connection overhead is | connection is lightweight enough that TCP connection overhead is | |||
negligible compared to TCPCL data sizes. | negligible compared to TCPCL data sizes. | |||
Once the TCPCL session is established and configured in this way, | Once the TCPCL session is established and configured in this way, | |||
bundles can be transferred in either direction. Each transfer is | bundles can be transferred in either direction. Each transfer is | |||
performed by segmenting the transfer data into one or more | performed by segmenting the transfer data into one or more | |||
XFER_SEGMENT messages. Multiple bundles can be transmitted | XFER_SEGMENT messages. Multiple bundles can be transmitted | |||
consecutively in a single direction on a single TCPCL connection. | consecutively in a single direction on a single TCPCL connection. | |||
Segments from different bundles are never interleaved. Bundle | Segments from different bundles are never interleaved. Bundle | |||
interleaving can be accomplished by fragmentation at the BP layer or | interleaving can be accomplished by fragmentation at the BP layer or | |||
by establishing multiple TCPCL sessions between the same peers. | by establishing multiple TCPCL sessions between the same peers. | |||
There is no fundamental limit on the number of TCPCL sessions which a | There is no fundamental limit on the number of TCPCL sessions that a | |||
single entity can establish beyond the limit imposed by the number of | single entity can establish, beyond the limit imposed by the number | |||
available (ephemeral) TCP ports of the active entity. | of available (ephemeral) TCP ports of the active entity. | |||
A feature of this protocol is for the receiving entity to send | One feature of this protocol is that the receiving entity can send | |||
acknowledgment (XFER_ACK) messages as bundle data segments arrive. | acknowledgment (XFER_ACK) messages as bundle data segments arrive. | |||
The rationale behind these acknowledgments is to enable the | The rationale behind these acknowledgments is to enable the | |||
transmitting entity to determine how much of the bundle has been | transmitting entity to determine how much of the bundle has been | |||
received, so that in case the session is interrupted, it can perform | received, so that if the session is interrupted, it can perform | |||
reactive fragmentation to avoid re-sending the already transmitted | reactive fragmentation to avoid resending the already-transmitted | |||
part of the bundle. In addition, there is no explicit flow control | part of the bundle. In addition, there is no explicit flow control | |||
on the TCPCL layer. | on the TCPCL. | |||
A TCPCL receiver can interrupt the transmission of a bundle at any | A TCPCL receiver can interrupt the transmission of a bundle at any | |||
point in time by replying with a XFER_REFUSE message, which causes | point in time by replying with a XFER_REFUSE message, which causes | |||
the sender to stop transmission of the associated bundle (if it | the sender to stop transmission of the associated bundle (if it | |||
hasn't already finished transmission). Note: This enables a cross- | hasn't already finished transmission). | |||
layer optimization in that it allows a receiver that detects that it | ||||
already has received a certain bundle to interrupt transmission as | | Note: This enables a cross-layer optimization in that it allows | |||
early as possible and thus save transmission capacity for other | | a receiver that detects that it has already received a certain | |||
bundles. | | bundle to interrupt transmission as early as possible and thus | |||
| save transmission capacity for other bundles. | ||||
For sessions that are idle, a KEEPALIVE message is sent at a | For sessions that are idle, a KEEPALIVE message is sent at a | |||
negotiated interval. This is used to convey entity live-ness | negotiated interval. This is used to convey entity liveness | |||
information during otherwise message-less time intervals. | information during otherwise messageless time intervals. | |||
A SESS_TERM message is used to initiate the ending of a TCPCL session | A SESS_TERM message is used to initiate the ending of a TCPCL session | |||
(see Section 6.1). During termination sequencing, in-progress | (see Section 6.1). During termination sequencing, in-progress | |||
transfers can be completed but no new transfers can be initiated. A | transfers can be completed but no new transfers can be initiated. A | |||
SESS_TERM message can also be used to refuse a session setup by a | SESS_TERM message can also be used to refuse a session setup by a | |||
peer (see Section 4.3). Regardless of the reason, session | peer (see Section 4.3). Regardless of the reason, session | |||
termination is initiated by one of the entities and responded-to by | termination is initiated by one of the entities and the other entity | |||
the other as illustrated by Figure 13 and Figure 14. Even when there | responds to it, as illustrated by Figures 13 and 14 in the next | |||
are no transfers queued or in-progress, the session termination | subsection. Even when there are no transfers queued or in progress, | |||
procedure allows each entity to distinguish between a clean end to a | the session termination procedure allows each entity to distinguish | |||
session and the TCP connection being closed because of some | between a clean end to a session and the TCP connection being closed | |||
underlying network issue. | because of some underlying network issue. | |||
Once a session is established, TCPCL is a symmetric protocol between | Once a session is established, the TCPCL is a symmetric protocol | |||
the peers. Both sides can start sending data segments in a session, | between the peers. Both sides can start sending data segments in a | |||
and one side's bundle transfer does not have to complete before the | session, and one side's bundle transfer does not have to complete | |||
other side can start sending data segments on its own. Hence, the | before the other side can start sending data segments on its own. | |||
protocol allows for a bi-directional mode of communication. Note | Hence, the protocol allows for a bidirectional mode of communication. | |||
that in the case of concurrent bidirectional transmission, | Note that in the case of concurrent bidirectional transmission, | |||
acknowledgment segments MAY be interleaved with data segments. | acknowledgment segments MAY be interleaved with data segments. | |||
3.3. TCPCL States and Transitions | 3.3. TCPCL States and Transitions | |||
The states of a normal TCPCL session (i.e., without session failures) | The states of a normal TCPCL session (i.e., without session failures) | |||
are indicated in Figure 4. | are indicated in Figure 4. | |||
+-------+ | +-------+ | |||
| START | | | START | | |||
+-------+ | +-------+ | |||
skipping to change at page 14, line 42 ¶ | skipping to change at line 614 ¶ | |||
| Ending | Done | Terminating | | | Ending | Done | Terminating | | |||
+-------------+ +-------------+ | +-------------+ +-------------+ | |||
| | | | |||
+----------TCP Close Message----------+ | +----------TCP Close Message----------+ | |||
| | | | |||
V | V | |||
+-------+ | +-------+ | |||
| END | | | END | | |||
+-------+ | +-------+ | |||
Figure 4: Top-level states of a TCPCL session | Figure 4: Top-Level States of a TCPCL Session | |||
Notes on Established Session states: | Notes on established session states: | |||
Session "Live" means transmitting or receiving over a transfer | * Session "Live" means transmitting or receiving over a transfer | |||
stream. | stream. | |||
Session "Idle" means no transmission/reception over a transfer | * Session "Idle" means no transmission/reception over a transfer | |||
stream. | stream. | |||
Session "Ending" means no new transfers will be allowed. | * Session "Ending" means no new transfers will be allowed. | |||
Contact negotiation involves exchanging a Contact Header (CH) in both | Contact negotiation involves exchanging a Contact Header ("CH" in | |||
directions and deriving a negotiated state from the two headers. The | Figures 5, 6, and 7) in both directions and deriving a negotiated | |||
contact negotiation sequencing is performed either as the active or | state from the two headers. The contact negotiation sequencing is | |||
passive entity, and is illustrated in Figure 5 and Figure 6 | performed as either the active or passive entity and is illustrated | |||
respectively which both share the data validation and negotiation of | in Figures 5 and 6, respectively, which both share the data | |||
the Processing of Contact Header "[PCH]" activity of Figure 7 and the | validation and negotiation of the Processing of Contact Header | |||
"[TCPCLOSE]" activity which indicates TCP connection close. | ("[PCH]") activity (Figure 7) and the "[TCPCLOSE]" activity, which | |||
Successful negotiation results in one of the Session Initiation | indicates TCP connection close. Successful negotiation results in | |||
"[SI]" activities being performed. To avoid data loss, a Session | one of the Session Initiation ("[SI]") activities being performed, as | |||
Termination "[ST]" exchange allows cleanly finishing transfers before | shown further below. To avoid data loss, a Session Termination | |||
a session is ended. | ("[ST]") exchange allows cleanly finishing transfers before a session | |||
is ended. | ||||
+-------+ | +-------+ | |||
| START | | | START | | |||
+-------+ | +-------+ | |||
| | | | |||
TCP Connecting | TCP Connecting | |||
V | V | |||
+-----------+ | +-----------+ | |||
| TCP | +---------+ | | TCP | +---------+ | |||
| Connected |--Send CH-->| Waiting |--Timeout-->[TCPCLOSE] | | Connected |--Send CH-->| Waiting |--Timeout-->[TCPCLOSE] | |||
skipping to change at page 16, line 30 ¶ | skipping to change at line 694 ¶ | |||
| TCPCL | +---------------+ | | TCPCL | +---------------+ | |||
| Messaging |<--Success--| TLS Handshake | | | Messaging |<--Success--| TLS Handshake | | |||
| Available | +---------------+ | | Available | +---------------+ | |||
+-----------+ | +-----------+ | |||
Figure 7: Processing of Contact Header [PCH] | Figure 7: Processing of Contact Header [PCH] | |||
Session negotiation involves exchanging a session initialization | Session negotiation involves exchanging a session initialization | |||
(SESS_INIT) message in both directions and deriving a negotiated | (SESS_INIT) message in both directions and deriving a negotiated | |||
state from the two messages. The session negotiation sequencing is | state from the two messages. The session negotiation sequencing is | |||
performed either as the active or passive entity, and is illustrated | performed as either the active or passive entity and is illustrated | |||
in Figure 8 and Figure 9 respectively which both share the data | in Figures 8 and 9, respectively (where "[PSI]" means "Processing of | |||
validation and negotiation of Figure 10. The validation here | Session Initiation"), which both share the data validation and | |||
includes certificate validation and authentication when TLS is used | negotiation shown in Figure 10. The validation here includes | |||
for the session. | certificate validation and authentication when TLS is used for the | |||
session. | ||||
+-----------+ | +-----------+ | |||
| TCPCL | +---------+ | | TCPCL | +---------+ | |||
| Messaging |--Send SESS_INIT-->| Waiting |--Timeout-->[ST] | | Messaging |--Send SESS_INIT-->| Waiting |--Timeout-->[ST] | |||
| Available | +---------+ | | Available | +---------+ | |||
+-----------+ | | +-----------+ | | |||
Received SESS_INIT | Received SESS_INIT | |||
| | | | |||
V | V | |||
[PSI] | [PSI] | |||
skipping to change at page 17, line 42 ¶ | skipping to change at line 750 ¶ | |||
+--------------+ | +--------------+ | |||
| Established | | | Established | | |||
| Session Idle | | | Session Idle | | |||
+--------------+ | +--------------+ | |||
Figure 10: Processing of Session Initiation [PSI] | Figure 10: Processing of Session Initiation [PSI] | |||
Transfers can occur after a session is established and it's not in | Transfers can occur after a session is established and it's not in | |||
the Ending state. Each transfer occurs within a single logical | the Ending state. Each transfer occurs within a single logical | |||
transfer stream between a sender and a receiver, as illustrated in | transfer stream between a sender and a receiver, as illustrated in | |||
Figure 11 and Figure 12 respectively. | Figures 11 and 12, respectively. | |||
+--Send XFER_SEGMENT--+ | +--Send XFER_SEGMENT--+ | |||
+--------+ | | | +--------+ | | | |||
| Stream | +-------------+ | | | Stream | +-------------+ | | |||
| Idle |---Send XFER_SEGMENT-->| In Progress |<------------+ | | Idle |---Send XFER_SEGMENT-->| In Progress |<------------+ | |||
+--------+ +-------------+ | +--------+ +-------------+ | |||
| | | | |||
+---------All segments sent-------+ | +---------All segments sent-------+ | |||
| | | | |||
V | V | |||
+---------+ +--------+ | +---------+ +--------+ | |||
| Waiting |---- Receive Final---->| Stream | | | Waiting |---- Receive Final---->| Stream | | |||
| for Ack | XFER_ACK | IDLE | | | for Ack | XFER_ACK | Idle | | |||
+---------+ +--------+ | +---------+ +--------+ | |||
Figure 11: Transfer sender states | Figure 11: Transfer Sender States | |||
Notes on transfer sending: | ||||
Pipelining of transfers can occur when the sending entity begins a | | Note on transfer sending: Pipelining of transfers can occur | |||
new transfer while in the "Waiting for Ack" state. | | when the sending entity begins a new transfer while in the | |||
| "Waiting for Ack" state. | ||||
+-Receive XFER_SEGMENT-+ | +-Receive XFER_SEGMENT-+ | |||
+--------+ | Send XFER_ACK | | +--------+ | Send XFER_ACK | | |||
| Stream | +-------------+ | | | Stream | +-------------+ | | |||
| Idle |--Receive XFER_SEGMENT-->| In Progress |<-------------+ | | Idle |--Receive XFER_SEGMENT-->| In Progress |<-------------+ | |||
+--------+ +-------------+ | +--------+ +-------------+ | |||
| | | | |||
+--------Sent Final XFER_ACK--------+ | +--------Sent Final XFER_ACK--------+ | |||
| | | | |||
V | V | |||
+--------+ | +--------+ | |||
| Stream | | | Stream | | |||
| Idle | | | Idle | | |||
+--------+ | +--------+ | |||
Figure 12: Transfer receiver states | Figure 12: Transfer Receiver States | |||
Session termination involves one entity initiating the termination of | Session termination involves one entity initiating the termination of | |||
the session and the other entity acknowledging the termination. For | the session and the other entity acknowledging the termination. For | |||
either entity, it is the sending of the SESS_TERM message which | either entity, it is the sending of the SESS_TERM message, which | |||
transitions the session to the Ending substate. While a session is | transitions the session to the Ending substate. While a session is | |||
in the Ending state only in-progress transfers can be completed and | in the Ending state, only in-progress transfers can be completed and | |||
no new transfers can be started. | no new transfers can be started. | |||
+-----------+ +---------+ | +-----------+ +---------+ | |||
| Session |--Send SESS_TERM-->| Session | | | Session |--Send SESS_TERM-->| Session | | |||
| Live/Idle | | Ending | | | Live/Idle | | Ending | | |||
+-----------+ +---------+ | +-----------+ +---------+ | |||
Figure 13: Session Termination [ST] from the Initiator | Figure 13: Session Termination [ST] from the Initiator | |||
+-----------+ +---------+ | +-----------+ +---------+ | |||
skipping to change at page 19, line 20 ¶ | skipping to change at line 815 ¶ | |||
+-----------+<------+ +---------+ | +-----------+<------+ +---------+ | |||
| | | | | | |||
Receive SESS_TERM | | Receive SESS_TERM | | |||
| | | | | | |||
+-------------+ | +-------------+ | |||
Figure 14: Session Termination [ST] from the Responder | Figure 14: Session Termination [ST] from the Responder | |||
3.4. PKIX Environments and CA Policy | 3.4. PKIX Environments and CA Policy | |||
This specification gives requirements about how to use PKIX | This specification defines requirements regarding how to use PKIX | |||
certificates issued by a Certificate Authority (CA), but does not | certificates issued by a Certificate Authority (CA) but does not | |||
define any mechanisms for how those certificates come to be. The | define any mechanisms for how those certificates come to be. The | |||
requirements about TCPCL certificate use are broad to support two | requirements regarding TCPCL certificate use are broad, to support | |||
quite different PKIX environments: | two quite different PKIX environments: | |||
DTN-Aware CAs: In the ideal case, the CA(s) issuing certificates for | DTN-Aware CAs: In the ideal case, the CA or CAs issuing certificates | |||
TCPCL entities are aware of the end use of the certificate, have a | for TCPCL entities are aware of the end use of the certificate, | |||
mechanism for verifying ownership of a Node ID, and are issuing | have a mechanism for verifying ownership of a node ID, and are | |||
certificates directly for that Node ID. In this environment, the | issuing certificates directly for that node ID. In this | |||
ability to authenticate a peer entity Node ID directly avoids the | environment, the ability to authenticate a peer entity node ID | |||
need to authenticate a network name or address and then implicitly | directly avoids the need to authenticate a network name or address | |||
trust Node ID of the peer. The TCPCL authenticates the Node ID | and then implicitly trust the node ID of the peer. The TCPCL | |||
whenever possible and this is preferred over lower-level PKIX | authenticates the node ID whenever possible; this is preferred | |||
identities. | over lower-level PKIX identities. | |||
DTN-Ignorant CAs: It is expected that Internet-scale "public" CAs | DTN-Ignorant CAs: It is expected that Internet-scale "public" CAs | |||
will continue to focus on DNS names as the preferred PKIX | will continue to focus on DNS names as the preferred PKIX | |||
identifier. There are large infrastructures already in-place for | identifier. There are large infrastructures already in place for | |||
managing network-level authentication and protocols to manage | managing network-level authentication and protocols to manage | |||
identity verification in those environments [RFC8555]. The TCPCL | identity verification in those environments [RFC8555]. The TCPCL | |||
allows for this type of environment by authenticating a lower- | allows for this type of environment by authenticating a lower- | |||
level identifier for a peer and requiring the entity to trust that | level identifier for a peer and requiring the entity to trust that | |||
the Node ID given by the peer (during session initialization) is | the node ID given by the peer (during session initialization) is | |||
valid. This situation is not ideal, as it allows vulnerabilities | valid. This situation is not ideal, as it allows the | |||
described in Section 8.9, but still provides some amount of mutual | vulnerabilities described in Section 7.9, but it still provides | |||
authentication to take place for a TCPCL session. | some amount of mutual authentication to take place for a TCPCL | |||
session. | ||||
Even within a single TCPCL session, each entity may operate within | Even within a single TCPCL session, each entity may operate within | |||
different PKI environments and with different identifier limitations. | different PKI environments and with different identifier limitations. | |||
The requirements related to identifiers in in a PKIX certificate are | The requirements related to identifiers in a PKIX certificate are | |||
in Section 4.4.1. | provided in Section 4.4.1. | |||
It is important for interoperability that a TCPCL entity have its own | It is important for interoperability that a TCPCL entity have its own | |||
security policy tailored to accommodate the peers with which it is | security policy tailored to accommodate the peers with which it is | |||
expected to operate. Some security policy recommendations are given | expected to operate. Some security policy recommendations are given | |||
in Section 4.4.5 but these are meant as a starting point for | in Section 4.4.5, but these are meant as a starting point for | |||
tailoring. A strict TLS security policy is appropriate for a private | tailoring. A strict TLS security policy is appropriate for a private | |||
network with a single shared CA. Operation on the Internet (such as | network with a single shared CA. Operation on the Internet (such as | |||
inter-site BP gateways) could trade more lax TCPCL security with the | inter-site BP gateways) could trade more lax TCPCL security with the | |||
use of encrypted bundle encapsulation [I-D.ietf-dtn-bibect] to ensure | use of encrypted bundle encapsulation [DTN-BIBECT] to ensure strong | |||
strong bundle security. | bundle security. | |||
By using the Server Name Indication (SNI) DNS name (see | By using the Server Name Indication (SNI) DNS name (see | |||
Section 4.4.3) a single passive entity can act as a convergence layer | Section 4.4.3), a single passive entity can act as a convergence | |||
for multiple BP agents with distinct Node IDs. When this "virtual | layer for multiple BPAs with distinct node IDs. When this "virtual | |||
host" behavior is used, the DNS name is used as the indication of | host" behavior is used, the DNS name is used as the indication of | |||
which BP Node the active entity is attempting to communicate with. A | which BP node the active entity is attempting to communicate with. A | |||
virtual host CL entity can be authenticated by a certificate | virtual host CL entity can be authenticated by a certificate | |||
containing all of the DNS names and/or Node IDs being hosted or by | containing all of the DNS names and/or node IDs being hosted or by | |||
several certificates each authenticating a single DNS name and/or | several certificates each authenticating a single DNS name and/or | |||
Node ID, using the SNI value from the peer to select which | node ID, using the SNI value from the peer to select which | |||
certificate to use. The logic for mapping an SNI DNS name to an end- | certificate to use. The logic for mapping an SNI DNS name to an end- | |||
entity certificate is an implementation matter, and can involve | entity certificate is an implementation matter and can involve | |||
correlating DNS name with Node ID or other certificate attributes. | correlating a DNS name with a node ID or other certificate | |||
attributes. | ||||
3.5. Session Keeping Policies | 3.5. Session-Keeping Policies | |||
This specification gives requirements about how to initiate, sustain, | This specification defines requirements regarding how to initiate, | |||
and terminate a TCPCL session but does not impose any requirements on | sustain, and terminate a TCPCL session but does not impose any | |||
how sessions need to be managed by a BP agent. It is a network | requirements on how sessions need to be managed by a BPA. It is a | |||
administration matter to determine an appropriate session keeping | network administration matter to determine an appropriate session- | |||
policy, but guidance given here can be used to steer policy toward | keeping policy, but guidance given here can be used to steer policy | |||
performance goals. | toward performance goals. | |||
Persistent Session: This policy preemptively establishes a single | Persistent Session: This policy preemptively establishes a single | |||
session to known entities in the network and keeps the session | session to known entities in the network and keeps the session | |||
active using KEEPALIVEs. Benefits of this policy include reducing | active using KEEPALIVEs. Benefits of this policy include reducing | |||
the total amount of TCP data needing to be exchanged for a set of | the total amount of TCP data that needs to be exchanged for a set | |||
transfers (assuming KEEPALIVE size is significantly smaller than | of transfers (assuming that the KEEPALIVE size is significantly | |||
transfer size), and allowing the session state to indicate peer | smaller than the transfer size) and allowing the session state to | |||
connectivity. Drawbacks include wasted network resources when a | indicate peer connectivity. Drawbacks include wasted network | |||
session is mostly idle or when the network connectivity is | resources when a session is mostly idle or when network | |||
inconsistent (which requires re-establishing failed sessions), and | connectivity is inconsistent (which requires that failed sessions | |||
potential queueing issues when multiple transfers are requested | be reestablished), and potential queueing issues when multiple | |||
simultaneously. This policy assumes that there is agreement | transfers are requested simultaneously. This policy assumes that | |||
between pairs of entities as to which of the peers will initiate | there is agreement between pairs of entities as to which of the | |||
sessions; if there is no such agreement, there is potential for | peers will initiate sessions; if there is no such agreement, there | |||
duplicate sessions to be established between peers. | is potential for duplicate sessions to be established between | |||
peers. | ||||
Ephemeral Sessions: This policy only establishes a session when an | Ephemeral Sessions: This policy only establishes a session when an | |||
outgoing transfer is needed to be sent. Benefits of this policy | outgoing transfer needs to be sent. Benefits of this policy | |||
include not wasting network resources on sessions which are idle | include not wasting network resources on sessions that are idle | |||
for long periods of time, and avoids queueing issues of a | for long periods of time and avoiding potential queueing issues as | |||
persistent session. Drawbacks include the TCP and TLS overhead of | can be seen when using a single persistent session. Drawbacks | |||
establish a new session for each transfer. This policy assumes | include the TCP and TLS overhead of establishing a new session for | |||
that each entity can function in a passive role to listen for | each transfer. This policy assumes that each entity can function | |||
session requests from any peer which needs to send a transfer; | in a passive role to listen for session requests from any peer | |||
when that is not the case the Polling behavior below needs to | that needs to send a transfer; when that is not the case, the | |||
happen. This policy can be augmented to keep the session | polling behavior discussed below needs to happen. This policy can | |||
established as long as any transfers are queued. | be augmented to keep the session established as long as any | |||
transfers are queued. | ||||
Active-Only Polling Sessions: When naming and/or addressing of one | Active-Only Polling Sessions: When naming and/or addressing of one | |||
entity is variable (i.e. dynamically assigned IP address or domain | entity is variable (i.e., a dynamically assigned IP address or | |||
name) or when firewall or routing rules prevent incoming TCP | domain name) or when firewall or routing rules prevent incoming | |||
connections, that entity can only function in the active role. In | TCP connections, that entity can only function in the active role. | |||
these cases, sessions also need to be established when an incoming | In these cases, sessions also need to be established when an | |||
transfer is expected from a peer or based on a periodic schedule. | incoming transfer is expected from a peer or based on a periodic | |||
This polling behavior causes inefficiencies compared to as-needed | schedule. This polling behavior causes inefficiencies compared to | |||
ephemeral sessions. | as-needed ephemeral sessions. | |||
Many other policies can be established in a TCPCL network between the | Many other policies can be established in a TCPCL network between the | |||
two extremes of single persistent sessions and only ephemeral | two extremes of single persistent sessions and only ephemeral | |||
sessions. Different policies can be applied to each peer entity and | sessions. Different policies can be applied to each peer entity and | |||
to each bundle as it needs to be transferred (e.g for quality of | to each bundle as it needs to be transferred (e.g., for quality of | |||
service). Additionally, future session extension types can apply | service). Additionally, future session extension types can apply | |||
further nuance to session policies and policy negotiation. | further nuance to session policies and policy negotiation. | |||
3.6. Transfer Segmentation Policies | 3.6. Transfer Segmentation Policies | |||
Each TCPCL session allows a negotiated transfer segmentation policy | Each TCPCL session allows a negotiated transfer segmentation policy | |||
to be applied in each transfer direction. A receiving entity can set | to be applied in each transfer direction. A receiving entity can set | |||
the Segment MRU in its SESS_INIT message to determine the largest | the Segment Maximum Receive Unit (MRU) in its SESS_INIT message to | |||
acceptable segment size, and a transmitting entity can segment a | determine the largest acceptable segment size, and a transmitting | |||
transfer into any sizes smaller than the receiver's Segment MRU. It | entity can segment a transfer into any sizes smaller than the | |||
is a network administration matter to determine an appropriate | receiver's Segment MRU. It is a network administration matter to | |||
segmentation policy for entities operating TCPCL, but guidance given | determine an appropriate segmentation policy for entities using the | |||
here can be used to steer policy toward performance goals. It is | TCPCL protocol, but guidance given here can be used to steer policy | |||
also advised to consider the Segment MRU in relation to chunking/ | toward performance goals. Administrators are also advised to | |||
packetization performed by TLS, TCP, and any intermediate network- | consider the Segment MRU in relation to chunking/packetization | |||
layer nodes. | performed by TLS, TCP, and any intermediate network-layer nodes. | |||
Minimum Overhead: For a simple network expected to exchange | Minimum Overhead: For a simple network expected to exchange | |||
relatively small bundles, the Segment MRU can be set to be | relatively small bundles, the Segment MRU can be set to be | |||
identical to the Transfer MRU which indicates that all transfers | identical to the Transfer MRU, which indicates that all transfers | |||
can be sent with a single data segment (i.e., no actual | can be sent with a single data segment (i.e., no actual | |||
segmentation). If the network is closed and all transmitters are | segmentation). If the network is closed and all transmitters are | |||
known to follow a single-segment transfer policy, then receivers | known to follow a single-segment transfer policy, then receivers | |||
can avoid the necessity of segment reassembly. Because this CL | can avoid the necessity of segment reassembly. Because this CL | |||
operates over a TCP stream, which suffers from a form of head-of- | operates over a TCP stream, which suffers from a form of head-of- | |||
queue blocking between messages, while one entity is transmitting | queue blocking between messages, while one entity is transmitting | |||
a single XFER_SEGMENT message it is not able to transmit any | a single XFER_SEGMENT message it is not able to transmit any | |||
XFER_ACK or XFER_REFUSE for any associated received transfers. | XFER_ACK or XFER_REFUSE messages for any associated received | |||
transfers. | ||||
Predictable Message Sizing: In situations where the maximum message | Predictable Message Sizing: In situations where the maximum message | |||
size is desired to be well-controlled, the Segment MRU can be set | size is desired to be well controlled, the Segment MRU can be set | |||
to the largest acceptable size (the message size less XFER_SEGMENT | to the largest acceptable size (the message size less the | |||
header size) and transmitters can always segment a transfer into | XFER_SEGMENT header size) and transmitters can always segment a | |||
maximum-size chunks no larger than the Segment MRU. This | transfer into maximum-size chunks no larger than the Segment MRU. | |||
guarantees that any single XFER_SEGMENT will not monopolize the | This guarantees that any single XFER_SEGMENT will not monopolize | |||
TCP stream for too long, which would prevent outgoing XFER_ACK and | the TCP stream for too long, which would prevent outgoing XFER_ACK | |||
XFER_REFUSE associated with received transfers. | and XFER_REFUSE messages associated with received transfers. | |||
Dynamic Segmentation: Even after negotiation of a Segment MRU for | Dynamic Segmentation: Even after negotiation of a Segment MRU for | |||
each receiving entity, the actual transfer segmentation only needs | each receiving entity, the actual transfer segmentation only needs | |||
to guarantee than any individual segment is no larger than that | to guarantee that any individual segment is no larger than that | |||
MRU. In a situation where TCP throughput is dynamic, the transfer | MRU. In a situation where TCP throughput is dynamic, the transfer | |||
segmentation size can also be dynamic in order to control message | segmentation size can also be dynamic in order to control message | |||
transmission duration. | transmission duration. | |||
Many other policies can be established in a TCPCL network between the | Many other policies can be established in a TCPCL network between the | |||
two extremes of minimum overhead (large MRU, single-segment) and | two extremes of minimum overhead (large MRU, single segment) and | |||
predictable message sizing (small MRU, highly segmented). Different | predictable message sizing (small MRU, highly segmented). Different | |||
policies can be applied to each transfer stream to and from any | policies can be applied to each transfer stream to and from any | |||
particular entity. Additionally, future session extension and | particular entity. Additionally, future session extension and | |||
transfer extension types can apply further nuance to transfer | transfer extension types can apply further nuance to transfer | |||
policies and policy negotiation. | policies and policy negotiation. | |||
3.7. Example Message Exchange | 3.7. Example Message Exchange | |||
The following figure depicts the protocol exchange for a simple | Figure 15 depicts the protocol exchange for a simple session, showing | |||
session, showing the session establishment and the transmission of a | the session establishment and the transmission of a single bundle | |||
single bundle split into three data segments (of lengths "L1", "L2", | split into three data segments (of lengths "L1", "L2", and "L3") from | |||
and "L3") from Entity A to Entity B. | Entity A to Entity B. | |||
Note that the sending entity can transmit multiple XFER_SEGMENT | Note that the sending entity can transmit multiple XFER_SEGMENT | |||
messages without waiting for the corresponding XFER_ACK responses. | messages without waiting for the corresponding XFER_ACK responses. | |||
This enables pipelining of messages on a transfer stream. Although | This enables pipelining of messages on a transfer stream. Although | |||
this example only demonstrates a single bundle transmission, it is | this example only demonstrates a single bundle transmission, it is | |||
also possible to pipeline multiple XFER_SEGMENT messages for | also possible to pipeline multiple XFER_SEGMENT messages for | |||
different bundles without necessarily waiting for XFER_ACK messages | different bundles without necessarily waiting for XFER_ACK messages | |||
to be returned for each one. However, interleaving data segments | to be returned for each one. However, interleaving data segments | |||
from different bundles is not allowed. | from different bundles is not allowed. | |||
skipping to change at page 24, line 4 ¶ | skipping to change at line 1043 ¶ | |||
| Length [L1+L2+L3] | | | Length [L1+L2+L3] | | |||
+-------------------------+ | +-------------------------+ | |||
+-------------------------+ | +-------------------------+ | |||
| SESS_TERM | -> +-------------------------+ | | SESS_TERM | -> +-------------------------+ | |||
+-------------------------+ <- | SESS_TERM | | +-------------------------+ <- | SESS_TERM | | |||
+-------------------------+ | +-------------------------+ | |||
+-------------------------+ +-------------------------+ | +-------------------------+ +-------------------------+ | |||
| TCP Close | -> <- | TCP Close | | | TCP Close | -> <- | TCP Close | | |||
+-------------------------+ +-------------------------+ | +-------------------------+ +-------------------------+ | |||
Figure 15: An example of the flow of protocol messages on a | ||||
single TCP Session between two entities | Figure 15: An Example of the Flow of Protocol Messages on a | |||
Single TCP Session between Two Entities | ||||
4. Session Establishment | 4. Session Establishment | |||
For bundle transmissions to occur using the TCPCL, a TCPCL session | For bundle transmissions to occur using the TCPCL, a TCPCL session | |||
MUST first be established between communicating entities. It is up | MUST first be established between communicating entities. It is up | |||
to the implementation to decide how and when session setup is | to the implementation to decide how and when session setup is | |||
triggered. For example, some sessions can be opened proactively and | triggered. For example, some sessions can be opened proactively and | |||
maintained for as long as is possible given the network conditions, | maintained for as long as is possible given the network conditions, | |||
while other sessions are be opened only when there is a bundle that | while other sessions will be opened only when there is a bundle that | |||
is queued for transmission and the routing algorithm selects a | is queued for transmission and the routing algorithm selects a | |||
certain next-hop node. | certain next-hop node. | |||
4.1. TCP Connection | 4.1. TCP Connection | |||
To establish a TCPCL session, an entity MUST first establish a TCP | To establish a TCPCL session, an entity MUST first establish a TCP | |||
connection with the intended peer entity, typically by using the | connection with the intended peer entity, typically by using the | |||
services provided by the operating system. Destination port number | services provided by the operating system. Destination port number | |||
4556 has been assigned by IANA as the Registered Port number for the | 4556 has been assigned by IANA as the registered port number for the | |||
TCP convergence layer. Other destination port numbers MAY be used | TCPCL; see Section 8.1. Other destination port numbers MAY be used | |||
per local configuration. Determining a peer's destination port | per local configuration. Determining a peer's destination port | |||
number (if different from the registered TCPCL port number) is up to | number (if different from the registered TCPCL port number) is left | |||
the implementation. Any source port number MAY be used for TCPCL | up to the implementation. Any source port number MAY be used for | |||
sessions. Typically an operating system assigned number in the TCP | TCPCL sessions. Typically, an operating system assigned number in | |||
Ephemeral range (49152-65535) is used. | the TCP Ephemeral range (49152-65535) is used. | |||
If the entity is unable to establish a TCP connection for any reason, | If the entity is unable to establish a TCP connection for any reason, | |||
then it is an implementation matter to determine how to handle the | then it is an implementation matter to determine how to handle the | |||
connection failure. An entity MAY decide to re-attempt to establish | connection failure. An entity MAY decide to reattempt to establish | |||
the connection. If it does so, it MUST NOT overwhelm its target with | the connection. If it does so, it MUST NOT overwhelm its target with | |||
repeated connection attempts. Therefore, the entity MUST NOT retry | repeated connection attempts. Therefore, the entity MUST NOT retry | |||
the connection setup earlier than some delay time from the last | the connection setup earlier than some delay time from the last | |||
attempt, and it SHOULD use a (binary) exponential back-off mechanism | attempt, and it SHOULD use a (binary) exponential backoff mechanism | |||
to increase this delay in case of repeated failures. The upper limit | to increase this delay in the case of repeated failures. The upper | |||
on a re-attempt back-off is implementation defined but SHOULD be no | limit on a reattempt backoff is implementation defined but SHOULD be | |||
longer than one minute (60 seconds) before signaling to the BP agent | no longer than one minute (60 seconds) before signaling to the BPA | |||
that a connection cannot be made. | that a connection cannot be made. | |||
Once a TCP connection is established, the active entity SHALL | Once a TCP connection is established, the active entity SHALL | |||
immediately transmit its Contact Header. Once a TCP connection is | immediately transmit its Contact Header. The passive entity SHALL | |||
established, the passive entity SHALL wait for the peer's Contact | wait for the active entity's Contact Header. Upon reception of a | |||
Header. If the passive entity does not receive a Contact Header | Contact Header, the passive entity SHALL transmit its Contact Header. | |||
after some implementation-defined time duration after TCP connection | If either entity does not receive a Contact Header after some | |||
is established, the entity SHALL close the TCP connection. Entities | implementation-defined time duration after the TCP connection is | |||
SHOULD choose a Contact Header reception timeout interval no longer | established, the waiting entity SHALL close the TCP connection. | |||
than one minute (60 seconds). Upon reception of a Contact Header, | Entities SHOULD choose a Contact Header reception timeout interval no | |||
the passive entity SHALL transmit its Contact Header. The ordering | longer than one minute (60 seconds). The ordering of the Contact | |||
of the Contact Header exchange allows the passive entity to avoid | Header exchange allows the passive entity to avoid allocating | |||
allocating resources to a potential TCPCL session until after a valid | resources to a potential TCPCL session until after a valid Contact | |||
Contact Header has been received from the active entity. This | Header has been received from the active entity. This ordering also | |||
ordering also allows the passive peer to adapt to alternate TCPCL | allows the passive peer to adapt to alternate TCPCL protocol | |||
protocol versions. | versions. | |||
The format of the Contact Header is described in Section 4.2. | The format of the Contact Header is described in Section 4.2. | |||
Because the TCPCL protocol version in use is part of the initial | Because the TCPCL protocol version in use is part of the initial | |||
Contact Header, entities using TCPCL version 4 can coexist on a | Contact Header, entities using TCPCL version 4 can coexist on a | |||
network with entities using earlier TCPCL versions (with some | network with entities using earlier TCPCL versions (with some | |||
negotiation needed for interoperation as described in Section 4.3). | negotiation needed for interoperation, as described in Section 4.3). | |||
Within this specification when an entity is said to "close" a TCP | Within this specification, when an entity is said to "close" a TCP | |||
connection the entity SHALL use the TCP FIN mechanism and not the RST | connection the entity SHALL use the TCP FIN mechanism and not the RST | |||
mechanism. Either mechanism, however, when received will cause a TCP | mechanism. However, either mechanism, when received, will cause a | |||
connection to become closed. | TCP connection to become closed. | |||
4.2. Contact Header | 4.2. Contact Header | |||
This section describes the format of the Contact Header and the | This section describes the format of the Contact Header and the | |||
meaning of its fields. | meaning of its fields. | |||
If the entity is configured to enable exchanging messages according | If the entity is configured to enable the exchange of messages | |||
to TLS 1.3 [RFC8446] or any successors which are compatible with that | according to TLS 1.3 [RFC8446] or any successors that are compatible | |||
TLS ClientHello, the the CAN_TLS flag within its Contact Header SHALL | with that TLS ClientHello, the CAN_TLS flag within its Contact Header | |||
be set to 1. The RECOMMENDED policy is to enable TLS for all | SHALL be set to 1. The RECOMMENDED policy is to enable TLS for all | |||
sessions, even if security policy does not allow or require | sessions, even if security policy does not allow or require | |||
authentication. This follows the opportunistic security model of | authentication. This follows the "opportunistic security" model | |||
[RFC7435], though an active attacker could interfere with the | specified in [RFC7435], though an active attacker could interfere | |||
exchange in such cases (see Section 8.4). | with the exchange in such cases (see Section 7.4). | |||
Upon receipt of the Contact Header, both entities perform the | Upon receipt of the Contact Header, both entities perform the | |||
validation and negotiation procedures defined in Section 4.3. After | validation and negotiation procedures defined in Section 4.3. After | |||
receiving the Contact Header from the other entity, either entity MAY | receiving the Contact Header from the other entity, either entity MAY | |||
refuse the session by sending a SESS_TERM message with an appropriate | refuse the session by sending a SESS_TERM message with an appropriate | |||
reason code. | reason code. | |||
The format for the Contact Header is as follows: | The format for the Contact Header is as follows: | |||
1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 | 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 | |||
skipping to change at page 26, line 8 ¶ | skipping to change at line 1144 ¶ | |||
| magic='dtn!' | | | magic='dtn!' | | |||
+---------------+---------------+---------------+---------------+ | +---------------+---------------+---------------+---------------+ | |||
| Version | Flags | | | Version | Flags | | |||
+---------------+---------------+ | +---------------+---------------+ | |||
Figure 16: Contact Header Format | Figure 16: Contact Header Format | |||
See Section 4.3 for details on the use of each of these Contact | See Section 4.3 for details on the use of each of these Contact | |||
Header fields. | Header fields. | |||
The fields of the Contact Header are: | The fields of the Contact Header are as follows: | |||
magic: A four-octet field that always contains the octet sequence | magic: A four-octet field that always contains the octet sequence | |||
0x64 0x74 0x6E 0x21, i.e., the text string "dtn!" in US-ASCII (and | 0x64 0x74 0x6E 0x21, i.e., the text string "dtn!" in US-ASCII (and | |||
UTF-8). | UTF-8). | |||
Version: A one-octet field value containing the value 4 (current | Version: A one-octet field value containing the value 4 (current | |||
version of the TCPCL). | version of the TCPCL protocol). | |||
Flags: A one-octet field of single-bit flags, interpreted according | Flags: A one-octet field of single-bit flags, interpreted according | |||
to the descriptions in Table 1. All reserved header flag bits | to the descriptions in Table 1. All reserved header flag bits | |||
SHALL be set to 0 by the sender. All reserved header flag bits | SHALL be set to 0 by the sender. All reserved header flag bits | |||
SHALL be ignored by the receiver. | SHALL be ignored by the receiver. | |||
+==========+========+========================================+ | +==========+========+===========================================+ | |||
| Name | Code | Description | | | Name | Code | Description | | |||
+==========+========+========================================+ | +==========+========+===========================================+ | |||
| CAN_TLS | 0x01 | If bit is set, indicates that the | | | CAN_TLS | 0x01 | If this bit is set, it indicates that the | | |||
| | | sending peer has enabled TLS security. | | | | | sending peer has enabled TLS security. | | |||
+----------+--------+----------------------------------------+ | +----------+--------+-------------------------------------------+ | |||
| Reserved | others | | | | Reserved | others | | | |||
+----------+--------+----------------------------------------+ | +----------+--------+-------------------------------------------+ | |||
Table 1: Contact Header Flags | Table 1: Contact Header Flags | |||
4.3. Contact Validation and Negotiation | 4.3. Contact Validation and Negotiation | |||
Upon reception of the Contact Header, each entity follows the | Upon reception of the Contact Header, each entity follows the | |||
following procedures to ensure the validity of the TCPCL session and | following procedures to ensure the validity of the TCPCL session and | |||
to negotiate values for the session parameters. | to negotiate values for the session parameters. | |||
If the magic string is not present or is not valid, the connection | If the "magic string" is not present or is not valid, the connection | |||
MUST be terminated. The intent of the magic string is to provide | MUST be terminated. The intent of the magic string is to provide | |||
some protection against an inadvertent TCP connection by a different | some protection against an inadvertent TCP connection by a different | |||
protocol than the one described in this document. To prevent a flood | protocol than the one described in this document. To prevent a flood | |||
of repeated connections from a misconfigured application, a passive | of repeated connections from a misconfigured application, a passive | |||
entity MAY deny new TCP connections from a specific peer address for | entity MAY deny new TCP connections from a specific peer address for | |||
a period of time after one or more connections fail to provide a | a period of time after one or more connections fail to provide a | |||
decodable Contact Header. | decodable Contact Header. | |||
The first negotiation is on the TCPCL protocol version to use. The | The first negotiation attempts to determine which TCPCL protocol | |||
active entity always sends its Contact Header first and waits for a | version to use. The active entity always sends its Contact Header | |||
response from the passive entity. During contact initiation, the | first and waits for a response from the passive entity. During | |||
active TCPCL entity SHALL send the highest TCPCL protocol version on | contact initiation, the active TCPCL entity SHALL send the highest | |||
a first session attempt for a TCPCL peer. If the active entity | TCPCL protocol version on a first session attempt for a TCPCL peer. | |||
receives a Contact Header with a lower protocol version than the one | If the active entity receives a Contact Header with a lower protocol | |||
sent earlier on the TCP connection, the TCP connection SHALL be | version than the one sent earlier on the TCP connection, the TCP | |||
closed. If the active entity receives a SESS_TERM message with | connection SHALL be closed. If the active entity receives a | |||
reason of "Version Mismatch", that entity MAY attempt further TCPCL | SESS_TERM message with a reason code of "Version mismatch", that | |||
sessions with the peer using earlier protocol version numbers in | entity MAY attempt further TCPCL sessions with the peer using earlier | |||
decreasing order. Managing multi-TCPCL-session state such as this is | protocol version numbers in decreasing order. Managing multi-TCPCL- | |||
an implementation matter. | session state such as this is an implementation matter. | |||
If the passive entity receives a Contact Header containing a version | If the passive entity receives a Contact Header containing a version | |||
that is not a version of the TCPCL that the entity implements, then | that is not a version of the TCPCL protocol that the entity | |||
the entity SHALL send its Contact Header and immediately terminate | implements, then the entity SHALL send its Contact Header and | |||
the session with a reason code of "Version mismatch". If the passive | immediately terminate the session with a reason code of "Version | |||
entity receives a Contact Header with a version that is lower than | mismatch". If the passive entity receives a Contact Header with a | |||
the latest version of the protocol that the entity implements, the | version that is lower than the latest version of the protocol that | |||
entity MAY either terminate the session (with a reason code of | the entity implements, the entity MAY either terminate the session | |||
"Version mismatch") or adapt its operation to conform to the older | (with a reason code of "Version mismatch") or adapt its operation to | |||
version of the protocol. The decision of version fall-back is an | conform to the older version of the protocol. The decision of | |||
implementation matter. | version fallback is an implementation matter. | |||
The negotiated contact parameters defined by this specification are | The negotiated contact parameters defined by this specification are | |||
described in the following paragraphs. | described in the following paragraphs. | |||
TCPCL Version: Both Contact Headers of a successful contact | TCPCL Version: Both Contact Headers of a successful contact | |||
negotiation have identical TCPCL Version numbers as described | negotiation have identical TCPCL version numbers as described | |||
above. Only upon response of a Contact Header from the passive | above. Only upon response of a Contact Header from the passive | |||
entity is the TCPCL protocol version established and session | entity is the TCPCL protocol version established and session | |||
negotiation begun. | negotiation begun. | |||
Enable TLS: Negotiation of the Enable TLS parameter is performed by | Enable TLS: Negotiation of the Enable TLS parameter is performed by | |||
taking the logical AND of the two Contact Headers' CAN_TLS flags. | taking the logical AND of the two Contact Headers' CAN_TLS flags. | |||
A local security policy is then applied to determine of the | A local security policy is then applied to determine whether the | |||
negotiated value of Enable TLS is acceptable. It can be a | negotiated value of Enable TLS is acceptable. A reasonable | |||
reasonable security policy to require or disallow the use of TLS | security policy would require or disallow the use of TLS, | |||
depending upon the desired network flows. The RECOMMENDED policy | depending upon the desired network flows. The RECOMMENDED policy | |||
is to require TLS for all sessions, even if security policy does | is to require TLS for all sessions, even if security policy does | |||
not allow or require authentication. Because this state is | not allow or require authentication. Because this state is | |||
negotiated over an unsecured medium, there is a risk of a TLS | negotiated over an unsecured medium, there is a risk of TLS | |||
Stripping as described in Section 8.4. | Stripping as described in Section 7.4. | |||
If the Enable TLS state is unacceptable, the entity SHALL | If the Enable TLS state is unacceptable, the entity SHALL | |||
terminate the session with a reason code of "Contact Failure". | terminate the session with a reason code of "Contact Failure". | |||
Note that this contact failure reason is different than a failure | Note that this "Contact Failure" reason is different than a | |||
of TLS handshake or TLS authentication after an agreed-upon and | failure of a TLS handshake or TLS authentication after an agreed- | |||
acceptable Enable TLS state. If the negotiated Enable TLS value | upon and acceptable Enable TLS state. If the negotiated Enable | |||
is true and acceptable then TLS negotiation feature (described in | TLS value is "true" and acceptable, then the TLS negotiation | |||
Section 4.4) begins immediately following the Contact Header | feature described in Section 4.4 begins immediately following the | |||
exchange. | Contact Header exchange. | |||
4.4. Session Security | 4.4. Session Security | |||
This version of the TCPCL supports establishing a Transport Layer | This version of the TCPCL protocol supports establishing a TLS | |||
Security (TLS) session within an existing TCP connection. When TLS | session within an existing TCP connection. When TLS is used within | |||
is used within the TCPCL it affects the entire session. Once TLS is | the TCPCL, it affects the entire session. Once TLS is established, | |||
established, there is no mechanism available to downgrade the TCPCL | there is no mechanism available to downgrade the TCPCL session to | |||
session to non-TLS operation. | non-TLS operation. | |||
Once established, the lifetime of a TLS connection SHALL be bound to | Once established, the lifetime of a TLS connection SHALL be bound to | |||
the lifetime of the underlying TCP connection. Immediately prior to | the lifetime of the underlying TCP connection. Immediately prior to | |||
actively ending a TLS connection after TCPCL session termination, the | actively ending a TLS connection after TCPCL session termination, the | |||
peer which sent the original (non-reply) SESS_TERM message SHOULD | peer that sent the original (non-reply) SESS_TERM message SHOULD | |||
follow the Closure Alert procedure of [RFC8446] to cleanly terminate | follow the closure alert procedure provided in [RFC8446] to cleanly | |||
the TLS connection. Because each TCPCL message is either fixed- | terminate the TLS connection. Because each TCPCL message is either | |||
length or self-indicates its length, the lack of a TLS Closure Alert | fixed length or self-indicates its length, the lack of a TLS closure | |||
will not cause data truncation or corruption. | alert will not cause data truncation or corruption. | |||
Subsequent TCPCL session attempts to the same passive entity MAY | Subsequent TCPCL session attempts to the same passive entity MAY | |||
attempt to use the TLS session resumption feature. There is no | attempt to use the TLS session resumption feature. There is no | |||
guarantee that the passive entity will accept the request to resume a | guarantee that the passive entity will accept the request to resume a | |||
TLS session, and the active entity cannot assume any resumption | TLS session, and the active entity cannot assume any resumption | |||
outcome. | outcome. | |||
4.4.1. Entity Identification | 4.4.1. Entity Identification | |||
The TCPCL uses TLS for certificate exchange in both directions to | The TCPCL uses TLS for certificate exchange in both directions to | |||
identify each entity and to allow each entity to authenticate its | identify each entity and to allow each entity to authenticate its | |||
peer. Each certificate can potentially identify multiple entities | peer. Each certificate can potentially identify multiple entities, | |||
and there is no problem using such a certificate as long as the | and there is no problem using such a certificate as long as the | |||
identifiers are sufficient to meet authentication policy (as | identifiers are sufficient to meet authentication policy (as | |||
described in later sections) for the entity which presents it. | described in later sections) for the entity that presents it. | |||
Because the PKIX environment of each TCPCL entity are likely not | Because the PKIX environment of each TCPCL entity is likely not | |||
controlled by the certificate end users (see Section 3.4), the TCPCL | controlled by the certificate end users (see Section 3.4), the TCPCL | |||
defines a prioritized list of what a certificate can identify about a | defines a prioritized list of what a certificate can identify | |||
TCPCL entity: | regarding a TCPCL entity: | |||
Node ID: The ideal certificate identity is the Node ID of the entity | Node ID: The ideal certificate identity is the node ID of the entity | |||
using the NODE-ID definition below. When the Node ID is | using the NODE-ID, as defined below. When the node ID is | |||
identified, there is no need for any lower-level identification to | identified, there is no need for any lower-level identification to | |||
be present (though it can still be present, and if so it is also | be present (though it can still be present, and if so it is also | |||
validated). | validated). | |||
DNS Name: If CA policy forbids a certificate to contain an arbitrary | DNS Name: If CA policy forbids a certificate to contain an arbitrary | |||
NODE-ID but allows a DNS-ID to be identified then one or more | NODE-ID but allows a DNS-ID to be identified, then one or more | |||
stable DNS names can be identified in the certificate. The use of | stable DNS names can be identified in the certificate. The use of | |||
wildcard DNS-ID is discouraged due to the complex rules for | wildcard DNS-IDs is discouraged due to the complex rules for | |||
matching and dependence on implementation support for wildcard | matching and dependence on implementation support for wildcard | |||
matching (see Section 6.4.3 of [RFC6125]). | matching (see Section 6.4.3 of [RFC6125]). | |||
Network Address: If no stable DNS name is available but a stable | Network Address: If no stable DNS name is available but a stable | |||
network address is available and CA policy allows a certificate to | network address is available and CA policy allows a certificate to | |||
contain a IPADDR-ID (as defined below) then one or more network | contain an IPADDR-ID (as defined below), then one or more network | |||
addresses can be identified in the certificate. | addresses can be identified in the certificate. | |||
This specification defines a NODE-ID of a certificate as being the | This specification defines a NODE-ID of a certificate as being the | |||
subjectAltName entry of type otherName with a name form of BundleEID | subjectAltName entry of type otherName with a name form of BundleEID | |||
(see Section 4.4.2.1) and a value limited to a Node ID. An entity | (see Section 4.4.2.1) and a value limited to a node ID. An entity | |||
SHALL ignore any otherName with a name form of BundleEID and a value | SHALL ignore any entry of type otherName with a name form of | |||
which is some URI other than a Node ID. The NODE-ID is similar to | BundleEID and a value that is some URI other than a node ID. The | |||
the URI-ID of [RFC6125] but restricted to a Node ID rather than a URI | NODE-ID is similar to the URI-ID as defined in [RFC6125] but is | |||
with a qualified-name authority part. Unless specified otherwise by | restricted to a node ID rather than a URI with a qualified-name | |||
the definition of the URI scheme being authenticated, URI matching of | authority part. Unless specified otherwise by the definition of the | |||
a NODE-ID SHALL use the URI comparison logic of [RFC3986] and scheme- | URI scheme being authenticated, URI matching of a NODE-ID SHALL use | |||
based normalization of those schemes specified in | the URI comparison logic provided in [RFC3986] and scheme-based | |||
[I-D.ietf-dtn-bpbis]. A URI scheme can refine this "exact match" | normalization of those schemes specified in [RFC9171]. A URI scheme | |||
logic with rules about how Node IDs within that scheme are to be | can refine this "exact match" logic with rules regarding how node IDs | |||
compared with the certificate-authenticated NODE-ID. | within that scheme are to be compared with the certificate- | |||
authenticated NODE-ID. | ||||
This specification reuses the DNS-ID definition of Section 1.8 of | This specification reuses the DNS-ID definition in Section 1.8 of | |||
[RFC6125], which is the subjectAltName entry of type dNSName whose | [RFC6125], which is the subjectAltName entry of type dNSName whose | |||
value is encoded according to [RFC5280]. | value is encoded according to [RFC5280]. | |||
This specification defines a IPADDR-ID of a certificate as being the | This specification defines an IPADDR-ID of a certificate as being the | |||
subjectAltName entry of type iPAddress whose value is encoded | subjectAltName entry of type iPAddress whose value is encoded | |||
according to [RFC5280]. | according to [RFC5280]. | |||
4.4.2. Certificate Profile for TCPCL | 4.4.2. Certificate Profile for the TCPCL | |||
All end-entity certificates used by a TCPCL entity SHALL conform to | All end-entity certificates used by a TCPCL entity SHALL conform to | |||
[RFC5280], or any updates or successors to that profile. When an | [RFC5280], or any updates or successors to that profile. When an | |||
end-entity certificate is supplied, the full certification chain | end-entity certificate is supplied, the full certification chain | |||
SHOULD be included unless security policy indicates that is | SHOULD be included unless security policy indicates that is | |||
unnecessary. An entity SHOULD omit the root CA certificate (the last | unnecessary. An entity SHOULD omit the root CA certificate (the last | |||
item of the chain) when sending a certification chain, as the | item of the chain) when sending a certification chain, as the | |||
recipient already has the root CA to anchor its validation. | recipient already has the root CA to anchor its validation. | |||
The TCPCL requires Version 3 certificates due to the extensions used | The TCPCL requires version 3 certificates due to the extensions used | |||
by this profile. TCPCL entities SHALL reject as invalid Version 1 | by this profile. TCPCL entities SHALL reject as invalid version 1 | |||
and Version 2 end-entity certificates. | and version 2 end-entity certificates. | |||
TCPCL entities SHALL accept certificates that contain an empty | TCPCL entities SHALL accept certificates that contain an empty | |||
Subject field or contain a Subject without a Common Name. Identity | Subject field or contain a Subject without a Common Name. Identity | |||
information in end-entity certificates is contained entirely in the | information in end-entity certificates is contained entirely in the | |||
subjectAltName extension as defined in Section 4.4.1 and below. | subjectAltName extension as defined in Section 4.4.1 and discussed in | |||
the paragraphs below. | ||||
All end-entity and CA certificates used for TCPCL SHOULD contain both | All end-entity and CA certificates used for the TCPCL SHOULD contain | |||
a Subject Key Identifier and an Authority Key Identifier extension in | both a subject key identifier and an authority key identifier | |||
accordance with [RFC5280]. TCPCL entities SHOULD NOT rely on either | extension in accordance with [RFC5280]. TCPCL entities SHOULD NOT | |||
a Subject Key Identifier and an Authority Key Identifier being | rely on either a subject key identifier or an authority key | |||
present in any received certificate. Including key identifiers | identifier being present in any received certificate. Including key | |||
simplifies the work of an entity needing to assemble a certification | identifiers simplifies the work of an entity that needs to assemble a | |||
chain. | certification chain. | |||
Unless prohibited by CA policy, a TCPCL end-entity certificate SHALL | Unless prohibited by CA policy, a TCPCL end-entity certificate SHALL | |||
contain a NODE-ID which authenticates the Node ID of the peer. When | contain a NODE-ID that authenticates the node ID of the peer. When | |||
assigned one or more stable DNS names, a TCPCL end-entity certificate | assigned one or more stable DNS names, a TCPCL end-entity certificate | |||
SHOULD contain DNS-ID which authenticates those (fully qualified) | SHOULD contain a DNS-ID that authenticates those (fully qualified) | |||
names. When assigned one or more stable network addresses, a TCPCL | names. When assigned one or more stable network addresses, a TCPCL | |||
end-entity certificate MAY contain IPADDR-ID which authenticates | end-entity certificate MAY contain an IPADDR-ID that authenticates | |||
those addresses. | those addresses. | |||
When allowed by CA policy, a BPSec end-entity certificate SHOULD | When allowed by CA policy, a Bundle Protocol Security (BPSec; see | |||
contain a PKIX Extended Key Usage extension in accordance with | [RFC9172]) end-entity certificate SHOULD contain a PKIX Extended Key | |||
Section 4.2.1.12 of [RFC5280]. When the PKIX Extended Key Usage | Usage (EKU) extension in accordance with Section 4.2.1.12 of | |||
extension is present, it SHOULD contain a key purpose id-kp- | [RFC5280]. When the PKIX EKU extension is present, it SHOULD contain | |||
bundleSecurity (see Section 4.4.2.1). Although not specifically | the key purpose id-kp-bundleSecurity (see Section 4.4.2.1). Although | |||
required by TCPCL, some networks or TLS implementations assume the | not specifically required by the TCPCL, some networks or TLS | |||
use of id-kp-clientAuth and id-kp-serverAuth are needed for, | implementations assume that id-kp-clientAuth and id-kp-serverAuth | |||
respectively, the client-side and server-side of TLS authentication. | need to be used for the client side and the server side of TLS | |||
For interoperability, a TCPCL end-entity certificate MAY contain an | authentication, respectively. For interoperability, a TCPCL end- | |||
Extended Key Usage with both id-kp-clientAuth and id-kp-serverAuth | entity certificate MAY contain an EKU with both id-kp-clientAuth and | |||
values. | id-kp-serverAuth values. | |||
When allowed by CA policy, a TCPCL end-entity certificate SHOULD | When allowed by CA policy, a TCPCL end-entity certificate SHOULD | |||
contain a PKIX Key Usage extension in accordance with Section 4.2.1.3 | contain a PKIX key usage extension in accordance with Section 4.2.1.3 | |||
of [RFC5280]. The PKIX Key Usage bit which is consistent with TCPCL | of [RFC5280]. The PKIX key usage bit that is consistent with TCPCL | |||
security using TLS 1.3 is digitalSignature. The specific algorithms | security using TLS 1.3 is digitalSignature. The specific algorithms | |||
used during the TLS handshake will determine which of those key uses | used during the TLS handshake will determine which of those key uses | |||
are exercised. Earlier versions of TLS can mandate use of the bits | are exercised. Earlier versions of TLS can mandate the use of the | |||
keyEncipherment or keyAgreement. | keyEncipherment bit or the keyAgreement bit. | |||
When allowed by CA policy, a TCPCL end-entity certificate SHOULD | When allowed by CA policy, a TCPCL end-entity certificate SHOULD | |||
contain an Online Certificate Status Protocol (OCSP) URI within an | contain an Online Certificate Status Protocol (OCSP) URI within an | |||
Authority Information Access extension in accordance with | authority information access extension in accordance with | |||
Section 4.2.2.1 of [RFC5280]. | Section 4.2.2.1 of [RFC5280]. | |||
4.4.2.1. PKIX OID Allocations | 4.4.2.1. PKIX OID Allocations | |||
This document defines a PKIX Other Name Form identifier of id-on- | This document defines a PKIX Other Name Form identifier, id-on- | |||
bundleEID in Appendix B which can be used as the type-id in a | bundleEID, in Appendix B; this identifier can be used as the type-id | |||
subjectAltName entry of type otherName. The BundleEID value | in a subjectAltName entry of type otherName. The BundleEID value | |||
associated with otherName type-id id-on-bundleEID SHALL be a URI, | associated with the otherName type-id id-on-bundleEID SHALL be a URI, | |||
encoded as an IA5String, with a scheme which is present in the IANA | encoded as an IA5String, with a scheme that is present in the IANA | |||
"Bundle Protocol URI Scheme Type" registry [IANA-BUNDLE]. Although | "Bundle Protocol URI Scheme Types" registry [IANA-BUNDLE]. Although | |||
this otherName form allows any Endpoint ID to be present, the NODE-ID | this Other Name Form allows any endpoint ID to be present, the NODE- | |||
defined in Section 4.4.1 limits its use to contain only a Node ID. | ID defined in Section 4.4.1 limits its use to contain only a node ID. | |||
This document defines a PKIX Extended Key Usage key purpose id-kp- | This document defines a PKIX EKU key purpose, id-kp-bundleSecurity, | |||
bundleSecurity in Appendix B which can be used to restrict a | in Appendix B; this purpose can be used to restrict a certificate's | |||
certificate's use. The id-kp-bundleSecurity purpose can be combined | use. The id-kp-bundleSecurity purpose can be combined with other | |||
with other purposes in the same certificate. | purposes in the same certificate. | |||
4.4.3. TLS Handshake | 4.4.3. TLS Handshake | |||
The use of TLS is negotiated using the Contact Header as described in | The use of TLS is negotiated via the Contact Header, as described in | |||
Section 4.3. After negotiating an Enable TLS parameter of true, and | Section 4.3. After negotiating an Enable TLS parameter of "true", | |||
before any other TCPCL messages are sent within the session, the | and before any other TCPCL messages are sent within the session, the | |||
session entities SHALL begin a TLS handshake in accordance with | session entities SHALL begin a TLS handshake in accordance with | |||
[RFC8446]. By convention, this protocol uses the entity which | [RFC8446]. By convention, this protocol uses the entity that | |||
initiated the underlying TCP connection (the active peer) as the | initiated the underlying TCP connection (the active peer) as the | |||
"client" role of the TLS handshake request. | "client" role of the TLS handshake request. | |||
The TLS handshake, if it occurs, is considered to be part of the | The TLS handshake, if it occurs, is considered to be part of the | |||
contact negotiation before the TCPCL session itself is established. | contact negotiation before the TCPCL session itself is established. | |||
Specifics about sensitive data exposure are discussed in Section 8. | Specifics regarding exposure of sensitive data are discussed in | |||
Section 7. | ||||
The parameters within each TLS negotiation are implementation | The parameters within each TLS negotiation are implementation | |||
dependent but any TCPCL entity SHALL follow all recommended practices | dependent but any TCPCL entity SHALL follow all recommended practices | |||
of BCP 195 [RFC7525], or any updates or successors that become part | specified in BCP 195 [RFC7525], or any updates or successors that | |||
of BCP 195. Within each TLS handshake, the following requirements | become part of BCP 195. Within each TLS handshake, the following | |||
apply (using the rough order in which they occur): | requirements apply (using the rough order in which they occur): | |||
Client Hello: When a resolved DNS name was used to establish the TCP | ClientHello: When a resolved DNS name was used to establish the TCP | |||
connection, the TLS ClientHello SHOULD include a "server_name" | connection, the TLS ClientHello SHOULD include a "server_name" | |||
extension in accordance with [RFC6066]. When present, the | extension in accordance with [RFC6066]. When present, the | |||
"server_name" extension SHALL contain a "HostName" value taken | server_name extension SHALL contain a "HostName" value taken from | |||
from the DNS name (of the passive entity) which was resolved. | the DNS name (of the passive entity) that was resolved. | |||
Note: The "HostName" in the "server_name" extension is the network | ||||
name for the passive entity, not the Node ID of that entity. | | Note: The "HostName" in the server_name extension is the | |||
| network name for the passive entity, not the node ID of that | ||||
| entity. | ||||
Server Certificate: The passive entity SHALL supply a certificate | Server Certificate: The passive entity SHALL supply a certificate | |||
within the TLS handshake to allow authentication of its side of | within the TLS handshake to allow authentication of its side of | |||
the session. The supplied end-entity certificate SHALL conform to | the session. The supplied end-entity certificate SHALL conform to | |||
the profile of Section 4.4.2. The passive entity MAY use the SNI | the profile described in Section 4.4.2. The passive entity MAY | |||
DNS name to choose an appropriate server-side certificate which | use the SNI DNS name to choose an appropriate server-side | |||
authenticates that DNS name. | certificate that authenticates that DNS name. | |||
Certificate Request: During TLS handshake, the passive entity SHALL | Certificate Request: During the TLS handshake, the passive entity | |||
request a client-side certificate. | SHALL request a client-side certificate. | |||
Client Certificate: The active entity SHALL supply a certificate | Client Certificate: The active entity SHALL supply a certificate | |||
chain within the TLS handshake to allow authentication of its side | chain within the TLS handshake to allow authentication of its side | |||
of the session. The supplied end-entity certificate SHALL conform | of the session. The supplied end-entity certificate SHALL conform | |||
to the profile of Section 4.4.2. | to the profile described in Section 4.4.2. | |||
If a TLS handshake cannot negotiate a TLS connection, both entities | If a TLS handshake cannot negotiate a TLS connection, both entities | |||
of the TCPCL session SHALL close the TCP connection. At this point | of the TCPCL session SHALL close the TCP connection. At this point, | |||
the TCPCL session has not yet been established so there is no TCPCL | the TCPCL session has not yet been established, so there is no TCPCL | |||
session to terminate. | session to terminate. | |||
After a TLS connection is successfully established, the active entity | After a TLS connection is successfully established, the active entity | |||
SHALL send a SESS_INIT message to begin session negotiation. This | SHALL send a SESS_INIT message to begin session negotiation. This | |||
session negotiation and all subsequent messaging are secured. | session negotiation and all subsequent messaging are secured. | |||
4.4.4. TLS Authentication | 4.4.4. TLS Authentication | |||
Using PKIX certificates exchanged during the TLS handshake, each of | Using PKIX certificates exchanged during the TLS handshake, each of | |||
the entities can authenticate a peer Node ID directly or authenticate | the entities can authenticate a peer node ID directly or authenticate | |||
the peer DNS name or network address. The logic for handling | the peer DNS name or network address. The logic for handling | |||
certificates and certificate data is separated into the following | certificates and certificate data is separated into the following | |||
phases: | phases: | |||
1. Validating the certification path from the end-entity certificate | 1. Validating the certification path from the end-entity certificate | |||
up to a trusted root CA. | up to a trusted root CA. | |||
2. Validating the Extended Key Usage (EKU) and other properties of | 2. Validating the EKU and other properties of the end-entity | |||
the end-entity certificate. | certificate. | |||
3. Authenticating identities from a valid end-entity certificate. | 3. Authenticating identities from a valid end-entity certificate. | |||
4. Applying security policy to the result of each identity type | 4. Applying security policy to the result of each identity type | |||
authentication. | authentication. | |||
The result of validating a peer identity (see Section 4.4.1) against | The result of validating a peer identity (see Section 4.4.1) against | |||
one or more type of certificate claim is one of the following: | one or more types of certificate claims is one of the following: | |||
Absent: Indicating that no such claims are present in the | Absent: Indicating that no such claims are present in the | |||
certificate and the identity cannot be authenticated. | certificate and the identity cannot be authenticated. | |||
Success: Indicating that one or more such claims are present and at | Success: Indicating that one or more such claims are present and at | |||
least one matches the peer identity value. | least one matches the peer identity value. | |||
Failure: Indicating that one or more such claims are present and | Failure: Indicating that one or more such claims are present and | |||
none match the peer identity. | none match the peer identity. | |||
4.4.4.1. Certificate Path and Purpose Validation | 4.4.4.1. Certificate Path and Purpose Validation | |||
For any peer end-entity certificate received during TLS handshake, | For any peer end-entity certificate received during the TLS | |||
the entity SHALL perform the certification path validation of | handshake, the entity SHALL perform the certification path validation | |||
[RFC5280] up to one of the entity's trusted CA certificates. If | described in [RFC5280] up to one of the entity's trusted CA | |||
enabled by local policy, the entity SHALL perform an OCSP check of | certificates. If enabled by local policy, the entity SHALL perform | |||
each certificate providing OCSP authority information in accordance | an OCSP check of each certificate providing OCSP authority | |||
with [RFC6960]. If certificate validation fails or if security | information in accordance with [RFC6960]. If certificate validation | |||
policy disallows a certificate for any reason, the entity SHALL fail | fails or if security policy disallows a certificate for any reason, | |||
the TLS handshake with a "bad_certificate" alert. Leaving out part | the entity SHALL fail the TLS handshake with a "bad_certificate" | |||
of the certification chain can cause the entity to fail to validate a | alert. Leaving out part of the certification chain can cause the | |||
certificate if the left-out certificates are unknown to the entity | entity to fail to validate a certificate if the certificates that | |||
(see Section 8.6). | were left out are unknown to the entity (see Section 7.6). | |||
For the end-entity peer certificate received during TLS handshake, | For the end-entity peer certificate received during the TLS | |||
the entity SHALL apply security policy to the Key Usage extension (if | handshake, the entity SHALL apply security policy to the key usage | |||
present) and Extended Key Usage extension (if present) in accordance | extension (if present) and EKU extension (if present) in accordance | |||
with Section 4.2.1.12 of [RFC5280] and the profile in Section 4.4.2. | with Sections 4.2.1.12 and 4.2.1.3 of [RFC5280], respectively, and | |||
with the profile discussed in Section 4.4.2 of this document. | ||||
4.4.4.2. Network-Level Authentication | 4.4.4.2. Network-Level Authentication | |||
Either during or immediately after the TLS handshake, if required by | Either during or immediately after the TLS handshake, each entity, if | |||
security policy each entity SHALL validate the following certificate | required by security policy, SHALL validate the following certificate | |||
identifiers together in accordance with Section 6 of [RFC6125]: | identifiers together in accordance with Section 6 of [RFC6125]: | |||
* If the active entity resolved a DNS name (of the passive entity) | * If the active entity resolved a DNS name (of the passive entity) | |||
in order to initiate the TCP connection that DNS name SHALL be | in order to initiate the TCP connection, that DNS name SHALL be | |||
used as a DNS-ID reference identifier. | used as a DNS-ID reference identifier. | |||
* The IP address of the other side of the TCP connection SHALL be | * The IP address of the other side of the TCP connection SHALL be | |||
used as an IPADDR-ID reference identifier. | used as an IPADDR-ID reference identifier. | |||
If the network-level identifiers authentication result is Failure or | If the network-level identifier's authentication result is Failure or | |||
if the result is Absent and security policy requires an authenticated | if the result is Absent and security policy requires an authenticated | |||
network-level identifier, the entity SHALL terminate the session | network-level identifier, the entity SHALL terminate the session | |||
(with a reason code of "Contact Failure"). | (with a reason code of "Contact Failure"). | |||
4.4.4.3. Node ID Authentication | 4.4.4.3. Node ID Authentication | |||
Immediately before Session Parameter Negotiation, if required by | Immediately before session parameter negotiation, each entity, if | |||
security policy each entity SHALL validate the certificate NODE-ID in | required by security policy, SHALL validate the certificate NODE-ID | |||
accordance with Section 6 of [RFC6125] using the Node ID of the | in accordance with Section 6 of [RFC6125] using the node ID of the | |||
peer's SESS_INIT message as the NODE-ID reference identifier. If the | peer's SESS_INIT message as the NODE-ID reference identifier. If the | |||
NODE-ID validation result is Failure or if the result is Absent and | NODE-ID validation result is Failure or if the result is Absent and | |||
security policy requires an authenticated Node ID, the entity SHALL | security policy requires an authenticated node ID, the entity SHALL | |||
terminate the session (with a reason code of "Contact Failure"). | terminate the session (with a reason code of "Contact Failure"). | |||
4.4.5. Policy Recommendations | 4.4.5. Policy Recommendations | |||
A RECOMMENDED security policy is to enable the use of OCSP checking | A RECOMMENDED security policy encompasses the following: | |||
during TLS handshake. A RECOMMENDED security policy is that if an | ||||
Extended Key Usage is present that it needs to contain id-kp- | ||||
bundleSecurity (of Section 4.4.2.1) to be usable with TCPCL security. | ||||
A RECOMMENDED security policy is to require a validated Node ID (of | ||||
Section 4.4.4.3) and to ignore any network-level identifier (of | ||||
Section 4.4.4.2). | ||||
This policy relies on and informs the certificate requirements in | * enabling the use of OCSP checking during the TLS handshake. | |||
Section 4.4.3. This policy assumes that a DTN-aware CA (see | ||||
Section 3.4) will only issue a certificate for a Node ID when it has | * instructing that, if an EKU extension is present, the extension | |||
verified that the private key holder actually controls the DTN node; | needs to contain id-kp-bundleSecurity (Section 4.4.2.1) to be | |||
this is needed to avoid the threat identified in Section 8.9. This | usable with TCPCL security. | |||
policy requires that a certificate contain a NODE-ID and allows the | ||||
certificate to also contain network-level identifiers. A tailored | * requiring a validated node ID (Section 4.4.4.3) and ignoring any | |||
policy on a more controlled network could relax the requirement on | network-level identifier (Section 4.4.4.2). | |||
Node ID validation and allow just network-level identifiers to | ||||
authenticate a peer. | This policy relies on and informs the certificate requirements | |||
provided in Section 4.4.3. This policy assumes that a DTN-aware CA | ||||
(see Section 3.4) will only issue a certificate for a node ID when it | ||||
has verified that the private key holder actually controls the bundle | ||||
node; this is needed to avoid the threat identified in Section 7.9. | ||||
This policy requires that a certificate contain a NODE-ID and allows | ||||
the certificate to also contain network-level identifiers. A | ||||
tailored policy on a more controlled network could relax the | ||||
requirement on node ID validation and allow just network-level | ||||
identifiers to authenticate a peer. | ||||
4.4.6. Example TLS Initiation | 4.4.6. Example TLS Initiation | |||
A summary of a typical TLS use is shown in the sequence in Figure 17 | A summary of a typical TLS initiation is shown in the sequence in | |||
below. In this example the active peer terminates the session but | Figure 17 below. In this example, the active peer terminates the | |||
termination can be initiated from either peer. | session, but termination can be initiated from either peer. | |||
Entity A Entity B | Entity A Entity B | |||
active peer passive peer | active peer passive peer | |||
+-------------------------+ | +-------------------------+ | |||
| Open TCP Connection | -> +-------------------------+ | | Open TCP Connection | -> +-------------------------+ | |||
+-------------------------+ <- | Accept Connection | | +-------------------------+ <- | Accept Connection | | |||
+-------------------------+ | +-------------------------+ | |||
+-------------------------+ | +-------------------------+ | |||
| Contact Header | -> +-------------------------+ | | Contact Header | -> +-------------------------+ | |||
skipping to change at page 35, line 45 ¶ | skipping to change at line 1596 ¶ | |||
+-------------------------+ <- | SESS_TERM | | +-------------------------+ <- | SESS_TERM | | |||
+-------------------------+ | +-------------------------+ | |||
+-------------------------+ | +-------------------------+ | |||
| TLS Closure Alert | -> +-------------------------+ | | TLS Closure Alert | -> +-------------------------+ | |||
+-------------------------+ <- | TLS Closure Alert | | +-------------------------+ <- | TLS Closure Alert | | |||
+-------------------------+ | +-------------------------+ | |||
+-------------------------+ +-------------------------+ | +-------------------------+ +-------------------------+ | |||
| TCP Close | -> <- | TCP Close | | | TCP Close | -> <- | TCP Close | | |||
+-------------------------+ +-------------------------+ | +-------------------------+ +-------------------------+ | |||
Figure 17: A simple visual example of TCPCL TLS Establishment | Figure 17: A Simple Visual Example of TCPCL TLS Establishment | |||
between two entities | between Two Entities | |||
4.5. Message Header | 4.5. Message Header | |||
After the initial exchange of a Contact Header and (if TLS is | After the initial exchange of a Contact Header and (if TLS is | |||
negotiated to be used) the TLS handshake, all messages transmitted | negotiated to be used) the TLS handshake, all messages transmitted | |||
over the session are identified by a one-octet header with the | over the session are identified by a one-octet header with the | |||
following structure: | following structure: | |||
0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
+---------------+ | +---------------+ | |||
| Message Type | | | Message Type | | |||
+---------------+ | +---------------+ | |||
Figure 18: Format of the Message Header | Figure 18: Format of the Message Header | |||
The message header fields are as follows: | The Message Header contains the following field: | |||
Message Type: Indicates the type of the message as per Table 2 | Message Type: Indicates the type of the message as per Table 2 | |||
below. Encoded values are listed in Section 9.5. | below. Encoded values are listed in Section 8.5. | |||
+==============+======+=====================================+ | +==============+======+=====================================+ | |||
| Name | Code | Description | | | Name | Code | Description | | |||
+==============+======+=====================================+ | +==============+======+=====================================+ | |||
| SESS_INIT | 0x07 | Contains the session parameter | | | SESS_INIT | 0x07 | Contains the session parameter | | |||
| | | inputs from one of the entities, as | | | | | inputs from one of the entities, as | | |||
| | | described in Section 4.6. | | | | | described in Section 4.6. | | |||
+--------------+------+-------------------------------------+ | +--------------+------+-------------------------------------+ | |||
| SESS_TERM | 0x05 | Indicates that one of the entities | | | SESS_TERM | 0x05 | Indicates that one of the entities | | |||
| | | participating in the session wishes | | | | | participating in the session wishes | | |||
skipping to change at page 37, line 30 ¶ | skipping to change at line 1643 ¶ | |||
+--------------+------+-------------------------------------+ | +--------------+------+-------------------------------------+ | |||
| XFER_ACK | 0x02 | Acknowledges reception of a data | | | XFER_ACK | 0x02 | Acknowledges reception of a data | | |||
| | | segment, as described in | | | | | segment, as described in | | |||
| | | Section 5.2.3. | | | | | Section 5.2.3. | | |||
+--------------+------+-------------------------------------+ | +--------------+------+-------------------------------------+ | |||
| XFER_REFUSE | 0x03 | Indicates that the transmission of | | | XFER_REFUSE | 0x03 | Indicates that the transmission of | | |||
| | | the current bundle SHALL be | | | | | the current bundle SHALL be | | |||
| | | stopped, as described in | | | | | stopped, as described in | | |||
| | | Section 5.2.4. | | | | | Section 5.2.4. | | |||
+--------------+------+-------------------------------------+ | +--------------+------+-------------------------------------+ | |||
| KEEPALIVE | 0x04 | Used to keep TCPCL session active, | | | KEEPALIVE | 0x04 | Used to keep the TCPCL session | | |||
| | | as described in Section 5.1.1. | | | | | active, as described in | | |||
| | | Section 5.1.1. | | ||||
+--------------+------+-------------------------------------+ | +--------------+------+-------------------------------------+ | |||
| MSG_REJECT | 0x06 | Contains a TCPCL message rejection, | | | MSG_REJECT | 0x06 | Contains a TCPCL message rejection, | | |||
| | | as described in Section 5.1.2. | | | | | as described in Section 5.1.2. | | |||
+--------------+------+-------------------------------------+ | +--------------+------+-------------------------------------+ | |||
Table 2: TCPCL Message Types | Table 2: TCPCL Message Types | |||
4.6. Session Initialization Message (SESS_INIT) | 4.6. Session Initialization Message (SESS_INIT) | |||
Before a session is established and ready to transfer bundles, the | Before a session is established and ready to transfer bundles, the | |||
session parameters are negotiated between the connected entities. | session parameters are negotiated between the connected entities. | |||
The SESS_INIT message is used to convey the per-entity parameters | The SESS_INIT message is used to convey the per-entity parameters, | |||
which are used together to negotiate the per-session parameters as | which are used together to negotiate the per-session parameters as | |||
described in Section 4.7. | described in Section 4.7. | |||
The format of a SESS_INIT message is as follows in Figure 19. | The format of a SESS_INIT message is shown in Figure 19. | |||
+-----------------------------+ | +-----------------------------+ | |||
| Message Header | | | Message Header | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Keepalive Interval (U16) | | | Keepalive Interval (U16) | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Segment MRU (U64) | | | Segment MRU (U64) | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Transfer MRU (U64) | | | Transfer MRU (U64) | | |||
+-----------------------------+ | +-----------------------------+ | |||
skipping to change at page 38, line 27 ¶ | skipping to change at line 1685 ¶ | |||
+-----------------------------+ | +-----------------------------+ | |||
| Session Extension | | | Session Extension | | |||
| Items Length (U32) | | | Items Length (U32) | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Session Extension | | | Session Extension | | |||
| Items (var.) | | | Items (var.) | | |||
+-----------------------------+ | +-----------------------------+ | |||
Figure 19: SESS_INIT Format | Figure 19: SESS_INIT Format | |||
The fields of the SESS_INIT message are: | The fields of the SESS_INIT message are as follows: | |||
Keepalive Interval: A 16-bit unsigned integer indicating the minimum | Keepalive Interval: A 16-bit unsigned integer indicating the minimum | |||
interval, in seconds, to negotiate as the Session Keepalive using | interval, in seconds, to negotiate as the Session Keepalive using | |||
the method of Section 4.7. | the method described in Section 4.7. | |||
Segment MRU: A 64-bit unsigned integer indicating the largest | Segment MRU: A 64-bit unsigned integer indicating the largest | |||
allowable single-segment data payload size to be received in this | allowable single-segment data payload size to be received in this | |||
session. Any XFER_SEGMENT sent to this peer SHALL have a data | session. Any XFER_SEGMENT sent to this peer SHALL have a data | |||
payload no longer than the peer's Segment MRU. The two entities | payload no longer than the peer's Segment MRU. The two entities | |||
of a single session MAY have different Segment MRUs, and no | of a single session MAY have different Segment MRUs, and no | |||
relation between the two is required. | relationship between the two is required. | |||
Transfer MRU: A 64-bit unsigned integer indicating the largest | Transfer MRU: A 64-bit unsigned integer indicating the largest | |||
allowable total-bundle data size to be received in this session. | allowable total-bundle data size to be received in this session. | |||
Any bundle transfer sent to this peer SHALL have a Total Bundle | Any bundle transfer sent to this peer SHALL have a Total Bundle | |||
Length payload no longer than the peer's Transfer MRU. This value | Length payload no longer than the peer's Transfer MRU. This value | |||
can be used to perform proactive bundle fragmentation. The two | can be used to perform proactive bundle fragmentation. The two | |||
entities of a single session MAY have different Transfer MRUs, and | entities of a single session MAY have different Transfer MRUs, and | |||
no relation between the two is required. | no relationship between the two is required. | |||
Node ID Length and Node ID Data: Together these fields represent a | Node ID Length and Node ID Data: Together, these fields represent a | |||
variable-length text string. The Node ID Length is a 16-bit | variable-length text string. The Node ID Length is a 16-bit | |||
unsigned integer indicating the number of octets of Node ID Data | unsigned integer indicating the number of octets of Node ID Data | |||
to follow. A zero-length Node ID SHALL be used to indicate the | to follow. A zero-length node ID SHALL be used to indicate the | |||
lack of Node ID rather than a truly empty Node ID. This case | lack of a node ID rather than a truly empty node ID. This case | |||
allows an entity to avoid exposing Node ID information on an | allows an entity to avoid exposing node ID information on an | |||
untrusted network. A non-zero-length Node ID Data SHALL contain | untrusted network. A non-zero-length Node ID Data SHALL contain | |||
the UTF-8 encoded Node ID of the Entity which sent the SESS_INIT | the UTF-8 encoded node ID of the entity that sent the SESS_INIT | |||
message. Every Node ID SHALL be a URI consistent with the | message. Every node ID SHALL be a URI consistent with the | |||
requirements of [RFC3986] and the URI schemes of the IANA "Bundle | requirements in [RFC3986] and the URI schemes of the IANA "Bundle | |||
Protocol URI Scheme Type" registry [IANA-BUNDLE]. The Node ID | Protocol URI Scheme Types" registry [IANA-BUNDLE]. The node ID | |||
itself can be authenticated as described in Section 4.4.4. | itself can be authenticated as described in Section 4.4.4. | |||
Session Extension Length and Session Extension Items: Together these | Session Extension Items Length and Session Extension Items list: | |||
fields represent protocol extension data not defined by this | Together, these fields represent protocol extension data not | |||
specification. The Session Extension Length is the total number | defined by this specification. The Session Extension Items Length | |||
of octets to follow which are used to encode the Session Extension | is the total number of octets to follow that are used to encode | |||
Item list. The encoding of each Session Extension Item is within | the Session Extension Items list. The encoding of each Session | |||
a consistent data container as described in Section 4.8. The full | Extension Item is within a consistent data container as described | |||
set of Session Extension Items apply for the duration of the TCPCL | in Section 4.8. The full set of Session Extension Items apply for | |||
session to follow. The order and multiplicity of these Session | the duration of the TCPCL session to follow. The order and | |||
Extension Items is significant, as defined in the associated type | multiplicity of these Session Extension Items are significant, as | |||
specification(s). If the content of the Session Extension Items | defined in the associated type specification(s). If the content | |||
data disagrees with the Session Extension Length (e.g., the last | of the Session Extension Items list disagrees with the Session | |||
Item claims to use more octets than are present in the Session | Extension Items Length (e.g., the last item claims to use more or | |||
Extension Length), the reception of the SESS_INIT is considered to | fewer octets than are indicated in the Session Extension Items | |||
have failed. | Length), the reception of the SESS_INIT is considered to have | |||
failed. | ||||
If an entity receives a peer Node ID which is not authenticated (by | If an entity receives a peer node ID that is not authenticated (by | |||
the procedure of Section 4.4.4.3) that Node ID SHOULD NOT be used by | the procedure described in Section 4.4.4.3), that node ID SHOULD NOT | |||
a BP agent for any discovery or routing functions. Trusting an | be used by a BPA for any discovery or routing functions. Trusting an | |||
unauthenticated Node ID can lead to the threat described in | unauthenticated node ID can lead to the threat described in | |||
Section 8.9. | Section 7.9. | |||
When the active entity initiates a TCPCL session, it is likely based | When the active entity initiates a TCPCL session, it is likely based | |||
on routing information which binds a Node ID to CL parameters used to | on routing information that binds a node ID to CL parameters used to | |||
initiate the session. If the active entity receives a SESS_INIT with | initiate the session. If the active entity receives a SESS_INIT with | |||
different Node ID than was intended for the TCPCL session, the | a different node ID than was intended for the TCPCL session, the | |||
session MAY be allowed to be established. If allowed, such a session | session MAY be allowed to be established. If allowed, such a session | |||
SHALL be associated with the Node ID provided in the SESS_INIT | SHALL be associated with the node ID provided in the SESS_INIT | |||
message rather than any intended value. | message rather than any intended value. | |||
4.7. Session Parameter Negotiation | 4.7. Session Parameter Negotiation | |||
An entity calculates the parameters for a TCPCL session by | An entity calculates the parameters for a TCPCL session by | |||
negotiating the values from its own preferences (conveyed by the | negotiating the values from its own preferences (conveyed by the | |||
SESS_INIT it sent to the peer) with the preferences of the peer | SESS_INIT it sent to the peer) with the preferences of the peer | |||
entity (expressed in the SESS_INIT that it received from the peer). | entity (expressed in the SESS_INIT that it received from the peer). | |||
The negotiated parameters defined by this specification are described | The negotiated parameters defined by this specification are described | |||
in the following paragraphs. | in the following paragraphs. | |||
Transfer MTU and Segment MTU: The maximum transmit unit (MTU) for | Transfer MTU and Segment MTU: The Maximum Transmission Unit (MTU) | |||
whole transfers and individual segments are identical to the | for whole transfers and individual segments is identical to the | |||
Transfer MRU and Segment MRU, respectively, of the received | Transfer MRU and Segment MRU, respectively, of the received | |||
SESS_INIT message. A transmitting peer can send individual | SESS_INIT message. A transmitting peer can send individual | |||
segments with any size smaller than the Segment MTU, depending on | segments with any size smaller than the Segment MTU, depending on | |||
local policy, dynamic network conditions, etc. Determining the | local policy, dynamic network conditions, etc. Determining the | |||
size of each transmitted segment is an implementation matter. If | size of each transmitted segment is an implementation matter. If | |||
either the Transfer MRU or Segment MRU is unacceptable, the entity | either the Transfer MRU or Segment MRU is unacceptable, the entity | |||
SHALL terminate the session with a reason code of "Contact | SHALL terminate the session with a reason code of "Contact | |||
Failure". | Failure". | |||
Session Keepalive: Negotiation of the Session Keepalive parameter is | Session Keepalive: Negotiation of the Session Keepalive parameter is | |||
performed by taking the minimum of the two Keepalive Interval | performed by taking the minimum of the two Keepalive Interval | |||
values from the two SESS_INIT messages. The Session Keepalive | values from the two SESS_INIT messages. The Session Keepalive | |||
interval is a parameter for the behavior described in | Interval is a parameter for the behavior described in | |||
Section 5.1.1. If the Session Keepalive interval is unacceptable, | Section 5.1.1. If the Session Keepalive Interval is unacceptable, | |||
the entity SHALL terminate the session with a reason code of | the entity SHALL terminate the session with a reason code of | |||
"Contact Failure". Note: a negotiated Session Keepalive of zero | "Contact Failure". | |||
indicates that KEEPALIVEs are disabled. | ||||
| Note: A negotiated Session Keepalive of zero indicates that | ||||
| KEEPALIVEs are disabled. | ||||
Once this process of parameter negotiation is completed, this | Once this process of parameter negotiation is completed, this | |||
protocol defines no additional mechanism to change the parameters of | protocol defines no additional mechanism to change the parameters of | |||
an established session; to effect such a change, the TCPCL session | an established session; to effect such a change, the TCPCL session | |||
MUST be terminated and a new session established. | MUST be terminated and a new session established. | |||
4.8. Session Extension Items | 4.8. Session Extension Items | |||
Each of the Session Extension Items SHALL be encoded in an identical | Each of the Session Extension Items SHALL be encoded in an identical | |||
Type-Length-Value (TLV) container form as indicated in Figure 20. | Type-Length-Value (TLV) container form as indicated in Figure 20. | |||
The fields of the Session Extension Item are: | The fields of the Session Extension Item are as follows: | |||
Item Flags: A one-octet field containing generic bit flags about the | Item Flags: A one-octet field containing generic bit flags related | |||
Item, which are listed in Table 3. All reserved header flag bits | to the Item, which are listed in Table 3. All reserved header | |||
SHALL be set to 0 by the sender. All reserved header flag bits | flag bits SHALL be set to 0 by the sender. All reserved header | |||
SHALL be ignored by the receiver. If a TCPCL entity receives a | flag bits SHALL be ignored by the receiver. If a TCPCL entity | |||
Session Extension Item with an unknown Item Type and the CRITICAL | receives a Session Extension Item with an unknown Item Type and | |||
flag of 1, the entity SHALL terminate the TCPCL session with | the CRITICAL flag set to 1, the entity SHALL terminate the TCPCL | |||
SESS_TERM reason code of "Contact Failure". If the CRITICAL flag | session with a SESS_TERM reason code of "Contact Failure". If the | |||
is 0, an entity SHALL skip over and ignore any item with an | CRITICAL flag is 0, an entity SHALL skip over and ignore any item | |||
unknown Item Type. | with an unknown Item Type. | |||
Item Type: A 16-bit unsigned integer field containing the type of | Item Type: A 16-bit unsigned integer field containing the type of | |||
the extension item. This specification does not define any | the extension item. This specification does not define any | |||
extension types directly, but does create an IANA registry for | extension types directly but does create an IANA registry for such | |||
such codes (see Section 9.3). | codes (see Section 8.3). | |||
Item Length: A 16-bit unsigned integer field containing the number | Item Length: A 16-bit unsigned integer field containing the number | |||
of Item Value octets to follow. | of Item Value octets to follow. | |||
Item Value: A variable-length data field which is interpreted | Item Value: A variable-length data field that is interpreted | |||
according to the associated Item Type. This specification places | according to the associated Item Type. This specification places | |||
no restrictions on an extension's use of available Item Value | no restrictions on an extension's use of available Item Value | |||
data. Extension specifications SHOULD avoid the use of large data | data. Extension specifications SHOULD avoid the use of large data | |||
lengths, as no bundle transfers can begin until the full extension | lengths, as no bundle transfers can begin until the full extension | |||
data is sent. | data is sent. | |||
1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 | 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+---------------+---------------+---------------+---------------+ | +---------------+---------------+---------------+---------------+ | |||
| Item Flags | Item Type | Item Length...| | | Item Flags | Item Type | Item Length...| | |||
+---------------+---------------+---------------+---------------+ | +---------------+---------------+---------------+---------------+ | |||
| length contd. | Item Value... | | | length contd. | Item Value... | | |||
+---------------+---------------+---------------+---------------+ | +---------------+---------------+---------------+---------------+ | |||
Figure 20: Session Extension Item Format | Figure 20: Session Extension Item Format | |||
+==========+========+=============================================+ | +==========+========+==================================+ | |||
| Name | Code | Description | | | Name | Code | Description | | |||
+==========+========+=============================================+ | +==========+========+==================================+ | |||
| CRITICAL | 0x01 | If bit is set, indicates that the receiving | | | CRITICAL | 0x01 | If this bit is set, it indicates | | |||
| | | peer must handle the extension item. | | | | | that the receiving peer must | | |||
+----------+--------+---------------------------------------------+ | | | | handle the extension item. | | |||
| Reserved | others | | | +----------+--------+----------------------------------+ | |||
+----------+--------+---------------------------------------------+ | | Reserved | others | | | |||
+----------+--------+----------------------------------+ | ||||
Table 3: Session Extension Item Flags | Table 3: Session Extension Item Flags | |||
5. Established Session Operation | 5. Established Session Operation | |||
This section describes the protocol operation for the duration of an | This section describes the protocol operation for the duration of an | |||
established session, including the mechanism for transmitting bundles | established session, including the mechanism for transmitting bundles | |||
over the session. | over the session. | |||
5.1. Upkeep and Status Messages | 5.1. Upkeep and Status Messages | |||
5.1.1. Session Upkeep (KEEPALIVE) | 5.1.1. Session Upkeep (KEEPALIVE) | |||
The protocol includes a provision for transmission of KEEPALIVE | The protocol includes a provision for transmission of KEEPALIVE | |||
messages over the TCPCL session to help determine if the underlying | messages over the TCPCL session to help determine if the underlying | |||
TCP connection has been disrupted. | TCP connection has been disrupted. | |||
As described in Section 4.3, a negotiated parameter of each session | As described in Section 4.7, a negotiated parameter of each session | |||
is the Session Keepalive interval. If the negotiated Session | is the Session Keepalive Interval. If the negotiated Session | |||
Keepalive is zero (i.e., one or both SESS_INIT messages contains a | Keepalive is zero (i.e., one or both SESS_INIT messages contain a | |||
zero Keepalive Interval), then the keepalive feature is disabled. | zero Keepalive Interval), then the keepalive feature is disabled. | |||
There is no logical minimum value for the keepalive interval (within | There is no logical minimum value for the Keepalive Interval (within | |||
the minimum imposed by the positive-value encoding), but when used | the minimum imposed by the positive-value encoding), but when used | |||
for many sessions on an open, shared network a short interval could | for many sessions on an open, shared network, a short interval could | |||
lead to excessive traffic. For shared network use, entities SHOULD | lead to excessive traffic. For shared network use, entities SHOULD | |||
choose a keepalive interval no shorter than 30 seconds. There is no | choose a Keepalive Interval no shorter than 30 seconds. There is no | |||
logical maximum value for the keepalive interval (within the maximum | logical maximum value for the Keepalive Interval (within the maximum | |||
imposed by the fixed-size encoding), but an idle TCP connection is | imposed by the fixed-size encoding), but an idle TCP connection is | |||
liable for closure by the host operating system if the keepalive time | liable for closure by the host operating system if the keepalive time | |||
is longer than tens-of-minutes. Entities SHOULD choose a keepalive | is longer than tens of minutes. Entities SHOULD choose a Keepalive | |||
interval no longer than 10 minutes (600 seconds). | Interval no longer than 10 minutes (600 seconds). | |||
Note: The Keepalive Interval SHOULD NOT be chosen too short as TCP | The chosen Keepalive Interval SHOULD NOT be too short, as TCP | |||
retransmissions MAY occur in case of packet loss. Those will have to | retransmissions may occur in the case of packet loss. Those will | |||
be triggered by a timeout (TCP retransmission timeout (RTO)), which | have to be triggered by a timeout (TCP retransmission timeout (RTO)), | |||
is dependent on the measured RTT for the TCP connection so that | which is dependent on the measured RTT for the TCP connection so that | |||
KEEPALIVE messages can experience noticeable latency. | KEEPALIVE messages can experience noticeable latency. | |||
The format of a KEEPALIVE message is a one-octet message type code of | The format of a KEEPALIVE message is a one-octet Message Type code of | |||
KEEPALIVE (as described in Table 2) with no additional data. Both | KEEPALIVE (as described in Table 2) with no additional data. Both | |||
sides SHALL send a KEEPALIVE message whenever the negotiated interval | sides SHALL send a KEEPALIVE message whenever the negotiated interval | |||
has elapsed with no transmission of any message (KEEPALIVE or other). | has elapsed with no transmission of any message (KEEPALIVE or other). | |||
If no message (KEEPALIVE or other) has been received in a session | If no message (KEEPALIVE or other) has been received in a session | |||
after some implementation-defined time duration, then the entity | after some implementation-defined time duration, then the entity | |||
SHALL terminate the session by transmitting a SESS_TERM message (as | SHALL terminate the session by transmitting a SESS_TERM message (as | |||
described in Section 6.1) with reason code "Idle Timeout". If | described in Section 6.1) with a reason code of "Idle timeout". If | |||
configurable, the idle timeout duration SHOULD be no shorter than | configurable, the idle timeout duration SHOULD be no shorter than | |||
twice the keepalive interval. If not configurable, the idle timeout | twice the Keepalive Interval. If not configurable, the idle timeout | |||
duration SHOULD be exactly twice the keepalive interval. | duration SHOULD be exactly twice the Keepalive Interval. | |||
5.1.2. Message Rejection (MSG_REJECT) | 5.1.2. Message Rejection (MSG_REJECT) | |||
This message type is not expected to be seen in a well-functioning | This message type is not expected to be seen in a well-functioning | |||
session. Its purpose is to aid in troubleshooting bad entity | session. Its purpose is to aid in troubleshooting bad entity | |||
behavior by allowing the peer to observe why an entity is not | behavior by allowing the peer to observe why an entity is not | |||
responding as expected to its messages. | responding as expected to its messages. | |||
If a TCPCL entity receives a message type which is unknown to it | If a TCPCL entity receives a message type that is unknown to it | |||
(possibly due to an unhandled protocol version mismatch or a | (possibly due to an unhandled protocol version mismatch or an | |||
incorrectly-negotiated session extension which defines a new message | incorrectly negotiated session extension that defines a new message | |||
type), the entity SHALL send a MSG_REJECT message with a Reason Code | type), the entity SHALL send a MSG_REJECT message with a reason code | |||
of "Message Type Unknown" and close the TCP connection. If a TCPCL | of "Message Type Unknown" and close the TCP connection. If a TCPCL | |||
entity receives a message type which is known but is inappropriate | entity receives a message type that is known but is inappropriate for | |||
for the negotiated session parameters (possibly due to incorrectly- | the negotiated session parameters (possibly due to an incorrectly | |||
negotiated session extension), the entity SHALL send a MSG_REJECT | negotiated session extension), the entity SHALL send a MSG_REJECT | |||
message with a Reason Code of "Message Unsupported". If a TCPCL | message with a reason code of "Message Unsupported". If a TCPCL | |||
entity receives a message which is inappropriate for the current | entity receives a message that is inappropriate for the current | |||
session state (e.g., a SESS_INIT after the session has already been | session state (e.g., a SESS_INIT after the session has already been | |||
established or an XFER_ACK message with an unknown Transfer ID), the | established or a XFER_ACK message with an unknown Transfer ID), the | |||
entity SHALL send a MSG_REJECT message with a Reason Code of "Message | entity SHALL send a MSG_REJECT message with a reason code of "Message | |||
Unexpected". | Unexpected". | |||
The format of a MSG_REJECT message is as follows in Figure 21. | The format of a MSG_REJECT message is shown in Figure 21. | |||
+-----------------------------+ | +-----------------------------+ | |||
| Message Header | | | Message Header | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Reason Code (U8) | | | Reason Code (U8) | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Rejected Message Header | | | Rejected Message Header | | |||
+-----------------------------+ | +-----------------------------+ | |||
Figure 21: Format of MSG_REJECT Messages | Figure 21: Format of MSG_REJECT Messages | |||
The fields of the MSG_REJECT message are: | The fields of the MSG_REJECT message are as follows: | |||
Reason Code: A one-octet refusal reason code interpreted according | Reason Code: A one-octet refusal reason code interpreted according | |||
to the descriptions in Table 4. | to the descriptions in Table 4. | |||
Rejected Message Header: The Rejected Message Header is a copy of | Rejected Message Header: The Rejected Message Header is a copy of | |||
the Message Header to which the MSG_REJECT message is sent as a | the Message Header to which the MSG_REJECT message is sent as a | |||
response. | response. | |||
+==============+======+=============================================+ | +==============+======+========================================+ | |||
| Name | Code | Description | | | Name | Code | Description | | |||
+==============+======+=============================================+ | +==============+======+========================================+ | |||
| Message Type | 0x01 | A message was received with a Message | | | Message Type | 0x01 | A message was received with a Message | | |||
| Unknown | | Type code unknown to the TCPCL entity. | | | Unknown | | Type code unknown to the TCPCL entity. | | |||
+--------------+------+---------------------------------------------+ | +--------------+------+----------------------------------------+ | |||
| Message | 0x02 | A message was received but the TCPCL | | | Message | 0x02 | A message was received, but the TCPCL | | |||
| Unsupported | | entity cannot comply with the message | | | Unsupported | | entity cannot comply with the message | | |||
| | | contents. | | | | | contents. | | |||
+--------------+------+---------------------------------------------+ | +--------------+------+----------------------------------------+ | |||
| Message | 0x03 | A message was received while the | | | Message | 0x03 | A message was received while the | | |||
| Unexpected | | session is in a state in which the | | | Unexpected | | session is in a state in which the | | |||
| | | message is not expected. | | | | | message is not expected. | | |||
+--------------+------+---------------------------------------------+ | +--------------+------+----------------------------------------+ | |||
Table 4: MSG_REJECT Reason Codes | Table 4: MSG_REJECT Reason Codes | |||
5.2. Bundle Transfer | 5.2. Bundle Transfer | |||
All of the messages in this section are directly associated with | All of the messages discussed in this section are directly associated | |||
transferring a bundle between TCPCL entities. | with transferring a bundle between TCPCL entities. | |||
A single TCPCL transfer results in a bundle (handled by the | A single TCPCL transfer results in the exchange of a bundle (handled | |||
convergence layer as opaque data) being exchanged from one entity to | by the convergence layer as opaque data) between two entities. In | |||
the other. In TCPCL a transfer is accomplished by dividing a single | the TCPCL, a transfer is accomplished by dividing a single bundle up | |||
bundle up into "segments" based on the receiving-side Segment MRU | into "segments" based on the receiving-side Segment MRU, which is | |||
(see Section 4.2). The choice of the length to use for segments is | defined in Section 4.6. The choice of the length to use for segments | |||
an implementation matter, but each segment MUST NOT be larger than | is an implementation matter, but each segment MUST NOT be larger than | |||
the receiving entity's maximum receive unit (MRU) (see the field | the receiving entity's Segment MRU. The first segment for a bundle | |||
Segment MRU of Section 4.2). The first segment for a bundle is | is indicated by the START flag, and the last segment is indicated by | |||
indicated by the 'START' flag and the last segment is indicated by | the END flag. | |||
the 'END' flag. | ||||
A single transfer (and by extension a single segment) SHALL NOT | A single transfer (and, by extension, a single segment) SHALL NOT | |||
contain data of more than a single bundle. This requirement is | contain data of more than a single bundle. This requirement is | |||
imposed on the agent using the TCPCL rather than TCPCL itself. | imposed on the agent using the TCPCL, rather than on the TCPCL | |||
itself. | ||||
If multiple bundles are transmitted on a single TCPCL connection, | If multiple bundles are transmitted on a single TCPCL connection, | |||
they MUST be transmitted consecutively without interleaving of | they MUST be transmitted consecutively, without the interleaving of | |||
segments from multiple bundles. | segments from multiple bundles. | |||
5.2.1. Bundle Transfer ID | 5.2.1. Bundle Transfer ID | |||
Each of the bundle transfer messages contains a Transfer ID which is | Each of the bundle transfer messages contains a Transfer ID, which is | |||
used to correlate messages (from both sides of a transfer) for each | used to correlate messages (from both sides of a transfer) for each | |||
bundle. A Transfer ID does not attempt to address uniqueness of the | bundle. A Transfer ID does not attempt to address uniqueness of the | |||
bundle data itself and has no relation to concepts such as bundle | bundle data itself and is not related to such concepts as bundle | |||
fragmentation. Each invocation of TCPCL by the bundle protocol | fragmentation. Each invocation of the TCPCL by the BPA, requesting | |||
agent, requesting transmission of a bundle (fragmentary or | transmission of a bundle (fragmentary or otherwise), results in the | |||
otherwise), results in the initiation of a single TCPCL transfer. | initiation of a single TCPCL transfer. Each transfer entails the | |||
Each transfer entails the sending of a sequence of some number of | sending of a sequence of some number of XFER_SEGMENT and XFER_ACK | |||
XFER_SEGMENT and XFER_ACK messages; all are correlated by the same | messages; all are correlated by the same Transfer ID. The sending | |||
Transfer ID. The sending entity originates a transfer ID and the | entity originates a Transfer ID, and the receiving entity uses that | |||
receiving entity uses that same Transfer ID in acknowledgements. | same Transfer ID in acknowledgments. | |||
Transfer IDs from each entity SHALL be unique within a single TCPCL | Transfer IDs from each entity SHALL be unique within a single TCPCL | |||
session. Upon exhaustion of the entire 64-bit Transfer ID space, the | session. Upon exhaustion of the entire 64-bit Transfer ID space, the | |||
sending entity SHALL terminate the session with SESS_TERM reason code | sending entity SHALL terminate the session with a SESS_TERM reason | |||
"Resource Exhaustion". For bidirectional bundle transfers, a TCPCL | code of "Resource Exhaustion". For bidirectional bundle transfers, a | |||
entity SHOULD NOT rely on any relation between Transfer IDs | TCPCL entity SHOULD NOT rely on any relationship between Transfer IDs | |||
originating from each side of the TCPCL session. | originating from each side of the TCPCL session. | |||
Although there is not a strict requirement for Transfer ID initial | Although there is not a strict requirement for initial Transfer ID | |||
values or ordering (see Section 8.13), in the absence of any other | values or the ordering of Transfer IDs (see Section 7.13), in the | |||
mechanism for generating Transfer IDs an entity SHALL use the | absence of any other mechanism for generating Transfer IDs, an entity | |||
following algorithm: The initial Transfer ID from each entity is zero | SHALL use the following algorithm: the initial Transfer ID from each | |||
and subsequent Transfer ID values are incremented from the prior | entity is zero, and subsequent Transfer ID values are incremented | |||
Transfer ID value by one. | from the prior Transfer ID value by one. | |||
5.2.2. Data Transmission (XFER_SEGMENT) | 5.2.2. Data Transmission (XFER_SEGMENT) | |||
Each bundle is transmitted in one or more data segments. The format | Each bundle is transmitted in one or more data segments. The format | |||
of a XFER_SEGMENT message follows in Figure 22. | of a XFER_SEGMENT message is shown in Figure 22. | |||
+------------------------------+ | +------------------------------+ | |||
| Message Header | | | Message Header | | |||
+------------------------------+ | +------------------------------+ | |||
| Message Flags (U8) | | | Message Flags (U8) | | |||
+------------------------------+ | +------------------------------+ | |||
| Transfer ID (U64) | | | Transfer ID (U64) | | |||
+------------------------------+ | +------------------------------+ | |||
| Transfer Extension | | | Transfer Extension | | |||
| Items Length (U32) | | | Items Length (U32) | | |||
skipping to change at page 46, line 27 ¶ | skipping to change at line 2026 ¶ | |||
| Items (var.) | | | Items (var.) | | |||
| (only for START segment) | | | (only for START segment) | | |||
+------------------------------+ | +------------------------------+ | |||
| Data length (U64) | | | Data length (U64) | | |||
+------------------------------+ | +------------------------------+ | |||
| Data contents (octet string) | | | Data contents (octet string) | | |||
+------------------------------+ | +------------------------------+ | |||
Figure 22: Format of XFER_SEGMENT Messages | Figure 22: Format of XFER_SEGMENT Messages | |||
The fields of the XFER_SEGMENT message are: | The fields of the XFER_SEGMENT message are as follows: | |||
Message Flags: A one-octet field of single-bit flags, interpreted | Message Flags: A one-octet field of single-bit flags, interpreted | |||
according to the descriptions in Table 5. All reserved header | according to the descriptions in Table 5. All reserved header | |||
flag bits SHALL be set to 0 by the sender. All reserved header | flag bits SHALL be set to 0 by the sender. All reserved header | |||
flag bits SHALL be ignored by the receiver. | flag bits SHALL be ignored by the receiver. | |||
Transfer ID: A 64-bit unsigned integer identifying the transfer | Transfer ID: A 64-bit unsigned integer identifying the transfer | |||
being made. | being made. | |||
Transfer Extension Length and Transfer Extension Items: Together | Transfer Extension Items Length and Transfer Extension Items list: | |||
these fields represent protocol extension data for this | Together, these fields represent protocol extension data for this | |||
specification. The Transfer Extension Length and Transfer | specification. The Transfer Extension Items Length and Transfer | |||
Extension Item fields SHALL only be present when the 'START' flag | Extension Items list SHALL only be present when the START flag is | |||
is set to 1 on the message. The Transfer Extension Length is the | set to 1 on the message. The Transfer Extension Items Length is | |||
total number of octets to follow which are used to encode the | the total number of octets to follow that are used to encode the | |||
Transfer Extension Item list. The encoding of each Transfer | Transfer Extension Items list. The encoding of each Transfer | |||
Extension Item is within a consistent data container as described | Extension Item is within a consistent data container, as described | |||
in Section 5.2.5. The full set of transfer extension items apply | in Section 5.2.5. The full set of Transfer Extension Items apply | |||
only to the associated single transfer. The order and | only to the associated single transfer. The order and | |||
multiplicity of these transfer extension items is significant, as | multiplicity of these Transfer Extension Items are significant, as | |||
defined in the associated type specification(s). If the content | defined in the associated type specification(s). If the content | |||
of the Transfer Extension Items data disagrees with the Transfer | of the Transfer Extension Items list disagrees with the Transfer | |||
Extension Length (e.g., the last Item claims to use more octets | Extension Items Length (e.g., the last item claims to use more or | |||
than are present in the Transfer Extension Length), the reception | fewer octets than are indicated in the Transfer Extension Items | |||
of the XFER_SEGMENT is considered to have failed. | Length), the reception of the XFER_SEGMENT is considered to have | |||
failed. | ||||
Data length: A 64-bit unsigned integer indicating the number of | Data length: A 64-bit unsigned integer indicating the number of | |||
octets in the Data contents to follow. | octets in Data contents to follow. | |||
Data contents: The variable-length data payload of the message. | Data contents: The variable-length data payload of the message. | |||
+==========+========+=======================================+ | +==========+========+============================================+ | |||
| Name | Code | Description | | | Name | Code | Description | | |||
+==========+========+=======================================+ | +==========+========+============================================+ | |||
| END | 0x01 | If bit is set, indicates that this is | | | END | 0x01 | If this bit is set, it indicates that this | | |||
| | | the last segment of the transfer. | | | | | is the last segment of the transfer. | | |||
+----------+--------+---------------------------------------+ | +----------+--------+--------------------------------------------+ | |||
| START | 0x02 | If bit is set, indicates that this is | | | START | 0x02 | If this bit is set, it indicates that this | | |||
| | | the first segment of the transfer. | | | | | is the first segment of the transfer. | | |||
+----------+--------+---------------------------------------+ | +----------+--------+--------------------------------------------+ | |||
| Reserved | others | | | | Reserved | others | | | |||
+----------+--------+---------------------------------------+ | +----------+--------+--------------------------------------------+ | |||
Table 5: XFER_SEGMENT Flags | Table 5: XFER_SEGMENT Flags | |||
The flags portion of the message contains two flag values in the two | The flags portion of the message contains two flag values in the two | |||
low-order bits, denoted 'START' and 'END' in Table 5. The 'START' | low-order bits, denoted START and END in Table 5. The START flag | |||
flag SHALL be set to 1 when transmitting the first segment of a | SHALL be set to 1 when transmitting the first segment of a transfer. | |||
transfer. The 'END' flag SHALL be set to 1 when transmitting the | The END flag SHALL be set to 1 when transmitting the last segment of | |||
last segment of a transfer. In the case where an entire transfer is | a transfer. In the case where an entire transfer is accomplished in | |||
accomplished in a single segment, both the 'START' and 'END' flags | a single segment, both the START flag and the END flag SHALL be set | |||
SHALL be set to 1. | to 1. | |||
Once a transfer of a bundle has commenced, the entity MUST only send | Once a transfer of a bundle has commenced, the entity MUST only send | |||
segments containing sequential portions of that bundle until it sends | segments containing sequential portions of that bundle until it sends | |||
a segment with the 'END' flag set to 1. No interleaving of multiple | a segment with the END flag set to 1. No interleaving of multiple | |||
transfers from the same entity is possible within a single TCPCL | transfers from the same entity is possible within a single TCPCL | |||
session. Simultaneous transfers between two entities MAY be achieved | session. Simultaneous transfers between two entities MAY be achieved | |||
using multiple TCPCL sessions. | using multiple TCPCL sessions. | |||
5.2.3. Data Acknowledgments (XFER_ACK) | 5.2.3. Data Acknowledgments (XFER_ACK) | |||
Although the TCP transport provides reliable transfer of data between | Although the TCP transport provides reliable transfer of data between | |||
transport peers, the typical BSD sockets interface provides no means | transport peers, the typical BSD sockets interface provides no means | |||
to inform a sending application of when the receiving application has | to inform a sending application of when the receiving application has | |||
processed some amount of transmitted data. Thus, after transmitting | processed some amount of transmitted data. Thus, after transmitting | |||
some data, the TCPCL needs an additional mechanism to determine | some data, the TCPCL needs an additional mechanism to determine | |||
whether the receiving agent has successfully received and fully | whether the receiving agent has successfully received and fully | |||
processed the segment. To this end, the TCPCL protocol provides | processed the segment. To this end, the TCPCL protocol provides | |||
feedback messaging whereby a receiving entity transmits | feedback messaging whereby a receiving entity transmits | |||
acknowledgments of reception of data segments. | acknowledgments of reception of data segments. | |||
The format of an XFER_ACK message follows in Figure 23. | The format of a XFER_ACK message is shown in Figure 23. | |||
+-----------------------------+ | +-----------------------------+ | |||
| Message Header | | | Message Header | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Message Flags (U8) | | | Message Flags (U8) | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Transfer ID (U64) | | | Transfer ID (U64) | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Acknowledged length (U64) | | | Acknowledged length (U64) | | |||
+-----------------------------+ | +-----------------------------+ | |||
Figure 23: Format of XFER_ACK Messages | Figure 23: Format of XFER_ACK Messages | |||
The fields of the XFER_ACK message are: | The fields of the XFER_ACK message are as follows: | |||
Message Flags: A one-octet field of single-bit flags, interpreted | Message Flags: A one-octet field of single-bit flags, interpreted | |||
according to the descriptions in Table 5. All reserved header | according to the descriptions in Table 5. All reserved header | |||
flag bits SHALL be set to 0 by the sender. All reserved header | flag bits SHALL be set to 0 by the sender. All reserved header | |||
flag bits SHALL be ignored by the receiver. | flag bits SHALL be ignored by the receiver. | |||
Transfer ID: A 64-bit unsigned integer identifying the transfer | Transfer ID: A 64-bit unsigned integer identifying the transfer | |||
being acknowledged. | being acknowledged. | |||
Acknowledged length: A 64-bit unsigned integer indicating the total | Acknowledged length: A 64-bit unsigned integer indicating the total | |||
number of octets in the transfer which are being acknowledged. | number of octets in the transfer that are being acknowledged. | |||
A receiving TCPCL entity SHALL send an XFER_ACK message in response | A receiving TCPCL entity SHALL send a XFER_ACK message in response to | |||
to each received XFER_SEGMENT message after the segment has been | each received XFER_SEGMENT message after the segment has been fully | |||
fully processed. The flags portion of the XFER_ACK header SHALL be | processed. The flags portion of the XFER_ACK header SHALL be set to | |||
set to match the corresponding XFER_SEGMENT message being | match the corresponding XFER_SEGMENT message being acknowledged | |||
acknowledged (including flags not decodable to the entity). The | (including flags not decodable to the entity). The acknowledged | |||
acknowledged length of each XFER_ACK contains the sum of the data | length of each XFER_ACK contains the sum of the Data length fields of | |||
length fields of all XFER_SEGMENT messages received so far in the | all XFER_SEGMENT messages received so far in the course of the | |||
course of the indicated transfer. The sending entity SHOULD transmit | indicated transfer. The sending entity SHOULD transmit multiple | |||
multiple XFER_SEGMENT messages without waiting for the corresponding | XFER_SEGMENT messages without waiting for the corresponding XFER_ACK | |||
XFER_ACK responses. This enables pipelining of messages on a | responses. This enables pipelining of messages on a transfer stream. | |||
transfer stream. | ||||
For example, suppose the sending entity transmits four segments of | For example, suppose the sending entity transmits four segments of | |||
bundle data with lengths 100, 200, 500, and 1000, respectively. | bundle data with lengths 100, 200, 500, and 1000, respectively. | |||
After receiving the first segment, the entity sends an acknowledgment | After receiving the first segment, the entity sends an acknowledgment | |||
of length 100. After the second segment is received, the entity | of length 100. After the second segment is received, the entity | |||
sends an acknowledgment of length 300. The third and fourth | sends an acknowledgment of length 300. The third and fourth | |||
acknowledgments are of length 800 and 1800, respectively. | acknowledgments are of lengths 800 and 1800, respectively. | |||
5.2.4. Transfer Refusal (XFER_REFUSE) | 5.2.4. Transfer Refusal (XFER_REFUSE) | |||
The TCPCL supports a mechanism by which a receiving entity can | The TCPCL supports a mechanism by which a receiving entity can | |||
indicate to the sender that it does not want to receive the | indicate to the sender that it does not want to receive the | |||
corresponding bundle. To do so, upon receiving an XFER_SEGMENT | corresponding bundle. To do so, upon receiving a XFER_SEGMENT | |||
message, the entity MAY transmit a XFER_REFUSE message. As data | message, the entity MAY transmit a XFER_REFUSE message. As data | |||
segments and acknowledgments can cross on the wire, the bundle that | segments and acknowledgments can cross on the wire, the bundle that | |||
is being refused SHALL be identified by the Transfer ID of the | is being refused SHALL be identified by the Transfer ID of the | |||
refusal. | refusal. | |||
There is no required relation between the Transfer MRU of a TCPCL | There is no required relationship between the Transfer MRU of a TCPCL | |||
entity (which is supposed to represent a firm limitation of what the | entity (which is supposed to represent a firm limitation of what the | |||
entity will accept) and sending of a XFER_REFUSE message. A | entity will accept) and the sending of a XFER_REFUSE message. A | |||
XFER_REFUSE can be used in cases where the agent's bundle storage is | XFER_REFUSE can be used in cases where the agent's bundle storage is | |||
temporarily depleted or somehow constrained. A XFER_REFUSE can also | temporarily depleted or somehow constrained. A XFER_REFUSE can also | |||
be used after the bundle header or any bundle data is inspected by an | be used after the bundle header or any bundle data is inspected by an | |||
agent and determined to be unacceptable. | agent and determined to be unacceptable. | |||
A transfer receiver MAY send an XFER_REFUSE message as soon as it | A transfer receiver MAY send a XFER_REFUSE message as soon as it | |||
receives any XFER_SEGMENT message. The transfer sender MUST be | receives any XFER_SEGMENT message. The transfer sender MUST be | |||
prepared for this and MUST associate the refusal with the correct | prepared for this and MUST associate the refusal with the correct | |||
bundle via the Transfer ID fields. | bundle via the Transfer ID fields. | |||
The TCPCL itself does not have any required behavior to respond to an | The TCPCL itself does not have any required behavior related to | |||
XFER_REFUSE based on its Reason Code; the refusal is passed up as an | responding to a XFER_REFUSE based on its reason code; the refusal is | |||
indication to the BP agent that the transfer has been refused. If a | passed up as an indication to the BPA that the transfer has been | |||
transfer refusal has a Reason Code which is not decodable to the BP | refused. If a transfer refusal has a reason code that is not | |||
agent, the agent SHOULD treat the refusal as having an Unknown | decodable to the BPA, the agent SHOULD treat the refusal as having a | |||
reason. | reason code of "Unknown". | |||
The format of the XFER_REFUSE message is as follows in Figure 24. | The format of the XFER_REFUSE message is shown in Figure 24. | |||
+-----------------------------+ | +-----------------------------+ | |||
| Message Header | | | Message Header | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Reason Code (U8) | | | Reason Code (U8) | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Transfer ID (U64) | | | Transfer ID (U64) | | |||
+-----------------------------+ | +-----------------------------+ | |||
Figure 24: Format of XFER_REFUSE Messages | Figure 24: Format of XFER_REFUSE Messages | |||
The fields of the XFER_REFUSE message are: | The fields of the XFER_REFUSE message are as follows: | |||
Reason Code: A one-octet refusal reason code interpreted according | Reason Code: A one-octet refusal reason code interpreted according | |||
to the descriptions in Table 6. | to the descriptions in Table 6. | |||
Transfer ID: A 64-bit unsigned integer identifying the transfer | Transfer ID: A 64-bit unsigned integer identifying the transfer | |||
being refused. | being refused. | |||
+=============+======+==========================================+ | +=============+======+==========================================+ | |||
| Name | Code | Description | | | Name | Code | Description | | |||
+=============+======+==========================================+ | +=============+======+==========================================+ | |||
| Unknown | 0x00 | Reason for refusal is unknown or not | | | Unknown | 0x00 | The reason for refusal is unknown or is | | |||
| | | specified. | | | | | not specified. | | |||
+-------------+------+------------------------------------------+ | +-------------+------+------------------------------------------+ | |||
| Completed | 0x01 | The receiver already has the complete | | | Completed | 0x01 | The receiver already has the complete | | |||
| | | bundle. The sender MAY consider the | | | | | bundle. The sender MAY consider the | | |||
| | | bundle as completely received. | | | | | bundle as completely received. | | |||
+-------------+------+------------------------------------------+ | +-------------+------+------------------------------------------+ | |||
| No | 0x02 | The receiver's resources are exhausted. | | | No | 0x02 | The receiver's resources are exhausted. | | |||
| Resources | | The sender SHOULD apply reactive bundle | | | Resources | | The sender SHOULD apply reactive bundle | | |||
| | | fragmentation before retrying. | | | | | fragmentation before retrying. | | |||
+-------------+------+------------------------------------------+ | +-------------+------+------------------------------------------+ | |||
| Retransmit | 0x03 | The receiver has encountered a problem | | | Retransmit | 0x03 | The receiver has encountered a problem | | |||
skipping to change at page 50, line 48 ¶ | skipping to change at line 2237 ¶ | |||
Table 6: XFER_REFUSE Reason Codes | Table 6: XFER_REFUSE Reason Codes | |||
The receiver MUST, for each transfer preceding the one to be refused, | The receiver MUST, for each transfer preceding the one to be refused, | |||
have either acknowledged all XFER_SEGMENT messages or refused the | have either acknowledged all XFER_SEGMENT messages or refused the | |||
bundle transfer. | bundle transfer. | |||
The bundle transfer refusal MAY be sent before an entire data segment | The bundle transfer refusal MAY be sent before an entire data segment | |||
is received. If a sender receives a XFER_REFUSE message, the sender | is received. If a sender receives a XFER_REFUSE message, the sender | |||
MUST complete the transmission of any partially sent XFER_SEGMENT | MUST complete the transmission of any partially sent XFER_SEGMENT | |||
message. There is no way to interrupt an individual TCPCL message | message. There is no way to interrupt an individual TCPCL message | |||
partway through sending it. The sender MUST NOT commence | partway through sending it. The sender MUST NOT subsequently | |||
transmission of any further segments of the refused bundle | commence transmission of any further segments of the refused bundle. | |||
subsequently. Note, however, that this requirement does not ensure | Note, however, that this requirement does not ensure that an entity | |||
that an entity will not receive another XFER_SEGMENT for the same | will not receive another XFER_SEGMENT for the same bundle after | |||
bundle after transmitting a XFER_REFUSE message since messages can | transmitting a XFER_REFUSE message, since messages can cross on the | |||
cross on the wire; if this happens, subsequent segments of the bundle | wire; if this happens, subsequent segments of the bundle SHALL also | |||
SHALL also be refused with a XFER_REFUSE message. | be refused with a XFER_REFUSE message. | |||
Note: If a bundle transmission is aborted in this way, the receiver | | Note: If a bundle transmission is aborted in this way, the | |||
does not receive a segment with the 'END' flag set to 1 for the | | receiver does not receive a segment with the END flag set to 1 | |||
aborted bundle. The beginning of the next bundle is identified by | | for the aborted bundle. The beginning of the next bundle is | |||
the 'START' flag set to 1, indicating the start of a new transfer, | | identified by the START flag set to 1, indicating the start of | |||
and with a distinct Transfer ID value. | | a new transfer, and with a distinct Transfer ID value. | |||
5.2.5. Transfer Extension Items | 5.2.5. Transfer Extension Items | |||
Each of the Transfer Extension Items SHALL be encoded in an identical | Each of the Transfer Extension Items SHALL be encoded in an identical | |||
Type-Length-Value (TLV) container form as indicated in Figure 25. | Type-Length-Value (TLV) container form as indicated in Figure 25. | |||
The fields of the Transfer Extension Item are: | The fields of the Transfer Extension Item are as follows: | |||
Item Flags: A one-octet field containing generic bit flags about the | Item Flags: A one-octet field containing generic bit flags related | |||
Item, which are listed in Table 7. All reserved header flag bits | to the Item, which are listed in Table 7. All reserved header | |||
SHALL be set to 0 by the sender. All reserved header flag bits | flag bits SHALL be set to 0 by the sender. All reserved header | |||
SHALL be ignored by the receiver. If a TCPCL entity receives a | flag bits SHALL be ignored by the receiver. If a TCPCL entity | |||
Transfer Extension Item with an unknown Item Type and the CRITICAL | receives a Transfer Extension Item with an unknown Item Type and | |||
flag is 1, the entity SHALL refuse the transfer with an | the CRITICAL flag is 1, the entity SHALL refuse the transfer with | |||
XFER_REFUSE reason code of "Extension Failure". If the CRITICAL | a XFER_REFUSE reason code of "Extension Failure". If the CRITICAL | |||
flag is 0, an entity SHALL skip over and ignore any item with an | flag is 0, an entity SHALL skip over and ignore any item with an | |||
unknown Item Type. | unknown Item Type. | |||
Item Type: A 16-bit unsigned integer field containing the type of | Item Type: A 16-bit unsigned integer field containing the type of | |||
the extension item. This specification creates an IANA registry | the extension item. This specification creates an IANA registry | |||
for such codes (see Section 9.4). | for such codes (see Section 8.4). | |||
Item Length: A 16-bit unsigned integer field containing the number | Item Length: A 16-bit unsigned integer field containing the number | |||
of Item Value octets to follow. | of Item Value octets to follow. | |||
Item Value: A variable-length data field which is interpreted | Item Value: A variable-length data field that is interpreted | |||
according to the associated Item Type. This specification places | according to the associated Item Type. This specification places | |||
no restrictions on an extension's use of available Item Value | no restrictions on an extension's use of available Item Value | |||
data. Extension specifications SHOULD avoid the use of large data | data. Extension specifications SHOULD avoid the use of large data | |||
lengths, as the associated transfer cannot begin until the full | lengths, as the associated transfer cannot begin until the full | |||
extension data is sent. | extension data is sent. | |||
1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 | 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+---------------+---------------+---------------+---------------+ | +---------------+---------------+---------------+---------------+ | |||
| Item Flags | Item Type | Item Length...| | | Item Flags | Item Type | Item Length...| | |||
skipping to change at page 52, line 4 ¶ | skipping to change at line 2289 ¶ | |||
lengths, as the associated transfer cannot begin until the full | lengths, as the associated transfer cannot begin until the full | |||
extension data is sent. | extension data is sent. | |||
1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 | 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+---------------+---------------+---------------+---------------+ | +---------------+---------------+---------------+---------------+ | |||
| Item Flags | Item Type | Item Length...| | | Item Flags | Item Type | Item Length...| | |||
+---------------+---------------+---------------+---------------+ | +---------------+---------------+---------------+---------------+ | |||
| length contd. | Item Value... | | | length contd. | Item Value... | | |||
+---------------+---------------+---------------+---------------+ | +---------------+---------------+---------------+---------------+ | |||
Figure 25: Transfer Extension Item Format | Figure 25: Transfer Extension Item Format | |||
+==========+========+=============================================+ | +==========+========+==================================+ | |||
| Name | Code | Description | | | Name | Code | Description | | |||
+==========+========+=============================================+ | +==========+========+==================================+ | |||
| CRITICAL | 0x01 | If bit is set, indicates that the receiving | | | CRITICAL | 0x01 | If this bit is set, it indicates | | |||
| | | peer must handle the extension item. | | | | | that the receiving peer must | | |||
+----------+--------+---------------------------------------------+ | | | | handle the extension item. | | |||
| Reserved | others | | | +----------+--------+----------------------------------+ | |||
+----------+--------+---------------------------------------------+ | | Reserved | others | | | |||
+----------+--------+----------------------------------+ | ||||
Table 7: Transfer Extension Item Flags | Table 7: Transfer Extension Item Flags | |||
5.2.5.1. Transfer Length Extension | 5.2.5.1. Transfer Length Extension | |||
The purpose of the Transfer Length extension is to allow entities to | The purpose of the Transfer Length Extension is to allow entities to | |||
preemptively refuse bundles that would exceed their resources or to | preemptively refuse bundles that would exceed their resources or to | |||
prepare storage on the receiving entity for the upcoming bundle data. | prepare storage on the receiving entity for the upcoming bundle data. | |||
Multiple Transfer Length extension items SHALL NOT occur within the | Multiple Transfer Length Extension Items SHALL NOT occur within the | |||
same transfer. The lack of a Transfer Length extension item in any | same transfer. The lack of a Transfer Length Extension Item in any | |||
transfer SHALL NOT imply anything about the potential length of the | transfer SHALL NOT imply anything regarding the potential length of | |||
transfer. The Transfer Length extension SHALL be assigned transfer | the transfer. The Transfer Length Extension SHALL use the IANA- | |||
extension type ID 0x0001. | assigned code point from Section 8.4. | |||
If a transfer occupies exactly one segment (i.e., both START and END | If a transfer occupies exactly one segment (i.e., both the START flag | |||
flags are 1) the Transfer Length extension SHOULD NOT be present. | and the END flag are 1), the Transfer Length Extension SHOULD NOT be | |||
The extension does not provide any additional information for single- | present. The extension does not provide any additional information | |||
segment transfers. | for single-segment transfers. | |||
The format of the Transfer Length data is as follows in Figure 26. | The format of the Transfer Length Extension data is shown in | |||
Figure 26. | ||||
+----------------------+ | +----------------------+ | |||
| Total Length (U64) | | | Total Length (U64) | | |||
+----------------------+ | +----------------------+ | |||
Figure 26: Format of Transfer Length data | Figure 26: Format of Transfer Length Extension Data | |||
The fields of the Transfer Length extension are: | The Transfer Length Extension data contains the following field: | |||
Total Length: A 64-bit unsigned integer indicating the size of the | Total Length: A 64-bit unsigned integer indicating the size of the | |||
data-to-be-transferred. The Total Length field SHALL be treated | data to be transferred. The Total Length field SHALL be treated | |||
as authoritative by the receiver. If, for whatever reason, the | as authoritative by the receiver. If, for whatever reason, the | |||
actual total length of bundle data received differs from the value | actual total length of bundle data received differs from the value | |||
indicated by the Total Length value, the receiver SHALL treat the | indicated by the Total Length value, the receiver SHALL treat the | |||
transmitted data as invalid and send an XFER_REFUSE with a Reason | transmitted data as invalid and send a XFER_REFUSE with a reason | |||
Code of "Not Acceptable". | code of "Not Acceptable". | |||
6. Session Termination | 6. Session Termination | |||
This section describes the procedures for terminating a TCPCL | This section describes the procedures for terminating a TCPCL | |||
session. The purpose of terminating a session is to allow transfers | session. The purpose of terminating a session is to allow transfers | |||
to complete before the TCP connection is closed but not allow any new | to complete before the TCP connection is closed but not allow any new | |||
transfers to start. A session state change is necessary for this to | transfers to start. A session state change is necessary for this to | |||
happen because transfers can be in-progress in either direction | happen, because transfers can be in progress in either direction | |||
(transfer stream) within a session. Waiting for a transfer to | (transfer stream) within a session. Waiting for a transfer to | |||
complete in one direction does not control or influence the | complete in one direction does not control or influence the | |||
possibility of a transfer in the other direction. Either peer of a | possibility of a transfer in the other direction. Either peer of a | |||
session can terminate an established session at any time. | session can terminate an established session at any time. | |||
6.1. Session Termination Message (SESS_TERM) | 6.1. Session Termination Message (SESS_TERM) | |||
To cleanly terminate a session, a SESS_TERM message SHALL be | To cleanly terminate a session, a SESS_TERM message SHALL be | |||
transmitted by either entity at any point following complete | transmitted by either entity at any point following complete | |||
transmission of any other message. When sent to initiate a | transmission of any other message. When sent to initiate a | |||
termination, the REPLY flag of a SESS_TERM message SHALL be 0. Upon | termination, the REPLY flag of a SESS_TERM message SHALL be 0. Upon | |||
receiving a SESS_TERM message after not sending a SESS_TERM message | receiving a SESS_TERM message after not sending a SESS_TERM message | |||
in the same session, an entity SHALL send an acknowledging SESS_TERM | in the same session, an entity SHALL send an acknowledging SESS_TERM | |||
message. When sent to acknowledge a termination, a SESS_TERM message | message. When sent to acknowledge a termination, a SESS_TERM message | |||
SHALL have identical data content from the message being acknowledged | SHALL have identical data content from the message being acknowledged | |||
except for the REPLY flag, which is set to 1 to indicate | except for the REPLY flag, which is set to 1 to indicate | |||
acknowledgement. | acknowledgment. | |||
Once a SESS_TERM message is sent the state of that TCPCL session | Once a SESS_TERM message is sent, the state of that TCPCL session | |||
changes to Ending. While the session is in the Ending state, an | changes to Ending. While the session is in the Ending state, | |||
entity MAY finish an in-progress transfer in either direction. While | ||||
the session is in the Ending state, an entity SHALL NOT begin any new | * an entity MAY finish an in-progress transfer in either direction. | |||
outgoing transfer for the remainder of the session. While the | ||||
session is in the Ending state, an entity SHALL NOT accept any new | * an entity SHALL NOT begin any new outgoing transfer for the | |||
incoming transfer for the remainder of the session. If a new | remainder of the session. | |||
incoming transfer is attempted while in the Ending state, the | ||||
receiving entity SHALL send an XFER_REFUSE with a Reason Code of | * an entity SHALL NOT accept any new incoming transfer for the | |||
remainder of the session. | ||||
If a new incoming transfer is attempted while in the Ending state, | ||||
the receiving entity SHALL send a XFER_REFUSE with a reason code of | ||||
"Session Terminating". | "Session Terminating". | |||
There are circumstances where an entity has an urgent need to close a | There are circumstances where an entity has an urgent need to close a | |||
TCP connection associated with a TCPCL session, without waiting for | TCP connection associated with a TCPCL session, without waiting for | |||
transfers to complete but also in a way which doesn't force timeouts | transfers to complete but also in a way that doesn't force timeouts | |||
to occur; for example, due to impending shutdown of the underlying | to occur -- for example, due to impending shutdown of the underlying | |||
data link layer. Instead of following a clean termination sequence, | data-link layer. Instead of following a clean termination sequence, | |||
after transmitting a SESS_TERM message an entity MAY perform an | after transmitting a SESS_TERM message, an entity MAY perform an | |||
unclean termination by immediately closing the associated TCP | unclean termination by immediately closing the associated TCP | |||
connection. When performing an unclean termination, an entity SHOULD | connection. When performing an unclean termination, an entity SHOULD | |||
acknowledge all received XFER_SEGMENTs with an XFER_ACK before | acknowledge all received XFER_SEGMENTs with a XFER_ACK before closing | |||
closing the TCP connection. Not acknowledging received segments can | the TCP connection. Not acknowledging received segments can result | |||
result in unnecessary bundle or bundle fragment retransmission. Any | in unnecessary bundle or bundle fragment retransmissions. Any delay | |||
delay between request to close the TCP connection and actual closing | between a request to close the TCP connection and the actual closing | |||
of the connection (a "half-closed" state) MAY be ignored by the TCPCL | of the connection (a "half-closed" state) MAY be ignored by the TCPCL | |||
entity. If the underlying TCP connection is closed during a | entity. If the underlying TCP connection is closed during a | |||
transmission (in either transfer stream), the transfer SHALL be | transmission (in either transfer stream), the transfer SHALL be | |||
indicated to the BP agent as failed (see the transmission failure and | indicated to the BPA as failed (see the transmission failure and | |||
reception failure indications of Section 3.1). | reception failure indications defined in Section 3.1). | |||
The TCPCL itself does not have any required behavior to respond to an | The TCPCL itself does not have any required behavior related to | |||
SESS_TERM based on its Reason Code; the termination is passed up as | responding to a SESS_TERM based on its reason code; the termination | |||
an indication to the BP agent that the session state has changed. If | is passed up as an indication to the BPA that the session state has | |||
a termination has a Reason Code which is not decodable to the BP | changed. If a termination has a reason code that is not decodable to | |||
agent, the agent SHOULD treat the termination as having an Unknown | the BPA, the agent SHOULD treat the termination as having a reason | |||
reason. | code of "Unknown". | |||
The format of the SESS_TERM message is as follows in Figure 27. | The format of the SESS_TERM message is shown in Figure 27. | |||
+-----------------------------+ | +-----------------------------+ | |||
| Message Header | | | Message Header | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Message Flags (U8) | | | Message Flags (U8) | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Reason Code (U8) | | | Reason Code (U8) | | |||
+-----------------------------+ | +-----------------------------+ | |||
Figure 27: Format of SESS_TERM Messages | Figure 27: Format of SESS_TERM Messages | |||
The fields of the SESS_TERM message are: | The fields of the SESS_TERM message are as follows: | |||
Message Flags: A one-octet field of single-bit flags, interpreted | Message Flags: A one-octet field of single-bit flags, interpreted | |||
according to the descriptions in Table 8. All reserved header | according to the descriptions in Table 8. All reserved header | |||
flag bits SHALL be set to 0 by the sender. All reserved header | flag bits SHALL be set to 0 by the sender. All reserved header | |||
flag bits SHALL be ignored by the receiver. | flag bits SHALL be ignored by the receiver. | |||
Reason Code: A one-octet refusal reason code interpreted according | Reason Code: A one-octet refusal reason code interpreted according | |||
to the descriptions in Table 9. | to the descriptions in Table 9. | |||
+==========+========+====================================+ | +==========+========+=======================================+ | |||
| Name | Code | Description | | | Name | Code | Description | | |||
+==========+========+====================================+ | +==========+========+=======================================+ | |||
| REPLY | 0x01 | If bit is set, indicates that this | | | REPLY | 0x01 | If this bit is set, it indicates that | | |||
| | | message is an acknowledgement of | | | | | this message is an acknowledgment of | | |||
| | | an earlier SESS_TERM message. | | | | | an earlier SESS_TERM message. | | |||
+----------+--------+------------------------------------+ | +----------+--------+---------------------------------------+ | |||
| Reserved | others | | | | Reserved | others | | | |||
+----------+--------+------------------------------------+ | +----------+--------+---------------------------------------+ | |||
Table 8: SESS_TERM Flags | Table 8: SESS_TERM Flags | |||
+==============+======+==========================================+ | +==============+======+==========================================+ | |||
| Name | Code | Description | | | Name | Code | Description | | |||
+==============+======+==========================================+ | +==============+======+==========================================+ | |||
| Unknown | 0x00 | A termination reason is not available. | | | Unknown | 0x00 | A termination reason is not available. | | |||
+--------------+------+------------------------------------------+ | +--------------+------+------------------------------------------+ | |||
| Idle timeout | 0x01 | The session is being terminated due to | | | Idle timeout | 0x01 | The session is being terminated due to | | |||
| | | idleness. | | | | | idleness. | | |||
+--------------+------+------------------------------------------+ | +--------------+------+------------------------------------------+ | |||
| Version | 0x02 | The entity cannot conform to the | | | Version | 0x02 | The entity cannot conform to the | | |||
skipping to change at page 55, line 30 ¶ | skipping to change at line 2464 ¶ | |||
| Failure | | a Contact Header or SESS_INIT option. | | | Failure | | a Contact Header or SESS_INIT option. | | |||
+--------------+------+------------------------------------------+ | +--------------+------+------------------------------------------+ | |||
| Resource | 0x05 | The entity has run into some resource | | | Resource | 0x05 | The entity has run into some resource | | |||
| Exhaustion | | limit and cannot continue the session. | | | Exhaustion | | limit and cannot continue the session. | | |||
+--------------+------+------------------------------------------+ | +--------------+------+------------------------------------------+ | |||
Table 9: SESS_TERM Reason Codes | Table 9: SESS_TERM Reason Codes | |||
The earliest a TCPCL session termination MAY occur is immediately | The earliest a TCPCL session termination MAY occur is immediately | |||
after transmission of a Contact Header (and prior to any further | after transmission of a Contact Header (and prior to any further | |||
message transmit). This can, for example, be used to notify that the | message transmissions). This can, for example, be used as a | |||
entity is currently not able or willing to communicate. However, an | notification that the entity is currently not able or willing to | |||
entity MUST always send the Contact Header to its peer before sending | communicate. However, an entity MUST always send the Contact Header | |||
a SESS_TERM message. | to its peer before sending a SESS_TERM message. | |||
Termination of the TCP connection MAY occur prior to receiving the | Termination of the TCP connection MAY occur prior to receiving the | |||
Contact header as discussed in Section 4.1. If reception of the | Contact Header as discussed in Section 4.1. If reception of the | |||
Contact Header itself somehow fails (e.g., an invalid "magic string" | Contact Header itself somehow fails (e.g., an invalid magic string is | |||
is received), an entity SHALL close the TCP connection without | received), an entity SHALL close the TCP connection without sending a | |||
sending a SESS_TERM message. | SESS_TERM message. | |||
If a session is to be terminated before a protocol message has | If a session is to be terminated before the sending of a protocol | |||
completed being sent, then the entity MUST NOT transmit the SESS_TERM | message has completed, then the entity MUST NOT transmit the | |||
message but still SHALL close the TCP connection. Each TCPCL message | SESS_TERM message but still SHALL close the TCP connection. Each | |||
is contiguous in the octet stream and has no ability to be cut short | TCPCL message is contiguous in the octet stream and has no ability to | |||
and/or preempted by an other message. This is particularly important | be cut short and/or preempted by another message. This is | |||
when large segment sizes are being transmitted; either entire | particularly important when large segment sizes are being | |||
XFER_SEGMENT is sent before a SESS_TERM message or the connection is | transmitted; either the entire XFER_SEGMENT is sent before a | |||
simply terminated mid-XFER_SEGMENT. | SESS_TERM message or the connection is simply terminated mid- | |||
XFER_SEGMENT. | ||||
6.2. Idle Session Shutdown | 6.2. Idle Session Termination | |||
The protocol includes a provision for clean termination of idle | The protocol includes a provision for clean termination of idle | |||
sessions. Determining the length of time to wait before terminating | sessions. Determining the length of time to wait before terminating | |||
idle sessions, if they are to be terminated at all, is an | idle sessions, if they are to be terminated at all, is an | |||
implementation and configuration matter. | implementation and configuration matter. | |||
If there is a configured time to terminate idle sessions and if no | If there is a configured time to terminate idle sessions and if no | |||
TCPCL messages (other than KEEPALIVE messages) has been received for | TCPCL messages (other than KEEPALIVE messages) have been received for | |||
at least that amount of time, then either entity MAY terminate the | at least that amount of time, then either entity MAY terminate the | |||
session by transmitting a SESS_TERM message indicating the reason | session by transmitting a SESS_TERM message with a reason code of | |||
code of "Idle timeout" (as described in Table 9). | "Idle timeout" (as described in Table 9). | |||
7. Implementation Status | ||||
This section is to be removed before publishing as an RFC. | ||||
[NOTE to the RFC Editor: please remove this section before | ||||
publication, as well as the reference to [RFC7942], | ||||
[github-dtn-demo-agent], and [github-dtn-wireshark].] | ||||
This section records the status of known implementations of the | ||||
protocol defined by this specification at the time of posting of this | ||||
Internet-Draft, and is based on a proposal described in [RFC7942]. | ||||
The description of implementations in this section is intended to | ||||
assist the IETF in its decision processes in progressing drafts to | ||||
RFCs. Please note that the listing of any individual implementation | ||||
here does not imply endorsement by the IETF. Furthermore, no effort | ||||
has been spent to verify the information presented here that was | ||||
supplied by IETF contributors. This is not intended as, and must not | ||||
be construed to be, a catalog of available implementations or their | ||||
features. Readers are advised to note that other implementations can | ||||
exist. | ||||
An example implementation of the this draft of TCPCLv4 has been | ||||
created as a GitHub project [github-dtn-demo-agent] and is intended | ||||
to use as a proof-of-concept and as a possible source of | ||||
interoperability testing. This example implementation uses D-Bus as | ||||
the CL-BP Agent interface, so it only runs on hosts which provide the | ||||
Python "dbus" library. | ||||
A wireshark dissector for TCPCLv4 has been created as a GitHub | ||||
project [github-dtn-wireshark] and has been kept in-sync with the | ||||
latest encoding of this specification. | ||||
8. Security Considerations | 7. Security Considerations | |||
This section separates security considerations into threat categories | This section separates security considerations into threat categories | |||
based on guidance of BCP 72 [RFC3552]. | based on guidance provided in BCP 72 [RFC3552]. | |||
8.1. Threat: Passive Leak of Node Data | 7.1. Threat: Passive Leak of Node Data | |||
When used without TLS security, the TCPCL exposes the Node ID and | When used without TLS security, the TCPCL exposes the node ID and | |||
other configuration data to passive eavesdroppers. This occurs even | other configuration data to passive eavesdroppers. This occurs even | |||
when no transfers occur within a TCPCL session. This can be avoided | when no transfers occur within a TCPCL session. This can be avoided | |||
by always using TLS, even if authentication is not available (see | by always using TLS, even if authentication is not available (see | |||
Section 8.12). | Section 7.12). | |||
8.2. Threat: Passive Leak of Bundle Data | 7.2. Threat: Passive Leak of Bundle Data | |||
TCPCL can be used to provide point-to-point transport security, but | The TCPCL can be used to provide point-to-point transport security, | |||
does not provide security of data-at-rest and does not guarantee end- | but it does not provide security of data at rest and does not | |||
to-end bundle security. The bundle security mechanisms defined in | guarantee end-to-end bundle security. The bundle security mechanisms | |||
[I-D.ietf-dtn-bpsec] are to be used instead. | defined in [RFC9172] are to be used instead. | |||
When used without TLS security, the TCPCL exposes all bundle data to | When used without TLS security, the TCPCL exposes all bundle data to | |||
passive eavesdroppers. This can be avoided by always using TLS, even | passive eavesdroppers. This can be avoided by always using TLS, even | |||
if authentication is not available (see Section 8.12). | if authentication is not available (see Section 7.12). | |||
8.3. Threat: TCPCL Version Downgrade | 7.3. Threat: TCPCL Version Downgrade | |||
When a TCPCL entity supports multiple versions of the protocol it is | When a TCPCL entity supports multiple versions of the protocol, it is | |||
possible for a malicious or misconfigured peer to use an older | possible for a malicious or misconfigured peer to use an older | |||
version of TCPCL which does not support transport security. A on- | version of the TCPCL protocol that does not support transport | |||
path attacker can also manipulate a Contact Header to present a lower | security. An on-path attacker can also manipulate a Contact Header | |||
protocol version than desired. | to present a lower protocol version than desired. | |||
It is up to security policies within each TCPCL entity to ensure that | It is up to security policies within each TCPCL entity to ensure that | |||
the negotiated TCPCL version meets transport security requirements. | the negotiated TCPCL version meets transport security requirements. | |||
8.4. Threat: Transport Security Stripping | 7.4. Threat: Transport Security Stripping | |||
When security policy allows non-TLS sessions, TCPCL does not protect | When security policy allows non-TLS sessions, the TCPCL does not | |||
against active network attackers. It is possible for a on-path | protect against active network attackers. It is possible for an on- | |||
attacker to set the CAN_TLS flag to 0 on either side of the Contact | path attacker to set the CAN_TLS flag to 0 on either side of the | |||
Header exchange, which will cause the negotiation of Section 4.3 to | Contact Header exchange, which will cause the negotiation discussed | |||
disable TLS. This leads to the "SSL Stripping" attack described in | in Section 4.3 to disable TLS. This leads to the "SSL Stripping" | |||
[RFC7457]. | attack described in [RFC7457]. | |||
The purpose of the CAN_TLS flag is to allow the use of TCPCL on | The purpose of the CAN_TLS flag is to allow the use of the TCPCL on | |||
entities which simply do not have a TLS implementation available. | entities that simply do not have a TLS implementation available. | |||
When TLS is available on an entity, it is strongly encouraged that | When TLS is available on an entity, it is strongly encouraged that | |||
the security policy disallow non-TLS sessions. This requires that | the security policy disallow non-TLS sessions. This requires that | |||
the TLS handshake occurs, regardless of the policy-driven parameters | the TLS handshake occur, regardless of the policy-driven parameters | |||
of the handshake and policy-driven handling of the handshake outcome. | of the handshake and policy-driven handling of the handshake outcome. | |||
One mechanism to mitigate the possibility of TLS stripping is the use | One mechanism to mitigate the possibility of TLS Stripping is the use | |||
of DNS-based Authentication of Named Entities (DANE) [RFC6698] toward | of DNS-based Authentication of Named Entities (DANE) [RFC6698] toward | |||
the passive peer. This mechanism relies on DNS and is | the passive peer. This mechanism relies on DNS and is | |||
unidirectional, so it doesn't help with applying policy toward the | unidirectional, so it doesn't help with applying policy toward the | |||
active peer, but it can be useful in an environment using | active peer, but it can be useful in an environment using | |||
opportunistic security. The configuration and use of DANE are | opportunistic security. The configuration and use of DANE are | |||
outside of the scope of this document. | outside of the scope of this document. | |||
The negotiated use of TLS is identical behavior to STARTTLS use in | The negotiated use of TLS is identical in behavior to the use of | |||
[RFC2595], [RFC4511], and others. | STARTTLS as described in [RFC2595], [RFC4511], and others. | |||
8.5. Threat: Weak TLS Configurations | 7.5. Threat: Weak TLS Configurations | |||
Even when using TLS to secure the TCPCL session, the actual | Even when using TLS to secure the TCPCL session, the actual cipher | |||
ciphersuite negotiated between the TLS peers can be insecure. | suite negotiated between the TLS peers can be insecure. | |||
Recommendations for ciphersuite use are included in BCP 195 | Recommendations for using cipher suites are included in BCP 195 | |||
[RFC7525]. It is up to security policies within each TCPCL entity to | [RFC7525]. It is up to security policies within each TCPCL entity to | |||
ensure that the negotiated TLS ciphersuite meets transport security | ensure that the negotiated TLS cipher suite meets transport security | |||
requirements. | requirements. | |||
8.6. Threat: Untrusted End-Entity Certificate | 7.6. Threat: Untrusted End-Entity Certificate | |||
The profile in Section 4.4.4 uses end-entity certificates chained up | The authentication method discussed in Section 4.4.4 uses end-entity | |||
to a trusted root CA. During TLS handshake, either entity can send a | certificates chained to a trusted root CA. During a TLS handshake, | |||
certificate set which does not contain the full chain, possibly | either entity can send a certificate set that does not contain the | |||
excluding intermediate or root CAs. In an environment where peers | full chain, possibly excluding intermediate or root CAs. In an | |||
are known to already contain needed root and intermediate CAs there | environment where peers are known to already contain needed root and | |||
is no need to include those CAs, but this has a risk of an entity not | intermediate CAs, there is no need to include those CAs, but this | |||
actually having one of the needed CAs. | carries the risk of an entity not actually having one of the needed | |||
CAs. | ||||
8.7. Threat: Certificate Validation Vulnerabilities | 7.7. Threat: Certificate Validation Vulnerabilities | |||
Even when TLS itself is operating properly an attacker can attempt to | Even when TLS itself is operating properly, an attacker can attempt | |||
exploit vulnerabilities within certificate check algorithms or | to exploit vulnerabilities within certificate check algorithms or | |||
configuration to establish a secure TCPCL session using an invalid | configuration to establish a secure TCPCL session using an invalid | |||
certificate. A BP agent treats the peer Node ID within a TCPCL | certificate. A BPA treats the peer node ID within a TCPCL session as | |||
session as authoritative and an invalid certificate exploit could | authoritative, and exploitation via an invalid certificate could lead | |||
lead to bundle data leaking and/or denial of service to the Node ID | to bundle data leaking and/or denial of service to the node ID being | |||
being impersonated. | impersonated. | |||
There are many reasons, described in [RFC5280] and [RFC6125], why a | There are many reasons, as described in [RFC5280] and [RFC6125], why | |||
certificate can fail to validate, including using the certificate | a certificate can fail to validate, including using the certificate | |||
outside of its valid time interval, using purposes for which it was | outside of its valid time interval, using purposes for which it was | |||
not authorized, or using it after it has been revoked by its CA. | not authorized, or using it after it has been revoked by its CA. | |||
Validating a certificate is a complex task and can require network | Validating a certificate is a complex task and can require network | |||
connectivity outside of the primary TCPCL network path(s) if a | connectivity outside of the primary TCPCL network path(s) if a | |||
mechanism such as OCSP [RFC6960] is used by the CA. The | mechanism such as OCSP [RFC6960] is used by the CA. The | |||
configuration and use of particular certificate validation methods | configuration and use of particular certificate validation methods | |||
are outside of the scope of this document. | are outside of the scope of this document. | |||
8.8. Threat: Symmetric Key Limits | 7.8. Threat: Symmetric Key Limits | |||
Even with a secure block cipher and securely-established session | Even with a secure block cipher and securely established session | |||
keys, there are limits to the amount of plaintext which can be safely | keys, there are limits to the amount of plaintext that can be safely | |||
encrypted with a given set of keys as described in [AEAD-LIMITS]. | encrypted with a given set of keys, as described in [AEAD-LIMITS]. | |||
When permitted by the negotiated TLS version (see [RFC8446]), it is | When permitted by the negotiated TLS version (see [RFC8446]), it is | |||
advisable to take advantage of session key updates to avoid those | advisable to take advantage of session key updates to avoid those | |||
limits. | limits. | |||
8.9. Threat: BP Node Impersonation | 7.9. Threat: BP Node Impersonation | |||
The certificates exchanged by TLS enable authentication of peer DNS | The certificates exchanged by TLS enable authentication of the peer | |||
name and Node ID, but it is possible that a peer either not provide a | DNS name and node ID, but it is possible that either a peer does not | |||
valid certificate or that the certificate does not validate either | provide a valid certificate or the certificate does not validate | |||
the DNS-ID/IPADDR-ID or NODE-ID of the peer (see Section 3.4). | either the DNS-ID/IPADDR-ID or NODE-ID of the peer (see Section 3.4). | |||
Having a CA-validated certificate does not alone guarantee the | Having a CA-validated certificate does not alone guarantee the | |||
identity of the network host or BP node from which the certificate is | identity of the network host or BP node from which the certificate is | |||
provided; additional validation procedures in Section 4.4.3 bind the | provided; additional validation procedures as provided in | |||
DNS-ID/IPADDR-ID or NODE-ID based on the contents of the certificate. | Section 4.4.4 bind the DNS-ID/IPADDR-ID or NODE-ID based on the | |||
contents of the certificate. | ||||
The DNS-ID/IPADDR-ID validation is a weaker form of authentication, | The DNS-ID/IPADDR-ID validation is a weaker form of authentication, | |||
because even if a peer is operating on an authenticated network DNS | because even if a peer is operating on an authenticated network DNS | |||
name or IP address it can provide an invalid Node ID and cause | name or IP address it can provide an invalid node ID and cause | |||
bundles to be "leaked" to an invalid node. Especially in DTN | bundles to be "leaked" to an invalid node. Especially in DTN | |||
environments, network names and addresses of nodes can be time- | environments, network names and addresses of nodes can be time- | |||
variable so binding a certificate to a Node ID is a more stable | variable, so binding a certificate to a node ID results in a more | |||
identity. | stable identity. | |||
NODE-ID validation ensures that the peer to which a bundle is | NODE-ID validation ensures that the peer to which a bundle is | |||
transferred is in fact the node which the BP Agent expects it to be. | transferred is in fact the node that the BPA expects it to be. In | |||
In circumstances where certificates can only be issued to DNS names, | circumstances where certificates can only be issued to DNS names, | |||
Node ID validation is not possible but it could be reasonable to | node ID validation is not possible, but it could be reasonable to | |||
assume that a trusted host is not going to present an invalid Node | assume that a trusted host is not going to present an invalid node | |||
ID. Determining when a DNS-ID/IPADDR-ID authentication can be | ID. Determining when a DNS-ID/IPADDR-ID authentication can be | |||
trusted to validate a Node ID is also a policy matter outside of the | trusted to validate a node ID is also a policy matter outside of the | |||
scope of this document. | scope of this document. | |||
One mitigation to arbitrary entities with valid PKIX certificates | One mitigation regarding arbitrary entities with valid PKIX | |||
impersonating arbitrary Node IDs is the use of the PKIX Extended Key | certificates impersonating arbitrary node IDs is the use of the PKIX | |||
Usage key purpose id-kp-bundleSecurity (see Section 4.4.2.1). When | EKU key purpose id-kp-bundleSecurity (Section 4.4.2.1). When this | |||
this Extended Key Usage is present in the certificate, it represents | EKU is present in the certificate, it represents a stronger assertion | |||
a stronger assertion that the private key holder should in fact be | that the private key holder should in fact be trusted to operate as a | |||
trusted to operate as a DTN Node. | bundle node. | |||
8.10. Threat: Denial of Service | 7.10. Threat: Denial of Service | |||
The behaviors described in this section all amount to a potential | The behaviors described in this section all amount to a potential | |||
denial-of-service to a TCPCL entity. The denial-of-service could be | denial of service to a TCPCL entity. The denial of service could be | |||
limited to an individual TCPCL session, could affect other well- | limited to an individual TCPCL session, could affect other well- | |||
behaving sessions on an entity, or could affect all sessions on a | behaved sessions on an entity, or could affect all sessions on a | |||
host. | host. | |||
A malicious entity can continually establish TCPCL sessions and delay | A malicious entity can trigger timeouts by continually establishing | |||
sending of protocol-required data to trigger timeouts. The victim | TCPCL sessions and delaying the sending of protocol-required data. | |||
entity can block TCP connections from network peers which are thought | The victim entity can block TCP connections from network peers that | |||
to be incorrectly behaving within TCPCL. | are thought to behave incorrectly within the TCPCL. | |||
An entity can send a large amount of data over a TCPCL session, | An entity can send a large amount of data over a TCPCL session, | |||
requiring the receiving entity to handle the data. The victim entity | requiring the receiving entity to handle the data. The victim entity | |||
can attempt to stop the flood of data by sending an XFER_REFUSE | can attempt to stop the flood of data by sending a XFER_REFUSE | |||
message, or forcibly terminate the session. | message or can forcibly terminate the session. | |||
There is the possibility of a "data dribble" attack in which an | A "data dribble" attack is also possible, in which an entity presents | |||
entity presents a very small Segment MRU which causes transfers to be | a very small Segment MRU that causes transfers to be split among a | |||
split among an large number of very small segments and causes the | large number of very small segments and causes the resultant | |||
segmentation overhead to overwhelm the actual bundle data segments. | segmentation overhead to overwhelm the actual bundle data segments. | |||
Similarly, an entity can present a very small Transfer MRU which will | Similarly, an entity can present a very small Transfer MRU that will | |||
cause resources to be wasted on establishment and upkeep of a TCPCL | cause resources to be wasted on establishment and upkeep of a TCPCL | |||
session over which a bundle could never be transferred. The victim | session over which a bundle could never be transferred. The victim | |||
entity can terminate the session during the negotiation of | entity can terminate the session during parameter negotiation | |||
Section 4.7 if the MRUs are unacceptable. | (Section 4.7) if the MRUs are unacceptable. | |||
The keepalive mechanism can be abused to waste throughput within a | An abusive entity could cause the keepalive mechanism to waste | |||
network link which would otherwise be usable for bundle | throughput within a network link that would otherwise be usable for | |||
transmissions. Due to the quantization of the Keepalive Interval | bundle transmissions. Due to the quantization of the Keepalive | |||
parameter the smallest Session Keepalive is one second, which should | Interval parameter, the smallest Session Keepalive is one second, | |||
be long enough to not flood the link. The victim entity can | which should be long enough to not flood the link. The victim entity | |||
terminate the session during the negotiation of Section 4.7 if the | can terminate the session during parameter negotiation (Section 4.7) | |||
Keepalive Interval is unacceptable. | if the Keepalive Interval is unacceptable. | |||
Finally, an attacker or a misconfigured entity can cause issues at | Finally, an attacker or a misconfigured entity can cause issues at | |||
the TCP connection which will cause unnecessary TCP retransmissions | the TCP connection that will cause unnecessary TCP retransmissions or | |||
or connection resets, effectively denying the use of the overlying | connection resets, effectively denying the use of the overlying TCPCL | |||
TCPCL session. | session. | |||
8.11. Mandatory-to-Implement TLS | 7.11. Mandatory-to-Implement TLS | |||
Following IETF best current practice, TLS is mandatory to implement | Following IETF best current practice, TLS is mandatory to implement | |||
for all TCPCL implementations but TLS is optional to use for a given | for all TCPCL implementations but TLS is optional to use for a given | |||
TCPCL session. The recommended configuration of Section 4.2 is to | TCPCL session. The policy recommendations in Sections 4.2 and 4.3 | |||
always enable TLS, but entities are permitted to disable TLS based on | both enable TLS and require TLS, but entities are permitted to | |||
local configuration. The configuration to enable or disable TLS for | disable and not require TLS based on local configuration. The | |||
an entity or a session is outside of the scope of this document. The | configuration to enable or require TLS for an entity or a session is | |||
configuration to disable TLS is different from the threat of TLS | outside of the scope of this document. The configuration to disable | |||
stripping described in Section 8.4. | TLS is different from the threat of TLS Stripping as described in | |||
Section 7.4. | ||||
8.12. Alternate Uses of TLS | 7.12. Alternate Uses of TLS | |||
This specification makes use of PKIX certificate validation and | This specification makes use of PKIX certificate validation and | |||
authentication within TLS. There are alternate uses of TLS which are | authentication within TLS. There are alternate uses of TLS that are | |||
not necessarily incompatible with the security goals of this | not necessarily incompatible with the security goals of this | |||
specification, but are outside of the scope of this document. The | specification but that are outside of the scope of this document. | |||
following subsections give examples of alternate TLS uses. | The following subsections give examples of alternate TLS uses. | |||
8.12.1. TLS Without Authentication | 7.12.1. TLS without Authentication | |||
In environments where PKI is available but there are restrictions on | In environments where PKI is available but there are restrictions on | |||
the issuance of certificates (including the contents of | the issuance of certificates (including the contents of | |||
certificates), it may be possible to make use of TLS in a way which | certificates), it may be possible to make use of TLS in a way that | |||
authenticates only the passive entity of a TCPCL session or which | authenticates only the passive entity of a TCPCL session or that does | |||
does not authenticate either entity. Using TLS in a way which does | not authenticate either entity. Using TLS in a way that does not | |||
not successfully authenticate some claim of both peer entities of a | successfully authenticate some claim of both peer entities of a TCPCL | |||
TCPCL session is outside of the scope of this document but does have | session is outside of the scope of this document but does have | |||
similar properties to the opportunistic security model of [RFC7435]. | properties similar to the opportunistic security model [RFC7435]. | |||
8.12.2. Non-Certificate TLS Use | 7.12.2. Non-certificate TLS Use | |||
In environments where PKI is unavailable, alternate uses of TLS which | In environments where PKI is unavailable, alternate uses of TLS that | |||
do not require certificates such as pre-shared key (PSK) | do not require certificates such as pre-shared key (PSK) | |||
authentication [RFC5489] and the use of raw public keys [RFC7250] are | authentication [RFC5489] and the use of raw public keys [RFC7250] are | |||
available and can be used to ensure confidentiality within TCPCL. | available and can be used to ensure confidentiality within the TCPCL. | |||
Using non-PKI node authentication methods is outside of the scope of | Using non-PKI node authentication methods is outside of the scope of | |||
this document. | this document. | |||
8.13. Predictability of Transfer IDs | 7.13. Predictability of Transfer IDs | |||
The only requirement on Transfer IDs is that they be unique with each | The only requirement on Transfer IDs is that they be unique within | |||
session from the sending peer only. The trivial algorithm of the | each session from the sending peer only. The trivial algorithm of | |||
first transfer starting at zero and later transfers incrementing by | the first transfer starting at zero and later transfers incrementing | |||
one causes absolutely predictable Transfer IDs. Even when a TCPCL | by one causes absolutely predictable Transfer IDs. Even when a TCPCL | |||
session is not TLS secured and there is a on-path attacker causing | session is not TLS secured and there is an on-path attacker causing | |||
denial of service with XFER_REFUSE messages, it is not possible to | denial of service with XFER_REFUSE messages, it is not possible to | |||
preemptively refuse a transfer so there is no benefit in having | preemptively refuse a transfer, so there is no benefit in having | |||
unpredictable Transfer IDs within a session. | unpredictable Transfer IDs within a session. | |||
9. IANA Considerations | 8. IANA Considerations | |||
Registration procedures referred to in this section are defined in | Registration procedures referred to in this section (e.g., the RFC | |||
[RFC8126]. | Required policy) are defined in [RFC8126]. | |||
Some of the registries have been defined as version specific to | Some of the registries have been defined as version specific for | |||
TCPCLv4, and imports some or all codepoints from TCPCLv3. This was | TCPCLv4, and these registries reuse some or all codepoints from | |||
done to disambiguate the use of these codepoints between TCPCLv3 and | TCPCLv3. This was done to disambiguate the use of these codepoints | |||
TCPCLv4 while preserving the semantics of some of the codepoints. | between TCPCLv3 and TCPCLv4 while preserving the semantics of some of | |||
the codepoints. | ||||
9.1. Port Number | 8.1. Port Number | |||
Within the port registry of [IANA-PORTS], TCP port number 4556 has | Within the "Service Name and Transport Protocol Port Number Registry" | |||
been previously assigned as the default port for the TCP convergence | [IANA-PORTS], TCP port number 4556 had previously been assigned as | |||
layer in [RFC7242]. This assignment is unchanged by TCPCL version 4, | the default port for the TCPCL; see [RFC7242]. This assignment is | |||
but the assignment reference is updated to this specification. Each | unchanged by TCPCL version 4, but the assignment reference has been | |||
TCPCL entity identifies its TCPCL protocol version in its initial | updated to point to this specification. Each TCPCL entity identifies | |||
contact (see Section 9.2), so there is no ambiguity about what | its TCPCL protocol version in its initial contact (see Sections 3.2 | |||
protocol is being used. The related assignments for UDP and DCCP | and 8.2), so there is no ambiguity regarding what protocol is being | |||
port 4556 (both registered by [RFC7122]) are unchanged. | used. The related assignments for UDP and DCCP port 4556 (both | |||
registered by [RFC7122]) are unchanged. | ||||
+========================+============================+ | +========================+============================+ | |||
| Parameter | Value | | | Parameter | Value | | |||
+========================+============================+ | +========================+============================+ | |||
| Service Name: | dtn-bundle | | | Service Name: | dtn-bundle | | |||
+------------------------+----------------------------+ | +------------------------+----------------------------+ | |||
| Transport Protocol(s): | TCP | | | Transport Protocol(s): | TCP | | |||
+------------------------+----------------------------+ | +------------------------+----------------------------+ | |||
| Assignee: | IESG <iesg@ietf.org> | | | Assignee: | IESG (iesg@ietf.org) | | |||
+------------------------+----------------------------+ | +------------------------+----------------------------+ | |||
| Contact: | IESG <iesg@ietf.org> | | | Contact: | IESG (iesg@ietf.org) | | |||
+------------------------+----------------------------+ | +------------------------+----------------------------+ | |||
| Description: | DTN Bundle TCP CL Protocol | | | Description: | DTN Bundle TCP CL Protocol | | |||
+------------------------+----------------------------+ | +------------------------+----------------------------+ | |||
| Reference: | This specification. | | | Reference: | This specification | | |||
+------------------------+----------------------------+ | +------------------------+----------------------------+ | |||
| Port Number: | 4556 | | | Port Number: | 4556 | | |||
+------------------------+----------------------------+ | +------------------------+----------------------------+ | |||
Table 10 | Table 10: TCP Port Number for the TCPCL | |||
9.2. Protocol Versions | ||||
IANA has created, under the "Bundle Protocol" registry [IANA-BUNDLE], | 8.2. Protocol Versions | |||
a sub-registry titled "Bundle Protocol TCP Convergence-Layer Version | ||||
Numbers". The version number table is updated to include this | ||||
specification. The registration procedure is RFC Required. | ||||
+=======+=============+=====================+ | IANA has registered the following value in the "Bundle Protocol TCP | |||
| Value | Description | Reference | | Convergence-Layer Version Numbers" registry [RFC7242]. | |||
+=======+=============+=====================+ | ||||
| 0 | Reserved | [RFC7242] | | ||||
+-------+-------------+---------------------+ | ||||
| 1 | Reserved | [RFC7242] | | ||||
+-------+-------------+---------------------+ | ||||
| 2 | Reserved | [RFC7242] | | ||||
+-------+-------------+---------------------+ | ||||
| 3 | TCPCL | [RFC7242] | | ||||
+-------+-------------+---------------------+ | ||||
| 4 | TCPCLv4 | This specification. | | ||||
+-------+-------------+---------------------+ | ||||
| 5-255 | Unassigned | | | ||||
+-------+-------------+---------------------+ | ||||
Table 11 | +=======+=============+====================+ | |||
| Value | Description | Reference | | ||||
+=======+=============+====================+ | ||||
| 4 | TCPCLv4 | This specification | | ||||
+-------+-------------+--------------------+ | ||||
9.3. Session Extension Types | Table 11: New TCPCL Version Number | |||
EDITOR NOTE: sub-registry to-be-created upon publication of this | 8.3. Session Extension Types | |||
specification. | ||||
IANA will create, under the "Bundle Protocol" registry [IANA-BUNDLE], | Under the "Bundle Protocol" registry [IANA-BUNDLE], IANA has created | |||
a sub-registry titled "Bundle Protocol TCP Convergence-Layer Version | the "Bundle Protocol TCP Convergence-Layer Version 4 Session | |||
4 Session Extension Types" and initialize it with the contents of | Extension Types" registry and populated it with the contents of | |||
Table 12. The registration procedure is Expert Review within the | Table 12. The registration procedure is Expert Review within the | |||
lower range 0x0001--0x7FFF. Values in the range 0x8000--0xFFFF are | lower range 0x0001-0x7FFF. Values in the range 0x8000-0xFFFF are | |||
reserved for use on private networks for functions not published to | reserved for Private or Experimental Use, which are not recorded by | |||
the IANA. | IANA. | |||
Specifications of new session extension types need to define the | Specifications of new session extension types need to define the | |||
encoding of the Item Value data as well as any meaning or restriction | encoding of the Item Value data as well as any meaning or restriction | |||
on the number of or order of instances of the type within an | on the number of or order of instances of the type within an | |||
extension item list. Specifications need to define how the extension | extension item list. Specifications need to define how the extension | |||
functions when no instance of the new extension type is received | functions when no instance of the new extension type is received | |||
during session negotiation. | during session negotiation. | |||
Expert(s) are encouraged to be biased towards approving registrations | Experts are encouraged to be biased towards approving registrations | |||
unless they are abusive, frivolous, or actively harmful (not merely | unless they are abusive, frivolous, or actively harmful (not merely | |||
aesthetically displeasing, or architecturally dubious). | esthetically displeasing or architecturally dubious). | |||
+================+==========================+ | ||||
| Code | Session Extension Type | | ||||
+================+==========================+ | ||||
| 0x0000 | Reserved | | ||||
+----------------+--------------------------+ | ||||
| 0x0001--0x7FFF | Unassigned | | ||||
+----------------+--------------------------+ | ||||
| 0x8000--0xFFFF | Private/Experimental Use | | ||||
+----------------+--------------------------+ | ||||
Table 12: Session Extension Type Codes | +===============+==========================================+ | |||
| Code | Session Extension Type | | ||||
+===============+==========================================+ | ||||
| 0x0000 | Reserved | | ||||
+---------------+------------------------------------------+ | ||||
| 0x0001-0x7FFF | Unassigned | | ||||
+---------------+------------------------------------------+ | ||||
| 0x8000-0xFFFF | Reserved for Private or Experimental Use | | ||||
+---------------+------------------------------------------+ | ||||
9.4. Transfer Extension Types | Table 12: Session Extension Type Codes | |||
EDITOR NOTE: sub-registry to-be-created upon publication of this | 8.4. Transfer Extension Types | |||
specification. | ||||
IANA will create, under the "Bundle Protocol" registry [IANA-BUNDLE], | Under the "Bundle Protocol" registry [IANA-BUNDLE], IANA has created | |||
a sub-registry titled "Bundle Protocol TCP Convergence-Layer Version | the "Bundle Protocol TCP Convergence-Layer Version 4 Transfer | |||
4 Transfer Extension Types" and initialize it with the contents of | Extension Types" registry and populated it with the contents of | |||
Table 13. The registration procedure is Expert Review within the | Table 13. The registration procedure is Expert Review within the | |||
lower range 0x0001--0x7FFF. Values in the range 0x8000--0xFFFF are | lower range 0x0001-0x7FFF. Values in the range 0x8000-0xFFFF are | |||
reserved for use on private networks for functions not published to | reserved for Private or Experimental Use, which are not recorded by | |||
the IANA. | IANA. | |||
Specifications of new transfer extension types need to define the | Specifications of new transfer extension types need to define the | |||
encoding of the Item Value data as well as any meaning or restriction | encoding of the Item Value data as well as any meaning or restriction | |||
on the number of or order of instances of the type within an | on the number of or order of instances of the type within an | |||
extension item list. Specifications need to define how the extension | extension item list. Specifications need to define how the extension | |||
functions when no instance of the new extension type is received in a | functions when no instance of the new extension type is received in a | |||
transfer. | transfer. | |||
Expert(s) are encouraged to be biased towards approving registrations | Experts are encouraged to be biased towards approving registrations | |||
unless they are abusive, frivolous, or actively harmful (not merely | unless they are abusive, frivolous, or actively harmful (not merely | |||
aesthetically displeasing, or architecturally dubious). | esthetically displeasing or architecturally dubious). | |||
+================+===========================+ | +===============+==========================================+ | |||
| Code | Transfer Extension Type | | | Code | Transfer Extension Type | | |||
+================+===========================+ | +===============+==========================================+ | |||
| 0x0000 | Reserved | | | 0x0000 | Reserved | | |||
+----------------+---------------------------+ | +---------------+------------------------------------------+ | |||
| 0x0001 | Transfer Length Extension | | | 0x0001 | Transfer Length Extension | | |||
+----------------+---------------------------+ | +---------------+------------------------------------------+ | |||
| 0x0002--0x7FFF | Unassigned | | | 0x0002-0x7FFF | Unassigned | | |||
+----------------+---------------------------+ | +---------------+------------------------------------------+ | |||
| 0x8000--0xFFFF | Private/Experimental Use | | | 0x8000-0xFFFF | Reserved for Private or Experimental Use | | |||
+----------------+---------------------------+ | +---------------+------------------------------------------+ | |||
Table 13: Transfer Extension Type Codes | Table 13: Transfer Extension Type Codes | |||
9.5. Message Types | 8.5. Message Types | |||
EDITOR NOTE: sub-registry to-be-created upon publication of this | ||||
specification. | ||||
IANA will create, under the "Bundle Protocol" registry [IANA-BUNDLE], | Under the "Bundle Protocol" registry [IANA-BUNDLE], IANA has created | |||
a sub-registry titled "Bundle Protocol TCP Convergence-Layer Version | the "Bundle Protocol TCP Convergence-Layer Version 4 Message Types" | |||
4 Message Types" and initialize it with the contents of Table 14. | registry and populated it with the contents of Table 14. The | |||
The registration procedure is RFC Required within the lower range | registration procedure is RFC Required within the lower range | |||
0x01--0xEF. Values in the range 0xF0--0xFF are reserved for use on | 0x01-0xEF. Values in the range 0xF0-0xFF are reserved for Private or | |||
private networks for functions not published to the IANA. | Experimental Use, which are not recorded by IANA. | |||
Specifications of new message types need to define the encoding of | Specifications of new message types need to define the encoding of | |||
the message data as well as the purpose and relationship of the new | the message data as well as the purpose and relationship of the new | |||
message to existing session/transfer state within the baseline | message to existing session/transfer state within the baseline | |||
message sequencing. The use of new message types need to be | message sequencing. The use of new message types needs to be | |||
negotiated between TCPCL entities within a session (using the session | negotiated between TCPCL entities within a session (using the session | |||
extension mechanism) so that the receiving entity can properly decode | extension mechanism) so that the receiving entity can properly decode | |||
all message types used in the session. | all message types used in the session. | |||
Expert(s) are encouraged to favor new session/transfer extension | Experts are encouraged to favor new session/transfer extension types | |||
types over new message types. TCPCL messages are not self- | over new message types. TCPCL messages are not self-delimiting, so | |||
delimiting, so care must be taken in introducing new message types. | care must be taken in introducing new message types. If an entity | |||
receives an unknown message type, the only thing that can be done is | ||||
If an entity receives an unknown message type the only thing that can | to send a MSG_REJECT and close the TCP connection; not even a clean | |||
be done is to send a MSG_REJECT and close the TCP connection; not | termination can be done at that point. | |||
even a clean termination can be done at that point. | ||||
+============+==========================+ | ||||
| Code | Message Type | | ||||
+============+==========================+ | ||||
| 0x00 | Reserved | | ||||
+------------+--------------------------+ | ||||
| 0x01 | XFER_SEGMENT | | ||||
+------------+--------------------------+ | ||||
| 0x02 | XFER_ACK | | ||||
+------------+--------------------------+ | ||||
| 0x03 | XFER_REFUSE | | ||||
+------------+--------------------------+ | ||||
| 0x04 | KEEPALIVE | | ||||
+------------+--------------------------+ | ||||
| 0x05 | SESS_TERM | | ||||
+------------+--------------------------+ | ||||
| 0x06 | MSG_REJECT | | ||||
+------------+--------------------------+ | ||||
| 0x07 | SESS_INIT | | ||||
+------------+--------------------------+ | ||||
| 0x08--0xEF | Unassigned | | ||||
+------------+--------------------------+ | ||||
| 0xF0--0xFF | Private/Experimental Use | | ||||
+------------+--------------------------+ | ||||
Table 14: Message Type Codes | +===========+==========================================+ | |||
| Code | Message Type | | ||||
+===========+==========================================+ | ||||
| 0x00 | Reserved | | ||||
+-----------+------------------------------------------+ | ||||
| 0x01 | XFER_SEGMENT | | ||||
+-----------+------------------------------------------+ | ||||
| 0x02 | XFER_ACK | | ||||
+-----------+------------------------------------------+ | ||||
| 0x03 | XFER_REFUSE | | ||||
+-----------+------------------------------------------+ | ||||
| 0x04 | KEEPALIVE | | ||||
+-----------+------------------------------------------+ | ||||
| 0x05 | SESS_TERM | | ||||
+-----------+------------------------------------------+ | ||||
| 0x06 | MSG_REJECT | | ||||
+-----------+------------------------------------------+ | ||||
| 0x07 | SESS_INIT | | ||||
+-----------+------------------------------------------+ | ||||
| 0x08-0xEF | Unassigned | | ||||
+-----------+------------------------------------------+ | ||||
| 0xF0-0xFF | Reserved for Private or Experimental Use | | ||||
+-----------+------------------------------------------+ | ||||
9.6. XFER_REFUSE Reason Codes | Table 14: Message Type Codes | |||
EDITOR NOTE: sub-registry to-be-created upon publication of this | 8.6. XFER_REFUSE Reason Codes | |||
specification. | ||||
IANA will create, under the "Bundle Protocol" registry [IANA-BUNDLE], | Under the "Bundle Protocol" registry [IANA-BUNDLE], IANA has created | |||
a sub-registry titled "Bundle Protocol TCP Convergence-Layer Version | the "Bundle Protocol TCP Convergence-Layer Version 4 XFER_REFUSE | |||
4 XFER_REFUSE Reason Codes" and initialize it with the contents of | Reason Codes" registry and populated it with the contents of | |||
Table 15. The registration procedure is Specification Required | Table 15. The registration procedure is Specification Required | |||
within the lower range 0x00--0xEF. Values in the range 0xF0--0xFF | within the lower range 0x00-0xEF. Values in the range 0xF0-0xFF are | |||
are reserved for use on private networks for functions not published | reserved for Private or Experimental Use, which are not recorded by | |||
to the IANA. | IANA. | |||
Specifications of new XFER_REFUSE reason codes need to define the | Specifications of new XFER_REFUSE reason codes need to define the | |||
meaning of the reason and disambiguate it with pre-existing reasons. | meaning of the reason and disambiguate it from preexisting reasons. | |||
Each refusal reason needs to be usable by the receiving BP Agent to | Each refusal reason needs to be usable by the receiving BPA to make | |||
make retransmission or re-routing decisions. | retransmission or rerouting decisions. | |||
Expert(s) are encouraged to be biased towards approving registrations | Experts are encouraged to be biased towards approving registrations | |||
unless they are abusive, frivolous, or actively harmful (not merely | unless they are abusive, frivolous, or actively harmful (not merely | |||
aesthetically displeasing, or architecturally dubious). | esthetically displeasing or architecturally dubious). | |||
+============+==========================+ | ||||
| Code | Refusal Reason | | ||||
+============+==========================+ | ||||
| 0x00 | Unknown | | ||||
+------------+--------------------------+ | ||||
| 0x01 | Completed | | ||||
+------------+--------------------------+ | ||||
| 0x02 | No Resources | | ||||
+------------+--------------------------+ | ||||
| 0x03 | Retransmit | | ||||
+------------+--------------------------+ | ||||
| 0x04 | Not Acceptable | | ||||
+------------+--------------------------+ | ||||
| 0x05 | Extension Failure | | ||||
+------------+--------------------------+ | ||||
| 0x06 | Session Terminating | | ||||
+------------+--------------------------+ | ||||
| 0x07--0xEF | Unassigned | | ||||
+------------+--------------------------+ | ||||
| 0xF0--0xFF | Private/Experimental Use | | ||||
+------------+--------------------------+ | ||||
Table 15: XFER_REFUSE Reason Codes | +===========+==========================================+ | |||
| Code | Refusal Reason | | ||||
+===========+==========================================+ | ||||
| 0x00 | Unknown | | ||||
+-----------+------------------------------------------+ | ||||
| 0x01 | Completed | | ||||
+-----------+------------------------------------------+ | ||||
| 0x02 | No Resources | | ||||
+-----------+------------------------------------------+ | ||||
| 0x03 | Retransmit | | ||||
+-----------+------------------------------------------+ | ||||
| 0x04 | Not Acceptable | | ||||
+-----------+------------------------------------------+ | ||||
| 0x05 | Extension Failure | | ||||
+-----------+------------------------------------------+ | ||||
| 0x06 | Session Terminating | | ||||
+-----------+------------------------------------------+ | ||||
| 0x07-0xEF | Unassigned | | ||||
+-----------+------------------------------------------+ | ||||
| 0xF0-0xFF | Reserved for Private or Experimental Use | | ||||
+-----------+------------------------------------------+ | ||||
9.7. SESS_TERM Reason Codes | Table 15: XFER_REFUSE Reason Codes | |||
EDITOR NOTE: sub-registry to-be-created upon publication of this | 8.7. SESS_TERM Reason Codes | |||
specification. | ||||
IANA will create, under the "Bundle Protocol" registry [IANA-BUNDLE], | Under the "Bundle Protocol" registry [IANA-BUNDLE], IANA has created | |||
a sub-registry titled "Bundle Protocol TCP Convergence-Layer Version | the "Bundle Protocol TCP Convergence-Layer Version 4 SESS_TERM Reason | |||
4 SESS_TERM Reason Codes" and initialize it with the contents of | Codes" registry and populated it with the contents of Table 16. The | |||
Table 16. The registration procedure is Specification Required | registration procedure is Specification Required within the lower | |||
within the lower range 0x00--0xEF. Values in the range 0xF0--0xFF | range 0x00-0xEF. Values in the range 0xF0-0xFF are reserved for | |||
are reserved for use on private networks for functions not published | Private or Experimental Use, which are not recorded by IANA. | |||
to the IANA. | ||||
Specifications of new SESS_TERM reason codes need to define the | Specifications of new SESS_TERM reason codes need to define the | |||
meaning of the reason and disambiguate it with pre-existing reasons. | meaning of the reason and disambiguate it from preexisting reasons. | |||
Each termination reason needs to be usable by the receiving BP Agent | Each termination reason needs to be usable by the receiving BPA to | |||
to make re-connection decisions. | make reconnection decisions. | |||
Expert(s) are encouraged to be biased towards approving registrations | Experts are encouraged to be biased towards approving registrations | |||
unless they are abusive, frivolous, or actively harmful (not merely | unless they are abusive, frivolous, or actively harmful (not merely | |||
aesthetically displeasing, or architecturally dubious). | esthetically displeasing or architecturally dubious). | |||
+============+==========================+ | ||||
| Code | Termination Reason | | ||||
+============+==========================+ | ||||
| 0x00 | Unknown | | ||||
+------------+--------------------------+ | ||||
| 0x01 | Idle timeout | | ||||
+------------+--------------------------+ | ||||
| 0x02 | Version mismatch | | ||||
+------------+--------------------------+ | ||||
| 0x03 | Busy | | ||||
+------------+--------------------------+ | ||||
| 0x04 | Contact Failure | | ||||
+------------+--------------------------+ | ||||
| 0x05 | Resource Exhaustion | | ||||
+------------+--------------------------+ | ||||
| 0x06--0xEF | Unassigned | | ||||
+------------+--------------------------+ | ||||
| 0xF0--0xFF | Private/Experimental Use | | ||||
+------------+--------------------------+ | ||||
Table 16: SESS_TERM Reason Codes | +===========+==========================================+ | |||
| Code | Termination Reason | | ||||
+===========+==========================================+ | ||||
| 0x00 | Unknown | | ||||
+-----------+------------------------------------------+ | ||||
| 0x01 | Idle timeout | | ||||
+-----------+------------------------------------------+ | ||||
| 0x02 | Version mismatch | | ||||
+-----------+------------------------------------------+ | ||||
| 0x03 | Busy | | ||||
+-----------+------------------------------------------+ | ||||
| 0x04 | Contact Failure | | ||||
+-----------+------------------------------------------+ | ||||
| 0x05 | Resource Exhaustion | | ||||
+-----------+------------------------------------------+ | ||||
| 0x06-0xEF | Unassigned | | ||||
+-----------+------------------------------------------+ | ||||
| 0xF0-0xFF | Reserved for Private or Experimental Use | | ||||
+-----------+------------------------------------------+ | ||||
9.8. MSG_REJECT Reason Codes | Table 16: SESS_TERM Reason Codes | |||
EDITOR NOTE: sub-registry to-be-created upon publication of this | 8.8. MSG_REJECT Reason Codes | |||
specification. | ||||
IANA will create, under the "Bundle Protocol" registry [IANA-BUNDLE], | Under the "Bundle Protocol" registry [IANA-BUNDLE], IANA has created | |||
a sub-registry titled "Bundle Protocol TCP Convergence-Layer Version | the "Bundle Protocol TCP Convergence-Layer Version 4 MSG_REJECT | |||
4 MSG_REJECT Reason Codes" and initialize it with the contents of | Reason Codes" registry and populated it with the contents of | |||
Table 17. The registration procedure is Specification Required | Table 17. The registration procedure is Specification Required | |||
within the lower range 0x01--0xEF. Values in the range 0xF0--0xFF | within the lower range 0x01-0xEF. Values in the range 0xF0-0xFF are | |||
are reserved for use on private networks for functions not published | reserved for Private or Experimental Use, which are not recorded by | |||
to the IANA. | IANA. | |||
Specifications of new MSG_REJECT reason codes need to define the | Specifications of new MSG_REJECT reason codes need to define the | |||
meaning of the reason and disambiguate it with pre-existing reasons. | meaning of the reason and disambiguate it from preexisting reasons. | |||
Each rejection reason needs to be usable by the receiving TCPCL | Each rejection reason needs to be usable by the receiving TCPCL | |||
Entity to make message sequencing and/or session termination | entity to make message sequencing and/or session termination | |||
decisions. | decisions. | |||
Expert(s) are encouraged to be biased towards approving registrations | Experts are encouraged to be biased towards approving registrations | |||
unless they are abusive, frivolous, or actively harmful (not merely | unless they are abusive, frivolous, or actively harmful (not merely | |||
aesthetically displeasing, or architecturally dubious). | esthetically displeasing or architecturally dubious). | |||
+============+==========================+ | ||||
| Code | Rejection Reason | | ||||
+============+==========================+ | ||||
| 0x00 | reserved | | ||||
+------------+--------------------------+ | ||||
| 0x01 | Message Type Unknown | | ||||
+------------+--------------------------+ | ||||
| 0x02 | Message Unsupported | | ||||
+------------+--------------------------+ | ||||
| 0x03 | Message Unexpected | | ||||
+------------+--------------------------+ | ||||
| 0x04--0xEF | Unassigned | | ||||
+------------+--------------------------+ | ||||
| 0xF0--0xFF | Private/Experimental Use | | ||||
+------------+--------------------------+ | ||||
Table 17: MSG_REJECT Reason Codes | ||||
9.9. Object Identifier for PKIX Module Identifier | +===========+==========================================+ | |||
| Code | Rejection Reason | | ||||
+===========+==========================================+ | ||||
| 0x00 | Reserved | | ||||
+-----------+------------------------------------------+ | ||||
| 0x01 | Message Type Unknown | | ||||
+-----------+------------------------------------------+ | ||||
| 0x02 | Message Unsupported | | ||||
+-----------+------------------------------------------+ | ||||
| 0x03 | Message Unexpected | | ||||
+-----------+------------------------------------------+ | ||||
| 0x04-0xEF | Unassigned | | ||||
+-----------+------------------------------------------+ | ||||
| 0xF0-0xFF | Reserved for Private or Experimental Use | | ||||
+-----------+------------------------------------------+ | ||||
IANA has created, under the "Structure of Management Information | Table 17: MSG_REJECT Reason Codes | |||
(SMI) Numbers" registry [IANA-SMI], a sub-registry titled "SMI | ||||
Security for PKIX Module Identifier". The table is updated to | ||||
include a row "id-mod-dtn-tcpclv4-2021" for identifying the module in | ||||
Appendix B as in the following table. | ||||
+=========+=========================+=====================+ | 8.9. Object Identifier for PKIX Module Identifier | |||
| Decimal | Description | References | | ||||
+=========+=========================+=====================+ | ||||
| MOD-TBD | id-mod-dtn-tcpclv4-2021 | This specification. | | ||||
+---------+-------------------------+---------------------+ | ||||
Table 18 | IANA has registered the following in the "SMI Security for PKIX | |||
Module Identifier" registry [IANA-SMI] for identifying the module | ||||
described in Appendix B. | ||||
9.10. Object Identifier for PKIX Other Name Forms | +=========+=========================+====================+ | |||
| Decimal | Description | References | | ||||
+=========+=========================+====================+ | ||||
| 103 | id-mod-dtn-tcpclv4-2021 | This specification | | ||||
+---------+-------------------------+--------------------+ | ||||
IANA has created, under the "Structure of Management Information | Table 18: New SMI Security Module | |||
(SMI) Numbers" registry [IANA-SMI], a sub-registry titled "SMI | ||||
Security for PKIX Other Name Forms". The other name forms table is | ||||
updated to include a row "id-on-bundleEID" for identifying DTN | ||||
Endpoint IDs as in the following table. | ||||
+=========+=================+=====================+ | 8.10. Object Identifier for PKIX Other Name Forms | |||
| Decimal | Description | References | | ||||
+=========+=================+=====================+ | ||||
| ON-TBD | id-on-bundleEID | This specification. | | ||||
+---------+-----------------+---------------------+ | ||||
Table 19 | IANA has registered the following in the "SMI Security for PKIX Other | |||
Name Forms" registry [IANA-SMI] for identifying bundle endpoint IDs: | ||||
The formal structure of the associated other name form is in | +=========+=================+====================+ | |||
Appendix B. The use of this OID is defined in Section 4.4.1 and | | Decimal | Description | References | | |||
Section 4.4.2. | +=========+=================+====================+ | |||
| 11 | id-on-bundleEID | This specification | | ||||
+---------+-----------------+--------------------+ | ||||
9.11. Object Identifier for PKIX Extended Key Usage | Table 19: New PKIX Other Name Form | |||
IANA has created, under the "Structure of Management Information | The formal structure of the associated Other Name Form is provided in | |||
(SMI) Numbers" registry [IANA-SMI], a sub-registry titled "SMI | Appendix B. The use of this OID is defined in Sections 4.4.1 and | |||
Security for PKIX Extended Key Purpose". The extended key purpose | 4.4.2. | |||
table is updated to include a purpose "id-kp-bundleSecurity" for | ||||
identifying DTN endpoints as in the following table. | ||||
+=========+======================+=====================+ | 8.11. Object Identifier for PKIX Extended Key Usage | |||
| Decimal | Description | References | | ||||
+=========+======================+=====================+ | ||||
| KP-TBD | id-kp-bundleSecurity | This specification. | | ||||
+---------+----------------------+---------------------+ | ||||
Table 20 | IANA has registered the following in the "SMI Security for PKIX | |||
Extended Key Purpose" registry [IANA-SMI] for securing BP bundles. | ||||
The formal definition of this EKU is in Appendix B. The use of this | +=========+======================+====================+ | |||
OID is defined in Section 4.4.2. | | Decimal | Description | References | | |||
+=========+======================+====================+ | ||||
| 35 | id-kp-bundleSecurity | This specification | | ||||
+---------+----------------------+--------------------+ | ||||
10. Acknowledgments | Table 20: New PKIX Extended Key Purpose | |||
This specification is based on comments on implementation of | The formal definition of this EKU is provided in Appendix B. The use | |||
[RFC7242] provided from Scott Burleigh. | of this OID is defined in Section 4.4.2. | |||
11. References | 9. References | |||
11.1. Normative References | 9.1. Normative References | |||
[IANA-BUNDLE] | [IANA-BUNDLE] | |||
IANA, "Bundle Protocol", | IANA, "Bundle Protocol", | |||
<https://www.iana.org/assignments/bundle/>. | <https://www.iana.org/assignments/bundle/>. | |||
[IANA-PORTS] | [IANA-PORTS] | |||
IANA, "Service Name and Transport Protocol Port Number | IANA, "Service Name and Transport Protocol Port Number | |||
Registry", <https://www.iana.org/assignments/service- | Registry", <https://www.iana.org/assignments/service- | |||
names-port-numbers/>. | names-port-numbers/>. | |||
[IANA-SMI] IANA, "Structure of Management Information (SMI) Numbers", | [IANA-SMI] IANA, "Structure of Management Information (SMI) Numbers | |||
(MIB Module Registrations)", | ||||
<https://www.iana.org/assignments/smi-numbers/>. | <https://www.iana.org/assignments/smi-numbers/>. | |||
[RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | |||
RFC 793, DOI 10.17487/RFC0793, September 1981, | RFC 793, DOI 10.17487/RFC0793, September 1981, | |||
<https://www.rfc-editor.org/info/rfc793>. | <https://www.rfc-editor.org/info/rfc793>. | |||
[RFC1122] Braden, R., Ed., "Requirements for Internet Hosts - | [RFC1122] Braden, R., Ed., "Requirements for Internet Hosts - | |||
Communication Layers", STD 3, RFC 1122, | Communication Layers", STD 3, RFC 1122, | |||
DOI 10.17487/RFC1122, October 1989, | DOI 10.17487/RFC1122, October 1989, | |||
<https://www.rfc-editor.org/info/rfc1122>. | <https://www.rfc-editor.org/info/rfc1122>. | |||
skipping to change at page 72, line 24 ¶ | skipping to change at line 3158 ¶ | |||
<https://www.rfc-editor.org/info/rfc8126>. | <https://www.rfc-editor.org/info/rfc8126>. | |||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
[RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
<https://www.rfc-editor.org/info/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
[I-D.ietf-dtn-bpbis] | [RFC9171] Burleigh, S., Fall, K., and E. Birrane, III, "Bundle | |||
Burleigh, S., Fall, K., and E. J. Birrane, "Bundle | Protocol Version 7", RFC 9171, DOI 10.17487/RFC9171, | |||
Protocol Version 7", Work in Progress, Internet-Draft, | January 2022, <https://www.rfc-editor.org/info/rfc9171>. | |||
draft-ietf-dtn-bpbis-31, 25 January 2021, | ||||
<https://datatracker.ietf.org/doc/html/draft-ietf-dtn- | ||||
bpbis-31>. | ||||
[X.680] ITU-T, "Information technology -- Abstract Syntax Notation | [X.680] ITU-T, "Information technology - Abstract Syntax Notation | |||
One (ASN.1): Specification of basic notation", ITU-T | One (ASN.1): Specification of basic notation", ITU-T | |||
Recommendation X.680, ISO/IEC 8824-1:2015, August 2015, | Recommendation X.680, ISO/IEC 8824-1:2021, February 2021, | |||
<https://www.itu.int/rec/T-REC-X.680-201508-I/en>. | <https://www.itu.int/rec/T-REC-X.680-202102-I/en>. | |||
11.2. Informative References | 9.2. Informative References | |||
[AEAD-LIMITS] | [AEAD-LIMITS] | |||
Luykx, A. and K. Paterson, "Limits on Authenticated | Luykx, A. and K. Paterson, "Limits on Authenticated | |||
Encryption Use in TLS", August 2017, | Encryption Use in TLS", August 2017, | |||
<http://www.isg.rhul.ac.uk/~kp/TLS-AEbounds.pdf>. | <https://www.isg.rhul.ac.uk/~kp/TLS-AEbounds.pdf>. | |||
[RFC2595] Newman, C., "Using TLS with IMAP, POP3 and ACAP", | [RFC2595] Newman, C., "Using TLS with IMAP, POP3 and ACAP", | |||
RFC 2595, DOI 10.17487/RFC2595, June 1999, | RFC 2595, DOI 10.17487/RFC2595, June 1999, | |||
<https://www.rfc-editor.org/info/rfc2595>. | <https://www.rfc-editor.org/info/rfc2595>. | |||
[RFC3552] Rescorla, E. and B. Korver, "Guidelines for Writing RFC | [RFC3552] Rescorla, E. and B. Korver, "Guidelines for Writing RFC | |||
Text on Security Considerations", BCP 72, RFC 3552, | Text on Security Considerations", BCP 72, RFC 3552, | |||
DOI 10.17487/RFC3552, July 2003, | DOI 10.17487/RFC3552, July 2003, | |||
<https://www.rfc-editor.org/info/rfc3552>. | <https://www.rfc-editor.org/info/rfc3552>. | |||
skipping to change at page 74, line 10 ¶ | skipping to change at line 3235 ¶ | |||
[RFC7435] Dukhovni, V., "Opportunistic Security: Some Protection | [RFC7435] Dukhovni, V., "Opportunistic Security: Some Protection | |||
Most of the Time", RFC 7435, DOI 10.17487/RFC7435, | Most of the Time", RFC 7435, DOI 10.17487/RFC7435, | |||
December 2014, <https://www.rfc-editor.org/info/rfc7435>. | December 2014, <https://www.rfc-editor.org/info/rfc7435>. | |||
[RFC7457] Sheffer, Y., Holz, R., and P. Saint-Andre, "Summarizing | [RFC7457] Sheffer, Y., Holz, R., and P. Saint-Andre, "Summarizing | |||
Known Attacks on Transport Layer Security (TLS) and | Known Attacks on Transport Layer Security (TLS) and | |||
Datagram TLS (DTLS)", RFC 7457, DOI 10.17487/RFC7457, | Datagram TLS (DTLS)", RFC 7457, DOI 10.17487/RFC7457, | |||
February 2015, <https://www.rfc-editor.org/info/rfc7457>. | February 2015, <https://www.rfc-editor.org/info/rfc7457>. | |||
[RFC7942] Sheffer, Y. and A. Farrel, "Improving Awareness of Running | ||||
Code: The Implementation Status Section", BCP 205, | ||||
RFC 7942, DOI 10.17487/RFC7942, July 2016, | ||||
<https://www.rfc-editor.org/info/rfc7942>. | ||||
[RFC8555] Barnes, R., Hoffman-Andrews, J., McCarney, D., and J. | [RFC8555] Barnes, R., Hoffman-Andrews, J., McCarney, D., and J. | |||
Kasten, "Automatic Certificate Management Environment | Kasten, "Automatic Certificate Management Environment | |||
(ACME)", RFC 8555, DOI 10.17487/RFC8555, March 2019, | (ACME)", RFC 8555, DOI 10.17487/RFC8555, March 2019, | |||
<https://www.rfc-editor.org/info/rfc8555>. | <https://www.rfc-editor.org/info/rfc8555>. | |||
[I-D.ietf-dtn-bpsec] | [RFC9172] Birrane, III, E. and K. McKeever, "Bundle Protocol | |||
III, E. J. B. and K. McKeever, "Bundle Protocol Security | Security (BPSec)", RFC 9172, DOI 10.17487/RFC9172, January | |||
Specification", Work in Progress, Internet-Draft, draft- | 2022, <https://www.rfc-editor.org/info/rfc9172>. | |||
ietf-dtn-bpsec-27, 16 February 2021, | ||||
<https://datatracker.ietf.org/doc/html/draft-ietf-dtn- | ||||
bpsec-27>. | ||||
[I-D.ietf-dtn-bibect] | [DTN-BIBECT] | |||
Burleigh, S., "Bundle-in-Bundle Encapsulation", Work in | Burleigh, S., "Bundle-in-Bundle Encapsulation", Work in | |||
Progress, Internet-Draft, draft-ietf-dtn-bibect-03, 18 | Progress, Internet-Draft, draft-ietf-dtn-bibect-03, 18 | |||
February 2020, <https://datatracker.ietf.org/doc/html/ | February 2020, <https://datatracker.ietf.org/doc/html/ | |||
draft-ietf-dtn-bibect-03>. | draft-ietf-dtn-bibect-03>. | |||
[github-dtn-demo-agent] | Appendix A. Significant Changes from RFC 7242 | |||
Sipos, B., "TCPCL Example Implementation", | ||||
<https://github.com/BSipos-RKF/dtn-demo-agent/>. | ||||
[github-dtn-wireshark] | ||||
Sipos, B., "TCPCL Wireshark Dissector", | ||||
<https://github.com/BSipos-RKF/dtn-wireshark/>. | ||||
Appendix A. Significant changes from RFC7242 | ||||
The areas in which changes from [RFC7242] have been made to existing | The areas in which changes from [RFC7242] have been made to existing | |||
headers and messages are: | headers and messages are as follows: | |||
* Split Contact Header into pre-TLS protocol negotiation and | * Split Contact Header into pre-TLS protocol negotiation and | |||
SESS_INIT parameter negotiation. The Contact Header is now fixed- | SESS_INIT parameter negotiation. The Contact Header is now fixed | |||
length. | length. | |||
* Changed Contact Header content to limit number of negotiated | * Changed Contact Header content to limit number of negotiated | |||
options. | options. | |||
* Added session option to negotiate maximum segment size (per each | * Added session option to negotiate maximum segment size (per each | |||
direction). | direction). | |||
* Renamed "Endpoint ID" to "Node ID" to conform with BPv7 | * Renamed "endpoint ID" to "node ID" to conform with BPv7 | |||
terminology. | terminology. | |||
* Added session extension capability. | * Added session extension capability. | |||
* Added transfer extension capability. Moved transfer total length | * Added transfer extension capability. Moved transfer total length | |||
into an extension item. | into an extension item. | |||
* Defined new IANA registries for message / type / reason codes to | * Defined new IANA registries for message / type / reason codes to | |||
allow renaming some codes for clarity. | allow renaming some codes for clarity. | |||
* Segments of all new IANA registries are reserved for private/ | * Pointed out that segments of all new IANA registries are reserved | |||
experimental use. | for private/experimental use. | |||
* Expanded Message Header to octet-aligned fields instead of bit- | * Expanded Message Header to octet-aligned fields instead of bit- | |||
packing. | packing. | |||
* Added a bundle transfer identification number to all bundle- | * Added a bundle transfer identification number to all bundle- | |||
related messages (XFER_SEGMENT, XFER_ACK, XFER_REFUSE). | related messages (XFER_SEGMENT, XFER_ACK, XFER_REFUSE). | |||
* Use flags in XFER_ACK to mirror flags from XFER_SEGMENT. | * Added flags in XFER_ACK to mirror flags from XFER_SEGMENT. | |||
* Removed all uses of SDNV fields and replaced with fixed-bit-length | * Removed all uses of Self-Delimiting Numeric Value (SDNV) fields | |||
(network byte order) fields. | and replaced with fixed-bit-length (network byte order) fields. | |||
* Renamed SHUTDOWN to SESS_TERM to deconflict term "shutdown" | * Renamed SHUTDOWN to SESS_TERM to deconflict term "shutdown" | |||
related to TCP connections. | related to TCP connections. | |||
* Removed the notion of a re-connection delay parameter. | * Removed the notion of a reconnection delay parameter. | |||
The areas in which extensions from [RFC7242] have been made as new | The areas in which extensions from [RFC7242] have been made as new | |||
messages and codes are: | messages and codes are as follows: | |||
* Added contact negotiation failure SESS_TERM reason code. | ||||
* Added MSG_REJECT message to indicate an unknown or unhandled | * Added MSG_REJECT message to indicate that an unknown or unhandled | |||
message was received. | message was received. | |||
* Added TLS connection security mechanism. | * Added TLS connection security mechanism. | |||
* Added "Not Acceptable", "Extension Failure", and "Session | * Added "Not Acceptable", "Extension Failure", and "Session | |||
Terminating" XFER_REFUSE reason codes. | Terminating" XFER_REFUSE reason codes. | |||
* Added "Resource Exhaustion" SESS_TERM reason code. | * Added "Contact Failure" (contact negotiation failure) and | |||
"Resource Exhaustion" SESS_TERM reason codes. | ||||
Appendix B. ASN.1 Module | Appendix B. ASN.1 Module | |||
The following ASN.1 module formally specifies the BundleEID | The following ASN.1 module formally specifies the BundleEID | |||
structure, its Other Name form, and the bundleSecurity Extended Key | structure, its Other Name Form, and the bundleSecurity EKU, using | |||
Usage in the syntax of [X.680]. This specification uses the ASN.1 | ASN.1 syntax per [X.680]. This specification uses the ASN.1 | |||
definitions from [RFC5912] with the 2002 ASN.1 notation used in that | definitions from [RFC5912] with the 2002 ASN.1 notation used in that | |||
document. | document. | |||
<CODE BEGINS> | <CODE BEGINS> | |||
DTN-TCPCLPv4-2021 | DTN-TCPCLv4-2021 | |||
{ iso(1) identified-organization(3) dod(6) | { iso(1) identified-organization(3) dod(6) | |||
internet(1) security(5) mechanisms(5) pkix(7) id-mod(0) | internet(1) security(5) mechanisms(5) pkix(7) id-mod(0) | |||
id-mod-dtn-tcpclv4-2021(MOD-TBD) } | id-mod-dtn-tcpclv4-2021(103) } | |||
DEFINITIONS IMPLICIT TAGS ::= | DEFINITIONS IMPLICIT TAGS ::= | |||
BEGIN | BEGIN | |||
IMPORTS | IMPORTS | |||
OTHER-NAME | OTHER-NAME | |||
FROM PKIX1Implicit-2009 -- [RFC5912] | FROM PKIX1Implicit-2009 -- [RFC5912] | |||
{ iso(1) identified-organization(3) dod(6) internet(1) | { iso(1) identified-organization(3) dod(6) internet(1) | |||
security(5) mechanisms(5) pkix(7) id-mod(0) | security(5) mechanisms(5) pkix(7) id-mod(0) | |||
id-mod-pkix1-implicit-02(59) } | id-mod-pkix1-implicit-02(59) } | |||
skipping to change at page 77, line 33 ¶ | skipping to change at line 3345 ¶ | |||
{ iso(1) identified-organization(3) dod(6) internet(1) | { iso(1) identified-organization(3) dod(6) internet(1) | |||
security(5) mechanisms(5) pkix(7) id-mod(0) | security(5) mechanisms(5) pkix(7) id-mod(0) | |||
id-mod-pkix1-explicit-02(51) } ; | id-mod-pkix1-explicit-02(51) } ; | |||
id-kp OBJECT IDENTIFIER ::= { id-pkix 3 } | id-kp OBJECT IDENTIFIER ::= { id-pkix 3 } | |||
id-on OBJECT IDENTIFIER ::= { id-pkix 8 } | id-on OBJECT IDENTIFIER ::= { id-pkix 8 } | |||
DTNOtherNames OTHER-NAME ::= { on-bundleEID, ... } | DTNOtherNames OTHER-NAME ::= { on-bundleEID, ... } | |||
-- The otherName definition for Bundle EID | -- The otherName definition for BundleEID | |||
on-bundleEID OTHER-NAME ::= { | on-bundleEID OTHER-NAME ::= { | |||
BundleEID IDENTIFIED BY { id-on-bundleEID } | BundleEID IDENTIFIED BY { id-on-bundleEID } | |||
} | } | |||
id-on-bundleEID OBJECT IDENTIFIER ::= { id-on ON-TBD } | id-on-bundleEID OBJECT IDENTIFIER ::= { id-on 11 } | |||
-- Same encoding as GeneralName of uniformResourceIdentifier | -- Same encoding as GeneralName of uniformResourceIdentifier | |||
BundleEID ::= IA5String | BundleEID ::= IA5String | |||
-- The Extended Key Usage key for bundle security | -- The Extended Key Usage key for bundle security | |||
id-kp-bundleSecurity OBJECT IDENTIFIER ::= { id-kp KP-TBD } | id-kp-bundleSecurity OBJECT IDENTIFIER ::= { id-kp 35 } | |||
END | END | |||
<CODE ENDS> | <CODE ENDS> | |||
Appendix C. Example of the BundleEID Other Name Form | Appendix C. Example of the BundleEID Other Name Form | |||
EDITOR NOTE: The encoded hex part "0b" and OID segment "11" are to be | ||||
replaced by ON-TBD allocated value. It was necessary to choose some | ||||
OID value, so I chose the first not-allocated code point. | ||||
This non-normative example demonstrates an otherName with a name form | This non-normative example demonstrates an otherName with a name form | |||
of BundleEID to encode the Node ID "dtn://example/". | of BundleEID to encode the node ID "dtn://example/". | |||
The hexadecimal form of the DER encoding of the otherName is: | The hexadecimal form of the DER encoding of the otherName is as | |||
follows: | ||||
a01c06082b0601050507080ba010160e64746e3a2f2f6578616d706c652f | a01c06082b0601050507080ba010160e64746e3a2f2f6578616d706c652f | |||
And the text decoding in Figure 28 is an output of Peter Gutmann's | And the text decoding in Figure 28 is an output of Peter Gutmann's | |||
"dumpasn1" program. | "dumpasn1" program. | |||
0 28: [0] { | 0 28: [0] { | |||
2 8: OBJECT IDENTIFIER '1 3 6 1 5 5 7 8 11' | 2 8: OBJECT IDENTIFIER '1 3 6 1 5 5 7 8 11' | |||
12 16: [0] { | 12 16: [0] { | |||
14 14: IA5String 'dtn://example/' | 14 14: IA5String 'dtn://example/' | |||
: } | : } | |||
: } | : } | |||
Figure 28: Visualized decoding of the on-bundleEID | Figure 28: Visualized Decoding of the on-bundleEID | |||
Acknowledgments | ||||
This specification is based on comments regarding the implementation | ||||
of [RFC7242] as provided by Scott Burleigh. | ||||
The ASN.1 module and its Other Name Form are based on a | ||||
recommendation provided by Russ Housley. | ||||
Authors' Addresses | Authors' Addresses | |||
Brian Sipos | Brian Sipos | |||
RKF Engineering Solutions, LLC | RKF Engineering Solutions, LLC | |||
7500 Old Georgetown Road | 7500 Old Georgetown Road | |||
Suite 1275 | Suite 1275 | |||
Bethesda, MD 20814-6198 | Bethesda, MD 20814-6198 | |||
United States of America | United States of America | |||
Email: brian.sipos+ietf@gmail.com | Email: brian.sipos+ietf@gmail.com | |||
Michael Demmer | Michael Demmer | |||
University of California, Berkeley | ||||
Computer Science Division | ||||
445 Soda Hall | ||||
Berkeley, CA 94720-1776 | ||||
United States of America | ||||
Email: demmer@cs.berkeley.edu | Email: demmer@gmail.com | |||
Joerg Ott | ||||
Aalto University | Jörg Ott | |||
Department of Communications and Networking | Technical University of Munich | |||
PO Box 13000 | Department of Informatics | |||
FI-02015 Aalto | Chair of Connected Mobility | |||
Finland | Boltzmannstrasse 3 | |||
DE-85748 Garching | ||||
Germany | ||||
Email: ott@in.tum.de | Email: ott@in.tum.de | |||
Simon Perreault | Simon Perreault | |||
Quebec QC | LogMeIn | |||
410 boulevard Charest Est | ||||
Suite 250 | ||||
Quebec QC G1K 8G3 | ||||
Canada | Canada | |||
Email: simon@per.reau.lt | Email: simon.perreault@logmein.com | |||
End of changes. 461 change blocks. | ||||
1470 lines changed or deleted | 1414 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |