draft-ietf-dtn-tcpclv4-12.txt | draft-ietf-dtn-tcpclv4-13.txt | |||
---|---|---|---|---|
Delay Tolerant Networking B. Sipos | Delay Tolerant Networking B. Sipos | |||
Internet-Draft RKF Engineering | Internet-Draft RKF Engineering | |||
Obsoletes: 7242 (if approved) M. Demmer | Obsoletes: 7242 (if approved) M. Demmer | |||
Intended status: Standards Track UC Berkeley | Intended status: Standards Track UC Berkeley | |||
Expires: October 2, 2019 J. Ott | Expires: February 21, 2020 J. Ott | |||
Aalto University | Aalto University | |||
S. Perreault | S. Perreault | |||
March 31, 2019 | August 20, 2019 | |||
Delay-Tolerant Networking TCP Convergence Layer Protocol Version 4 | Delay-Tolerant Networking TCP Convergence Layer Protocol Version 4 | |||
draft-ietf-dtn-tcpclv4-12 | draft-ietf-dtn-tcpclv4-13 | |||
Abstract | Abstract | |||
This document describes a revised protocol for the TCP-based | This document describes a revised protocol for the TCP-based | |||
convergence layer (TCPCL) for Delay-Tolerant Networking (DTN). The | convergence layer (TCPCL) for Delay-Tolerant Networking (DTN). The | |||
protocol revision is based on implementation issues in the original | protocol revision is based on implementation issues in the original | |||
TCPCL Version 3 of RFC7242 and updates to the Bundle Protocol | TCPCL Version 3 of RFC7242 and updates to the Bundle Protocol | |||
contents, encodings, and convergence layer requirements in Bundle | contents, encodings, and convergence layer requirements in Bundle | |||
Protocol Version 7. Specifically, the TCPCLv4 uses CBOR-encoded BPv7 | Protocol Version 7. Specifically, the TCPCLv4 uses CBOR-encoded BPv7 | |||
bundles as its service data unit being transported and provides a | bundles as its service data unit being transported and provides a | |||
skipping to change at page 1, line 43 ¶ | skipping to change at page 1, line 43 ¶ | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on October 2, 2019. | This Internet-Draft will expire on February 21, 2020. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2019 IETF Trust and the persons identified as the | Copyright (c) 2019 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 | Provisions Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
1.1. Convergence Layer Services . . . . . . . . . . . . . . . 4 | 1.1. Scope . . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
2. Requirements Language . . . . . . . . . . . . . . . . . . . . 6 | 2. Requirements Language . . . . . . . . . . . . . . . . . . . . 5 | |||
2.1. Definitions Specific to the TCPCL Protocol . . . . . . . 6 | 2.1. Definitions Specific to the TCPCL Protocol . . . . . . . 5 | |||
3. General Protocol Description . . . . . . . . . . . . . . . . 9 | 3. General Protocol Description . . . . . . . . . . . . . . . . 8 | |||
3.1. TCPCL Session Overview . . . . . . . . . . . . . . . . . 9 | 3.1. Convergence Layer Services . . . . . . . . . . . . . . . 8 | |||
3.2. TCPCL States and Transitions . . . . . . . . . . . . . . 11 | 3.2. TCPCL Session Overview . . . . . . . . . . . . . . . . . 10 | |||
3.3. Transfer Segmentation Policies . . . . . . . . . . . . . 16 | 3.3. TCPCL States and Transitions . . . . . . . . . . . . . . 12 | |||
3.4. Example Message Exchange . . . . . . . . . . . . . . . . 17 | 3.4. Transfer Segmentation Policies . . . . . . . . . . . . . 18 | |||
4. Session Establishment . . . . . . . . . . . . . . . . . . . . 19 | 3.5. Example Message Exchange . . . . . . . . . . . . . . . . 19 | |||
4.1. TCP Connection . . . . . . . . . . . . . . . . . . . . . 19 | 4. Session Establishment . . . . . . . . . . . . . . . . . . . . 21 | |||
4.2. Contact Header . . . . . . . . . . . . . . . . . . . . . 19 | 4.1. TCP Connection . . . . . . . . . . . . . . . . . . . . . 21 | |||
4.3. Contact Validation and Negotiation . . . . . . . . . . . 20 | 4.2. Contact Header . . . . . . . . . . . . . . . . . . . . . 22 | |||
4.4. Session Security . . . . . . . . . . . . . . . . . . . . 21 | 4.3. Contact Validation and Negotiation . . . . . . . . . . . 23 | |||
4.4.1. TLS Handshake Result . . . . . . . . . . . . . . . . 22 | 4.4. Session Security . . . . . . . . . . . . . . . . . . . . 24 | |||
4.4.2. Example TLS Initiation . . . . . . . . . . . . . . . 22 | 4.4.1. TLS Handshake . . . . . . . . . . . . . . . . . . . . 24 | |||
4.5. Message Type Codes . . . . . . . . . . . . . . . . . . . 23 | 4.4.2. TLS Authentication . . . . . . . . . . . . . . . . . 25 | |||
4.6. Session Initialization Message (SESS_INIT) . . . . . . . 24 | 4.4.3. Example TLS Initiation . . . . . . . . . . . . . . . 26 | |||
4.7. Session Parameter Negotiation . . . . . . . . . . . . . . 26 | 4.5. Message Header . . . . . . . . . . . . . . . . . . . . . 27 | |||
4.8. Session Extension Items . . . . . . . . . . . . . . . . . 27 | 4.6. Session Initialization Message (SESS_INIT) . . . . . . . 28 | |||
5. Established Session Operation . . . . . . . . . . . . . . . . 28 | 4.7. Session Parameter Negotiation . . . . . . . . . . . . . . 30 | |||
5.1. Upkeep and Status Messages . . . . . . . . . . . . . . . 28 | 4.8. Session Extension Items . . . . . . . . . . . . . . . . . 31 | |||
5.1.1. Session Upkeep (KEEPALIVE) . . . . . . . . . . . . . 28 | 5. Established Session Operation . . . . . . . . . . . . . . . . 32 | |||
5.1.2. Message Rejection (MSG_REJECT) . . . . . . . . . . . 29 | 5.1. Upkeep and Status Messages . . . . . . . . . . . . . . . 32 | |||
5.2. Bundle Transfer . . . . . . . . . . . . . . . . . . . . . 30 | 5.1.1. Session Upkeep (KEEPALIVE) . . . . . . . . . . . . . 32 | |||
5.2.1. Bundle Transfer ID . . . . . . . . . . . . . . . . . 30 | 5.1.2. Message Rejection (MSG_REJECT) . . . . . . . . . . . 33 | |||
5.2.2. Data Transmission (XFER_SEGMENT) . . . . . . . . . . 31 | 5.2. Bundle Transfer . . . . . . . . . . . . . . . . . . . . . 34 | |||
5.2.3. Data Acknowledgments (XFER_ACK) . . . . . . . . . . . 33 | 5.2.1. Bundle Transfer ID . . . . . . . . . . . . . . . . . 35 | |||
5.2.4. Transfer Refusal (XFER_REFUSE) . . . . . . . . . . . 34 | 5.2.2. Data Transmission (XFER_SEGMENT) . . . . . . . . . . 35 | |||
5.2.5. Transfer Extension Items . . . . . . . . . . . . . . 36 | 5.2.3. Data Acknowledgments (XFER_ACK) . . . . . . . . . . . 37 | |||
6. Session Termination . . . . . . . . . . . . . . . . . . . . . 38 | 5.2.4. Transfer Refusal (XFER_REFUSE) . . . . . . . . . . . 38 | |||
6.1. Session Termination Message (SESS_TERM) . . . . . . . . . 38 | 5.2.5. Transfer Extension Items . . . . . . . . . . . . . . 41 | |||
6.2. Idle Session Shutdown . . . . . . . . . . . . . . . . . . 40 | 6. Session Termination . . . . . . . . . . . . . . . . . . . . . 43 | |||
7. Implementation Status . . . . . . . . . . . . . . . . . . . . 40 | 6.1. Session Termination Message (SESS_TERM) . . . . . . . . . 43 | |||
8. Security Considerations . . . . . . . . . . . . . . . . . . . 41 | 6.2. Idle Session Shutdown . . . . . . . . . . . . . . . . . . 45 | |||
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 42 | 7. Implementation Status . . . . . . . . . . . . . . . . . . . . 45 | |||
9.1. Port Number . . . . . . . . . . . . . . . . . . . . . . . 42 | 8. Security Considerations . . . . . . . . . . . . . . . . . . . 46 | |||
9.2. Protocol Versions . . . . . . . . . . . . . . . . . . . . 43 | 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 47 | |||
9.3. Session Extension Types . . . . . . . . . . . . . . . . . 43 | 9.1. Port Number . . . . . . . . . . . . . . . . . . . . . . . 47 | |||
9.4. Transfer Extension Types . . . . . . . . . . . . . . . . 44 | 9.2. Protocol Versions . . . . . . . . . . . . . . . . . . . . 48 | |||
9.5. Message Types . . . . . . . . . . . . . . . . . . . . . . 45 | 9.3. Session Extension Types . . . . . . . . . . . . . . . . . 48 | |||
9.6. XFER_REFUSE Reason Codes . . . . . . . . . . . . . . . . 45 | 9.4. Transfer Extension Types . . . . . . . . . . . . . . . . 49 | |||
9.7. SESS_TERM Reason Codes . . . . . . . . . . . . . . . . . 46 | 9.5. Message Types . . . . . . . . . . . . . . . . . . . . . . 50 | |||
9.8. MSG_REJECT Reason Codes . . . . . . . . . . . . . . . . . 47 | 9.6. XFER_REFUSE Reason Codes . . . . . . . . . . . . . . . . 50 | |||
10. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 48 | 9.7. SESS_TERM Reason Codes . . . . . . . . . . . . . . . . . 51 | |||
11. References . . . . . . . . . . . . . . . . . . . . . . . . . 48 | 9.8. MSG_REJECT Reason Codes . . . . . . . . . . . . . . . . . 52 | |||
11.1. Normative References . . . . . . . . . . . . . . . . . . 48 | 10. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 53 | |||
11.2. Informative References . . . . . . . . . . . . . . . . . 49 | 11. References . . . . . . . . . . . . . . . . . . . . . . . . . 53 | |||
Appendix A. Significant changes from RFC7242 . . . . . . . . . . 49 | 11.1. Normative References . . . . . . . . . . . . . . . . . . 53 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 50 | 11.2. Informative References . . . . . . . . . . . . . . . . . 54 | |||
Appendix A. Significant changes from RFC7242 . . . . . . . . . . 55 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 56 | ||||
1. Introduction | 1. Introduction | |||
This document describes the TCP-based convergence-layer protocol for | This document describes the TCP-based convergence-layer protocol for | |||
Delay-Tolerant Networking. Delay-Tolerant Networking is an end-to- | Delay-Tolerant Networking. Delay-Tolerant Networking is an end-to- | |||
end architecture providing communications in and/or through highly | end architecture providing communications in and/or through highly | |||
stressed environments, including those with intermittent | stressed environments, including those with intermittent | |||
connectivity, long and/or variable delays, and high bit error rates. | connectivity, long and/or variable delays, and high bit error rates. | |||
More detailed descriptions of the rationale and capabilities of these | More detailed descriptions of the rationale and capabilities of these | |||
networks can be found in "Delay-Tolerant Network Architecture" | networks can be found in "Delay-Tolerant Network Architecture" | |||
skipping to change at page 4, line 24 ¶ | skipping to change at page 4, line 24 ¶ | |||
| TCP | ---> Transport Layer | | TCP | ---> Transport Layer | |||
+-------------------------+ | +-------------------------+ | |||
| IPv4/IPv6 | ---> Network Layer | | IPv4/IPv6 | ---> Network Layer | |||
+-------------------------+ | +-------------------------+ | |||
| Link-Layer Protocol | ---> Link Layer | | Link-Layer Protocol | ---> Link Layer | |||
+-------------------------+ | +-------------------------+ | |||
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 | ||||
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: | |||
o The format of protocol data units of the Bundle Protocol, as those | o The format of protocol data units of the Bundle Protocol, as those | |||
are defined elsewhere in [RFC5050] and [I-D.ietf-dtn-bpbis]. This | are defined elsewhere in [I-D.ietf-dtn-bpbis]. This includes the | |||
includes the concept of bundle fragmentation or bundle | concept of bundle fragmentation or bundle encapsulation. The | |||
encapsulation. The TCPCL transfers bundles as opaque data blocks. | TCPCL transfers bundles as opaque data blocks. | |||
o Mechanisms for locating or identifying other bundle entities | o Mechanisms for locating or identifying other bundle entities | |||
within an internet. | (peers) within a network or across an internet. The mapping of | |||
Node ID to potential CL protocol and network address is left to | ||||
1.1. Convergence Layer Services | implementation and configuration of the BP Agent and its various | |||
potential routing strategies. | ||||
This version of the TCPCL provides the following services to support | ||||
the overlaying Bundle Protocol agent. In all cases, this is not an | ||||
API defintion but a logical description of how the CL may interact | ||||
with the BP agent. Each of these interactions may be associated with | ||||
any number of additional metadata items as necessary to support the | ||||
operation of the CL or BP agent. | ||||
Attempt Session The TCPCL allows a BP agent to pre-emptively attempt | ||||
to establish a TCPCL session with a peer entity. Each session | ||||
attempt can send a different set of session negotiation parameters | ||||
as directed by the BP agent. | ||||
Terminate Session The TCPCL allows a BP agent to pre-emptively | ||||
terminate an established TCPCL session with a peer entity. The | ||||
terminate request is on a per-session basis. | ||||
Session State Changed The TCPCL supports indication when the session | ||||
state changes. The top-level session states indicated are: | ||||
Contact Negotating: A TCP connection has been made (as either | ||||
active or passive entity) and contact negotiation has begun. | ||||
Session Negotiating: Contact negotation has been completed | ||||
(including possible TLS use) and session negotiation has begun. | ||||
Established: The session has been fully established and is ready | ||||
for its first transfer. | ||||
Closing: The entity received a SESS_TERM message and is in the | ||||
closing state. | ||||
Terminated: The session has finished normal termination | ||||
sequencing.. | ||||
Failed: The session ended without normal termination sequencing. | ||||
Session Idle Changed The TCPCL supports indication when the live/ | ||||
idle sub-state changes. This occurs only when the top-level | ||||
session state is Established. Because TCPCL transmits serially | ||||
over a TCP connection, it suffers from "head of queue blocking" | ||||
this indication provides information about when a session is | ||||
available for immediate transfer start. | ||||
Begin Transmission The principal purpose of the TCPCL is to allow a | ||||
BP agent to transmit bundle data over an established TCPCL | ||||
session. Transmission request is on a per-session basis, the CL | ||||
does not necessarily perform any per-session or inter-session | ||||
queueing. Any queueing of transmissions is the obligation of the | ||||
BP agent. | ||||
Transmission Success The TCPCL supports positive indication when a | ||||
bundle has been fully transferred to a peer entity. | ||||
Transmission Intermediate Progress The TCPCL supports positive | ||||
indication of intermediate progress of transferr to a peer entity. | ||||
This intermediate progress is at the granularity of each | ||||
transferred segment. | ||||
Transmission Failure The TCPCL supports positive indication of | ||||
certain reasons for bundle transmission failure, notably when the | ||||
peer entity rejects the bundle or when a TCPCL session ends before | ||||
transferr success. The TCPCL itself does not have a notion of | ||||
transfer timeout. | ||||
Reception Initialized The TCPCL supports indication to the reciver | ||||
just before any transmssion data is sent. This corresponds to | ||||
reception of the XFER_SEGMENT message with the START flag set. | ||||
Interrupt Reception The TCPCL allows a BP agent to interrupt an | ||||
individual transfer before it has fully completed (successfully or | ||||
not). Interruption can occur any time after the reception is | ||||
initialized. | ||||
Reception Success The TCPCL supports positive indication when a | o Logic for routing bundles along a path toward a bundle's endpoint. | |||
bundle has been fully transferred from a peer entity. | This CL protocol is involved only in transporting bundles between | |||
adjacent nodes in a routing sequence. | ||||
Reception Intermediate Progress The TCPCL supports positive | o Policies or mechanisms for assigning X.509 certificates, | |||
indication of intermediate progress of transfer from the peer | provisioning or deploying certificates and private keys, or | |||
entity. This intermediate progress is at the granularity of each | configuring security parameters on an individual BP node or across | |||
transferred segment. Intermediate reception indication allows a | a network. | |||
BP agent the chance to inspect bundle header contents before the | ||||
entire bundle is available, and thus supports the "Reception | ||||
Interruption" capability. | ||||
Reception Failure The TCPCL supports positive indication of certain | Any TCPCL implementation requires a BP agent to perform those above | |||
reasons for reception failure, notably when the local entity | listed functions in order to perform end-to-end bundle delivery. | |||
rejects an attempted transfer for some local policy reason or when | ||||
a TCPCL session ends before transfer success. The TCPCL itself | ||||
does not have a notion of transfer timeout. | ||||
2. Requirements Language | 2. Requirements Language | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALLNOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
document are to be interpreted as described in [RFC2119]. | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | ||||
capitals, as shown here. | ||||
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. | |||
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 | |||
skipping to change at page 9, line 37 ¶ | skipping to change at page 8, line 37 ¶ | |||
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 | the Transmission Control Protocol (TCP). This document specifies the | |||
encapsulation of bundles, procedures for TCP setup and teardown, and | encapsulation of bundles, procedures for TCP setup and teardown, and | |||
a set of messages and node requirements. The general operation of | a set of messages and node requirements. The general operation of | |||
the protocol is as follows. | the protocol is as follows. | |||
3.1. TCPCL Session Overview | 3.1. Convergence Layer Services | |||
This version of the TCPCL provides the following services to support | ||||
the overlaying Bundle Protocol agent. In all cases, this is not an | ||||
API defintion but a logical description of how the CL can interact | ||||
with the BP agent. Each of these interactions can be associated with | ||||
any number of additional metadata items as necessary to support the | ||||
operation of the CL or BP agent. | ||||
Attempt Session: The TCPCL allows a BP agent to pre-emptively | ||||
attempt to establish a TCPCL session with a peer entity. Each | ||||
session attempt can send a different set of session negotiation | ||||
parameters as directed by the BP agent. | ||||
Terminate Session: The TCPCL allows a BP agent to pre-emptively | ||||
terminate an established TCPCL session with a peer entity. The | ||||
terminate request is on a per-session basis. | ||||
Session State Changed: The TCPCL supports indication when the | ||||
session state changes. The top-level session states indicated | ||||
are: | ||||
Connecting: A TCP connection is being established. This state | ||||
only applies to the active entity. | ||||
Contact Negotating: A TCP connection has been made (as either | ||||
active or passive entity) and contact negotiation has begun. | ||||
Session Negotiating: Contact negotation has been completed | ||||
(including possible TLS use) and session negotiation has begun. | ||||
Established: The session has been fully established and is ready | ||||
for its first transfer. | ||||
Ending: The entity received a SESS_TERM message and is in the | ||||
ending state. | ||||
Terminated: The session has finished normal termination | ||||
sequencing. | ||||
Failed: The session ended without normal termination sequencing. | ||||
Session Idle Changed: The TCPCL supports indication when the live/ | ||||
idle sub-state of the session changes. This occurs only when the | ||||
top-level session state is "Established". The session transitions | ||||
from Idle to Live at the at the start of a transfer in either | ||||
transfer stream; the session transitions from Live to Idle at the | ||||
end of a transfer when the other transfer stream does not have an | ||||
ongoing transfer. Because TCPCL transmits serially over a TCP | ||||
connection, it suffers from "head of queue blocking" this | ||||
indication provides information about when a session is available | ||||
for immediate transfer start. | ||||
Begin Transmission: The principal purpose of the TCPCL is to allow a | ||||
BP agent to transmit bundle data over an established TCPCL | ||||
session. Transmission request is on a per-session basis, the CL | ||||
does not necessarily perform any per-session or inter-session | ||||
queueing. Any queueing of transmissions is the obligation of the | ||||
BP agent. | ||||
Transmission Success: The TCPCL supports positive indication when a | ||||
bundle has been fully transferred to a peer entity. | ||||
Transmission Intermediate Progress: The TCPCL supports positive | ||||
indication of intermediate progress of transferr to a peer entity. | ||||
This intermediate progress is at the granularity of each | ||||
transferred segment. | ||||
Transmission Failure: The TCPCL supports positive indication of | ||||
certain reasons for bundle transmission failure, notably when the | ||||
peer entity rejects the bundle or when a TCPCL session ends before | ||||
transferr success. The TCPCL itself does not have a notion of | ||||
transfer timeout. | ||||
Reception Initialized: The TCPCL supports indication to the reciver | ||||
just before any transmssion data is sent. This corresponds to | ||||
reception of the XFER_SEGMENT message with the START flag set. | ||||
Interrupt Reception: The TCPCL allows a BP agent to interrupt an | ||||
individual transfer before it has fully completed (successfully or | ||||
not). Interruption can occur any time after the reception is | ||||
initialized. | ||||
Reception Success: The TCPCL supports positive indication when a | ||||
bundle has been fully transferred from a peer entity. | ||||
Reception Intermediate Progress: The TCPCL supports positive | ||||
indication of intermediate progress of transfer from the peer | ||||
entity. This intermediate progress is at the granularity of each | ||||
transferred segment. Intermediate reception indication allows a | ||||
BP agent the chance to inspect bundle header contents before the | ||||
entire bundle is available, and thus supports the "Reception | ||||
Interruption" capability. | ||||
Reception Failure: The TCPCL supports positive indication of certain | ||||
reasons for reception failure, notably when the local entity | ||||
rejects an attempted transfer for some local policy reason or when | ||||
a TCPCL session ends before transfer success. The TCPCL itself | ||||
does not have a notion of transfer timeout. | ||||
3.2. TCPCL Session Overview | ||||
First, one node establishes a TCPCL session to the other by | First, one node 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 | |||
possibly initiate TLS security. Once contact negotiation is | possibly initiate TLS security. Once contact negotiation is | |||
complete, TCPCL messaging is available and the session negotiation is | complete, TCPCL messaging is available and the session negotiation is | |||
used to set parameters of the TCPCL session. One of these parameters | used to set parameters of the TCPCL session. One of these parameters | |||
is a singleton endpoint identifier for each node (not the singleton | is a Node ID of each TCPCL Entity. This is used to assist in routing | |||
Endpoint Identifier (EID) of any application running on the node) to | and forwarding messages by the BP Agent and is part of the | |||
denote the bundle-layer identity of each DTN node. This is used to | authentication capability provided by TLS. | |||
assist in routing and forwarding messages (e.g. to prevent loops). | ||||
Once negotiated, the parameters of a TCPCL session cannot change and | Once negotiated, the parameters of a TCPCL session cannot change and | |||
if there is a desire by either peer to transfer data under different | if 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 | |||
negligable compared to TCPCL data sizes. | negligable 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 an sequence of logical segments of data within | performed by an sequence of logical segments of data within | |||
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 | ||||
single node can establish beyond the limit imposed by the number of | ||||
available (ephemeral) TCP ports of the passive peer. | ||||
A feature of this protocol is for the receiving node to send | A feature of this protocol is for the receiving node to 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 sender | The rationale behind these acknowledgments is to enable the sender | |||
node to determine how much of the bundle has been received, so that | node to determine how much of the bundle has been received, so that | |||
in case the session is interrupted, it can perform reactive | in case the session is interrupted, it can perform reactive | |||
fragmentation to avoid re-sending the already transmitted part of the | fragmentation to avoid re-sending the already transmitted part of the | |||
bundle. In addition, there is no explicit flow control on the TCPCL | bundle. In addition, there is no explicit flow control on the TCPCL | |||
layer. | layer. | |||
skipping to change at page 10, line 40 ¶ | skipping to change at page 11, line 48 ¶ | |||
hasn't already finished transmission) Note: This enables a cross- | hasn't already finished transmission) Note: This enables a cross- | |||
layer optimization in that it allows a receiver that detects that it | layer optimization in that it allows a receiver that detects that it | |||
already has received a certain bundle to interrupt transmission as | already has received a certain bundle to interrupt transmission as | |||
early as possible and thus save transmission capacity for other | early as possible and thus save transmission capacity for other | |||
bundles. | 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 node live-ness | negotiated interval. This is used to convey node live-ness | |||
information during otherwise message-less time intervals. | information during otherwise message-less time intervals. | |||
A SESS_TERM message is used to start the closing of a TCPCL session | A SESS_TERM message is used to start the ending of a TCPCL session | |||
(see Section 6.1). During shutdown sequencing, in-progress transfers | (see Section 6.1). During shutdown sequencing, in-progress transfers | |||
can be completed but no new transfers can be initiated. A SESS_TERM | 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 peer (see | message can also be used to refuse a session setup by a peer (see | |||
Section 4.3). It is an implementation matter to determine whether or | Section 4.3). It is an implementation matter to determine whether or | |||
not to close a TCPCL session while there are no transfers queued or | not to close a TCPCL session while there are no transfers queued or | |||
in-progress. | in-progress. | |||
Once a session is established established, TCPCL is a symmetric | Once a session is established, TCPCL is a symmetric protocol between | |||
protocol between the peers. Both sides can start sending data | the peers. Both sides can start sending data segments in a session, | |||
segments in a session, and one side's bundle transfer does not have | and one side's bundle transfer does not have to complete before the | |||
to complete before the other side can start sending data segments on | other side can start sending data segments on its own. Hence, the | |||
its own. Hence, the protocol allows for a bi-directional mode of | protocol allows for a bi-directional mode of communication. Note | |||
communication. Note that in the case of concurrent bidirectional | that in the case of concurrent bidirectional transmission, | |||
transmission, acknowledgment segments MAY be interleaved with data | acknowledgment segments MAY be interleaved with data segments. | |||
segments. | ||||
3.2. TCPCL States and Transitions | 3.3. TCPCL States and Transitions | |||
The states of a nominal TCPCL session (i.e. without session failures) | The states of a nominal TCPCL session (i.e. without session failures) | |||
are indicated in Figure 4. | are indicated in Figure 4. | |||
+-------+ | +-------+ | |||
| START | | | START | | |||
+-------+ | +-------+ | |||
| | | | |||
TCP Establishment | TCP Establishment | |||
| | | | |||
skipping to change at page 12, line 28 ¶ | skipping to change at page 13, line 28 ¶ | |||
| Negotiated | | Negotiated | |||
V | V | |||
+-------------+ +-------------+ | +-------------+ +-------------+ | |||
| Established |----New Transfer---->| Established | | | Established |----New Transfer---->| Established | | |||
| Session | | Session | | | Session | | Session | | |||
| Idle |<---Transfers Done---| Live | | | Idle |<---Transfers Done---| Live | | |||
+-------------+ +-------------+ | +-------------+ +-------------+ | |||
| | | | | | |||
+------------------------------------+ | +------------------------------------+ | |||
| | | | |||
SESS_TERM Exchange | [SESSTERM] Exchange | |||
| | | | |||
V | V | |||
+-------------+ | +-------------+ | |||
| Established | +-------------+ | | Established | +-------------+ | |||
| Session |----Transfers------>| TCP | | | Session |----Transfers------>| TCP | | |||
| Ending | Done | Terminating | | | Ending | Done | Terminating | | |||
+-------------+ +-------------+ | +-------------+ +-------------+ | |||
| | | | |||
+------------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 reeiving over a transfer | Session "Live" means transmitting or reeiving 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 "Closing" means no new transfers will be allowed. | Session "Ending" means no new transfers will be allowed. | |||
The contact negotiation sequencing is performed either as the active | Contact negotation involves exchanging a Contact Header (CH) in both | |||
or passive peer, and is illustrated in Figure 5 and Figure 6 | directions and deriving a negotiated state from the two headers. The | |||
contact negotiation sequencing is performed either as the active or | ||||
passive peer, and is illustrated in Figure 5 and Figure 6 | ||||
respectively which both share the data validation and analyze final | respectively which both share the data validation and analyze final | |||
states of Figure 7. | states of the "[PCH]" activity of Figure 7 and the "[TCPCLOSE]" | |||
activity which indicates TCP connection close. Successful | ||||
negotiation results in one of the Session Initiation "[SI]" | ||||
activities being performed. | ||||
+-------+ | +-------+ | |||
| START |-----TCP-----+ | | START | | |||
+-------+ Connecting | | +-------+ | |||
V | | | |||
+-----------+ +---------+ | TCP Connecting | |||
| Connected |--OK-->| Send CH |--OK-->[PCH] | V | |||
+-----------+ +---------+ | +-----------+ | |||
| | | | TCP | +---------+ | |||
Error Error | | Connected |--Send CH-->| Waiting |--Timeout-->[TCPCLOSE] | |||
| | | +-----------+ +---------+ | |||
V | | | | |||
[TCPTERM]<-------------+ | Recevied CH | |||
V | ||||
[PCH] | ||||
Figure 5: Contact Initiation as Active peer | Figure 5: Contact Initiation as Active peer | |||
+-------+ | +-----------+ +---------+ | |||
| START |-----TCP----->[PCH] | | TCP |--Wait for-->| Waiting |--Timeout-->[TCPCLOSE] | |||
+-------+ Connected | | Connected | CH +---------+ | |||
+-----------+ | | ||||
Received CH | ||||
V | ||||
+-----------------+ | ||||
| Preparing reply |--Send CH-->[PSI] | ||||
+-----------------+ | ||||
Figure 6: Contact Initiation as Passive peer | Figure 6: Contact Initiation as Passive peer | |||
+-------->[TCPTERM]<----------+ | ||||
| | | ||||
Timeout Error | ||||
or Error | | ||||
| | | ||||
+-------+ +---------+ Contact +----------+ | ||||
| START |---->| Waiting |---- Header --->| Validate | | ||||
+-------+ +---------+ Received +----------+ | ||||
| | ||||
+---------------------------+ | ||||
| | ||||
V | ||||
+---------+ | ||||
+--Error--| Analyze |---No TLS---->[SI] | ||||
| | | ^ | ||||
| +---------+ | | ||||
| | | | ||||
V TLS | | ||||
[TCPTERM] Negotiated | | ||||
^ | | | ||||
| V | | ||||
| +-----------+ | | ||||
| | Establish |---Success---+ | ||||
+--Error--| TLS | | ||||
+-----------+ | ||||
Figure 7: Processing of Contact Header (PCH) | +-----------+ | |||
| Peer CH | | ||||
| available | | ||||
+-----------+ | ||||
| | ||||
Validate and | ||||
Negotiate | ||||
V | ||||
+------------+ | ||||
| Negotiated |----Failure---->[TCPCLOSE] | ||||
+------------+ ^ | ||||
| | | | ||||
No TLS +----Negotiate---+ | | ||||
V TLS | Failure | ||||
+-----------+ V | | ||||
| TCPCL | +---------------+ | ||||
| Messaging |<--Success--| TLS Finished | | ||||
| Available | +---------------+ | ||||
+-----------+ | ||||
The session negotiation sequencing is performed either as the active | Figure 7: Processing of Contact Header [PCH] | |||
or passive peer, and is illustrated in Figure 8 and Figure 9 | ||||
respectively which both share the data validation and analyze final | ||||
states of Figure 10. | ||||
+-------+ TCPCL | Session negotation involves exchanging a session initialization | |||
| START |--Messaging--+ | (SESS_INIT) message in both directions and deriving a negotiated | |||
+-------+ Available | | state from the two messages. The session negotiation sequencing is | |||
V | performed either as the active or passive peer, and is illustrated in | |||
+----------------+ | Figure 8 and Figure 9 respectively which both share the data | |||
| Send SESS_INIT |--OK-->[PSI] | validation and analyze final states of Figure 10. The validation | |||
+----------------+ | here includes certificate validation and authentication when TLS is | |||
| | used for the session. | |||
Error | ||||
| | ||||
V | ||||
[SESSTERM] | ||||
Figure 8: Session Initiation as Active peer | +-----------+ | |||
| TCPCL | +---------+ | ||||
| Messaging |--Send SESS_INIT-->| Waiting |--Timeout-->[SESSTERM] | ||||
| Available | +---------+ | ||||
+-----------+ | | ||||
Recevied SESS_INIT | ||||
| | ||||
V | ||||
[PSI] | ||||
+-------+ TCPCL | Figure 8: Session Initiation [SI] as Active peer | |||
| START |---Messaging-->[PSI] | ||||
+-------+ Available | ||||
Figure 9: Session Initiation as Passive peer | +-----------+ | |||
| TCPCL | +---------+ | ||||
| Messaging |----Wait for ---->| Waiting |--Timeout-->[SESSTERM] | ||||
| Available | SESS_INIT +---------+ | ||||
+-----------+ | | ||||
Recevied SESS_INIT | ||||
| | ||||
+-----------------+ | ||||
| Preparing reply |--Send SESS_INIT-->[PSI] | ||||
+-----------------+ | ||||
+------->[SESSTERM]<--------+ | Figure 9: Session Initiation [SI] as Passive peer | |||
| | | ||||
Timeout Error | ||||
or Error | | ||||
| | | ||||
+-------+ +---------+ +----------+ | ||||
| START |---->| Waiting |---SESS_INIT--->| Validate | | ||||
+-------+ +---------+ Received +----------+ | ||||
| | ||||
+---------------------------+ | ||||
| | ||||
V | ||||
+---------+ +--------------+ | ||||
+--Error--| Analyze |---->| Established | | ||||
| | | | Session Idle | | ||||
| +---------+ +--------------+ | ||||
V | ||||
[SESSTERM] | ||||
Figure 10: Processing of Session Initiation (PSI) | +----------------+ | |||
| Peer SESS_INIT | | ||||
| available | | ||||
+----------------+ | ||||
| | ||||
Validate and | ||||
Negotiate | ||||
V | ||||
+------------+ | ||||
| Negotiated |---Failure--->[SESSTERM] | ||||
+------------+ | ||||
| | ||||
Success | ||||
V | ||||
+--------------+ | ||||
| Established | | ||||
| Session Idle | | ||||
+--------------+ | ||||
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. | Figure 11 and Figure 12 respectively. | |||
+--Send XFER_SEGMENT--+ | +--Send XFER_SEGMENT--+ | |||
+--------+ | | | +--------+ | | | |||
| Stream | +-------------+ | | | Stream | +-------------+ | | |||
| Idle |---Send XFER_SEGMENT-->| In Progress |<------------+ | | Idle |---Send XFER_SEGMENT-->| In Progress |<------------+ | |||
skipping to change at page 16, line 13 ¶ | skipping to change at page 17, line 29 ¶ | |||
Figure 11: Transfer sender states | Figure 11: Transfer sender states | |||
Notes on transfer sending: | Notes on transfer sending: | |||
Pipelining of transfers can occur when the sending entity begins a | Pipelining of transfers can occur when the sending entity begins a | |||
new transfer while in the "Waiting for Ack" state. | 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 | |||
3.3. Transfer Segmentation Policies | Session termination involves one entity initiating the termination of | |||
the session and the other entity acknowledging the termination. For | ||||
either entity, it is the sending of the SESS_TERM message which | ||||
transitions the session to the ending substate. While a session is | ||||
being terminated only in-progress transfers can be completed and no | ||||
new transfers can be started. | ||||
+-----------+ +---------+ | ||||
| Session |--Send SESS_TERM-->| Session | | ||||
| Live/Idle | | Ending | | ||||
+-----------+ +---------+ | ||||
Figure 13: Session Termination [SESSTERM] from the Initiator | ||||
+-----------+ +---------+ | ||||
| Session |--Send SESS_TERM-->| Session | | ||||
| Live/Idle | | Ending | | ||||
+-----------+<------+ +---------+ | ||||
| | | ||||
Receive SESS_TERM | | ||||
| | | ||||
+-------------+ | ||||
Figure 14: Session Termination [SESSTERM] from the Responder | ||||
3.4. Transfer Segmentation Policies | ||||
Each TCPCL session allows a negotiated transfer segmentation polcy to | Each TCPCL session allows a negotiated transfer segmentation polcy to | |||
be applied in each transfer direction. A receiving node can set the | be applied in each transfer direction. A receiving node can set the | |||
Segment MRU in its contact header to determine the largest acceptable | Segment MRU in its contact header to determine the largest acceptable | |||
segment size, and a transmitting node can segment a transfer into any | segment size, and a transmitting node can segment a transfer into any | |||
sizes smaller than the receiver's Segment MRU. It is a network | sizes smaller than the receiver's Segment MRU. It is a network | |||
administration matter to determine an appropriate segmentation policy | administration matter to determine an appropriate segmentation policy | |||
for entities operating TCPCL, but guidance given here can be used to | for entities operating TCPCL, but guidance given here can be used to | |||
steer policy toward performance goals. It is also advised to | steer policy toward performance goals. It is also advised to | |||
consider the Segment MRU in relation to chunking/packetization | consider the Segment MRU in relation to chunking/packetization | |||
performed by TLS, TCP, and any intermediate network-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 node is transmitting a | queue blocking between messages, while one node is transmitting a | |||
single XFER_SEGMENT message it is not able to transmit any | 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 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 XFER_SEGMENT | |||
header size) and transmitters can always segment a transfer into | header size) and transmitters can always segment a transfer into | |||
maximum-size chunks no larger than the Segment MRU. This | maximum-size chunks no larger than the Segment MRU. This | |||
guarantees that any single XFER_SEGMENT will not monopolize the | guarantees that any single XFER_SEGMENT will not monopolize the | |||
TCP stream for too long, which would prevent outgoing XFER_ACK and | TCP stream for too long, which would prevent outgoing XFER_ACK and | |||
XFER_REFUSE associated with received transfers. | XFER_REFUSE 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 node, the actual transfer segmentation only needs | each receiving node, the actual transfer segmentation only needs | |||
to guarantee than any individual segment is no larger than that | to guarantee than any individual segment is no larger than that | |||
MRU. In a situation where network "goodput" is dynamic, the | MRU. In a situation where network "goodput" is dynamic, the | |||
transfer segmentation size can also be dynamic in order to control | transfer segmentation size can also be dynamic in order to control | |||
message transmission duration. | message transmission duration. | |||
Many other policies can be established in a TCPCL network between | Many other policies can be established in a TCPCL network between the | |||
these two extremes. Different policies can be applied to each | two extremes of minimum overhead (large MRU, single-segment) and | |||
direction to/from any particular node. Additionally, future header | predictable message sizing (small MRU, highly segmented). Different | |||
and transfer extension types can apply further nuance to transfer | policies can be applied to each transfer stream to and from from any | |||
policies and policy negotiation. | particular node. Additionally, future header and transfer extension | |||
types can apply further nuance to transfer policies and policy | ||||
negotiation. | ||||
3.4. Example Message Exchange | 3.5. Example Message Exchange | |||
The following figure depicts the protocol exchange for a simple | The following figure depicts the protocol exchange for a simple | |||
session, showing the session establishment and the transmission of a | session, showing the session establishment and the transmission of a | |||
single bundle split into three data segments (of lengths "L1", "L2", | single bundle split into three data segments (of lengths "L1", "L2", | |||
and "L3") from Entity A to Entity B. | and "L3") from Entity A to Entity B. | |||
Note that the sending node can transmit multiple XFER_SEGMENT | Note that the sending node 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 | |||
skipping to change at page 18, line 46 ¶ | skipping to change at page 20, line 46 ¶ | |||
<- | XFER_ACK (end) | | <- | XFER_ACK (end) | | |||
| Transfer ID [I1] | | | Transfer ID [I1] | | |||
| Length [L1+L2+L3] | | | Length [L1+L2+L3] | | |||
+-------------------------+ | +-------------------------+ | |||
+-------------------------+ | +-------------------------+ | |||
| SESS_TERM | -> +-------------------------+ | | SESS_TERM | -> +-------------------------+ | |||
+-------------------------+ <- | SESS_TERM | | +-------------------------+ <- | SESS_TERM | | |||
+-------------------------+ | +-------------------------+ | |||
Figure 13: An example of the flow of protocol messages on a single | Figure 15: An example of the flow of protocol messages on a single | |||
TCP Session between two entities | 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 MAY be opened proactively and | triggered. For example, some sessions MAY 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 MAY be opened only when there is a bundle that | while other sessions MAY be opened only when there is a bundle that | |||
skipping to change at page 19, line 35 ¶ | skipping to change at page 21, line 35 ¶ | |||
the implementation. Any source port number MAY be used for TCPCL | the implementation. Any source port number MAY be used for TCPCL | |||
sessions. Typically an operating system assigned number in the TCP | sessions. Typically an operating system assigned number in the TCP | |||
Ephemeral range (49152-65535) is used. | 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 re-attempt 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 retry the | repeated connection attempts. Therefore, the entity MUST retry the | |||
connection setup no earlier than some delay time from the last | connection setup no earlier than some delay time from the last | |||
attempt, and it SHOULD use a (binary) exponential backoff mechanism | attempt, and it SHOULD use a (binary) exponential back-off mechanism | |||
to increase this delay in case of repeated failures. | to increase this delay in case of repeated failures. The upper limit | |||
on a re-attempt back-off is implementation defined but SHOULD be no | ||||
longer than one minute before signaling to the BP agent that a | ||||
connection cannot be made. | ||||
Once a TCP connection is established, each entity MUST immediately | Once a TCP connection is established, each entity MUST immediately | |||
transmit a contact header over the TCP connection. The format of the | transmit a contact header over the TCP connection. The format of the | |||
contact header is described in Section 4.2. | contact header is described in Section 4.2. Because the TCPCL | |||
protocol version in use is part of the initial contact header, nodes | ||||
using TCPCL version 4 can coexist on a network with nodes using | ||||
earlier TCPCL versions (with some negotiation needed for | ||||
interoperation as described in Section 4.3). | ||||
4.2. Contact Header | 4.2. Contact Header | |||
Once a TCP connection is established, both parties exchange a contact | Once a TCP connection is established, both parties exchange a contact | |||
header. This section describes the format of the contact header and | header. This section describes the format of the contact header and | |||
the meaning of its fields. | the meaning of its fields. | |||
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 | |||
skipping to change at page 20, line 15 ¶ | skipping to change at page 22, line 27 ¶ | |||
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 | |||
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 | |||
+---------------+---------------+---------------+---------------+ | +---------------+---------------+---------------+---------------+ | |||
| magic='dtn!' | | | magic='dtn!' | | |||
+---------------+---------------+---------------+---------------+ | +---------------+---------------+---------------+---------------+ | |||
| Version | Flags | | | Version | Flags | | |||
+---------------+---------------+ | +---------------+---------------+ | |||
Figure 14: 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: | |||
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 protocol). | version of the TCPCL). | |||
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. | to the descriptions in Table 1. All reserved header flag bits | |||
SHALL be not set by the sender. All reserved header flag bits | ||||
SHALL be ignored by the receiver. | ||||
+----------+--------+-----------------------------------------------+ | +----------+--------+-----------------------------------------------+ | |||
| Name | Code | Description | | | Name | Code | Description | | |||
+----------+--------+-----------------------------------------------+ | +----------+--------+-----------------------------------------------+ | |||
| CAN_TLS | 0x01 | If bit is set, indicates that the sending | | | CAN_TLS | 0x01 | If bit is set, indicates that the sending | | |||
| | | peer is capable of TLS security. | | | | | peer is capable of TLS security. | | |||
| | | | | | | | | | |||
| Reserved | others | | | Reserved | others | | |||
+----------+--------+-----------------------------------------------+ | +----------+--------+-----------------------------------------------+ | |||
skipping to change at page 21, line 6 ¶ | skipping to change at page 23, line 28 ¶ | |||
Upon reception of the contact header, each node follows the following | Upon reception of the contact header, each node follows the following | |||
procedures to ensure the validity of the TCPCL session and to | procedures to ensure the validity of the TCPCL session and to | |||
negotiate values for the session parameters. | 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, an entity | of repeated connections from a misconfigured application, an entity | |||
MAY elect to hold an invalid connection open and idle for some time | MAY elect to hold an invalid connection open and idle for some time | |||
before closing it. | before ending it. | |||
The first negotiation is on the TCPCL protocol version to use. The | The first negotiation is on the TCPCL protocol version to use. The | |||
active node always sends its Contact Header first and waits for a | active node always sends its Contact Header first and waits for a | |||
response from the passive node. The active node can repeatedly | response from the passive node. The active node can repeatedly | |||
attempt different protocol versions in descending order until the | attempt different protocol versions in descending order until the | |||
passive node accepts one with a corresponding Contact Header reply. | passive node accepts one with a corresponding Contact Header reply. | |||
Only upon response of a Contact Header from the passive node is the | Only upon response of a Contact Header from the passive node is the | |||
TCPCL protocol version established and parameter negotiation begun. | TCPCL protocol version established and parameter negotiation begun. | |||
During contact initiation, the active TCPCL node SHALL send the | During contact initiation, the active TCPCL node SHALL send the | |||
highest TCPCL protocol version on a first session attempt for a TCPCL | highest TCPCL protocol version on a first session attempt for a TCPCL | |||
peer. If the active node receives a Contact Header with a different | peer. If the active node receives a Contact Header with a different | |||
protocol version than the one sent earlier on the TCP connection, the | protocol version than the one sent earlier on the TCP connection, the | |||
TCP connection SHALL be terminated. If the active node receives a | TCP connection SHALL be terminated. If the active node receives a | |||
SESS_TERM message with reason of "Version Mismatch", that node MAY | SESS_TERM message with reason of "Version Mismatch", that node MAY | |||
attempt further TCPCL sessions with the peer using earlier protocol | attempt further TCPCL sessions with the peer using earlier protocol | |||
version numbers in decreasing order. Managing multi-TCPCL-session | version numbers in decreasing order. Managing multi-TCPCL-session | |||
state such as this is an implementation matter. | state such as this is an implementation matter. | |||
If the passive node receives a contact header containing a version | If the passive node receives a contact header containing a version | |||
that is greater than the current version of the protocol that the | that is greater than the current version of the TCPCL that the node | |||
node implements, then the node SHALL shutdown the session with a | implements, then the node SHALL shutdown the session with a reason | |||
reason code of "Version mismatch". If the passive node receives a | code of "Version mismatch". If the passive node receives a contact | |||
contact header with a version that is lower than the version of the | header with a version that is lower than the version of the protocol | |||
protocol that the node implements, the node MAY either terminate the | that the node implements, the node MAY either terminate the session | |||
session (with a reason code of "Version mismatch") or the node MAY | (with a reason code of "Version mismatch") or the node MAY adapt its | |||
adapt its operation to conform to the older version of the protocol. | operation to conform to the older version of the protocol. The | |||
The decision of version fall-back is an implementation matter. | decision of version fall-back is an implementation matter. | |||
4.4. Session Security | 4.4. Session Security | |||
This version of the TCPCL supports establishing a Transport Layer | This version of the TCPCL supports establishing a Transport Layer | |||
Security (TLS) session within an existing TCP connection. When TLS | Security (TLS) session within an existing TCP connection. When TLS | |||
is used within the TCPCL it affects the entire session. Once | is used within the TCPCL it affects the entire session. Once | |||
established, there is no mechanism available to downgrade a TCPCL | established, there is no mechanism available to downgrade a TCPCL | |||
session to non-TLS operation. If this is desired, the entire TCPCL | session to non-TLS operation. If this is desired, the entire TCPCL | |||
session MUST be terminated and a new non-TLS-negotiated session | session MUST be terminated and a new non-TLS-negotiated session | |||
established. | established. | |||
4.4.1. TLS Handshake | ||||
The use of TLS is negotated using the Contact Header as described in | The use of TLS is negotated using 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, and | |||
before any other TCPCL messages are sent within the session, the | 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 TLS | |||
[RFC5246]. The parameters within each TLS negotiation are | 1.2 [RFC5246] or any successors that are compatible with TLS 1.2. By | |||
implementation dependent but any TCPCL node SHALL follow all | convention, this protocol uses the node which initiated the | |||
recommended practices of [BCP195], or any updates or successors that | underlying TCP connection as the "client" role of the TLS handshake | |||
become part of [BCP195]. By convention, this protocol uses the node | request. | |||
which initiated the underlying TCP connection as the "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 about sensitive data exposure are discussed in Section 8. | |||
4.4.1. TLS Handshake Result | The parameters within each TLS negotiation are implementation | |||
dependent but any TCPCL node SHALL follow all recommended practices | ||||
of BCP 195 [RFC7525], or any updates or successors that become part | ||||
of BCP 195. The TLS handshake SHOULD include a Server Name | ||||
Indication from the active peer. The TLS handshake SHALL request a | ||||
client-side certificate to allow authentication of the active peer. | ||||
The passive peer SHOULD supply a certificate within the TLS handshake | ||||
to allow authentication of its side of the session. The active peer | ||||
SHOULD supply a certificate within the TLS handshake to allow | ||||
authentication of its side of the session. All certificates supplied | ||||
during TLS handshake SHALL conform with the profile of [RFC5280]. | ||||
When a certificate is supplied during TLS handshake, the full | ||||
certification chain SHOULD be included unless security policy | ||||
indicates that is unnecessary. | ||||
If a TLS handshake cannot negotiate a TLS session, both entities of | If a TLS handshake cannot negotiate a TLS session, both entities of | |||
the TCPCL session SHALL terminate the TCP connection. At this point | the TCPCL session SHALL close the TCP connection. At this point the | |||
the TCPCL session has not yet been established so there is no TCPCL | TCPCL session has not yet been established so there is no TCPCL | |||
session to terminate. This also avoids any potential security issues | session to terminate. This also avoids any potential security issues | |||
assoicated with further TCP communication with an untrusted peer. | assoicated with further TCP communication with an untrusted peer. | |||
After a TLS session is successfully established, the active peer | After a TLS session is successfully established, the active peer | |||
SHALL send a SESS_INIT message to begin session negotiation. This | SHALL send a SESS_INIT message to begin session negotiation. This | |||
session negotation and all subsequent messaging are secured. | session negotation and all subsequent messaging are secured. | |||
4.4.2. Example TLS Initiation | 4.4.2. TLS Authentication | |||
A summary of a typical CAN_TLS usage is shown in the sequence in | Using X.509 certificates exchanged during the TLS handshake, each of | |||
Figure 15 below. | the entities can attempt to authenticate its peer at the network | |||
layer (host name and address) and at the application layer (BP Node | ||||
ID). The Node ID exchanged in the Session Initialization is likely | ||||
to be used by the BP agent for making transfer and routing decisions, | ||||
so attempting host name validation is optional while attempting Node | ||||
ID validation is required. The logic for attempting validation is | ||||
separate from the logic for handling the result of validation, which | ||||
is based on local security policy. | ||||
Any certificate received during TLS handshake SHALL be validated up | ||||
to one or more trusted certificate authority (CA) certificates. If | ||||
certificate validation fails or if security policy disallows a | ||||
certificate for any reason, the entity SHOULD terminate the session | ||||
(with a reason code of "Contact Failure"). | ||||
Immediately after the TLS handshake, each side of the TCP connection | ||||
SHOULD perform host name validation of its peer in accordance with | ||||
[RFC6125] unless it is not needed by security policy. The active | ||||
peer SHALL attempt to authenticate the host name (of the passive | ||||
peer) used to initiate the TCP connection. The active peer MAY | ||||
attempt to authenticate the IP address of the other side of the TCP | ||||
connection. The passive peer SHALL attempt to authenticate the IP | ||||
address of the other side of the TCP connection. The passive peer | ||||
MAY use the IP address to resolve one or more host names of the | ||||
active peer and attempt to authenticate those. If host name | ||||
validation fails (including failure because the certificate does not | ||||
contain any DNS-ID), the entity SHOULD terminate the session (with a | ||||
reason code of "Contact Failure") unless security policy allows an | ||||
unauthticated host. | ||||
Immediately before Session Parameter Negotiation, each side of the | ||||
session SHALL perform Node ID validation of its peer as described | ||||
below. Node ID validation SHALL succeed if the associated | ||||
certificate contains a subjectAltName entry of type | ||||
uniformResourceIdentifier whose value matches the Node ID of the | ||||
TCPCL entity. URI matching of Node IDs SHALL use the URI comparison | ||||
logic of [RFC3986] and scheme-based normalization of those schemes | ||||
specified in [I-D.ietf-dtn-bpbis]. This is similar to the URI-ID of | ||||
[RFC6125] but does not require any structure to the scheme-specific- | ||||
part of the URI. If Node ID validation fails (including failure | ||||
because the certificate does not contain any subjectAltName URI), the | ||||
entity SHOULD terminate the session (with a reason code of "Contact | ||||
Failure") unless security policy allows an unauthticated node. | ||||
4.4.3. Example TLS Initiation | ||||
A summary of a typical TLS use is shown in the sequence in Figure 17 | ||||
below. | ||||
Entity A Entity B | Entity A Entity B | |||
======== ======== | active peer passive peer | |||
+-------------------------+ | +-------------------------+ | |||
| Open TCP Connnection | -> | | Open TCP Connnection | -> | |||
+-------------------------+ +-------------------------+ | +-------------------------+ +-------------------------+ | |||
<- | Accept Connection | | <- | Accept Connection | | |||
+-------------------------+ | +-------------------------+ | |||
+-------------------------+ | +-------------------------+ | |||
| Contact Header | -> | | Contact Header | -> | |||
+-------------------------+ +-------------------------+ | +-------------------------+ +-------------------------+ | |||
<- | Contact Header | | <- | Contact Header | | |||
+-------------------------+ | +-------------------------+ | |||
+-------------------------+ +-------------------------+ | +-------------------------+ +-------------------------+ | |||
| TLS Negotiation | -> <- | TLS Negotiation | | | TLS Negotiation | -> <- | TLS Negotiation | | |||
| (as client) | | (as server) | | | (as client) | | (as server) | | |||
+-------------------------+ +-------------------------+ | +-------------------------+ +-------------------------+ | |||
... secured TCPCL messaging, starting with SESS_INIT ... | Host name validation occurs. | |||
Secured TCPCL messaging can begin. | ||||
+-------------------------+ +-------------------------+ | +-------------------------+ +-------------------------+ | |||
| SESS_TERM | -> <- | SESS_TERM | | | SESS_INIT | -> <- | SESS_INIT | | |||
+-------------------------+ +-------------------------+ | +-------------------------+ +-------------------------+ | |||
Figure 15: A simple visual example of TCPCL TLS Establishment between | Node ID validation occurs. | |||
Session is established, transfers can begin. | ||||
+-------------------------+ +-------------------------+ | ||||
| SESS_TERM | -> <- | SESS_TERM | | ||||
+-------------------------+ +-------------------------+ | ||||
Figure 17: A simple visual example of TCPCL TLS Establishment between | ||||
two entities | two entities | |||
4.5. Message Type Codes | 4.5. Message Header | |||
After the initial exchange of a contact header, all messages | After the initial exchange of a contact header, all messages | |||
transmitted over the session are identified by a one-octet header | transmitted over the session are identified by a one-octet header | |||
with the following structure: | with the following structure: | |||
0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
+---------------+ | +---------------+ | |||
| Message Type | | | Message Type | | |||
+---------------+ | +---------------+ | |||
Figure 16: Format of the Message Header | Figure 18: Format of the Message Header | |||
The message header fields are as follows: | The message header fields are as follows: | |||
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 9.5. | |||
+--------------+------+---------------------------------------------+ | +--------------+------+---------------------------------------------+ | |||
| Name | Code | Description | | | Name | Code | Description | | |||
+--------------+------+---------------------------------------------+ | +--------------+------+---------------------------------------------+ | |||
| SESS_INIT | 0x07 | Contains the session parameter inputs from | | | SESS_INIT | 0x07 | Contains the session parameter inputs from | | |||
skipping to change at page 24, line 44 ¶ | skipping to change at page 28, line 44 ¶ | |||
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 17. | The format of a SESS_INIT message is as follows 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 25, line 25 ¶ | skipping to change at page 29, line 25 ¶ | |||
+-----------------------------+ | +-----------------------------+ | |||
| EID Data (variable) | | | EID Data (variable) | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Session Extension | | | Session Extension | | |||
| Items Length (U32) | | | Items Length (U32) | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Session Extension | | | Session Extension | | |||
| Items (var.) | | | Items (var.) | | |||
+-----------------------------+ | +-----------------------------+ | |||
Figure 17: SESS_INIT Format | Figure 19: SESS_INIT Format | |||
The fields of the SESS_INIT message are: | The fields of the SESS_INIT message are: | |||
Keepalive Interval: A 16-bit unsigned integer indicating the | Keepalive Interval: A 16-bit unsigned integer indicating the | |||
interval, in seconds, between any subsequent messages being | interval, in seconds, between any subsequent messages being | |||
transmitted by the peer. The peer receiving this contact header | transmitted by the peer. The peer receiving this contact header | |||
uses this interval to determine how long to wait after any last- | uses this interval to determine how long to wait after any last- | |||
message transmission and a necessary subsequent KEEPALIVE message | message transmission and a necessary subsequent KEEPALIVE message | |||
transmission. | transmission. | |||
skipping to change at page 25, line 51 ¶ | skipping to change at page 29, line 51 ¶ | |||
relation between the two is required. | relation 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 relation between the two is required. | |||
EID Length and EID Data: Together these fields represent a variable- | Node ID Length and Node ID Data: Together these fields represent a | |||
length text string. The EID Length is a 16-bit unsigned integer | variable-length text string. The Node ID Length is a 16-bit | |||
indicating the number of octets of EID Data to follow. A zero EID | unsigned integer indicating the number of octets of Node ID Data | |||
Length SHALL be used to indicate the lack of EID rather than a | to follow. A zero-length Node ID SHALL be used to indicate the | |||
truly empty EID. This case allows an entity to avoid exposing EID | lack of Node ID rather than a truly empty Node ID. This case | |||
information on an untrusted network. A non-zero-length EID Data | allows an entity to avoid exposing Node ID information on an | |||
SHALL contain the UTF-8 encoded EID of some singleton endpoint in | untrusted network. A non-zero-length Node ID Data SHALL contain | |||
which the sending entity is a member, in the canonical format of | the UTF-8 encoded Node ID of the Entity which sent the SESS_INIT | |||
<scheme name>:<scheme-specific part>. This EID encoding is | message. Every Node ID SHALL be a URI consistent with the | |||
consistent with [I-D.ietf-dtn-bpbis]. | requirements of [RFC3986] and the URI schemes of | |||
[I-D.ietf-dtn-bpbis]. The Node ID itself can be authenticated as | ||||
described in Section 4.4.2. | ||||
Session Extension Length and Session Extension Items: Together these | Session Extension Length and Session Extension Items: Together these | |||
fields represent protocol extension data not defined by this | fields represent protocol extension data not defined by this | |||
specification. The Session Extension Length is the total number | specification. The Session Extension Length is the total number | |||
of octets to follow which are used to encode the Session Extension | of octets to follow which are used to encode the Session Extension | |||
Item list. The encoding of each Session Extension Item is within | Item list. The encoding of each Session Extension Item is within | |||
a consistent data container as described in Section 4.8. The full | a consistent data container as described in Section 4.8. The full | |||
set of Session Extension Items apply for the duration of the TCPCL | set of Session Extension Items apply for the duration of the TCPCL | |||
session to follow. The order and mulitplicity of these Session | session to follow. The order and mulitplicity of these Session | |||
Extension Items MAY be significant, as defined in the associated | Extension Items MAY be significant, as defined in the associated | |||
skipping to change at page 26, line 51 ¶ | skipping to change at page 31, line 5 ¶ | |||
Session Keepalive: Negotiation of the Session Keepalive parameter is | Session Keepalive: Negotiation of the Session Keepalive parameter is | |||
performed by taking the minimum of this two contact headers' | performed by taking the minimum of this two contact headers' | |||
Keepalive Interval. The Session Keepalive interval is a parameter | Keepalive Interval. The Session Keepalive interval is a parameter | |||
for the behavior described in Section 5.1.1. | for the behavior described in Section 5.1.1. | |||
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 of the | |||
negotated value of Enable TLS is acceptable. It can be a | negotated value of Enable TLS is acceptable. It can be a | |||
reasonable security policy to both require or disallow the use of | reasonable security policy to both require or disallow the use of | |||
TLS depending upon the desired network flows. If the Enable TLS | TLS depending upon the desired network flows. Because this state | |||
state is unacceptable, the node SHALL terminate the session with a | is negotiated over an unsecured medium, there is a risk of a TLS | |||
reason code of "Contact Failure". Note that this contact failure | Stripping as described in Section 8. If the Enable TLS state is | |||
is different than a failure of TLS handshake after an agreed-upon | unacceptable, the node SHALL terminate the session with a reason | |||
and acceptable Enable TLS state. If the negotiated Enable TLS | code of "Contact Failure". Note that this contact failure reason | |||
value is true and acceptable then TLS negotiation feature | is different than a failure of TLS handshake or TLS authentication | |||
(described in Section 4.4) begins immediately following the | after an agreed-upon and acceptable Enable TLS state. If the | |||
contact header exchange. | negotiated Enable TLS value is true and acceptable then TLS | |||
negotiation feature (described in Section 4.4) begins immediately | ||||
following the contact header exchange. | ||||
Once this process of parameter negotiation is completed (which | Once this process of parameter negotiation is completed (which | |||
includes a possible completed TLS handshake of the connection to use | includes a possible completed TLS handshake of the connection to use | |||
TLS), this protocol defines no additional mechanism to change the | TLS), this protocol defines no additional mechanism to change the | |||
parameters of an established session; to effect such a change, the | parameters of an established session; to effect such a change, the | |||
TCPCL session MUST be terminated and a new session established. | TCPCL session 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 18. | 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: | |||
Flags: A one-octet field containing generic bit flags about the | Flags: A one-octet field containing generic bit flags about the | |||
Item, which are listed in Table 3. If a TCPCL entity receives a | Item, which are listed in Table 3. All reserved header flag bits | |||
SHALL be not set by the sender. All reserved header flag bits | ||||
SHALL be ignored by the receiver. If a TCPCL entity receives a | ||||
Session Extension Item with an unknown Item Type and the CRITICAL | Session Extension Item with an unknown Item Type and the CRITICAL | |||
flag set, the entity SHALL close the TCPCL session with SESS_TERM | flag set, the entity SHALL close the TCPCL session with SESS_TERM | |||
reason code of "Contact Failure". If the CRITICAL flag is not | reason code of "Contact Failure". If the CRITICAL flag is not | |||
set, an entity SHALL skip over and ignore any item with an unknown | set, an entity SHALL skip over and ignore any item with an unknown | |||
Item Type. | 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 allocate an IANA registry for | extension types directly, but does allocate an IANA registry for | |||
such codes (see Section 9.3). | such codes (see Section 9.3). | |||
skipping to change at page 28, line 13 ¶ | skipping to change at page 32, line 15 ¶ | |||
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 18: 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 bit is set, indicates that the receiving | | |||
| | | peer must handle the extension item. | | | | | peer must handle the extension item. | | |||
| | | | | | | | | | |||
| Reserved | others | | | Reserved | others | | |||
+----------+--------+-----------------------------------------------+ | +----------+--------+-----------------------------------------------+ | |||
skipping to change at page 29, line 33 ¶ | skipping to change at page 33, line 35 ¶ | |||
5.1.2. Message Rejection (MSG_REJECT) | 5.1.2. Message Rejection (MSG_REJECT) | |||
If a TCPCL node receives a message which is unknown to it (possibly | If a TCPCL node receives a message which is unknown to it (possibly | |||
due to an unhandled protocol mismatch) or is inappropriate for the | due to an unhandled protocol mismatch) or is inappropriate for the | |||
current session state (e.g. a KEEPALIVE message received after | current session state (e.g. a KEEPALIVE message received after | |||
contact header negotiation has disabled that feature), there is a | contact header negotiation has disabled that feature), there is a | |||
protocol-level message to signal this condition in the form of a | protocol-level message to signal this condition in the form of a | |||
MSG_REJECT reply. | MSG_REJECT reply. | |||
The format of a MSG_REJECT message is as follows in Figure 19. | The format of a MSG_REJECT message is as follows in Figure 21. | |||
+-----------------------------+ | +-----------------------------+ | |||
| Message Header | | | Message Header | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Reason Code (U8) | | | Reason Code (U8) | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Rejected Message Header | | | Rejected Message Header | | |||
+-----------------------------+ | +-----------------------------+ | |||
Figure 19: 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: | |||
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. | |||
skipping to change at page 31, line 24 ¶ | skipping to change at page 35, line 32 ¶ | |||
Transfer ID space, the sending node SHALL terminate the session with | Transfer ID space, the sending node SHALL terminate the session with | |||
SESS_TERM reason code "Resource Exhaustion". | SESS_TERM reason code "Resource Exhaustion". | |||
For bidirectional bundle transfers, a TCPCL node SHOULD NOT rely on | For bidirectional bundle transfers, a TCPCL node SHOULD NOT rely on | |||
any relation between Transfer IDs originating from each side of the | any relation between Transfer IDs originating from each side of the | |||
TCPCL session. | TCPCL session. | |||
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 20. | of a XFER_SEGMENT message follows 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 31, line 46 ¶ | skipping to change at page 36, line 25 ¶ | |||
+------------------------------+ | +------------------------------+ | |||
| Transfer Extension | | | Transfer Extension | | |||
| 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 20: 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: | |||
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. | according to the descriptions in Table 5. All reserved header | |||
flag bits SHALL be not set by the sender. All reserved header | ||||
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 Length and Transfer Extension Items: Together | |||
these fields represent protocol extension data for this | these fields represent protocol extension data for this | |||
specification. The Transfer Extension Length and Transfer | specification. The Transfer Extension Length and Transfer | |||
Extension Item fields SHALL only be present when the 'START' flag | Extension Item fields SHALL only be present when the 'START' flag | |||
is set on the message. The Transfer Extension Length is the total | is set on the message. The Transfer Extension Length is the total | |||
number of octets to follow which are used to encode the Transfer | number of octets to follow which are used to encode the Transfer | |||
skipping to change at page 33, line 19 ¶ | skipping to change at page 37, line 48 ¶ | |||
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 the segment. | whether the receiving agent has successfully received the segment. | |||
To this end, the TCPCL protocol provides feedback messaging whereby a | To this end, the TCPCL protocol provides feedback messaging whereby a | |||
receiving node transmits acknowledgments of reception of data | receiving node transmits acknowledgments of reception of data | |||
segments. | segments. | |||
The format of an XFER_ACK message follows in Figure 21. | The format of an XFER_ACK message follows 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 21: 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: | |||
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. | according to the descriptions in Table 5. All reserved header | |||
flag bits SHALL be not set by the sender. All reserved header | ||||
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 which are being acknowledged. | |||
A receiving TCPCL node SHALL send an XFER_ACK message in response to | A receiving TCPCL node SHALL send an XFER_ACK message in response to | |||
each received XFER_SEGMENT message. The flags portion of the | each received XFER_SEGMENT message. The flags portion of the | |||
XFER_ACK header SHALL be set to match the corresponding DATA_SEGMENT | XFER_ACK header SHALL be set to match the corresponding DATA_SEGMENT | |||
skipping to change at page 34, line 36 ¶ | skipping to change at page 39, line 20 ¶ | |||
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 receiver MAY send an XFER_REFUSE message as soon as it receives any | A receiver MAY send an XFER_REFUSE message as soon as it receives any | |||
XFER_SEGMENT message. The sender MUST be prepared for this and MUST | XFER_SEGMENT message. The sender MUST be prepared for this and MUST | |||
associate the refusal with the correct bundle via the Transfer ID | associate the refusal with the correct bundle via the Transfer ID | |||
fields. | fields. | |||
The format of the XFER_REFUSE message is as follows in Figure 22. | The format of the XFER_REFUSE message is as follows in Figure 24. | |||
+-----------------------------+ | +-----------------------------+ | |||
| Message Header | | | Message Header | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Reason Code (U8) | | | Reason Code (U8) | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Transfer ID (U64) | | | Transfer ID (U64) | | |||
+-----------------------------+ | +-----------------------------+ | |||
Figure 22: 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: | |||
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. | |||
+------------+------+-----------------------------------------------+ | +------------+------+-----------------------------------------------+ | |||
skipping to change at page 36, line 8 ¶ | skipping to change at page 41, line 8 ¶ | |||
Note: If a bundle transmission is aborted in this way, the receiver | Note: If a bundle transmission is aborted in this way, the receiver | |||
MAY not receive a segment with the 'END' flag set to '1' for the | MAY not receive a segment with the 'END' flag set to '1' for the | |||
aborted bundle. The beginning of the next bundle is identified by | aborted bundle. The beginning of the next bundle is identified by | |||
the 'START' bit set to '1', indicating the start of a new transfer, | the 'START' bit set to '1', indicating the start of a new transfer, | |||
and with a distinct Transfer ID value. | 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 23. | 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: | |||
Flags: A one-octet field containing generic bit flags about the | Flags: A one-octet field containing generic bit flags about the | |||
Item, which are listed in Table 7. If a TCPCL node receives a | Item, which are listed in Table 7. All reserved header flag bits | |||
SHALL be not set by the sender. All reserved header flag bits | ||||
SHALL be ignored by the receiver. If a TCPCL node receives a | ||||
Transfer Extension Item with an unknown Item Type and the CRITICAL | Transfer Extension Item with an unknown Item Type and the CRITICAL | |||
flag set, the node SHALL refuse the transfer with an XFER_REFUSE | flag set, the node SHALL refuse the transfer with an XFER_REFUSE | |||
reason code of "Extension Failure". If the CRITICAL flag is not | reason code of "Extension Failure". If the CRITICAL flag is not | |||
set, an entity SHALL skip over and ignore any item with an unknown | set, an entity SHALL skip over and ignore any item with an unknown | |||
Item Type. | 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 allocates an IANA registry | the extension item. This specification allocates an IANA registry | |||
for such codes (see Section 9.4). | for such codes (see Section 9.4). | |||
skipping to change at page 36, line 42 ¶ | skipping to change at page 41, line 44 ¶ | |||
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 23: 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 bit is set, indicates that the receiving | | |||
| | | peer must handle the extension item. | | | | | peer must handle the extension item. | | |||
| | | | | | | | | | |||
| Reserved | others | | | Reserved | others | | |||
+----------+--------+-----------------------------------------------+ | +----------+--------+-----------------------------------------------+ | |||
skipping to change at page 37, line 33 ¶ | skipping to change at page 42, line 33 ¶ | |||
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 about the potential length of the | |||
transfer. The Transfer Length extension SHALL be assigned transfer | transfer. The Transfer Length extension SHALL be assigned transfer | |||
extension type ID 0x0001. | extension type ID 0x0001. | |||
If a transfer occupies exactly one segment (i.e. both START and END | If a transfer occupies exactly one segment (i.e. both START and END | |||
bits are set) the Transfer Length extension SHOULD NOT be present. | bits are set) the Transfer Length extension SHOULD NOT be present. | |||
The extension does not provide any additional information for single- | The extension does not provide any additional information for single- | |||
segment transfers. | segment transfers. | |||
The format of the Transfer Length data is as follows in Figure 24. | The format of the Transfer Length data is as follows in Figure 26. | |||
+----------------------+ | +----------------------+ | |||
| Total Length (U64) | | | Total Length (U64) | | |||
+----------------------+ | +----------------------+ | |||
Figure 24: Format of Transfer Length data | Figure 26: Format of Transfer Length data | |||
The fields of the Transfer Length extension are: | The fields of the Transfer Length extension are: | |||
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. | transmitted data as invalid. | |||
skipping to change at page 38, line 24 ¶ | skipping to change at page 43, line 24 ¶ | |||
termination, the REPLY bit of a SESS_TERM message SHALL NOT be set. | termination, the REPLY bit of a SESS_TERM message SHALL NOT be set. | |||
Upon receiving a SESS_TERM message after not sending a SESS_TERM | Upon receiving a SESS_TERM message after not sending a SESS_TERM | |||
message in the same session, an entity SHALL send an acknowledging | message in the same session, an entity SHALL send an acknowledging | |||
SESS_TERM message. When sent to acknowledge a termination, a | SESS_TERM message. When sent to acknowledge a termination, a | |||
SESS_TERM message SHALL have identical data content from the message | SESS_TERM message SHALL have identical data content from the message | |||
being acknowledged except for the REPLY bit, which is set to indicate | being acknowledged except for the REPLY bit, which is set to indicate | |||
acknowledgement. | acknowledgement. | |||
After sending a SESS_TERM message, an entity MAY continue a possible | After sending a SESS_TERM message, an entity MAY continue a possible | |||
in-progress transfer in either direction. After sending a SESS_TERM | in-progress transfer in either direction. After sending a SESS_TERM | |||
message, an entity SHALL NOT begin any new outgoing transfer (i.e. | message, an entity SHALL NOT begin any new outgoing transfer for the | |||
send an XFER_SEGMENT message) for the remainder of the session. | remainder of the session. After receving a SESS_TERM message, an | |||
After receving a SESS_TERM message, an entity SHALL NOT accept any | entity SHALL NOT accept any new incoming transfer for the remainder | |||
new incoming transfer for the remainder of the session. | of the session. | |||
Instead of following a clean shutdown sequence, after transmitting a | Instead of following a clean shutdown sequence, after transmitting a | |||
SESS_TERM message an entity MAY immediately close the associated TCP | SESS_TERM message an entity MAY immediately close the associated TCP | |||
connection. When performing an unclean shutdown, a receiving node | connection. When performing an unclean shutdown, a receiving node | |||
SHOULD acknowledge all received data segments before closing the TCP | SHOULD acknowledge all received data segments before closing the TCP | |||
connection. Not acknowledging received segments can result in | connection. Not acknowledging received segments can result in | |||
unnecessary retransmission. When performing an unclean shutodwn, a | unnecessary retransmission. When performing an unclean shutodwn, a | |||
transmitting node SHALL treat either sending or receiving a SESS_TERM | transmitting node SHALL treat either sending or receiving a SESS_TERM | |||
message (i.e. before the final acknowledgment) as a failure of the | message (i.e. before the final acknowledgment) as a failure of the | |||
transfer. Any delay between request to terminate the TCP connection | transfer. Any delay between request to terminate the TCP connection | |||
and actual closing of the connection (a "half-closed" state) MAY be | and actual closing of the connection (a "half-closed" state) MAY be | |||
ignored by the TCPCL node. | ignored by the TCPCL node. | |||
The format of the SESS_TERM message is as follows in Figure 25. | The format of the SESS_TERM message is as follows in Figure 27. | |||
+-----------------------------+ | +-----------------------------+ | |||
| Message Header | | | Message Header | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Message Flags (U8) | | | Message Flags (U8) | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Reason Code (U8) | | | Reason Code (U8) | | |||
+-----------------------------+ | +-----------------------------+ | |||
Figure 25: 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: | |||
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. | according to the descriptions in Table 8. All reserved header | |||
flag bits SHALL be not set by the sender. All reserved header | ||||
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 message is | | | REPLY | 0x01 | If bit is set, indicates that this message is | | |||
| | | an acknowledgement of an earlier SESS_TERM | | | | | an acknowledgement of an earlier SESS_TERM | | |||
| | | message. | | | | | message. | | |||
skipping to change at page 40, line 25 ¶ | skipping to change at page 45, line 27 ¶ | |||
message but still SHALL close the TCP connection. Each TCPCL message | message but still SHALL close the TCP connection. Each TCPCL message | |||
is contiguous in the octet stream and has no ability to be cut short | is contiguous in the octet stream and has no ability to be cut short | |||
and/or preempted by an other message. This is particularly important | and/or preempted by an other message. This is particularly important | |||
when large segment sizes are being transmitted; either entire | when large segment sizes are being transmitted; either entire | |||
XFER_SEGMENT is sent before a SESS_TERM message or the connection is | XFER_SEGMENT is sent before a SESS_TERM message or the connection is | |||
simply terminated mid-XFER_SEGMENT. | simply terminated mid-XFER_SEGMENT. | |||
6.2. Idle Session Shutdown | 6.2. Idle Session Shutdown | |||
The protocol includes a provision for clean shutdown of idle | The protocol includes a provision for clean shutdown of idle | |||
sessions. Determining the length of time to wait before closing idle | sessions. Determining the length of time to wait before ending idle | |||
sessions, if they are to be closed at all, is an implementation and | sessions, if they are to be closed at all, is an implementation and | |||
configuration matter. | configuration matter. | |||
If there is a configured time to close idle links and if no TCPCL | If there is a configured time to close idle links and if no TCPCL | |||
messages (other than KEEPALIVE messages) has been received for at | messages (other than KEEPALIVE messages) has been received for at | |||
least that amount of time, then either node MAY terminate the session | least that amount of time, then either node MAY terminate the session | |||
by transmitting a SESS_TERM message indicating the reason code of | by transmitting a SESS_TERM message indicating the reason code of | |||
"Idle timeout" (as described in Table 9). | "Idle timeout" (as described in Table 9). | |||
7. Implementation Status | 7. Implementation Status | |||
skipping to change at page 40, line 51 ¶ | skipping to change at page 46, line 5 ¶ | |||
This section records the status of known implementations of the | This section records the status of known implementations of the | |||
protocol defined by this specification at the time of posting of this | protocol defined by this specification at the time of posting of this | |||
Internet-Draft, and is based on a proposal described in [RFC7942]. | Internet-Draft, and is based on a proposal described in [RFC7942]. | |||
The description of implementations in this section is intended to | The description of implementations in this section is intended to | |||
assist the IETF in its decision processes in progressing drafts to | assist the IETF in its decision processes in progressing drafts to | |||
RFCs. Please note that the listing of any individual implementation | RFCs. Please note that the listing of any individual implementation | |||
here does not imply endorsement by the IETF. Furthermore, no effort | here does not imply endorsement by the IETF. Furthermore, no effort | |||
has been spent to verify the information presented here that was | has been spent to verify the information presented here that was | |||
supplied by IETF contributors. This is not intended as, and must not | supplied by IETF contributors. This is not intended as, and must not | |||
be construed to be, a catalog of available implementations or their | be construed to be, a catalog of available implementations or their | |||
features. Readers are advised to note that other implementations may | features. Readers are advised to note that other implementations can | |||
exist. | exist. | |||
An example implementation of the this draft of TCPCLv4 has been | An example implementation of the this draft of TCPCLv4 has been | |||
created as a GitHub project [github-dtn-bpbis-tcpcl] and is intented | created as a GitHub project [github-dtn-bpbis-tcpcl] and is intented | |||
to use as a proof-of-concept and as a possible source of | to use as a proof-of-concept and as a possible source of | |||
interoperability testing. This example implementation uses D-Bus as | interoperability testing. This example implementation uses D-Bus as | |||
the CL-BP Agent interface, so it only runs on hosts which provide the | the CL-BP Agent interface, so it only runs on hosts which provide the | |||
Python "dbus" library. | Python "dbus" library. | |||
8. Security Considerations | 8. Security Considerations | |||
One security consideration for this protocol relates to the fact that | ||||
entities present their endpoint identifier as part of the contact | ||||
header exchange. It would be possible for an entity to fake this | ||||
value and present the identity of a singleton endpoint in which the | ||||
node is not a member, essentially masquerading as another DTN node. | ||||
If this identifier is used outside of a TLS-secured session or | ||||
without further verification as a means to determine which bundles | ||||
are transmitted over the session, then the node that has falsified | ||||
its identity would be able to obtain bundles that it otherwise would | ||||
not have. Therefore, an entity SHALL NOT use the EID value of an | ||||
unsecured contact header to derive a peer node's identity unless it | ||||
can corroborate it via other means. When TCPCL session security is | ||||
mandated by a TCPCL peer, that peer SHALL transmit initial unsecured | ||||
contact header values indicated in Table 10 in order. These values | ||||
avoid unnecessarily leaking session parameters and will be ignored | ||||
when secure contact header re-exchange occurs. | ||||
+--------------------+---------------------------------------------+ | ||||
| Parameter | Value | | ||||
+--------------------+---------------------------------------------+ | ||||
| Flags | The USE_TLS flag is set. | | ||||
| | | | ||||
| Keepalive Interval | Zero, indicating no keepalive. | | ||||
| | | | ||||
| Segment MRU | Zero, indicating all segments are refused. | | ||||
| | | | ||||
| Transfer MRU | Zero, indicating all transfers are refused. | | ||||
| | | | ||||
| EID | Empty, indicating lack of EID. | | ||||
+--------------------+---------------------------------------------+ | ||||
Table 10: Recommended Unsecured Contact Header | ||||
TCPCL can be used to provide point-to-point transport security, but | TCPCL can be used to provide point-to-point transport security, but | |||
does not provide security of data-at-rest and does not guarantee end- | does not provide security of data-at-rest and does not guarantee end- | |||
to-end bundle security. The mechanisms defined in [RFC6257] and | to-end bundle security. The bundle security mechanisms defined in | |||
[I-D.ietf-dtn-bpsec] are to be used instead. | [I-D.ietf-dtn-bpsec] are to be used instead. | |||
When negotating whether to use TLS security as part of the contact | ||||
header exchange, it is possible for a man-in-the-middle attacker to | ||||
unset the CAN_TLS flag on either side of the exchange. This leads to | ||||
the "SSL Stripping" attack described in [RFC7457]. If TLS is desired | ||||
for use on any TCPCL network, it is strongly encouraged that the | ||||
security policy disallow use of TCPCL when "Enable TLS" is negotiated | ||||
to false. This requires that the TLS handshake occurs, regardless of | ||||
the policy-driven parameters of the handshake and policy-driven | ||||
handling of the handshake outcome. | ||||
Even when using TLS to secure the TCPCL session, the actual | Even when using TLS to secure the TCPCL session, the actual | |||
ciphersuite negotiated between the TLS peers MAY be insecure. TLS | ciphersuite negotiated between the TLS peers MAY be insecure. TLS | |||
can be used to perform authentication without data confidentiality, | can be used to perform authentication without data confidentiality, | |||
for example. It is up to security policies within each TCPCL node to | for example. It is up to security policies within each TCPCL node to | |||
ensure that the negotiated TLS ciphersuite meets transport security | ensure that the negotiated TLS ciphersuite meets transport security | |||
requirements. This is identical behavior to STARTTLS use in | requirements. This is identical behavior to STARTTLS use in | |||
[RFC2595]. | [RFC2595]. | |||
The certificates exchanged by TLS enable authentication of peer host | ||||
name and Node ID, but it is possible that a peer either not provide a | ||||
valid certificate or that the certificate does not validate either | ||||
the host name or Node ID of the peer. Having a CA-validated | ||||
certificate does not alone guarantee the identity of the network host | ||||
or BP node from which the certificate is provided; additional | ||||
validation procedures bind the host name or node ID based on the | ||||
contents of the certificate. The host name validation is a weaker | ||||
form of authentication, because even if a peer is operating on an | ||||
authenticated network host name it can provide an invalid Node ID and | ||||
cause bundles to be "leaked" to an invalid node. Especially in DTN | ||||
environments, network names and addresses of nodes can be time- | ||||
variable so binding a certificate to a Node ID is a more stable | ||||
identity. 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. It is a reasonable policy to skip host name validation if | ||||
certificates can be guaranteed to validate the peer's Node ID. In | ||||
circumstances where certificates can only be issued to network host | ||||
names, 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 | ||||
ID. Trusting an authenticated host name can be feasable on a network | ||||
secured by a private CA but is not advisable on the Internet when | ||||
using a variety of public CAs. | ||||
Another consideration for this protocol relates to denial-of-service | Another consideration for this protocol relates to denial-of-service | |||
attacks. An entity MAY send a large amount of data over a TCPCL | attacks. An entity MAY send a large amount of data over a TCPCL | |||
session, requiring the receiving entity to handle the data, attempt | session, requiring the receiving entity to handle the data, attempt | |||
to stop the flood of data by sending a XFER_REFUSE message, or | to stop the flood of data by sending a XFER_REFUSE message, or | |||
forcibly terminate the session. This burden could cause denial of | forcibly terminate the session. This burden could cause denial of | |||
service on other, well-behaving sessions. There is also nothing to | service on other, well-behaving sessions. There is also nothing to | |||
prevent a malicious entity from continually establishing sessions and | prevent a malicious entity from continually establishing sessions and | |||
repeatedly trying to send copious amounts of bundle data. A | repeatedly trying to send copious amounts of bundle data. A | |||
listening entity MAY take countermeasures such as ignoring TCP SYN | listening entity MAY take countermeasures such as ignoring TCP SYN | |||
messages, closing TCP connections as soon as they are established, | messages, closing TCP connections as soon as they are established, | |||
waiting before sending the contact header, sending a SESS_TERM | waiting before sending the contact header, sending a SESS_TERM | |||
message quickly or with a delay, etc. | message quickly or with a delay, etc. | |||
9. IANA Considerations | 9. IANA Considerations | |||
In this section, registration procedures are as defined in [RFC8126]. | Registration procedures referred to in this section are defined in | |||
[RFC8126]. | ||||
Some of the registries below are created new for TCPCLv4 but share | Some of the registries have been defined as version specific to | |||
code values with TCPCLv3. This was done to disambiguate the use of | TCPCLv4, and imports some or all codepoints from TCPCLv3. This was | |||
these values between TCPCLv3 and TCPCLv4 while preserving the | done to disambiguate the use of these codepoints between TCPCLv3 and | |||
semantics of some values. | TCPCLv4 while preserving the semantics of some of the codepoints. | |||
9.1. Port Number | 9.1. Port Number | |||
Port number 4556 has been previously assigned as the default port for | Port number 4556 has been previously assigned as the default port for | |||
the TCP convergence layer in [RFC7242]. This assignment is unchanged | the TCP convergence layer in [RFC7242]. This assignment is unchanged | |||
by protocol version 4. Each TCPCL entity identifies its TCPCL | by protocol version 4. Each TCPCL entity identifies its TCPCL | |||
protocol version in its initial contact (see Section 9.2), so there | protocol version in its initial contact (see Section 9.2), so there | |||
is no ambiguity about what protocol is being used. | is no ambiguity about what protocol is being used. | |||
+------------------------+-------------------------------------+ | +------------------------+-------------------------------------+ | |||
skipping to change at page 44, line 5 ¶ | skipping to change at page 49, line 5 ¶ | |||
+-------+-------------+---------------------+ | +-------+-------------+---------------------+ | |||
9.3. Session Extension Types | 9.3. Session Extension Types | |||
EDITOR NOTE: sub-registry to-be-created upon publication of this | EDITOR NOTE: sub-registry to-be-created upon publication of this | |||
specification. | specification. | |||
IANA will create, under the "Bundle Protocol" registry, a sub- | IANA will create, under the "Bundle Protocol" registry, a sub- | |||
registry titled "Bundle Protocol TCP Convergence-Layer Version 4 | registry titled "Bundle Protocol TCP Convergence-Layer Version 4 | |||
Session Extension Types" and initialize it with the contents of | Session Extension Types" and initialize it with the contents of | |||
Table 11. The registration procedure is RFC Required within the | Table 10. 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 use on private networks for functions not published to | |||
the IANA. | the IANA. | |||
+----------------+--------------------------+ | +----------------+--------------------------+ | |||
| Code | Session Extension Type | | | Code | Session Extension Type | | |||
+----------------+--------------------------+ | +----------------+--------------------------+ | |||
| 0x0000 | Reserved | | | 0x0000 | Reserved | | |||
| | | | | | | | |||
| 0x0001--0x7FFF | Unassigned | | | 0x0001--0x7FFF | Unassigned | | |||
| | | | | | | | |||
| 0x8000--0xFFFF | Private/Experimental Use | | | 0x8000--0xFFFF | Private/Experimental Use | | |||
+----------------+--------------------------+ | +----------------+--------------------------+ | |||
Table 11: Session Extension Type Codes | Table 10: Session Extension Type Codes | |||
9.4. Transfer Extension Types | 9.4. Transfer Extension Types | |||
EDITOR NOTE: sub-registry to-be-created upon publication of this | EDITOR NOTE: sub-registry to-be-created upon publication of this | |||
specification. | specification. | |||
IANA will create, under the "Bundle Protocol" registry, a sub- | IANA will create, under the "Bundle Protocol" registry, a sub- | |||
registry titled "Bundle Protocol TCP Convergence-Layer Version 4 | registry titled "Bundle Protocol TCP Convergence-Layer Version 4 | |||
Transfer Extension Types" and initialize it with the contents of | Transfer Extension Types" and initialize it with the contents of | |||
Table 12. The registration procedure is RFC Required within the | Table 11. 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 use on private networks for functions not published to | |||
the IANA. | the IANA. | |||
+----------------+---------------------------+ | +----------------+---------------------------+ | |||
| 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 | Private/Experimental Use | | |||
+----------------+---------------------------+ | +----------------+---------------------------+ | |||
Table 12: Transfer Extension Type Codes | Table 11: Transfer Extension Type Codes | |||
9.5. Message Types | 9.5. Message Types | |||
EDITOR NOTE: sub-registry to-be-created upon publication of this | EDITOR NOTE: sub-registry to-be-created upon publication of this | |||
specification. | specification. | |||
IANA will create, under the "Bundle Protocol" registry, a sub- | IANA will create, under the "Bundle Protocol" registry, a sub- | |||
registry titled "Bundle Protocol TCP Convergence-Layer Version 4 | registry titled "Bundle Protocol TCP Convergence-Layer Version 4 | |||
Message Types" and initialize it with the contents of Table 13. The | Message Types" and initialize it with the contents of Table 12. The | |||
registration procedure is RFC Required. | registration procedure is RFC Required within the lower range 0x01-- | |||
0xEF. Values in the range 0xF0--0xFF are reserved for use on private | ||||
networks for functions not published to the IANA. | ||||
+-----------+--------------+ | +------------+--------------------------+ | |||
| Code | Message Type | | | Code | Message Type | | |||
+-----------+--------------+ | +------------+--------------------------+ | |||
| 0x00 | Reserved | | | 0x00 | Reserved | | |||
| | | | | | | | |||
| 0x01 | XFER_SEGMENT | | | 0x01 | XFER_SEGMENT | | |||
| | | | | | | | |||
| 0x02 | XFER_ACK | | | 0x02 | XFER_ACK | | |||
| | | | | | | | |||
| 0x03 | XFER_REFUSE | | | 0x03 | XFER_REFUSE | | |||
| | | | | | | | |||
| 0x04 | KEEPALIVE | | | 0x04 | KEEPALIVE | | |||
| | | | | | | | |||
| 0x05 | SESS_TERM | | | 0x05 | SESS_TERM | | |||
| | | | | | | | |||
| 0x06 | MSG_REJECT | | | 0x06 | MSG_REJECT | | |||
| | | | | | | | |||
| 0x07 | SESS_INIT | | | 0x07 | SESS_INIT | | |||
| | | | | | | | |||
| 0x08--0xf | Unassigned | | | 0x08--0xEF | Unassigned | | |||
+-----------+--------------+ | | | | | |||
| 0xF0--0xFF | Private/Experimental Use | | ||||
+------------+--------------------------+ | ||||
Table 13: Message Type Codes | Table 12: Message Type Codes | |||
9.6. XFER_REFUSE Reason Codes | 9.6. XFER_REFUSE Reason Codes | |||
EDITOR NOTE: sub-registry to-be-created upon publication of this | EDITOR NOTE: sub-registry to-be-created upon publication of this | |||
specification. | specification. | |||
IANA will create, under the "Bundle Protocol" registry, a sub- | IANA will create, under the "Bundle Protocol" registry, a sub- | |||
registry titled "Bundle Protocol TCP Convergence-Layer Version 4 | registry titled "Bundle Protocol TCP Convergence-Layer Version 4 | |||
XFER_REFUSE Reason Codes" and initialize it with the contents of | XFER_REFUSE Reason Codes" and initialize it with the contents of | |||
Table 14. The registration procedure is RFC Required. | Table 13. The registration procedure is Specification Required | |||
within the lower range 0x00--0xEF. Values in the range 0xF0--0xFF | ||||
are reserved for use on private networks for functions not published | ||||
to the IANA. | ||||
+------------+---------------------------+ | +------------+--------------------------+ | |||
| Code | Refusal Reason | | | Code | Refusal Reason | | |||
+------------+---------------------------+ | +------------+--------------------------+ | |||
| 0x00 | Unknown | | | 0x00 | Unknown | | |||
| | | | | | | | |||
| 0x01 | Extension Failure | | | 0x01 | Extension Failure | | |||
| | | | | | | | |||
| 0x02 | Completed | | | 0x02 | Completed | | |||
| | | | | | | | |||
| 0x03 | No Resources | | | 0x03 | No Resources | | |||
| | | | | | | | |||
| 0x04 | Retransmit | | | 0x04 | Retransmit | | |||
| | | | | | | | |||
| 0x05--0x07 | Unassigned | | | 0x05--0xEF | Unassigned | | |||
| | | | | | | | |||
| 0x08--0xFF | Reserved for future usage | | | 0xF0--0xFF | Private/Experimental Use | | |||
+------------+---------------------------+ | +------------+--------------------------+ | |||
Table 14: XFER_REFUSE Reason Codes | Table 13: XFER_REFUSE Reason Codes | |||
9.7. SESS_TERM Reason Codes | 9.7. SESS_TERM Reason Codes | |||
EDITOR NOTE: sub-registry to-be-created upon publication of this | EDITOR NOTE: sub-registry to-be-created upon publication of this | |||
specification. | specification. | |||
IANA will create, under the "Bundle Protocol" registry, a sub- | IANA will create, under the "Bundle Protocol" registry, a sub- | |||
registry titled "Bundle Protocol TCP Convergence-Layer Version 4 | registry titled "Bundle Protocol TCP Convergence-Layer Version 4 | |||
SESS_TERM Reason Codes" and initialize it with the contents of | SESS_TERM Reason Codes" and initialize it with the contents of | |||
Table 15. The registration procedure is RFC Required. | Table 14. The registration procedure is Specification Required | |||
within the lower range 0x00--0xEF. Values in the range 0xF0--0xFF | ||||
are reserved for use on private networks for functions not published | ||||
to the IANA. | ||||
+------------+---------------------+ | +------------+--------------------------+ | |||
| Code | Termination Reason | | | Code | Termination Reason | | |||
+------------+---------------------+ | +------------+--------------------------+ | |||
| 0x00 | Unknown | | | 0x00 | Unknown | | |||
| | | | | | | | |||
| 0x01 | Idle timeout | | | 0x01 | Idle timeout | | |||
| | | | | | | | |||
| 0x02 | Version mismatch | | | 0x02 | Version mismatch | | |||
| | | | | | | | |||
| 0x03 | Busy | | | 0x03 | Busy | | |||
| | | | | | | | |||
| 0x04 | Contact Failure | | | 0x04 | Contact Failure | | |||
| | | | | | | | |||
| 0x05 | Resource Exhaustion | | | 0x05 | Resource Exhaustion | | |||
| | | | | | | | |||
| 0x06--0xFF | Unassigned | | | 0x06--0xEF | Unassigned | | |||
+------------+---------------------+ | | | | | |||
| 0xF0--0xFF | Private/Experimental Use | | ||||
+------------+--------------------------+ | ||||
Table 15: SESS_TERM Reason Codes | Table 14: SESS_TERM Reason Codes | |||
9.8. MSG_REJECT Reason Codes | 9.8. MSG_REJECT Reason Codes | |||
EDITOR NOTE: sub-registry to-be-created upon publication of this | EDITOR NOTE: sub-registry to-be-created upon publication of this | |||
specification. | specification. | |||
IANA will create, under the "Bundle Protocol" registry, a sub- | IANA will create, under the "Bundle Protocol" registry, a sub- | |||
registry titled "Bundle Protocol TCP Convergence-Layer Version 4 | registry titled "Bundle Protocol TCP Convergence-Layer Version 4 | |||
MSG_REJECT Reason Codes" and initialize it with the contents of | MSG_REJECT Reason Codes" and initialize it with the contents of | |||
Table 16. The registration procedure is RFC Required. | Table 15. The registration procedure is Specification Required | |||
within the lower range 0x01--0xEF. Values in the range 0xF0--0xFF | ||||
are reserved for use on private networks for functions not published | ||||
to the IANA. | ||||
+-----------+----------------------+ | +------------+--------------------------+ | |||
| Code | Rejection Reason | | | Code | Rejection Reason | | |||
+-----------+----------------------+ | +------------+--------------------------+ | |||
| 0x00 | reserved | | | 0x00 | reserved | | |||
| | | | | | | | |||
| 0x01 | Message Type Unknown | | | 0x01 | Message Type Unknown | | |||
| | | | | | | | |||
| 0x02 | Message Unsupported | | | 0x02 | Message Unsupported | | |||
| | | | | | | | |||
| 0x03 | Message Unexpected | | | 0x03 | Message Unexpected | | |||
| | | | | | | | |||
| 0x04-0xFF | Unassigned | | | 0x04--0xEF | Unassigned | | |||
+-----------+----------------------+ | | | | | |||
| 0xF0--0xFF | Private/Experimental Use | | ||||
+------------+--------------------------+ | ||||
Table 16: MSG_REJECT Reason Codes | Table 15: MSG_REJECT Reason Codes | |||
10. Acknowledgments | 10. Acknowledgments | |||
This specification is based on comments on implementation of | This specification is based on comments on implementation of | |||
[RFC7242] provided from Scott Burleigh. | [RFC7242] provided from Scott Burleigh. | |||
11. References | 11. References | |||
11.1. Normative References | 11.1. Normative References | |||
[BCP195] Sheffer, Y., Holz, R., and P. Saint-Andre, | ||||
"Recommendations for Secure Use of Transport Layer | ||||
Security (TLS) and Datagram Transport Layer Security | ||||
(DTLS)", BCP 195, RFC 7525, DOI 10.17487/RFC7525, May | ||||
2015. | ||||
[I-D.ietf-dtn-bpbis] | [I-D.ietf-dtn-bpbis] | |||
Burleigh, S., Fall, K., and E. Birrane, "Bundle Protocol | Burleigh, S., Fall, K., and E. Birrane, "Bundle Protocol | |||
Version 7", draft-ietf-dtn-bpbis-12 (work in progress), | Version 7", draft-ietf-dtn-bpbis-14 (work in progress), | |||
November 2018. | August 2019. | |||
[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>. | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | ||||
Resource Identifier (URI): Generic Syntax", STD 66, | ||||
RFC 3986, DOI 10.17487/RFC3986, January 2005, | ||||
<https://www.rfc-editor.org/info/rfc3986>. | ||||
[RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security | [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security | |||
(TLS) Protocol Version 1.2", RFC 5246, | (TLS) Protocol Version 1.2", RFC 5246, | |||
DOI 10.17487/RFC5246, August 2008, | DOI 10.17487/RFC5246, August 2008, | |||
<https://www.rfc-editor.org/info/rfc5246>. | <https://www.rfc-editor.org/info/rfc5246>. | |||
[RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., | ||||
Housley, R., and W. Polk, "Internet X.509 Public Key | ||||
Infrastructure Certificate and Certificate Revocation List | ||||
(CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008, | ||||
<https://www.rfc-editor.org/info/rfc5280>. | ||||
[RFC6125] Saint-Andre, P. and J. Hodges, "Representation and | ||||
Verification of Domain-Based Application Service Identity | ||||
within Internet Public Key Infrastructure Using X.509 | ||||
(PKIX) Certificates in the Context of Transport Layer | ||||
Security (TLS)", RFC 6125, DOI 10.17487/RFC6125, March | ||||
2011, <https://www.rfc-editor.org/info/rfc6125>. | ||||
[RFC7525] Sheffer, Y., Holz, R., and P. Saint-Andre, | ||||
"Recommendations for Secure Use of Transport Layer | ||||
Security (TLS) and Datagram Transport Layer Security | ||||
(DTLS)", BCP 195, RFC 7525, DOI 10.17487/RFC7525, May | ||||
2015, <https://www.rfc-editor.org/info/rfc7525>. | ||||
[RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | |||
Writing an IANA Considerations Section in RFCs", BCP 26, | Writing an IANA Considerations Section in RFCs", BCP 26, | |||
RFC 8126, DOI 10.17487/RFC8126, June 2017, | RFC 8126, DOI 10.17487/RFC8126, June 2017, | |||
<https://www.rfc-editor.org/info/rfc8126>. | <https://www.rfc-editor.org/info/rfc8126>. | |||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | ||||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | ||||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | ||||
11.2. Informative References | 11.2. Informative References | |||
[github-dtn-bpbis-tcpcl] | [github-dtn-bpbis-tcpcl] | |||
Sipos, B., "TCPCL Example Implementation", | Sipos, B., "TCPCL Example Implementation", | |||
<https://github.com/BSipos-RKF/dtn-bpbis-tcpcl/tree/ | <https://github.com/BSipos-RKF/dtn-bpbis-tcpcl/tree/ | |||
develop>. | develop>. | |||
[I-D.ietf-dtn-bpsec] | [I-D.ietf-dtn-bpsec] | |||
Birrane, E. and K. McKeever, "Bundle Protocol Security | Birrane, E. and K. McKeever, "Bundle Protocol Security | |||
Specification", draft-ietf-dtn-bpsec-09 (work in | Specification", draft-ietf-dtn-bpsec-10 (work in | |||
progress), February 2019. | progress), April 2019. | |||
[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>. | |||
[RFC4838] Cerf, V., Burleigh, S., Hooke, A., Torgerson, L., Durst, | [RFC4838] Cerf, V., Burleigh, S., Hooke, A., Torgerson, L., Durst, | |||
R., Scott, K., Fall, K., and H. Weiss, "Delay-Tolerant | R., Scott, K., Fall, K., and H. Weiss, "Delay-Tolerant | |||
Networking Architecture", RFC 4838, DOI 10.17487/RFC4838, | Networking Architecture", RFC 4838, DOI 10.17487/RFC4838, | |||
April 2007, <https://www.rfc-editor.org/info/rfc4838>. | April 2007, <https://www.rfc-editor.org/info/rfc4838>. | |||
[RFC5050] Scott, K. and S. Burleigh, "Bundle Protocol | ||||
Specification", RFC 5050, DOI 10.17487/RFC5050, November | ||||
2007, <https://www.rfc-editor.org/info/rfc5050>. | ||||
[RFC6257] Symington, S., Farrell, S., Weiss, H., and P. Lovell, | ||||
"Bundle Security Protocol Specification", RFC 6257, | ||||
DOI 10.17487/RFC6257, May 2011, | ||||
<https://www.rfc-editor.org/info/rfc6257>. | ||||
[RFC7242] Demmer, M., Ott, J., and S. Perreault, "Delay-Tolerant | [RFC7242] Demmer, M., Ott, J., and S. Perreault, "Delay-Tolerant | |||
Networking TCP Convergence-Layer Protocol", RFC 7242, | Networking TCP Convergence-Layer Protocol", RFC 7242, | |||
DOI 10.17487/RFC7242, June 2014, | DOI 10.17487/RFC7242, June 2014, | |||
<https://www.rfc-editor.org/info/rfc7242>. | <https://www.rfc-editor.org/info/rfc7242>. | |||
[RFC7457] Sheffer, Y., Holz, R., and P. Saint-Andre, "Summarizing | ||||
Known Attacks on Transport Layer Security (TLS) and | ||||
Datagram TLS (DTLS)", RFC 7457, DOI 10.17487/RFC7457, | ||||
February 2015, <https://www.rfc-editor.org/info/rfc7457>. | ||||
[RFC7942] Sheffer, Y. and A. Farrel, "Improving Awareness of Running | [RFC7942] Sheffer, Y. and A. Farrel, "Improving Awareness of Running | |||
Code: The Implementation Status Section", BCP 205, | Code: The Implementation Status Section", BCP 205, | |||
RFC 7942, DOI 10.17487/RFC7942, July 2016, | RFC 7942, DOI 10.17487/RFC7942, July 2016, | |||
<https://www.rfc-editor.org/info/rfc7942>. | <https://www.rfc-editor.org/info/rfc7942>. | |||
Appendix A. Significant changes from RFC7242 | 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: | |||
o Split contact header into pre-TLS protocol negotiation and | o 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. | |||
o Changed contact header content to limit number of negotiated | o Changed contact header content to limit number of negotiated | |||
options. | options. | |||
o Added contact option to negotiate maximum segment size (per each | o Added session option to negotiate maximum segment size (per each | |||
direction). | direction). | |||
o Renamed "Endpoint ID" to "Node ID" to conform with BPv7 | ||||
terminology. | ||||
o Added session extension capability. | o Added session extension capability. | |||
o Added transfer extension capability. Moved transfer total length | o Added transfer extension capability. Moved transfer total length | |||
into an extension item. | into an extension item. | |||
o Defined new IANA registries for message / type / reason codes to | o Defined new IANA registries for message / type / reason codes to | |||
allow renaming some codes for clarity. | allow renaming some codes for clarity. | |||
o Segments of all new IANA registries are reserved for private/ | ||||
experimental use. | ||||
o Expanded Message Header to octet-aligned fields instead of bit- | o Expanded Message Header to octet-aligned fields instead of bit- | |||
packing. | packing. | |||
o Added a bundle transfer identification number to all bundle- | o 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). | |||
o Use flags in XFER_ACK to mirror flags from XFER_SEGMENT. | o Use flags in XFER_ACK to mirror flags from XFER_SEGMENT. | |||
o Removed all uses of SDNV fields and replaced with fixed-bit-length | o Removed all uses of SDNV fields and replaced with fixed-bit-length | |||
fields. | fields. | |||
o Renamed SHUTDOWN to SESS_TERM to deconflict term "shutdown". | o Renamed SHUTDOWN to SESS_TERM to deconflict term "shutdown" | |||
related to TCP connections. | ||||
o Removed the notion of a re-connection delay parameter. | o Removed the notion of a re-connection 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: | |||
o Added contact negotiation failure SESS_TERM reason code. | o Added contact negotiation failure SESS_TERM reason code. | |||
o Added MSG_REJECT message to indicate an unknown or unhandled | o Added MSG_REJECT message to indicate an unknown or unhandled | |||
message was received. | message was received. | |||
End of changes. 124 change blocks. | ||||
485 lines changed or deleted | 694 lines changed or added | |||
This html diff was produced by rfcdiff 1.47. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |