draft-ietf-dtn-tcpclv4-18.txt | draft-ietf-dtn-tcpclv4-19.txt | |||
---|---|---|---|---|
Delay Tolerant Networking B. Sipos | Delay Tolerant Networking B. Sipos | |||
Internet-Draft RKF Engineering | Internet-Draft RKF Engineering | |||
Intended status: Standards Track M. Demmer | Intended status: Standards Track M. Demmer | |||
Expires: July 30, 2020 UC Berkeley | Expires: September 8, 2020 UC Berkeley | |||
J. Ott | J. Ott | |||
Aalto University | Aalto University | |||
S. Perreault | S. Perreault | |||
January 27, 2020 | March 7, 2020 | |||
Delay-Tolerant Networking TCP Convergence Layer Protocol Version 4 | Delay-Tolerant Networking TCP Convergence Layer Protocol Version 4 | |||
draft-ietf-dtn-tcpclv4-18 | draft-ietf-dtn-tcpclv4-19 | |||
Abstract | Abstract | |||
This document describes a TCP-based convergence layer (TCPCL) for | This document describes a TCP-based convergence layer (TCPCL) for | |||
Delay-Tolerant Networking (DTN). This version of the TCPCL protocol | Delay-Tolerant Networking (DTN). This version of the TCPCL protocol | |||
is based on implementation issues in the earlier TCPCL Version 3 of | resolves implementation issues in the earlier TCPCL Version 3 of | |||
RFC7242 and updates to the Bundle Protocol (BP) contents, encodings, | RFC7242 and updates to the Bundle Protocol (BP) contents, encodings, | |||
and convergence layer requirements in BP Version 7. Specifically, | and convergence layer requirements in BP Version 7. Specifically, | |||
the TCPCLv4 uses CBOR-encoded BPv7 bundles as its service data unit | the TCPCLv4 uses CBOR-encoded BPv7 bundles as its service data unit | |||
being transported and provides a reliable transport of such bundles. | being transported and provides a reliable transport of such bundles. | |||
This version of TCPCL also includes security and extensibility | ||||
mechanisms. | ||||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
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 July 30, 2020. | This Internet-Draft will expire on September 8, 2020. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2020 IETF Trust and the persons identified as the | Copyright (c) 2020 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 | |||
skipping to change at page 2, line 17 ¶ | skipping to change at page 2, line 21 ¶ | |||
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. Scope . . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1.1. Scope . . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
2. Requirements Language . . . . . . . . . . . . . . . . . . . . 5 | 2. Requirements Language . . . . . . . . . . . . . . . . . . . . 5 | |||
2.1. Definitions Specific to the TCPCL Protocol . . . . . . . 5 | 2.1. Definitions Specific to the TCPCL Protocol . . . . . . . 5 | |||
3. General Protocol Description . . . . . . . . . . . . . . . . 8 | 3. General Protocol Description . . . . . . . . . . . . . . . . 9 | |||
3.1. Convergence Layer Services . . . . . . . . . . . . . . . 8 | 3.1. Convergence Layer Services . . . . . . . . . . . . . . . 9 | |||
3.2. TCPCL Session Overview . . . . . . . . . . . . . . . . . 10 | 3.2. TCPCL Session Overview . . . . . . . . . . . . . . . . . 11 | |||
3.3. TCPCL States and Transitions . . . . . . . . . . . . . . 12 | 3.3. TCPCL States and Transitions . . . . . . . . . . . . . . 13 | |||
3.4. Transfer Segmentation Policies . . . . . . . . . . . . . 18 | 3.4. Transfer Segmentation Policies . . . . . . . . . . . . . 19 | |||
3.5. Example Message Exchange . . . . . . . . . . . . . . . . 19 | 3.5. Example Message Exchange . . . . . . . . . . . . . . . . 20 | |||
4. Session Establishment . . . . . . . . . . . . . . . . . . . . 20 | 4. Session Establishment . . . . . . . . . . . . . . . . . . . . 21 | |||
4.1. TCP Connection . . . . . . . . . . . . . . . . . . . . . 21 | 4.1. TCP Connection . . . . . . . . . . . . . . . . . . . . . 22 | |||
4.2. Contact Header . . . . . . . . . . . . . . . . . . . . . 22 | 4.2. Contact Header . . . . . . . . . . . . . . . . . . . . . 23 | |||
4.3. Contact Validation and Negotiation . . . . . . . . . . . 23 | 4.3. Contact Validation and Negotiation . . . . . . . . . . . 24 | |||
4.4. Session Security . . . . . . . . . . . . . . . . . . . . 24 | 4.4. Session Security . . . . . . . . . . . . . . . . . . . . 25 | |||
4.4.1. TLS Handshake . . . . . . . . . . . . . . . . . . . . 24 | 4.4.1. Entity Identification . . . . . . . . . . . . . . . . 26 | |||
4.4.2. TLS Authentication . . . . . . . . . . . . . . . . . 26 | 4.4.2. TLS Handshake . . . . . . . . . . . . . . . . . . . . 27 | |||
4.4.3. Example TLS Initiation . . . . . . . . . . . . . . . 27 | 4.4.3. TLS Authentication . . . . . . . . . . . . . . . . . 28 | |||
4.5. Message Header . . . . . . . . . . . . . . . . . . . . . 28 | 4.4.4. Example TLS Initiation . . . . . . . . . . . . . . . 30 | |||
4.6. Session Initialization Message (SESS_INIT) . . . . . . . 30 | 4.5. Message Header . . . . . . . . . . . . . . . . . . . . . 31 | |||
4.7. Session Parameter Negotiation . . . . . . . . . . . . . . 31 | 4.6. Session Initialization Message (SESS_INIT) . . . . . . . 32 | |||
4.8. Session Extension Items . . . . . . . . . . . . . . . . . 32 | 4.7. Session Parameter Negotiation . . . . . . . . . . . . . . 34 | |||
5. Established Session Operation . . . . . . . . . . . . . . . . 33 | 4.8. Session Extension Items . . . . . . . . . . . . . . . . . 35 | |||
5.1. Upkeep and Status Messages . . . . . . . . . . . . . . . 33 | 5. Established Session Operation . . . . . . . . . . . . . . . . 36 | |||
5.1.1. Session Upkeep (KEEPALIVE) . . . . . . . . . . . . . 34 | 5.1. Upkeep and Status Messages . . . . . . . . . . . . . . . 36 | |||
5.1.2. Message Rejection (MSG_REJECT) . . . . . . . . . . . 34 | 5.1.1. Session Upkeep (KEEPALIVE) . . . . . . . . . . . . . 36 | |||
5.2. Bundle Transfer . . . . . . . . . . . . . . . . . . . . . 35 | 5.1.2. Message Rejection (MSG_REJECT) . . . . . . . . . . . 37 | |||
5.2.1. Bundle Transfer ID . . . . . . . . . . . . . . . . . 36 | 5.2. Bundle Transfer . . . . . . . . . . . . . . . . . . . . . 38 | |||
5.2.2. Data Transmission (XFER_SEGMENT) . . . . . . . . . . 36 | 5.2.1. Bundle Transfer ID . . . . . . . . . . . . . . . . . 39 | |||
5.2.3. Data Acknowledgments (XFER_ACK) . . . . . . . . . . . 38 | 5.2.2. Data Transmission (XFER_SEGMENT) . . . . . . . . . . 39 | |||
5.2.4. Transfer Refusal (XFER_REFUSE) . . . . . . . . . . . 39 | 5.2.3. Data Acknowledgments (XFER_ACK) . . . . . . . . . . . 41 | |||
5.2.5. Transfer Extension Items . . . . . . . . . . . . . . 42 | 5.2.4. Transfer Refusal (XFER_REFUSE) . . . . . . . . . . . 42 | |||
6. Session Termination . . . . . . . . . . . . . . . . . . . . . 44 | 5.2.5. Transfer Extension Items . . . . . . . . . . . . . . 45 | |||
6.1. Session Termination Message (SESS_TERM) . . . . . . . . . 44 | 6. Session Termination . . . . . . . . . . . . . . . . . . . . . 47 | |||
6.2. Idle Session Shutdown . . . . . . . . . . . . . . . . . . 46 | 6.1. Session Termination Message (SESS_TERM) . . . . . . . . . 47 | |||
7. Implementation Status . . . . . . . . . . . . . . . . . . . . 46 | 6.2. Idle Session Shutdown . . . . . . . . . . . . . . . . . . 50 | |||
8. Security Considerations . . . . . . . . . . . . . . . . . . . 47 | ||||
8.1. Threat: Passive Leak of Node Data . . . . . . . . . . . . 47 | 7. Implementation Status . . . . . . . . . . . . . . . . . . . . 50 | |||
8.2. Threat: Passive Leak of Bundle Data . . . . . . . . . . . 47 | 8. Security Considerations . . . . . . . . . . . . . . . . . . . 50 | |||
8.3. Threat: TCPCL Version Downgrade . . . . . . . . . . . . . 47 | 8.1. Threat: Passive Leak of Node Data . . . . . . . . . . . . 51 | |||
8.4. Threat: Transport Security Stripping . . . . . . . . . . 47 | 8.2. Threat: Passive Leak of Bundle Data . . . . . . . . . . . 51 | |||
8.5. Threat: Weak Ciphersuite Downgrade . . . . . . . . . . . 48 | 8.3. Threat: TCPCL Version Downgrade . . . . . . . . . . . . . 51 | |||
8.6. Threat: Invalid Certificate Use . . . . . . . . . . . . . 48 | 8.4. Threat: Transport Security Stripping . . . . . . . . . . 51 | |||
8.7. Threat: Symmetric Key Overuse . . . . . . . . . . . . . . 48 | 8.5. Threat: Weak Ciphersuite Downgrade . . . . . . . . . . . 52 | |||
8.8. Threat: BP Node Impersonation . . . . . . . . . . . . . . 48 | 8.6. Threat: Invalid Certificate Use . . . . . . . . . . . . . 52 | |||
8.9. Threat: Denial of Service . . . . . . . . . . . . . . . . 49 | 8.7. Threat: Symmetric Key Overuse . . . . . . . . . . . . . . 52 | |||
8.10. Alternate Uses of TLS . . . . . . . . . . . . . . . . . . 50 | 8.8. Threat: BP Node Impersonation . . . . . . . . . . . . . . 52 | |||
8.10.1. TLS Without Authentication . . . . . . . . . . . . . 50 | 8.9. Threat: Denial of Service . . . . . . . . . . . . . . . . 53 | |||
8.10.2. Non-Certificate TLS Use . . . . . . . . . . . . . . 50 | 8.10. Alternate Uses of TLS . . . . . . . . . . . . . . . . . . 54 | |||
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 50 | 8.10.1. TLS Without Authentication . . . . . . . . . . . . . 54 | |||
9.1. Port Number . . . . . . . . . . . . . . . . . . . . . . . 51 | 8.10.2. Non-Certificate TLS Use . . . . . . . . . . . . . . 54 | |||
9.2. Protocol Versions . . . . . . . . . . . . . . . . . . . . 51 | 8.11. Predictability of Transfer IDs . . . . . . . . . . . . . 54 | |||
9.3. Session Extension Types . . . . . . . . . . . . . . . . . 52 | 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 55 | |||
9.4. Transfer Extension Types . . . . . . . . . . . . . . . . 53 | 9.1. Port Number . . . . . . . . . . . . . . . . . . . . . . . 55 | |||
9.5. Message Types . . . . . . . . . . . . . . . . . . . . . . 54 | 9.2. Protocol Versions . . . . . . . . . . . . . . . . . . . . 55 | |||
9.6. XFER_REFUSE Reason Codes . . . . . . . . . . . . . . . . 55 | 9.3. Session Extension Types . . . . . . . . . . . . . . . . . 56 | |||
9.7. SESS_TERM Reason Codes . . . . . . . . . . . . . . . . . 56 | 9.4. Transfer Extension Types . . . . . . . . . . . . . . . . 57 | |||
9.8. MSG_REJECT Reason Codes . . . . . . . . . . . . . . . . . 57 | 9.5. Message Types . . . . . . . . . . . . . . . . . . . . . . 58 | |||
10. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 58 | 9.6. XFER_REFUSE Reason Codes . . . . . . . . . . . . . . . . 59 | |||
11. References . . . . . . . . . . . . . . . . . . . . . . . . . 58 | 9.7. SESS_TERM Reason Codes . . . . . . . . . . . . . . . . . 60 | |||
11.1. Normative References . . . . . . . . . . . . . . . . . . 58 | 9.8. MSG_REJECT Reason Codes . . . . . . . . . . . . . . . . . 61 | |||
11.2. Informative References . . . . . . . . . . . . . . . . . 60 | 10. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 62 | |||
Appendix A. Significant changes from RFC7242 . . . . . . . . . . 61 | 11. References . . . . . . . . . . . . . . . . . . . . . . . . . 62 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 62 | 11.1. Normative References . . . . . . . . . . . . . . . . . . 62 | |||
11.2. Informative References . . . . . . . . . . . . . . . . . 64 | ||||
Appendix A. Significant changes from RFC7242 . . . . . . . . . . 65 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 66 | ||||
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 46 ¶ | skipping to change at page 4, line 51 ¶ | |||
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 [I-D.ietf-dtn-bpbis]. This includes the | are defined elsewhere in [I-D.ietf-dtn-bpbis]. This includes the | |||
concept of bundle fragmentation or bundle encapsulation. The | concept of bundle fragmentation or bundle 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 | |||
(peers) within a network or across an internet. The mapping of | (peers) within a network or across an internet. The mapping of | |||
Node ID to potential CL protocol and network address is left to | Node ID to potential convergence layer (CL) protocol and network | |||
implementation and configuration of the BP Agent and its various | address is left to implementation and configuration of the BP | |||
potential routing strategies. | Agent and its various potential routing strategies. | |||
o Logic for routing bundles along a path toward a bundle's endpoint. | o Logic for routing bundles along a path toward a bundle's endpoint. | |||
This CL protocol is involved only in transporting bundles between | This CL protocol is involved only in transporting bundles between | |||
adjacent nodes in a routing sequence. | adjacent nodes in a routing sequence. | |||
o Policies or mechanisms for assigning X.509 certificates, | o Policies or mechanisms for creating X.509 certificates; | |||
provisioning, deploying, or accessing certificates and private | provisioning, deploying, or accessing certificates and private | |||
keys, deploying or accessing certificate revocation lists (CRLs), | keys; deploying or accessing certificate revocation lists (CRLs); | |||
or configuring security parameters on an individual entity or | or configuring security parameters on an individual entity or | |||
across a network. | across a network. | |||
o Uses of TLS which are not based on X.509 certificate | o Uses of TLS which are not based on X.509 certificate | |||
authentication (see Section 8.10.2) or in which authentication is | authentication (see Section 8.10.2) or in which authentication of | |||
not available (see Section 8.10.1). | both entities is not possible (see Section 8.10.1). | |||
Any TCPCL implementation requires a BP agent to perform those above | Any TCPCL implementation requires a BP agent to perform those above | |||
listed functions in order to perform end-to-end bundle delivery. | listed functions in order to perform end-to-end bundle delivery. | |||
2. Requirements Language | 2. Requirements Language | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
2.1. Definitions Specific to the TCPCL Protocol | 2.1. Definitions Specific to the TCPCL Protocol | |||
This section contains definitions specific to the TCPCL protocol. | This section contains definitions specific to the TCPCL protocol. | |||
Network Byte Order: Most significant byte first, a.k.a., big endian. | ||||
All of the integer encodings in this protocol SHALL be transmitted | ||||
in network byte order. | ||||
TCPCL Entity: This is the notional TCPCL application that initiates | TCPCL Entity: This is the notional TCPCL application that initiates | |||
TCPCL sessions. This design, implementation, configuration, and | TCPCL sessions. This design, implementation, configuration, and | |||
specific behavior of such an entity is outside of the scope of | specific behavior of such an entity is outside of the scope of | |||
this document. However, the concept of an entity has utility | this document. However, the concept of an entity has utility | |||
within the scope of this document as the container and initiator | within the scope of this document as the container and initiator | |||
of TCPCL sessions. The relationship between a TCPCL entity and | of TCPCL sessions. The relationship between a TCPCL entity and | |||
TCPCL sessions is defined as follows: | TCPCL sessions is defined as follows: | |||
A TCPCL Entity MAY actively initiate any number of TCPCL | * A TCPCL Entity MAY actively initiate any number of TCPCL | |||
Sessions and should do so whenever the entity is the initial | Sessions and should do so whenever the entity is the initial | |||
transmitter of information to another entity in the network. | transmitter of information to another entity in the network. | |||
A TCPCL Entity MAY support zero or more passive listening | * A TCPCL Entity MAY support zero or more passive listening | |||
elements that listen for connection requests from other TCPCL | elements that listen for connection requests from other TCPCL | |||
Entities operating on other entitys in the network. | Entities operating on other entities in the network. | |||
A TCPCL Entity MAY passivley initiate any number of TCPCL | * A TCPCL Entity MAY passively initiate any number of TCPCL | |||
Sessions from requests received by its passive listening | Sessions from requests received by its passive listening | |||
element(s) if the entity uses such elements. | element(s) if the entity uses such elements. | |||
These relationships are illustrated in Figure 2. For most TCPCL | These relationships are illustrated in Figure 2. For most TCPCL | |||
behavior within a session, the two entities are symmetric and | behavior within a session, the two entities are symmetric and | |||
there is no protocol distinction between them. Some specific | there is no protocol distinction between them. Some specific | |||
behavior, particularly during session establishment, distinguishes | behavior, particularly during session establishment, distinguishes | |||
between the active entity and the passive entity. For the | between the active entity and the passive entity. For the | |||
remainder of this document, the term "entity" without the prefix | remainder of this document, the term "entity" without the prefix | |||
"TCPCL" refers to a TCPCL entity. | "TCPCL" refers to a TCPCL entity. | |||
TCP Connection: The term Connection in this specification | TCP Connection: The term Connection in this specification | |||
exclusively refers to a TCP connection and any and all behaviors, | exclusively refers to a TCP connection and any and all behaviors, | |||
sessions, and other states associated with that TCP connection. | sessions, and other states associated with that TCP connection. | |||
TCPCL Session: A TCPCL session (as opposed to a TCP connection) is a | TCPCL Session: A TCPCL session (as opposed to a TCP connection) is a | |||
TCPCL communication relationship between two TCPCL entities. | TCPCL communication relationship between two TCPCL entities. A | |||
Within a single TCPCL session there are two possible transfer | TCPCL session operates within a single underlying TCP connection | |||
streams; one in each direction, with one stream from each entity | and the lifetime of a TCPCL session is bound to the lifetime of | |||
being the outbound stream and the other being the inbound stream. | that TCP connection. A TCPCL session is terminated when the TCP | |||
The lifetime of a TCPCL session is bound to the lifetime of an | connection ends, due either to one or both entities actively | |||
underlying TCP connection. A TCPCL session is terminated when the | ||||
TCP connection ends, due either to one or both entities actively | ||||
closing the TCP connection or due to network errors causing a | closing the TCP connection or due to network errors causing a | |||
failure of the TCP connection. For the remainder of this | failure of the TCP connection. Within a single TCPCL session | |||
document, the term "session" without the prefix "TCPCL" refers to | there are two possible transfer streams; one in each direction, | |||
a TCPCL session. | with one stream from each entity being the outbound stream and the | |||
other being the inbound stream (see Figure 3). From the | ||||
perspective of a TCPCL session, the two transfer streams do not | ||||
logically interact with each other. The streams do operate over | ||||
the same TCP connection and between the same BP agents, so there | ||||
are logical relationships at those layers (message and bundle | ||||
interleaving respectively). For the remainder of this document, | ||||
the term "session" without the prefix "TCPCL" refers to a TCPCL | ||||
session. | ||||
Session parameters: These are a set of values used to affect the | Session parameters: These are a set of values used to affect the | |||
operation of the TCPCL for a given session. The manner in which | operation of the TCPCL for a given session. The manner in which | |||
these parameters are conveyed to the bundle entity and thereby to | these parameters are conveyed to the bundle entity and thereby to | |||
the TCPCL is implementation dependent. However, the mechanism by | the TCPCL is implementation dependent. However, the mechanism by | |||
which two entities exchange and negotiate the values to be used | which two entities exchange and negotiate the values to be used | |||
for a given session is described in Section 4.3. | for a given session is described in Section 4.3. | |||
Transfer Stream: A Transfer stream is a uni-directional user-data | Transfer Stream: A Transfer stream is a uni-directional user-data | |||
path within a TCPCL Session. Messages sent over a transfer stream | path within a TCPCL Session. Transfers sent over a transfer | |||
are serialized, meaning that one set of user data must complete | stream are serialized, meaning that one transfer must complete its | |||
its transmission prior to another set of user data being | transmission prior to another transfer being started over the same | |||
transmitted over the same transfer stream. Each uni-directional | transfer stream. At the stream layer there is no logical | |||
stream has a single sender entity and a single receiver entity. | relationship between transfers in that stream; it's only within | |||
the BP agent that transfers are fully decoded as bundles. Each | ||||
uni-directional stream has a single sender entity and a single | ||||
receiver entity. | ||||
Transfer: This refers to the procedures and mechanisms for | Transfer: This refers to the procedures and mechanisms for | |||
conveyance of an individual bundle from one node to another. Each | conveyance of an individual bundle from one node to another. Each | |||
transfer within TCPCL is identified by a Transfer ID number which | transfer within TCPCL is identified by a Transfer ID number which | |||
is unique only to a single direction within a single Session. | is guaranteed to be unique only to a single direction within a | |||
single Session. | ||||
Transfer Segment: A subset of a transfer of user data being | Transfer Segment: A subset of a transfer of user data being | |||
communicated over a trasnfer stream. | communicated over a transfer stream. | |||
Idle Session: A TCPCL session is idle while the only messages being | Idle Session: A TCPCL session is idle while there is no transmission | |||
transmitted or received are KEEPALIVE messages. | in-progress in either direction. While idle, the only messages | |||
being transmitted or received are KEEPALIVE messages. | ||||
Live Session: A TCPCL session is live while any messages are being | Live Session: A TCPCL session is live while there is a transmission | |||
transmitted or received. | in-progress in either direction. | |||
Reason Codes: The TCPCL uses numeric codes to encode specific | Reason Codes: The TCPCL uses numeric codes to encode specific | |||
reasons for individual failure/error message types. | reasons for individual failure/error message types. | |||
The relationship between connections, sessions, and streams is shown | The relationship between connections, sessions, and streams is shown | |||
in Figure 3. | in Figure 3. | |||
+--------------------------------------------+ | +--------------------------------------------+ | |||
| TCPCL Entity | | | TCPCL Entity | | |||
| | +----------------+ | | | +----------------+ | |||
| +--------------------------------+ | | |-+ | | +--------------------------------+ | | |-+ | |||
| | Actively Inititated Session #1 +------------->| Other | | | | | Actively Initiated Session #1 +------------->| Other | | | |||
| +--------------------------------+ | | TCPCL Entity's | | | | +--------------------------------+ | | TCPCL Entity's | | | |||
| ... | | Passive | | | | ... | | Passive | | | |||
| +--------------------------------+ | | Listener | | | | +--------------------------------+ | | Listener | | | |||
| | Actively Inititated Session #n +------------->| | | | | | Actively Initiated Session #n +------------->| | | | |||
| +--------------------------------+ | +----------------+ | | | +--------------------------------+ | +----------------+ | | |||
| | +-----------------+ | | | +-----------------+ | |||
| +---------------------------+ | | | +---------------------------+ | | |||
| +---| +---------------------------+ | +----------------+ | | +---| +---------------------------+ | +----------------+ | |||
| | | | Optional Passive | | | |-+ | | | | | Optional Passive | | | |-+ | |||
| | +-| Listener(s) +<-------------+ | | | | | +-| Listener(s) +<-------------+ | | | |||
| | +---------------------------+ | | | | | | | +---------------------------+ | | | | | |||
| | | | Other | | | | | | | Other | | | |||
| | +---------------------------------+ | | TCPCL Entity's | | | | | +---------------------------------+ | | TCPCL Entity's | | | |||
| +--->| Passively Inititated Session #1 +-------->| Active | | | | +--->| Passively Initiated Session #1 +-------->| Active | | | |||
| | +---------------------------------+ | | Initiator(s) | | | | | +---------------------------------+ | | Initiator(s) | | | |||
| | | | | | | | | | | | | | |||
| | +---------------------------------+ | | | | | | | +---------------------------------+ | | | | | |||
| +--->| Passively Inititated Session #n +-------->| | | | | +--->| Passively Initiated Session #n +-------->| | | | |||
| +---------------------------------+ | +----------------+ | | | +---------------------------------+ | +----------------+ | | |||
| | +-----------------+ | | | +-----------------+ | |||
+--------------------------------------------+ | +--------------------------------------------+ | |||
Figure 2: The relationships between TCPCL entities | Figure 2: The relationships between TCPCL entities | |||
+----------------------------+ +--------------------------+ | +---------------------------+ +---------------------------+ | |||
| "Own" TCPCL Session | | "Other" TCPCL Session | | | "Own" TCPCL Session | | "Other" TCPCL Session | | |||
| | | | | | | | | | |||
| +-----------------------+ | | +---------------------+ | | | +----------------------+ | | +----------------------+ | | |||
| | TCP Connection | | | | TCP Connection | | | | | TCP Connection | | | | TCP Connection | | | |||
| | | | | | | | | | | | | | | | | | |||
| | +-------------------+ | | | | +-----------------+ | | | | | +-----------------+ | | Messages | | +-----------------+ | | | |||
| | | Optional Inbound | | | | | | Peer Outbound | | | | | | | Own Inbound | +--------------------+ | Peer Outbound | | | | |||
| | | Transfer Stream |<-[Seg]--[Seg]--[Seg]-| | Transfer Stream | | | | | | | Transfer Stream | | Transfer Stream | | | | |||
| | | ----- |--[Ack]----[Ack]------->| ----- | | | | | | | ----- |<---[Seg]--[Seg]--[Seg]---| ----- | | | | |||
| | | RECEIVER | | | | | | SENDER | | | | | | | RECEIVER |---[Ack]----[Ack]-------->| SENDER | | | | |||
| | +-------------------+ | | | | +-----------------+ | | | | | +-----------------+ +-----------------+ | | | |||
| | | | | | | | | | | | | | |||
| | +-------------------+ | | | | +-----------------+ | | | | | +-----------------+ +-----------------+ | | | |||
| | | Optional Outbound | | | | | | Peer Inbound | | | | | | | Own Outbound |-------[Seg]---[Seg]----->| Peer Inbound | | | | |||
| | | Transfer Stream |------[Seg]---[Seg]---->| Transfer Stream | | | | | | | Transfer Stream |<---[Ack]----[Ack]-[Ack]--| Transfer Stream | | | | |||
| | | ----- |<--[Ack]----[Ack]-[Ack]-| ----- | | | | | | | ----- | | ----- | | | | |||
| | | SENDER | | | | | | RECEIVER | | | | | | | SENDER | +--------------------+ | RECEIVER | | | | |||
| | +-------------------+ | | | | +-----------------+ | | | | | +-----------------+ | | | | +-----------------+ | | | |||
| +-----------------------+ | | +---------------------+ | | | +-----------------------+ | | +---------------------+ | | |||
+----------------------------+ +--------------------------+ | +----------------------------+ +--------------------------+ | |||
Figure 3: The relationship within a TCPCL Session of its two streams | Figure 3: The relationship within a TCPCL Session of its two streams | |||
3. General Protocol Description | 3. General Protocol Description | |||
The service of this protocol is the transmission of DTN bundles via | The service of this protocol is the transmission of DTN bundles via | |||
the Transmission Control Protocol (TCP). This document specifies the | 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. Convergence Layer Services | 3.1. Convergence Layer Services | |||
This version of the TCPCL provides the following services to support | This version of the TCPCL provides the following services to support | |||
the overlaying Bundle Protocol agent. In all cases, this is not an | the overlaying Bundle Protocol agent. In all cases, this is not an | |||
API defintion but a logical description of how the CL can interact | API definition but a logical description of how the CL can interact | |||
with the BP agent. Each of these interactions can be associated with | with the BP agent. Each of these interactions can be associated with | |||
any number of additional metadata items as necessary to support the | any number of additional metadata items as necessary to support the | |||
operation of the CL or BP agent. | operation of the CL or BP agent. | |||
Attempt Session: The TCPCL allows a BP agent to pre-emptively | Attempt Session: The TCPCL allows a BP agent to preemptively attempt | |||
attempt to establish a TCPCL session with a peer entity. Each | to establish a TCPCL session with a peer entity. Each session | |||
session attempt can send a different set of session negotiation | attempt can send a different set of session negotiation parameters | |||
parameters as directed by the BP agent. | as directed by the BP agent. | |||
Terminate Session: The TCPCL allows a BP agent to pre-emptively | Terminate Session: The TCPCL allows a BP agent to preemptively | |||
terminate an established TCPCL session with a peer entity. The | terminate an established TCPCL session with a peer entity. The | |||
terminate request is on a per-session basis. | terminate request is on a per-session basis. | |||
Session State Changed: The TCPCL supports indication when the | Session State Changed: The TCPCL entity indicates to the BP agent | |||
session state changes. The top-level session states indicated | when the session state changes. The top-level session states | |||
are: | indicated are: | |||
Connecting: A TCP connection is being established. This state | Connecting: A TCP connection is being established. This state | |||
only applies to the active entity. | only applies to the active entity. | |||
Contact Negotiating: A TCP connection has been made (as either | Contact Negotiating: A TCP connection has been made (as either | |||
active or passive entity) and contact negotiation has begun. | active or passive entity) and contact negotiation has begun. | |||
Session Negotiating: Contact negotiation has been completed | Session Negotiating: Contact negotiation has been completed | |||
(including possible TLS use) and session negotiation has begun. | (including possible TLS use) and session negotiation has begun. | |||
Established: The session has been fully established and is ready | Established: The session has been fully established and is ready | |||
for its first transfer. | for its first transfer. | |||
Ending: The entity received a SESS_TERM message and is in the | Ending: The entity sent SESS_TERM message and is in the ending | |||
ending state. | state. | |||
Terminated: The session has finished normal termination | Terminated: The session has finished normal termination | |||
sequencing. | sequencing. | |||
Failed: The session ended without normal termination sequencing. | Failed: The session ended without normal termination sequencing. | |||
Session Idle Changed: The TCPCL supports indication when the live/ | Session Idle Changed: The TCPCL entity indicates to the BP agent | |||
idle sub-state of the session changes. This occurs only when the | when the live/idle sub-state of the session changes. This occurs | |||
top-level session state is "Established". The session transitions | only when the top-level session state is "Established". The | |||
from Idle to Live at the at the start of a transfer in either | session transitions from Idle to Live at the at the start of a | |||
transfer stream; the session transitions from Live to Idle at the | transfer in either transfer stream; the session transitions from | |||
end of a transfer when the other transfer stream does not have an | Live to Idle at the end of a transfer when the other transfer | |||
ongoing transfer. Because TCPCL transmits serially over a TCP | stream does not have an ongoing transfer. Because TCPCL transmits | |||
connection, it suffers from "head of queue blocking" this | serially over a TCP connection it suffers from "head of queue | |||
indication provides information about when a session is available | blocking," so a transfer in either direction can block an | |||
for immediate transfer start. | immediate start of a new transfer in the session. | |||
Begin Transmission: The principal purpose of the TCPCL is to allow a | Begin Transmission: The principal purpose of the TCPCL is to allow a | |||
BP agent to transmit bundle data over an established TCPCL | BP agent to transmit bundle data over an established TCPCL | |||
session. Transmission request is on a per-session basis, the CL | session. Transmission request is on a per-session basis and the | |||
does not necessarily perform any per-session or inter-session | CL does not necessarily perform any per-session or inter-session | |||
queueing. Any queueing of transmissions is the obligation of the | queueing. Any queueing of transmissions is the obligation of the | |||
BP agent. | BP agent. | |||
Transmission Success: The TCPCL supports positive indication when a | Transmission Success: The TCPCL entity indicates to the BP agent | |||
bundle has been fully transferred to a peer entity. | when a bundle has been fully transferred to a peer entity. | |||
Transmission Intermediate Progress: The TCPCL supports positive | Transmission Intermediate Progress: The TCPCL entity indicates to | |||
indication of intermediate progress of transfer to a peer entity. | the BP agent on intermediate progress of transfer to a peer | |||
This intermediate progress is at the granularity of each | entity. This intermediate progress is at the granularity of each | |||
transferred segment. | transferred segment. | |||
Transmission Failure: The TCPCL supports positive indication of | Transmission Failure: The TCPCL entity indicates to the BP agent on | |||
certain reasons for bundle transmission failure, notably when the | certain reasons for bundle transmission failure, notably when the | |||
peer entity rejects the bundle or when a TCPCL session ends before | peer entity rejects the bundle or when a TCPCL session ends before | |||
transfer success. The TCPCL itself does not have a notion of | transfer success. The TCPCL itself does not have a notion of | |||
transfer timeout. | transfer timeout. | |||
Reception Initialized: The TCPCL supports indication to the reciver | Reception Initialized: The TCPCL entity indicates to the receiving | |||
just before any transmssion data is sent. This corresponds to | BP agent just before any transmission data is sent. This | |||
reception of the XFER_SEGMENT message with the START flag of 1. | corresponds to reception of the XFER_SEGMENT message with the | |||
START flag of 1. | ||||
Interrupt Reception: The TCPCL allows a BP agent to interrupt an | Interrupt Reception: The TCPCL entity allows a BP agent to interrupt | |||
individual transfer before it has fully completed (successfully or | an individual transfer before it has fully completed (successfully | |||
not). Interruption can occur any time after the reception is | or not). Interruption can occur any time after the reception is | |||
initialized. | initialized. | |||
Reception Success: The TCPCL supports positive indication when a | Reception Success: The TCPCL entity indicates to the BP agent when a | |||
bundle has been fully transferred from a peer entity. | bundle has been fully transferred from a peer entity. | |||
Reception Intermediate Progress: The TCPCL supports positive | Reception Intermediate Progress: The TCPCL entity indicates to the | |||
indication of intermediate progress of transfer from the peer | BP agent on intermediate progress of transfer from the peer | |||
entity. This intermediate progress is at the granularity of each | entity. This intermediate progress is at the granularity of each | |||
transferred segment. Intermediate reception indication allows a | transferred segment. Intermediate reception indication allows a | |||
BP agent the chance to inspect bundle header contents before the | BP agent the chance to inspect bundle header contents before the | |||
entire bundle is available, and thus supports the "Reception | entire bundle is available, and thus supports the "Reception | |||
Interruption" capability. | Interruption" capability. | |||
Reception Failure: The TCPCL supports positive indication of certain | Reception Failure: The TCPCL entity indicates to the BP agent on | |||
reasons for reception failure, notably when the local entity | certain reasons for reception failure, notably when the local | |||
rejects an attempted transfer for some local policy reason or when | entity rejects an attempted transfer for some local policy reason | |||
a TCPCL session ends before transfer success. The TCPCL itself | or when a TCPCL session ends before transfer success. The TCPCL | |||
does not have a notion of transfer timeout. | itself does not have a notion of transfer timeout. | |||
3.2. TCPCL Session Overview | 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 | |||
negotiate the use of TLS security (as described in Section 4). Once | negotiate the use of TLS security (as described in Section 4). Once | |||
contact negotiation is complete, TCPCL messaging is available and the | contact negotiation is complete, TCPCL messaging is available and the | |||
session negotiation is used to set parameters of the TCPCL session. | session negotiation is used to set parameters of the TCPCL session. | |||
One of these parameters is a Node ID of each TCPCL Entity. This is | One of these parameters is a Node ID that each TCPCL Entity is acting | |||
used to assist in routing and forwarding messages by the BP Agent and | as. This is used to assist in routing and forwarding messages by the | |||
is part of the authentication capability provided by TLS. | BP Agent and is part of the authentication capability provided by | |||
TLS. | ||||
Once negotiated, the parameters of a TCPCL session cannot change and | Once negotiated, the parameters of a TCPCL session cannot change 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. | negligible compared to TCPCL data sizes. | |||
Once the TCPCL session is established and configured in this way, | Once the TCPCL session is established and configured in this way, | |||
bundles can be transferred in either direction. Each transfer is | bundles can be transferred in either direction. Each transfer is | |||
performed by an sequence of logical segments of data within | performed by segmenting the transfer data into one or more | |||
XFER_SEGMENT messages. Multiple bundles can be transmitted | XFER_SEGMENT messages. Multiple bundles can be transmitted | |||
consecutively in a single direction on a single TCPCL connection. | consecutively in a single direction on a single TCPCL connection. | |||
Segments from different bundles are never interleaved. Bundle | Segments from different bundles are never interleaved. Bundle | |||
interleaving can be accomplished by fragmentation at the BP layer or | interleaving can be accomplished by fragmentation at the BP layer or | |||
by establishing multiple TCPCL sessions between the same peers. | by establishing multiple TCPCL sessions between the same peers. | |||
There is no fundamental limit on the number of TCPCL sessions which a | There is no fundamental limit on the number of TCPCL sessions which a | |||
single node can establish beyond the limit imposed by the number of | single node can establish beyond the limit imposed by the number of | |||
available (ephemeral) TCP ports of the passive entity. | available (ephemeral) TCP ports of the active entity. | |||
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 11, line 48 ¶ | skipping to change at page 12, line 49 ¶ | |||
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 ending of a TCPCL session | A SESS_TERM message is used to initiate the ending of a TCPCL session | |||
(see Section 6.1). During shutdown sequencing, in-progress transfers | (see Section 6.1). During termination sequencing, in-progress | |||
can be completed but no new transfers can be initiated. A SESS_TERM | transfers can be completed but no new transfers can be initiated. A | |||
message can also be used to refuse a session setup by a peer (see | SESS_TERM message can also be used to refuse a session setup by a | |||
Section 4.3). Regardless of the reason, session termination is | peer (see Section 4.3). Regardless of the reason, session | |||
initiated by one of the entities and responded-to by the other as | termination is initiated by one of the entities and responded-to by | |||
illustrated by Figure 13 and Figure 14. Even when there are no | the other as illustrated by Figure 13 and Figure 14. Even when there | |||
transfers queued or in-progress, the session termination procedure | are no transfers queued or in-progress, the session termination | |||
allows each entity to distinguish between a clean end to a session | procedure allows each entity to distinguish between a clean end to a | |||
and the TCP connection being closed because of some underlying | session and the TCP connection being closed because of some | |||
network issue. | underlying network issue. | |||
Once a session is established, TCPCL is a symmetric protocol between | Once a session is established, TCPCL is a symmetric protocol between | |||
the peers. Both sides can start sending data segments in a session, | the peers. Both sides can start sending data segments in a session, | |||
and one side's bundle transfer does not have to complete before the | and one side's bundle transfer does not have to complete before the | |||
other side can start sending data segments on its own. Hence, the | other side can start sending data segments on its own. Hence, the | |||
protocol allows for a bi-directional mode of communication. Note | protocol allows for a bi-directional mode of communication. Note | |||
that in the case of concurrent bidirectional transmission, | that in the case of concurrent bidirectional transmission, | |||
acknowledgment segments MAY be interleaved with data segments. | acknowledgment segments MAY be interleaved with data segments. | |||
3.3. TCPCL States and Transitions | 3.3. TCPCL States and Transitions | |||
The states of a nominal TCPCL session (i.e. without session failures) | The states of a normal TCPCL session (i.e., without session failures) | |||
are indicated in Figure 4. | are indicated in Figure 4. | |||
+-------+ | +-------+ | |||
| START | | | START | | |||
+-------+ | +-------+ | |||
| | | | |||
TCP Establishment | TCP Establishment | |||
| | | | |||
V | V | |||
+-----------+ +---------------------+ | +-----------+ +---------------------+ | |||
skipping to change at page 13, line 46 ¶ | skipping to change at page 14, line 46 ¶ | |||
| | | | |||
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 receiving over a transfer | |||
stream. | stream. | |||
Session "Idle" means no transmission/reception over a transfer | Session "Idle" means no transmission/reception over a transfer | |||
stream. | stream. | |||
Session "Ending" means no new transfers will be allowed. | Session "Ending" means no new transfers will be allowed. | |||
Contact negotiation involves exchanging a Contact Header (CH) in both | Contact negotiation involves exchanging a Contact Header (CH) in both | |||
directions and deriving a negotiated state from the two headers. The | directions and deriving a negotiated state from the two headers. The | |||
contact negotiation sequencing is performed either as the active or | contact negotiation sequencing is performed either as the active or | |||
passive entity, and is illustrated in Figure 5 and Figure 6 | passive entity, 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 negotiation of | |||
states of the "[PCH]" activity of Figure 7 and the "[TCPCLOSE]" | the Processing of Contact Header "[PCH]" activity of Figure 7 and the | |||
activity which indicates TCP connection close. Successful | "[TCPCLOSE]" activity which indicates TCP connection close. | |||
negotiation results in one of the Session Initiation "[SI]" | Successful negotiation results in one of the Session Initiation | |||
activities being performed. To avoid data loss, a Session | "[SI]" activities being performed. To avoid data loss, a Session | |||
Termination "[ST]" exchange allows cleanly finishing transfers before | Termination "[ST]" exchange allows cleanly finishing transfers before | |||
a session is ended. | a session is ended. | |||
+-------+ | +-------+ | |||
| START | | | START | | |||
+-------+ | +-------+ | |||
| | | | |||
TCP Connecting | TCP Connecting | |||
V | V | |||
+-----------+ | +-----------+ | |||
| TCP | +---------+ | | TCP | +---------+ | |||
| Connected |--Send CH-->| Waiting |--Timeout-->[TCPCLOSE] | | Connected |--Send CH-->| Waiting |--Timeout-->[TCPCLOSE] | |||
+-----------+ +---------+ | +-----------+ +---------+ | |||
| | | | |||
Recevied CH | Received CH | |||
V | V | |||
[PCH] | [PCH] | |||
Figure 5: Contact Initiation as Active Entity | Figure 5: Contact Initiation as Active Entity | |||
+-----------+ +---------+ | +-----------+ +---------+ | |||
| TCP |--Wait for-->| Waiting |--Timeout-->[TCPCLOSE] | | TCP |--Wait for-->| Waiting |--Timeout-->[TCPCLOSE] | |||
| Connected | CH +---------+ | | Connected | CH +---------+ | |||
+-----------+ | | +-----------+ | | |||
Received CH | Received CH | |||
V | V | |||
+-----------------+ | +-----------------+ | |||
| Preparing reply |--Send CH-->[PSI] | | Preparing reply |--Send CH-->[PCH] | |||
+-----------------+ | +-----------------+ | |||
Figure 6: Contact Initiation as Passive Entity | Figure 6: Contact Initiation as Passive Entity | |||
+-----------+ | +-----------+ | |||
| Peer CH | | | Peer CH | | |||
| available | | | available | | |||
+-----------+ | +-----------+ | |||
| | | | |||
Validate and | Validate and | |||
skipping to change at page 15, line 32 ¶ | skipping to change at page 16, line 32 ¶ | |||
| Available | +---------------+ | | Available | +---------------+ | |||
+-----------+ | +-----------+ | |||
Figure 7: Processing of Contact Header [PCH] | Figure 7: Processing of Contact Header [PCH] | |||
Session negotiation involves exchanging a session initialization | Session negotiation involves exchanging a session initialization | |||
(SESS_INIT) message in both directions and deriving a negotiated | (SESS_INIT) message in both directions and deriving a negotiated | |||
state from the two messages. The session negotiation sequencing is | state from the two messages. The session negotiation sequencing is | |||
performed either as the active or passive entity, and is illustrated | performed either as the active or passive entity, and is illustrated | |||
in Figure 8 and Figure 9 respectively which both share the data | in Figure 8 and Figure 9 respectively which both share the data | |||
validation and analyze final states of Figure 10. The validation | validation and negotiation of Figure 10. The validation here | |||
here includes certificate validation and authentication when TLS is | includes certificate validation and authentication when TLS is used | |||
used for the session. | for the session. | |||
+-----------+ | +-----------+ | |||
| TCPCL | +---------+ | | TCPCL | +---------+ | |||
| Messaging |--Send SESS_INIT-->| Waiting |--Timeout-->[ST] | | Messaging |--Send SESS_INIT-->| Waiting |--Timeout-->[ST] | |||
| Available | +---------+ | | Available | +---------+ | |||
+-----------+ | | +-----------+ | | |||
Recevied SESS_INIT | Received SESS_INIT | |||
| | | | |||
V | V | |||
[PSI] | [PSI] | |||
Figure 8: Session Initiation [SI] as Active Entity | Figure 8: Session Initiation [SI] as Active Entity | |||
+-----------+ | +-----------+ | |||
| TCPCL | +---------+ | | TCPCL | +---------+ | |||
| Messaging |----Wait for ---->| Waiting |--Timeout-->[ST] | | Messaging |----Wait for ---->| Waiting |--Timeout-->[ST] | |||
| Available | SESS_INIT +---------+ | | Available | SESS_INIT +---------+ | |||
+-----------+ | | +-----------+ | | |||
Recevied SESS_INIT | Received SESS_INIT | |||
| | | | |||
+-----------------+ | +-----------------+ | |||
| Preparing reply |--Send SESS_INIT-->[PSI] | | Preparing reply |--Send SESS_INIT-->[PSI] | |||
+-----------------+ | +-----------------+ | |||
Figure 9: Session Initiation [SI] as Passive Entity | Figure 9: Session Initiation [SI] as Passive Entity | |||
+----------------+ | +----------------+ | |||
| Peer SESS_INIT | | | Peer SESS_INIT | | |||
| available | | | available | | |||
skipping to change at page 16, line 40 ¶ | skipping to change at page 17, line 40 ¶ | |||
Success | Success | |||
V | V | |||
+--------------+ | +--------------+ | |||
| Established | | | Established | | |||
| Session Idle | | | Session Idle | | |||
+--------------+ | +--------------+ | |||
Figure 10: Processing of Session Initiation [PSI] | Figure 10: Processing of Session Initiation [PSI] | |||
Transfers can occur after a session is established and it's not in | Transfers can occur after a session is established and it's not in | |||
the ending state. Each transfer occurs within a single logical | the Ending state. Each transfer occurs within a single logical | |||
transfer stream between a sender and a receiver, as illustrated in | transfer stream between a sender and a receiver, as illustrated in | |||
Figure 11 and Figure 12 respectively. | 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 |<------------+ | |||
+--------+ +-------------+ | +--------+ +-------------+ | |||
| | | | |||
+---------All segments sent-------+ | +---------All segments sent-------+ | |||
skipping to change at page 17, line 45 ¶ | skipping to change at page 18, line 45 ¶ | |||
+--------+ | +--------+ | |||
| Stream | | | Stream | | |||
| Idle | | | Idle | | |||
+--------+ | +--------+ | |||
Figure 12: Transfer receiver states | Figure 12: Transfer receiver states | |||
Session termination involves one entity initiating the termination of | Session termination involves one entity initiating the termination of | |||
the session and the other entity acknowledging the termination. For | the session and the other entity acknowledging the termination. For | |||
either entity, it is the sending of the SESS_TERM message which | either entity, it is the sending of the SESS_TERM message which | |||
transitions the session to the ending substate. While a session is | transitions the session to the Ending substate. While a session is | |||
being terminated only in-progress transfers can be completed and no | in the Ending state only in-progress transfers can be completed and | |||
new transfers can be started. | no new transfers can be started. | |||
+-----------+ +---------+ | +-----------+ +---------+ | |||
| Session |--Send SESS_TERM-->| Session | | | Session |--Send SESS_TERM-->| Session | | |||
| Live/Idle | | Ending | | | Live/Idle | | Ending | | |||
+-----------+ +---------+ | +-----------+ +---------+ | |||
Figure 13: Session Termination [ST] from the Initiator | Figure 13: Session Termination [ST] from the Initiator | |||
+-----------+ +---------+ | +-----------+ +---------+ | |||
| Session |--Send SESS_TERM-->| Session | | | Session |--Send SESS_TERM-->| Session | | |||
skipping to change at page 18, line 27 ¶ | skipping to change at page 19, line 27 ¶ | |||
Receive SESS_TERM | | Receive SESS_TERM | | |||
| | | | | | |||
+-------------+ | +-------------+ | |||
Figure 14: Session Termination [ST] from the Responder | Figure 14: Session Termination [ST] from the Responder | |||
3.4. Transfer Segmentation Policies | 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 SESS_INIT message to determine the largest | |||
segment size, and a transmitting node can segment a transfer into any | acceptable segment size, and a transmitting node can segment a | |||
sizes smaller than the receiver's Segment MRU. It is a network | transfer into any sizes smaller than the receiver's Segment MRU. It | |||
administration matter to determine an appropriate segmentation policy | is a network administration matter to determine an appropriate | |||
for entities operating TCPCL, but guidance given here can be used to | segmentation policy for entities operating TCPCL, but guidance given | |||
steer policy toward performance goals. It is also advised to | here can be used to steer policy toward performance goals. It is | |||
consider the Segment MRU in relation to chunking/packetization | also advised to consider the Segment MRU in relation to chunking/ | |||
performed by TLS, TCP, and any intermediate network-layer nodes. | packetization 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 TCP throughput is dynamic, the transfer | |||
transfer segmentation size can also be dynamic in order to control | segmentation size can also be dynamic in order to control message | |||
message transmission duration. | transmission duration. | |||
Many other policies can be established in a TCPCL network between the | Many other policies can be established in a TCPCL network between the | |||
two extremes of minimum overhead (large MRU, single-segment) and | two extremes of minimum overhead (large MRU, single-segment) and | |||
predictable message sizing (small MRU, highly segmented). Different | predictable message sizing (small MRU, highly segmented). Different | |||
policies can be applied to each transfer stream to and from any | policies can be applied to each transfer stream to and from any | |||
particular node. Additionally, future header and transfer extension | particular node. Additionally, future header and transfer extension | |||
types can apply further nuance to transfer policies and policy | types can apply further nuance to transfer policies and policy | |||
negotiation. | negotiation. | |||
3.5. Example Message Exchange | 3.5. Example Message Exchange | |||
skipping to change at page 19, line 44 ¶ | skipping to change at page 20, line 45 ¶ | |||
also possible to pipeline multiple XFER_SEGMENT messages for | also possible to pipeline multiple XFER_SEGMENT messages for | |||
different bundles without necessarily waiting for XFER_ACK messages | different bundles without necessarily waiting for XFER_ACK messages | |||
to be returned for each one. However, interleaving data segments | to be returned for each one. However, interleaving data segments | |||
from different bundles is not allowed. | from different bundles is not allowed. | |||
No errors or rejections are shown in this example. | No errors or rejections are shown in this example. | |||
Entity A Entity B | Entity A Entity B | |||
======== ======== | ======== ======== | |||
+-------------------------+ | +-------------------------+ | |||
| Open TCP Connnection | -> +-------------------------+ | | Open TCP Connection | -> +-------------------------+ | |||
+-------------------------+ <- | Accept Connection | | +-------------------------+ <- | Accept Connection | | |||
+-------------------------+ | +-------------------------+ | |||
+-------------------------+ | +-------------------------+ | |||
| Contact Header | -> +-------------------------+ | | Contact Header | -> +-------------------------+ | |||
+-------------------------+ <- | Contact Header | | +-------------------------+ <- | Contact Header | | |||
+-------------------------+ | +-------------------------+ | |||
+-------------------------+ | +-------------------------+ | |||
| SESS_INIT | -> +-------------------------+ | | SESS_INIT | -> +-------------------------+ | |||
+-------------------------+ <- | SESS_INIT | | +-------------------------+ <- | SESS_INIT | | |||
+-------------------------+ | +-------------------------+ | |||
+-------------------------+ | +-------------------------+ | |||
| XFER_SEGMENT (start) | -> | | XFER_SEGMENT (start) | -> | |||
| Transfer ID [I1] | | | Transfer ID [I1] | | |||
| Length [L1] | | | Length [L1] | | |||
| Bundle Data 0..(L1-1) | | | Bundle Data 0..(L1-1) | | |||
skipping to change at page 20, line 49 ¶ | skipping to change at page 21, line 51 ¶ | |||
+-------------------------+ +-------------------------+ | +-------------------------+ +-------------------------+ | |||
Figure 15: 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 can be opened proactively and | |||
maintained for as long as is possible given the network conditions, | maintained for as long as is possible given the network conditions, | |||
while other sessions MAY be opened only when there is a bundle that | while other sessions are be opened only when there is a bundle that | |||
is queued for transmission and the routing algorithm selects a | is queued for transmission and the routing algorithm selects a | |||
certain next-hop node. | certain next-hop node. | |||
4.1. TCP Connection | 4.1. TCP Connection | |||
To establish a TCPCL session, an entity MUST first establish a TCP | To establish a TCPCL session, an entity MUST first establish a TCP | |||
connection with the intended peer entity, typically by using the | connection with the intended peer entity, typically by using the | |||
services provided by the operating system. Destination port number | services provided by the operating system. Destination port number | |||
4556 has been assigned by IANA as the Registered Port number for the | 4556 has been assigned by IANA as the Registered Port number for the | |||
TCP convergence layer. Other destination port numbers MAY be used | TCP convergence layer. Other destination port numbers MAY be used | |||
per local configuration. Determining a peer's destination port | per local configuration. Determining a peer's destination port | |||
number (if different from the registered TCPCL port number) is up to | number (if different from the registered TCPCL port number) is up to | |||
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 NOT retry | |||
connection setup no earlier than some delay time from the last | the connection setup earlier than some delay time from the last | |||
attempt, and it SHOULD use a (binary) exponential back-off mechanism | attempt, and it SHOULD use a (binary) exponential back-off mechanism | |||
to increase this delay in case of repeated failures. The upper limit | 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 | 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 | longer than one minute (60 seconds) before signaling to the BP agent | |||
connection cannot be made. | that a connection cannot be made. | |||
Once a TCP connection is established, the active entity SHALL | Once a TCP connection is established, the active entity SHALL | |||
immediately transmit its contact header. Upon reception of a contact | immediately transmit its Contact Header. Once a TCP connection is | |||
header, the passive entity SHALL transmit its contact header. If the | established, the passive entity SHALL wait for the peer's Contact | |||
passive entity does not receive a Contact Header after some | Header. If the passive entity does not receive a Contact Header | |||
implementation-defined time duration after TCP connection is | after some implementation-defined time duration after TCP connection | |||
established, the entity SHALL close the TCP connection. The ordering | is established, the entity SHALL close the TCP connection. Entities | |||
of the contact header exchange allows the passive entity to avoid | SHOULD choose a Contact Header reception timeout interval no longer | |||
than 10 minutes (600 seconds). Upon reception of a Contact Header, | ||||
the passive entity SHALL transmit its Contact Header. The ordering | ||||
of the Contact Header exchange allows the passive entity to avoid | ||||
allocating resources to a potential TCPCL session until after a valid | allocating resources to a potential TCPCL session until after a valid | |||
contact header has been received from the passive entity. This | Contact Header has been received from the active entity. This | |||
ordering also allows the passive peer to adapt to alternate TCPCL | ordering also allows the passive peer to adapt to alternate TCPCL | |||
protocol versions. | protocol versions. | |||
The format of the contact header is described in Section 4.2. | The format of the Contact Header is described in Section 4.2. | |||
Because the TCPCL protocol version in use is part of the initial | Because the TCPCL protocol version in use is part of the initial | |||
contact header, nodes using TCPCL version 4 can coexist on a network | Contact Header, nodes using TCPCL version 4 can coexist on a network | |||
with nodes using earlier TCPCL versions (with some negotiation needed | with nodes using earlier TCPCL versions (with some negotiation needed | |||
for interoperation as described in Section 4.3). | for interoperation as described in Section 4.3). | |||
4.2. Contact Header | 4.2. Contact Header | |||
This section describes the format of the contact header and the | This section describes the format of the Contact Header and the | |||
meaning of its fields. | meaning of its fields. | |||
If an entity is capable of exchanging messages according to TLS 1.2 | If an entity is capable of exchanging messages according to TLS 1.3 | |||
[RFC5246] or any successors [RFC8446] that are compatible with TLS | [RFC8446] or any successors which are compatible with that TLS | |||
1.2, the CAN_TLS flag within its contanct header SHALL be set to 1. | ClientHello, the the CAN_TLS flag within its Contact Header SHALL be | |||
This behavor prefers the use of TLS when possible, even if security | set to 1. This behavior prefers the use of TLS when possible, even | |||
policy does not allow or require authentication. This follows the | if security policy does not allow or require authentication. This | |||
opportunistic security model of [RFC7435]. | follows the opportunistic security model of [RFC7435]. | |||
Upon receipt of the contact header, both entities perform the | Upon receipt of the Contact Header, both entities perform the | |||
validation and negotiation procedures defined in Section 4.3. After | validation and negotiation procedures defined in Section 4.3. After | |||
receiving the contact header from the other entity, either entity MAY | receiving the Contact Header from the other entity, either entity MAY | |||
refuse the session by sending a SESS_TERM message with an appropriate | refuse the session by sending a SESS_TERM message with an appropriate | |||
reason code. | reason code. | |||
The format for the Contact Header is as follows: | The format for the Contact Header is as follows: | |||
1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 | 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 | |||
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 16: Contact Header Format | Figure 16: Contact Header Format | |||
See Section 4.3 for details on the use of each of these contact | See Section 4.3 for details on the use of each of these Contact | |||
header fields. | Header fields. | |||
The fields of the contact header are: | The fields of the Contact Header are: | |||
magic: A four-octet field that always contains the octet sequence | magic: A four-octet field that always contains the octet sequence | |||
0x64 0x74 0x6E 0x21, i.e., the text string "dtn!" in US-ASCII (and | 0x64 0x74 0x6E 0x21, i.e., the text string "dtn!" in US-ASCII (and | |||
UTF-8). | UTF-8). | |||
Version: A one-octet field value containing the value 4 (current | Version: A one-octet field value containing the value 4 (current | |||
version of the TCPCL). | version of the TCPCL). | |||
Flags: A one-octet field of single-bit flags, interpreted according | Flags: A one-octet field of single-bit flags, interpreted according | |||
to the descriptions in Table 1. All reserved header flag bits | to the descriptions in Table 1. All reserved header flag bits | |||
skipping to change at page 23, line 18 ¶ | skipping to change at page 24, line 20 ¶ | |||
| 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 | | |||
+----------+--------+-----------------------------------------------+ | +----------+--------+-----------------------------------------------+ | |||
Table 1: Contact Header Flags | Table 1: Contact Header Flags | |||
4.3. Contact Validation and Negotiation | 4.3. Contact Validation and Negotiation | |||
Upon reception of the contact header, each 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, a passive | |||
MAY elect to hold an invalid connection open and idle for some time | entity MAY deny new TCP connections from a specific peer address for | |||
before ending it. | a period of time after one or more connections fail to provide a | |||
decodable Contact Header. | ||||
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 entity always sends its Contact Header first and waits for a | active entity always sends its Contact Header first and waits for a | |||
response from the passive entity. The active entity can repeatedly | response from the passive entity. During contact initiation, the | |||
attempt different protocol versions in descending order until the | active TCPCL node SHALL send the highest TCPCL protocol version on a | |||
passive entity accepts one with a corresponding Contact Header reply. | first session attempt for a TCPCL peer. If the active entity | |||
Only upon response of a Contact Header from the passive entity is the | receives a Contact Header with a lower protocol version than the one | |||
TCPCL protocol version established and parameter negotiation begun. | sent earlier on the TCP connection, the TCP connection SHALL be | |||
closed. If the active entity receives a SESS_TERM message with | ||||
reason of "Version Mismatch", that node MAY attempt further TCPCL | ||||
sessions with the peer using earlier protocol version numbers in | ||||
decreasing order. Managing multi-TCPCL-session state such as this is | ||||
an implementation matter. | ||||
During contact initiation, the active TCPCL node SHALL send the | If the passive entity receives a Contact Header containing a version | |||
highest TCPCL protocol version on a first session attempt for a TCPCL | that is not a version of the TCPCL that the entity implements, then | |||
peer. If the active entity receives a Contact Header with a | the entity SHALL send its Contact Header and immediately terminate | |||
different protocol version than the one sent earlier on the TCP | the session with a reason code of "Version mismatch". If the passive | |||
connection, the TCP connection SHALL be closed. If the active entity | entity receives a Contact Header with a version that is lower than | |||
receives a SESS_TERM message with reason of "Version Mismatch", that | the latest version of the protocol that the entity implements, the | |||
node MAY attempt further TCPCL sessions with the peer using earlier | entity MAY either terminate the session (with a reason code of | |||
protocol version numbers in decreasing order. Managing multi-TCPCL- | "Version mismatch") or adapt its operation to conform to the older | |||
session state such as this is an implementation matter. | version of the protocol. The decision of version fall-back is an | |||
implementation matter. | ||||
If the passive entity receives a contact header containing a version | The negotiated contact parameters defined by this specification are | |||
that is greater than the current version of the TCPCL that the node | described in the following paragraphs. | |||
implements, then the node SHALL shutdown the session with a reason | ||||
code of "Version mismatch". If the passive entity receives a contact | TCPCL Version: Both Contact Headers of a successful contact | |||
header with a version that is lower than the version of the protocol | negotiation have identical TCPCL Version numbers as described | |||
that the node implements, the node MAY either terminate the session | above. Only upon response of a Contact Header from the passive | |||
(with a reason code of "Version mismatch") or the node MAY adapt its | entity is the TCPCL protocol version established and session | |||
operation to conform to the older version of the protocol. The | negotiation begun. | |||
decision of version fall-back is an implementation matter. | ||||
Enable TLS: Negotiation of the Enable TLS parameter is performed by | ||||
taking the logical AND of the two Contact Headers' CAN_TLS flags. | ||||
A local security policy is then applied to determine of the | ||||
negotiated value of Enable TLS is acceptable. It can be a | ||||
reasonable security policy to require or disallow the use of TLS | ||||
depending upon the desired network flows. Because this state is | ||||
negotiated over an unsecured medium, there is a risk of a TLS | ||||
Stripping as described in Section 8. If the Enable TLS state is | ||||
unacceptable, the entity SHALL terminate the session with a reason | ||||
code of "Contact Failure". Note that this contact failure reason | ||||
is different than a failure of TLS handshake or TLS authentication | ||||
after an agreed-upon and acceptable Enable TLS state. If the | ||||
negotiated Enable TLS value is true and acceptable then TLS | ||||
negotiation feature (described in Section 4.4) begins immediately | ||||
following the Contact Header exchange. | ||||
4.4. Session Security | 4.4. Session Security | |||
This version of the TCPCL supports establishing a Transport Layer | This version of the TCPCL 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 TLS is | |||
established, there is no mechanism available to downgrade a TCPCL | established, there is no mechanism available to downgrade the TCPCL | |||
session to non-TLS operation. If this is desired, the entire TCPCL | session to non-TLS operation. | |||
session MUST be terminated and a new non-TLS-negotiated session | ||||
established. | ||||
Once established, the lifetime of a TLS session SHALL be bound to the | Once established, the lifetime of a TLS connection SHALL be bound to | |||
lifetime of the underlying TCP connection. Immediately prior to | the lifetime of the underlying TCP connection. Immediately prior to | |||
actively ending a TLS session after TCPCL session termination, the | actively ending a TLS connection after TCPCL session termination, the | |||
peer which sent the original (non-reply) SESS_TERM message SHOULD | peer which sent the original (non-reply) SESS_TERM message SHOULD | |||
follow the Closure Alert procedure of [RFC5246] to cleanly terminate | follow the Closure Alert procedure of [RFC8446] to cleanly terminate | |||
the TLS session. Because each TCPCL message is either fixed-length | the TLS connection. Because each TCPCL message is either fixed- | |||
or self-indicates its length, the lack of a TLS Closure Alert will | length or self-indicates its length, the lack of a TLS Closure Alert | |||
not cause data truncation or corruption. | will not cause data truncation or corruption. | |||
Subsequent TCPCL session attempts to the same passive entity MAY | Subsequent TCPCL session attempts to the same passive entity MAY | |||
attempt use the TLS session resumption feature. There is no | attempt use the TLS connection resumption feature. There is no | |||
guarantee that the passive entity will accept the request to resume a | guarantee that the passive entity will accept the request to resume a | |||
TLS session, and the active entity cannot assume any resumption | TLS session, and the active entity cannot assume any resumption | |||
outcome. | outcome. | |||
4.4.1. TLS Handshake | 4.4.1. Entity Identification | |||
The TCPCL uses the TLS for certificate exchange in both directions to | ||||
identify each entity and to allow each entity to authenticate its | ||||
peer. Each certificate can potentially identify multiple entities | ||||
and there is no problem using such a certificate as long as the | ||||
identifiers are sufficient to meet authentication policy (as | ||||
described in later sections) for the entity which presents it. | ||||
The public key infrastructure (PKI) Certificate Authority (CA) or | ||||
authorities available within a network are likely not controlled by | ||||
the certificate end users and CA policies vary widely between | ||||
networks and PKI management tools. For this reason, the TCPCL | ||||
defines a prioritized list of what a certificate can identify about a | ||||
TCPCL entity: | ||||
Node ID: The ideal certificate identity is the Node ID of the entity | ||||
using the NODE-ID definition below. When the Node ID is | ||||
identified, there is no need for any lower-level identification to | ||||
take place. | ||||
Host Name: If CA policy forbids a certificate to contain an | ||||
arbitrary NODE-ID but allows a DNS-ID to be identified then one or | ||||
more stable host names can be identified in the certificate. The | ||||
use of wildcard DNS-ID is discouraged due to the complex rules for | ||||
matching and dependence on implementation support for wildcard | ||||
matching. | ||||
Network Address: If no stable host name is available but a stable | ||||
network address is available and CA policy allows a certificate to | ||||
contain a NETWORK-ID (as defined below) then one or more network | ||||
addresses can be identified in the certificate. There is no | ||||
wildcard-type address matching defined, so this is the least | ||||
robust | ||||
When only a DNS-ID or NETWORK-ID can be identified by a certificate, | ||||
it is implied that an entity which authenticates using that | ||||
certificate is trusted to provide a valid Node ID in its SESS_INIT; | ||||
the certificate itself does not actually authenticate that Node ID. | ||||
The RECOMMENDED security policy of an entity is to validate a peer | ||||
which authenticates its Node ID regardless of an authenticated host | ||||
name or address, and only consider the host/address authentication in | ||||
the absence of an authenticated Node ID. | ||||
This specification defines a NODE-ID of a certificate as being the | ||||
subjectAltName entry of type uniformResourceIdentifier whose value is | ||||
a URI consistent with the requirements of [RFC3986] and the URI | ||||
schemes of the IANA "Bundle Protocol URI Scheme Type" registry. This | ||||
is similar to the URI-ID of [RFC6125] but does not require any | ||||
structure to the scheme-specific-part of the URI. Unless specified | ||||
otherwise by the definition of the URI scheme being authenticated, | ||||
URI matching of a NODE-ID SHALL use the URI comparison logic of | ||||
[RFC3986] and scheme-based normalization of those schemes specified | ||||
in [I-D.ietf-dtn-bpbis]. A URI scheme can refine this "exact match" | ||||
logic with rules about how Node IDs within that scheme are to be | ||||
compared with the certificate-authenticated NODE-ID. | ||||
This specification defines a NETWORK-ID of a certificate as being the | ||||
subjectAltName entry of type iPAddress whose value is encoded | ||||
according to [RFC5280]. | ||||
4.4.2. TLS Handshake | ||||
The use of TLS is negotiated using the Contact Header as described in | The use of TLS is negotiated 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 TLS | session entities SHALL begin a TLS handshake in accordance with | |||
1.2 [RFC5246] or any successors that are compatible with TLS 1.2. By | [RFC8446]. By convention, this protocol uses the entity which | |||
convention, this protocol uses the node which initiated the | initiated the underlying TCP connection (the active peer) as the | |||
underlying TCP connection as the "client" role of the TLS handshake | "client" role of the TLS handshake request. | |||
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. | |||
The parameters within each TLS negotiation are implementation | The parameters within each TLS negotiation are implementation | |||
dependent but any TCPCL node SHALL follow all recommended practices | 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 [RFC7525], or any updates or successors that become part | |||
of BCP 195. Within each TLS handshake, the following requirements | of BCP 195. Within each TLS handshake, the following requirements | |||
apply (using the rough order in which they occur): | apply (using the rough order in which they occur): | |||
Client Hello: When a resolved host name was used to establish the | Client Hello: When a resolved host name was used to establish the | |||
TCP connection, the TLS ClientHello SHOULD include a Server Name | TCP connection, the TLS ClientHello SHOULD include a Server Name | |||
Indication (SNI) from the active entity in accordance with | Indication (SNI) in accordance with [RFC6066] containing that host | |||
[RFC6066]. When present, the SNI SHALL contain the same host name | name (of the passive entity) which was resolved. Note: The SNI | |||
used to establish the TCP connection. Note: The SNI text is the | text is the network-layer name for the passive entity, which is | |||
network-layer name for the passive entity, which is not the Node | not the Node ID of that entity. | |||
ID of that entity. | ||||
Server Certificate: The passive entity SHALL supply a certificate | Server Certificate: The passive entity SHALL supply a certificate | |||
within the TLS handshake to allow authentication of its side of | within the TLS handshake to allow authentication of its side of | |||
the session. When assigned a stable host name or address, the | the session. Unless prohibited by CA policy, the passive entity | |||
passive entity certificate SHOULD contain a subjectAltName entry | certificate SHALL contain a NODE-ID which authenticates the Node | |||
which authenticates that host name or address. The passive entity | ID of the peer. When assigned a stable host name, the passive | |||
certificate SHOULD contain a subjectAltName entry of type | entity certificate SHOULD contain a DNS-ID which authenticates | |||
uniformResourceIdentifier which authenticates the Node ID of the | that (fully qualified) name. When assigned a stable network | |||
peer. The passive entity MAY use the SNI host name to choose an | address, the passive entity certificate MAY contain a NETWORK-ID | |||
appropriate server-side certificate which authenticates that host | which authenticates that address. The passive entity MAY use the | |||
name and corresponding Node ID. | SNI host name to choose an appropriate server-side certificate | |||
which authenticates that host name. | ||||
Certificate Request: During TLS handshake, the passive entity SHALL | Certificate Request: During TLS handshake, the passive entity SHALL | |||
request a client-side certificate. | request a client-side certificate. | |||
Client Certificate: The active entity SHALL supply a certificate | Client Certificate: The active entity SHALL supply a certificate | |||
chain within the TLS handshake to allow authentication of its side | chain within the TLS handshake to allow authentication of its side | |||
of the session. When assigned a stable host name or address, the | of the session. Unless prohibited by CA policy, the active entity | |||
active entity certificate SHOULD contain a subjectAltName entry | certificate SHALL contain a NODE-ID which authenticates the Node | |||
which authenticates that host name or address. The active entity | ID of the peer. When assigned a stable host name, the active | |||
certificate SHOULD contain a subjectAltName entry of type | entity certificate SHOULD contain a DNS-ID which authenticates | |||
uniformResourceIdentifier which authenticates the Node ID of the | that (fully qualified) name. When assigned a stable network | |||
peer. | address, the active entity certificate MAY contain a NETWORK-ID | |||
which authenticates that address. | ||||
All certificates supplied during TLS handshake SHALL conform with the | All certificates supplied during TLS handshake SHALL conform to | |||
profile of [RFC5280], or any updates or successors to that profile. | [RFC5280], or any updates or successors to that profile. When a | |||
When a certificate is supplied during TLS handshake, the full | certificate is supplied during TLS handshake, the full certification | |||
certification chain SHOULD be included unless security policy | chain SHOULD be included unless security policy indicates that is | |||
indicates that is unnecessary. | unnecessary. | |||
If a TLS handshake cannot negotiate a TLS session, both entities of | If a TLS handshake cannot negotiate a TLS connection, both entities | |||
the TCPCL session SHALL close the TCP connection. At this point the | of the TCPCL session SHALL close the TCP connection. At this point | |||
TCPCL session has not yet been established so there is no TCPCL | the TCPCL session has not yet been established so there is no TCPCL | |||
session to terminate. This also avoids any potential security issues | session to terminate. | |||
assoicated with further TCP communication with an untrusted peer. | ||||
After a TLS session is successfully established, the active entity | After a TLS connection is successfully established, the active entity | |||
SHALL send a SESS_INIT message to begin session negotiation. This | SHALL send a SESS_INIT message to begin session negotiation. This | |||
session negotiation and all subsequent messaging are secured. | session negotiation and all subsequent messaging are secured. | |||
4.4.2. TLS Authentication | 4.4.3. TLS Authentication | |||
Using X.509 certificates exchanged during the TLS handshake, each of | Using X.509 certificates exchanged during the TLS handshake, each of | |||
the entities can attempt to authenticate its peer at the network | the entities can attempt to authenticate its peer Node ID directly or | |||
layer (host name and address) and at the application layer (BP Node | authenticate the peer host name or network address. The Node ID | |||
ID). The Node ID exchanged in the Session Initialization is likely | exchanged in the Session Initialization is likely to be used by the | |||
to be used by the BP agent for making transfer and routing decisions, | BP agent for making transfer and routing decisions, so attempting | |||
so attempting host name validation is optional while attempting Node | Node ID validation is required while attempting host name validation | |||
ID validation is required. The logic for attempting validation is | is optional. The logic for attempting validation is separate from | |||
separate from the logic for handling the result of validation, which | the logic for handling the result of validation, which is based on | |||
is based on local security policy. | local security policy. | |||
By using the SNI host name (see Section 4.4.1) a single passive | By using the SNI host name (see Section 4.4.2) a single passive | |||
entity can act as a convergence layer for multiple BP agents with | entity can act as a convergence layer for multiple BP agents with | |||
distinct Node IDs. When this "virtual host" behavior is used, the | distinct Node IDs. When this "virtual host" behavior is used, the | |||
host name is used as the indication of which BP Node the passive | host name is used as the indication of which BP Node the active | |||
entity is attempting to communicate with. A virtual host CL entity | entity is attempting to communicate with. A virtual host CL entity | |||
can be authenticated by a certificate containing all of the host | can be authenticated by a certificate containing all of the host | |||
names and/or Node IDs being hosted or by several certificates each | names and/or Node IDs being hosted or by several certificates each | |||
authenticating a single host name and/or Node ID. | authenticating a single host name and/or Node ID, using the SNI value | |||
from the peer to select which certificate to use. | ||||
Any certificate received during TLS handshake SHALL be validated up | Any certificate received during TLS handshake SHALL be validated up | |||
to one or more trusted certificate authority (CA) certificates. If | to one or more trusted CA certificates. If certificate validation | |||
certificate validation fails or if security policy disallows a | fails or if security policy disallows a certificate for any reason, | |||
certificate for any reason, the entity SHALL terminate the session | the entity SHALL terminate the session (with a reason code of | |||
(with a reason code of "Contact Failure"). | "Contact Failure"). | |||
Either during or immediately after the TLS handshake, each side of | Either during or immediately after the TLS handshake, the active | |||
the TCP connection SHOULD perform host name validation of its peer in | entity SHALL attempt to authenticate the host name (of the passive | |||
accordance with [RFC6125] unless it is not needed by security policy. | entity) used to initiate the TCP connection using any DNS-ID of the | |||
The active entity SHALL attempt to authenticate the host name (of the | peer certificate. If host name validation fails (including failure | |||
passive entity) used to initiate the TCP connection. The active | because the certificate does not contain any DNS-ID) and security | |||
entity MAY attempt to authenticate the IP address of the other side | policy disallows an unauthenticated host, the entity SHALL terminate | |||
of the TCP connection. The passive entity SHALL attempt to | the session (with a reason code of "Contact Failure"). | |||
authenticate the IP address of the other side of the TCP connection. | ||||
The passive entity MAY use the IP address to resolve one or more host | Either during or immediately after the TLS handshake, the active | |||
names of the active entity and attempt to authenticate those. If | entity SHALL attempt to authenticate the IP address of the other side | |||
host name validation fails (including failure because the certificate | of the TCP connection using any NETWORK-ID of the peer certificate. | |||
does not contain any DNS-ID) and security policy disallows an | Either during or immediately after the TLS handshake, the passive | |||
unauthticated host, the entity SHALL terminate the session (with a | entity SHALL attempt to authenticate the IP address of the other side | |||
reason code of "Contact Failure"). | of the TCP connection using any NETWORK-ID of the peer certificate. | |||
If host address validation fails (including failure because the | ||||
certificate does not contain any NETWORK-ID) and security policy | ||||
disallows an unauthenticated host, the entity SHALL terminate the | ||||
session (with a reason code of "Contact Failure"). | ||||
Immediately before Session Parameter Negotiation, each side of the | Immediately before Session Parameter Negotiation, each side of the | |||
session SHALL perform Node ID validation of its peer as described | session SHALL perform Node ID validation of its peer as described | |||
below. Node ID validation SHALL succeed if the associated | below. Node ID validation SHALL succeed if the associated | |||
certificate contains a subjectAltName entry of type | certificate includes a NODE-ID whose value matches the Node ID of the | |||
uniformResourceIdentifier whose value matches the Node ID of the | TCPCL entity. If Node ID validation fails (including failure because | |||
TCPCL entity. Unless specified otherwise by the definition of the | the certificate does not contain any NODE-ID) and security policy | |||
URI scheme being authenticated, URI matching of Node IDs SHALL use | disallows an unauthenticated Node ID, the entity SHALL terminate the | |||
the URI comparison logic of [RFC3986] and scheme-based normalization | session (with a reason code of "Contact Failure"). | |||
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. A URI scheme can refine this "exact | ||||
match" logic with rules about how Node IDs within that scheme are to | ||||
be compared with the certificate-authenticated URI. If Node ID | ||||
validation fails (including failure because the certificate does not | ||||
contain any subjectAltName URI) and security policy disallows an | ||||
unauthticated Node ID, the entity SHALL terminate the session (with a | ||||
reason code of "Contact Failure"). | ||||
4.4.3. Example TLS Initiation | 4.4.4. Example TLS Initiation | |||
A summary of a typical TLS use is shown in the sequence in Figure 17 | A summary of a typical TLS use is shown in the sequence in Figure 17 | |||
below. | below. In this example the active peer terminates the session but | |||
termination can be initiated from either peer. | ||||
Entity A Entity B | Entity A Entity B | |||
active peer passive peer | active peer passive peer | |||
+-------------------------+ | +-------------------------+ | |||
| Open TCP Connnection | -> +-------------------------+ | | Open TCP Connection | -> +-------------------------+ | |||
+-------------------------+ <- | 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) | | |||
skipping to change at page 28, line 50 ¶ | skipping to change at page 31, line 7 ¶ | |||
+-------------------------+ | +-------------------------+ | |||
+-------------------------+ +-------------------------+ | +-------------------------+ +-------------------------+ | |||
| TCP Close | -> <- | TCP Close | | | TCP Close | -> <- | TCP Close | | |||
+-------------------------+ +-------------------------+ | +-------------------------+ +-------------------------+ | |||
Figure 17: A simple visual example of TCPCL TLS Establishment between | Figure 17: A simple visual example of TCPCL TLS Establishment between | |||
two entities | two entities | |||
4.5. Message Header | 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 18: Format of the Message Header | Figure 18: Format of the Message Header | |||
skipping to change at page 29, line 27 ¶ | skipping to change at page 32, line 15 ¶ | |||
+--------------+------+---------------------------------------------+ | +--------------+------+---------------------------------------------+ | |||
| Name | Code | Description | | | Name | Code | Description | | |||
+--------------+------+---------------------------------------------+ | +--------------+------+---------------------------------------------+ | |||
| SESS_INIT | 0x07 | Contains the session parameter | | | SESS_INIT | 0x07 | Contains the session parameter | | |||
| | | inputs from one of the entities, | | | | | inputs from one of the entities, | | |||
| | | as described in Section 4.6. | | | | | as described in Section 4.6. | | |||
| | | | | | | | | | |||
| SESS_TERM | 0x05 | Indicates that one of the | | | SESS_TERM | 0x05 | Indicates that one of the | | |||
| | | entities participating in the session | | | | | entities participating in the session | | |||
| | | wishes to cleanly terminate the session, as | | | | | wishes to cleanly terminate the session, as | | |||
| | | described in Section 6. | | | | | described in Section 6.1. | | |||
| | | | | | | | | | |||
| XFER_SEGMENT | 0x01 | Indicates the transmission of | | | XFER_SEGMENT | 0x01 | Indicates the transmission of | | |||
| | | a segment of bundle data, as described in | | | | | a segment of bundle data, as described in | | |||
| | | Section 5.2.2. | | | | | Section 5.2.2. | | |||
| | | | | | | | | | |||
| XFER_ACK | 0x02 | Acknowledges reception of a | | | XFER_ACK | 0x02 | Acknowledges reception of a | | |||
| | | data segment, as described in | | | | | data segment, as described in | | |||
| | | Section 5.2.3. | | | | | Section 5.2.3. | | |||
| | | | | | | | | | |||
| XFER_REFUSE | 0x03 | Indicates that the | | | XFER_REFUSE | 0x03 | Indicates that the | | |||
| | | transmission of the current bundle SHALL be | | | | | transmission of the current bundle SHALL be | | |||
| | | stopped, as described in | | | | | stopped, as described in | | |||
| | | Section 5.2.4. | | | | | Section 5.2.4. | | |||
| | | | | | | | | | |||
| KEEPALIVE | 0x04 | Used to keep TCPCL session | | | KEEPALIVE | 0x04 | Used to keep TCPCL session | | |||
| | | active, as described in Section | | | | | active, as described in | | |||
| | | 5.1.1. | | | | | Section 5.1.1. | | |||
| | | | | | | | | | |||
| MSG_REJECT | 0x06 | Contains a TCPCL message | | | MSG_REJECT | 0x06 | Contains a TCPCL message | | |||
| | | rejection, as described in | | | | | rejection, as described in | | |||
| | | Section 5.1.2. | | | | | Section 5.1.2. | | |||
+--------------+------+---------------------------------------------+ | +--------------+------+---------------------------------------------+ | |||
Table 2: TCPCL Message Types | Table 2: TCPCL Message Types | |||
4.6. Session Initialization Message (SESS_INIT) | 4.6. Session Initialization Message (SESS_INIT) | |||
skipping to change at page 30, line 39 ¶ | skipping to change at page 33, line 29 ¶ | |||
| Items Length (U32) | | | Items Length (U32) | | |||
+-----------------------------+ | +-----------------------------+ | |||
| Session Extension | | | Session Extension | | |||
| Items (var.) | | | Items (var.) | | |||
+-----------------------------+ | +-----------------------------+ | |||
Figure 19: SESS_INIT Format | Figure 19: SESS_INIT Format | |||
The fields of the SESS_INIT message are: | The fields of the SESS_INIT message are: | |||
Keepalive Interval: A 16-bit unsigned integer indicating the | Keepalive Interval: A 16-bit unsigned integer indicating the minimum | |||
interval, in seconds, between any subsequent messages being | interval, in seconds, to negotiate the Session Keepalive using the | |||
transmitted by the peer. The peer receiving this contact header | method of Section 4.7. | |||
uses this interval to determine how long to wait after any last- | ||||
message transmission and a necessary subsequent KEEPALIVE message | ||||
transmission. | ||||
Segment MRU: A 64-bit unsigned integer indicating the largest | Segment MRU: A 64-bit unsigned integer indicating the largest | |||
allowable single-segment data payload size to be received in this | allowable single-segment data payload size to be received in this | |||
session. Any XFER_SEGMENT sent to this peer SHALL have a data | session. Any XFER_SEGMENT sent to this peer SHALL have a data | |||
payload no longer than the peer's Segment MRU. The two entities | payload no longer than the peer's Segment MRU. The two entities | |||
of a single session MAY have different Segment MRUs, and no | of a single session MAY have different Segment MRUs, and no | |||
relation between the two is required. | 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. | |||
skipping to change at page 31, line 22 ¶ | skipping to change at page 34, line 8 ¶ | |||
Node ID Length and Node ID Data: Together these fields represent a | Node ID Length and Node ID Data: Together these fields represent a | |||
variable-length text string. The Node ID Length is a 16-bit | variable-length text string. The Node ID Length is a 16-bit | |||
unsigned integer indicating the number of octets of Node ID Data | unsigned integer indicating the number of octets of Node ID Data | |||
to follow. A zero-length Node ID SHALL be used to indicate the | to follow. A zero-length Node ID SHALL be used to indicate the | |||
lack of Node ID rather than a truly empty Node ID. This case | lack of Node ID rather than a truly empty Node ID. This case | |||
allows an entity to avoid exposing Node ID information on an | allows an entity to avoid exposing Node ID information on an | |||
untrusted network. A non-zero-length Node ID Data SHALL contain | untrusted network. A non-zero-length Node ID Data SHALL contain | |||
the UTF-8 encoded Node ID of the Entity which sent the SESS_INIT | the UTF-8 encoded Node ID of the Entity which sent the SESS_INIT | |||
message. Every Node ID SHALL be a URI consistent with the | message. Every Node ID SHALL be a URI consistent with the | |||
requirements of [RFC3986] and the URI schemes of | requirements of [RFC3986] and the URI schemes of the IANA "Bundle | |||
[I-D.ietf-dtn-bpbis]. The Node ID itself can be authenticated as | Protocol URI Scheme Type" registry. The Node ID itself can be | |||
described in Section 4.4.2. | authenticated as described in Section 4.4.3. | |||
Session Extension Length and Session Extension Items: | Session Extension Length and Session Extension Items: | |||
Together these fields represent protocol extension data not | Together these fields represent protocol extension data not | |||
defined by this specification. The Session Extension Length is | defined by this specification. The Session Extension Length is | |||
the total number of octets to follow which are used to encode the | the total number of octets to follow which are used to encode the | |||
Session Extension Item list. The encoding of each Session | Session Extension Item list. The encoding of each Session | |||
Extension Item is within a consistent data container as described | Extension Item is within a consistent data container as described | |||
in Section 4.8. The full set of Session Extension Items apply for | in Section 4.8. The full set of Session Extension Items apply for | |||
the duration of the TCPCL session to follow. The order and | the duration of the TCPCL session to follow. The order and | |||
mulitplicity of these Session Extension Items MAY be significant, | multiplicity of these Session Extension Items is significant, as | |||
as defined in the associated type specification(s). | defined in the associated type specification(s). | |||
4.7. Session Parameter Negotiation | 4.7. Session Parameter Negotiation | |||
An entity calculates the parameters for a TCPCL session by | An entity calculates the parameters for a TCPCL session by | |||
negotiating the values from its own preferences (conveyed by the | negotiating the values from its own preferences (conveyed by the | |||
contact header it sent to the peer) with the preferences of the peer | SESS_INIT it sent to the peer) with the preferences of the peer node | |||
node (expressed in the contact header that it received from the | (expressed in the SESS_INIT that it received from the peer). The | |||
peer). The negotiated parameters defined by this specification are | negotiated parameters defined by this specification are described in | |||
described in the following paragraphs. | the following paragraphs. | |||
Transfer MTU and Segment MTU: The maximum transmit unit (MTU) for | Transfer MTU and Segment MTU: The maximum transmit unit (MTU) for | |||
whole transfers and individual segments are idententical to the | whole transfers and individual segments are identical to the | |||
Transfer MRU and Segment MRU, respectively, of the recevied | Transfer MRU and Segment MRU, respectively, of the received | |||
contact header. A transmitting peer can send individual segments | Contact Header. A transmitting peer can send individual segments | |||
with any size smaller than the Segment MTU, depending on local | with any size smaller than the Segment MTU, depending on local | |||
policy, dynamic network conditions, etc. Determining the size of | policy, dynamic network conditions, etc. Determining the size of | |||
each transmitted segment is an implementation matter. If the | each transmitted segment is an implementation matter. If either | |||
either Transfer MRU or Segment MRU is unacceptable, the node SHALL | the Transfer MRU or Segment MRU is unacceptable, the entity SHALL | |||
terminate the session with a reason code of "Contact Failure". | terminate the session with a reason code of "Contact Failure". | |||
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 the two Contact Headers' | |||
Keepalive Interval. The Session Keepalive interval is a parameter | Keepalive Interval values. The Session Keepalive interval is a | |||
for the behavior described in Section 5.1.1. If the Session | parameter for the behavior described in Section 5.1.1. If the | |||
Keepalive interval is unacceptable, the node SHALL terminate the | Session Keepalive interval is unacceptable, the entity SHALL | |||
session with a reason code of "Contact Failure". | terminate the session with a reason code of "Contact Failure". | |||
Note: a negotiated Session Keepalive of zero indicates that | ||||
Enable TLS: Negotiation of the Enable TLS parameter is performed by | KEEPALIVEs are disabled. | |||
taking the logical AND of the two contact headers' CAN_TLS flags. | ||||
A local security policy is then applied to determine of the | ||||
negotiated value of Enable TLS is acceptable. It can be a | ||||
reasonable security policy to both require or disallow the use of | ||||
TLS depending upon the desired network flows. Because this state | ||||
is negotiated over an unsecured medium, there is a risk of a TLS | ||||
Stripping as described in Section 8. If the Enable TLS state is | ||||
unacceptable, the node SHALL terminate the session with a reason | ||||
code of "Contact Failure". Note that this contact failure reason | ||||
is different than a failure of TLS handshake or TLS authentication | ||||
after an agreed-upon and acceptable Enable TLS state. If the | ||||
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 20. | Type-Length-Value (TLV) container form as indicated in Figure 20. | |||
The fields of the Session Extension Item are: | The fields of the Session Extension Item are: | |||
Flags: A one-octet field containing generic bit flags about the | Item Flags: A one-octet field containing generic bit flags about the | |||
Item, which are listed in Table 3. All reserved header flag bits | Item, which are listed in Table 3. All reserved header flag bits | |||
SHALL be set to 0 by the sender. All reserved header flag bits | SHALL be set to 0 by the sender. All reserved header flag bits | |||
SHALL be ignored by the receiver. If a TCPCL entity receives a | 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 of 1, the entity SHALL close the TCPCL session with SESS_TERM | flag of 1, the entity SHALL close the TCPCL session with SESS_TERM | |||
reason code of "Contact Failure". If the CRITICAL flag is 0, an | reason code of "Contact Failure". If the CRITICAL flag is 0, an | |||
entity SHALL skip over and ignore any item with an unknown Item | entity SHALL skip over and ignore any item with an unknown Item | |||
Type. | 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 create an IANA registry for | |||
such codes (see Section 9.3). | such codes (see Section 9.3). | |||
Item Length: A 16-bit unsigned integer field containing the number | Item Length: A 16-bit unsigned integer field containing the number | |||
of Item Value octets to follow. | of Item Value octets to follow. | |||
Item Value: A variable-length data field which is interpreted | Item Value: A variable-length data field which is interpreted | |||
according to the associated Item Type. This specification places | according to the associated Item Type. This specification places | |||
no restrictions on an extension's use of available Item Value | no restrictions on an extension's use of available Item Value | |||
data. Extension specifications SHOULD avoid the use of large data | data. Extension specifications SHOULD avoid the use of large data | |||
lengths, as no bundle transfers can begin until the full extension | lengths, as no bundle transfers can begin until the full extension | |||
skipping to change at page 34, line 4 ¶ | skipping to change at page 36, line 23 ¶ | |||
Table 3: Session Extension Item Flags | Table 3: Session Extension Item Flags | |||
5. Established Session Operation | 5. Established Session Operation | |||
This section describes the protocol operation for the duration of an | This section describes the protocol operation for the duration of an | |||
established session, including the mechanism for transmitting bundles | established session, including the mechanism for transmitting bundles | |||
over the session. | over the session. | |||
5.1. Upkeep and Status Messages | 5.1. Upkeep and Status Messages | |||
5.1.1. Session Upkeep (KEEPALIVE) | 5.1.1. Session Upkeep (KEEPALIVE) | |||
The protocol includes a provision for transmission of KEEPALIVE | The protocol includes a provision for transmission of KEEPALIVE | |||
messages over the TCPCL session to help determine if the underlying | messages over the TCPCL session to help determine if the underlying | |||
TCP connection has been disrupted. | TCP connection has been disrupted. | |||
As described in Section 4.3, a negotiated parameter of each session | As described in Section 4.3, a negotiated parameter of each session | |||
is the Session Keepalive interval. If the negotiated Session | is the Session Keepalive interval. If the negotiated Session | |||
Keepalive is zero (i.e. one or both contact headers contains a zero | Keepalive is zero (i.e., one or both contact headers contains a zero | |||
Keepalive Interval), then the keepalive feature is disabled. There | Keepalive Interval), then the keepalive feature is disabled. There | |||
is no logical minimum value for the keepalive interval, but when used | is no logical minimum value for the keepalive interval (within the | |||
for many sessions on an open, shared network a short interval could | minimum imposed by the positive-value encoding), but when used for | |||
lead to excessive traffic. For shared network use, entities SHOULD | many sessions on an open, shared network a short interval could lead | |||
choose a keepalive interval no shorter than 30 seconds. There is no | to excessive traffic. For shared network use, entities SHOULD choose | |||
logical maximum value for the keepalive interval, but an idle TCP | a keepalive interval no shorter than 30 seconds. There is no logical | |||
connection is liable for closure by the host operating system if the | maximum value for the keepalive interval (within the maximum imposed | |||
keepalive time is longer than tens-of-minutes. Entities SHOULD | by the fixed-size encoding), but an idle TCP connection is liable for | |||
choose a keepalive interval no longer than 10 minutes (600 seconds). | closure by the host operating system if the keepalive time is longer | |||
than tens-of-minutes. Entities SHOULD choose a keepalive interval no | ||||
longer than 10 minutes (600 seconds). | ||||
Note: The Keepalive Interval SHOULD NOT be chosen too short as TCP | Note: The Keepalive Interval SHOULD NOT be chosen too short as TCP | |||
retransmissions MAY occur in case of packet loss. Those will have to | retransmissions MAY occur in case of packet loss. Those will have to | |||
be triggered by a timeout (TCP retransmission timeout (RTO)), which | be triggered by a timeout (TCP retransmission timeout (RTO)), which | |||
is dependent on the measured RTT for the TCP connection so that | is dependent on the measured RTT for the TCP connection so that | |||
KEEPALIVE messages MAY experience noticeable latency. | KEEPALIVE messages can experience noticeable latency. | |||
The format of a KEEPALIVE message is a one-octet message type code of | The format of a KEEPALIVE message is a one-octet message type code of | |||
KEEPALIVE (as described in Table 2) with no additional data. Both | KEEPALIVE (as described in Table 2) with no additional data. Both | |||
sides SHALL send a KEEPALIVE message whenever the negotiated interval | sides SHALL send a KEEPALIVE message whenever the negotiated interval | |||
has elapsed with no transmission of any message (KEEPALIVE or other). | has elapsed with no transmission of any message (KEEPALIVE or other). | |||
If no message (KEEPALIVE or other) has been received in a session | If no message (KEEPALIVE or other) has been received in a session | |||
after some implementation-defined time duration, then the node SHALL | after some implementation-defined time duration, then the entity | |||
terminate the session by transmitting a SESS_TERM message (as | SHALL terminate the session by transmitting a SESS_TERM message (as | |||
described in Section 6.1) with reason code "Idle Timeout". If | described in Section 6.1) with reason code "Idle Timeout". If | |||
configurable, the idle timeout duration SHOULD be no shorter than | configurable, the idle timeout duration SHOULD be no shorter than | |||
twice the keepalive interval. If not configurable, the idle timeout | twice the keepalive interval. If not configurable, the idle timeout | |||
duration SHOULD be exactly twice the keepalive interval. | duration SHOULD be exactly twice the keepalive interval. | |||
5.1.2. Message Rejection (MSG_REJECT) | 5.1.2. Message Rejection (MSG_REJECT) | |||
If a TCPCL node receives a message which is unknown to it (possibly | This message type is not expected to be seen in a well-functioning | |||
due to an unhandled protocol mismatch) or is inappropriate for the | session. Its purpose is to aid in troubleshooting bad entity | |||
current session state (e.g. a KEEPALIVE message received after | behavior by allowing the peer to observe why an entity is not | |||
contact header negotiation has disabled that feature), there is a | responding as expected to its messages. | |||
protocol-level message to signal this condition in the form of a | ||||
MSG_REJECT reply. | If a TCPCL entity receives a message type which is unknown to it | |||
(possibly due to an unhandled protocol version mismatch or a | ||||
incorrectly-negotiated session extension which defines a new message | ||||
type), the entity SHALL send a MSG_REJECT message with a Reason Code | ||||
of "Message Type Unknown" and close the TCP connection. If a TCPCL | ||||
entity receives a message type which is known but is inappropriate | ||||
for the negotiated session parameters (possibly due to incorrectly- | ||||
negotiated session extension), the entity SHALL send a MSG_REJECT | ||||
message with a Reason Code of "Message Unsupported". If a TCPCL | ||||
entity receives a message which is inappropriate for the current | ||||
session state (e.g., a SESS_INIT after the session has already been | ||||
established or an XFER_ACK message with an unknown Transfer ID), the | ||||
entity SHALL send a MSG_REJECT message with a Reason Code of "Message | ||||
Unexpected". | ||||
The format of a MSG_REJECT message is as follows in Figure 21. | 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 | | |||
+-----------------------------+ | +-----------------------------+ | |||
skipping to change at page 35, line 32 ¶ | skipping to change at page 38, line 20 ¶ | |||
response. | response. | |||
+-------------+------+----------------------------------------------+ | +-------------+------+----------------------------------------------+ | |||
| Name | Code | Description | | | Name | Code | Description | | |||
+-------------+------+----------------------------------------------+ | +-------------+------+----------------------------------------------+ | |||
| Message | 0x01 | A message was received with a | | | Message | 0x01 | A message was received with a | | |||
| Type | | Message Type code unknown to the TCPCL node. | | | Type | | Message Type code unknown to the TCPCL node. | | |||
| Unknown | | | | | Unknown | | | | |||
| | | | | | | | | | |||
| Message | 0x02 | A message was received but the | | | Message | 0x02 | A message was received but the | | |||
| Unsupported | | TCPCL node cannot comply with the message | | | Unsupported | | TCPCL entity cannot comply with the message | | |||
| | | contents. | | | | | contents. | | |||
| | | | | | | | | | |||
| Message | 0x03 | A message was received while the | | | Message | 0x03 | A message was received while the | | |||
| Unexpected | | session is in a state in which the message | | | Unexpected | | session is in a state in which the message | | |||
| | | is not expected. | | | | | is not expected. | | |||
+-------------+------+----------------------------------------------+ | +-------------+------+----------------------------------------------+ | |||
Table 4: MSG_REJECT Reason Codes | Table 4: MSG_REJECT Reason Codes | |||
5.2. Bundle Transfer | 5.2. Bundle Transfer | |||
All of the messages in this section are directly associated with | All of the messages in this section are directly associated with | |||
transferring a bundle between TCPCL entities. | transferring a bundle between TCPCL entities. | |||
A single TCPCL transfer results in a bundle (handled by the | A single TCPCL transfer results in a bundle (handled by the | |||
convergence layer as opaque data) being exchanged from one node to | convergence layer as opaque data) being exchanged from one node to | |||
the other. In TCPCL a transfer is accomplished by dividing a single | the other. In TCPCL a transfer is accomplished by dividing a single | |||
bundle up into "segments" based on the receiving-side Segment MRU | bundle up into "segments" based on the receiving-side Segment MRU | |||
(see Section 4.2). The choice of the length to use for segments is | (see Section 4.2). The choice of the length to use for segments is | |||
an implementation matter, but each segment MUST be no larger than the | an implementation matter, but each segment MUST NOT be larger than | |||
receiving node's maximum receive unit (MRU) (see the field Segment | the receiving node's maximum receive unit (MRU) (see the field | |||
MRU of Section 4.2). The first segment for a bundle is indicated by | Segment MRU of Section 4.2). The first segment for a bundle is | |||
the 'START' flag and the last segment is indicated by the 'END' flag. | indicated by the 'START' flag and the last segment is indicated by | |||
the 'END' flag. | ||||
A single transfer (and by extension a single segment) SHALL NOT | A single transfer (and by extension a single segment) SHALL NOT | |||
contain data of more than a single bundle. This requirement is | contain data of more than a single bundle. This requirement is | |||
imposed on the agent using the TCPCL rather than TCPCL itself. | imposed on the agent using the TCPCL rather than TCPCL itself. | |||
If multiple bundles are transmitted on a single TCPCL connection, | If multiple bundles are transmitted on a single TCPCL connection, | |||
they MUST be transmitted consecutively without interleaving of | they MUST be transmitted consecutively without interleaving of | |||
segments from multiple bundles. | segments from multiple bundles. | |||
5.2.1. Bundle Transfer ID | 5.2.1. Bundle Transfer ID | |||
Each of the bundle transfer messages contains a Transfer ID which is | Each of the bundle transfer messages contains a Transfer ID which is | |||
used to correlate messages (from both sides of a transfer) for each | used to correlate messages (from both sides of a transfer) for each | |||
bundle. A Transfer ID does not attempt to address uniqueness of the | bundle. A Transfer ID does not attempt to address uniqueness of the | |||
bundle data itself and has no relation to concepts such as bundle | bundle data itself and has no relation to concepts such as bundle | |||
fragmentation. Each invocation of TCPCL by the bundle protocol | fragmentation. Each invocation of TCPCL by the bundle protocol | |||
agent, requesting transmission of a bundle (fragmentary or | agent, requesting transmission of a bundle (fragmentary or | |||
otherwise), results in the initiation of a single TCPCL transfer. | otherwise), results in the initiation of a single TCPCL transfer. | |||
Each transfer entails the sending of a sequence of some number of | Each transfer entails the sending of a sequence of some number of | |||
XFER_SEGMENT and XFER_ACK messages; all are correlated by the same | XFER_SEGMENT and XFER_ACK messages; all are correlated by the same | |||
Transfer ID. | Transfer ID. The sending entity originates a transfer ID and the | |||
receiving entity uses that same Transfer ID in acknowledgements. | ||||
Transfer IDs from each node SHALL be unique within a single TCPCL | Transfer IDs from each node SHALL be unique within a single TCPCL | |||
session. The initial Transfer ID from each node SHALL have value | session. Upon exhaustion of the entire 64-bit Transfer ID space, the | |||
zero. Subsequent Transfer ID values SHALL be incremented from the | sending node SHALL terminate the session with SESS_TERM reason code | |||
prior Transfer ID value by one. Upon exhaustion of the entire 64-bit | "Resource Exhaustion". For bidirectional bundle transfers, a TCPCL | |||
Transfer ID space, the sending node SHALL terminate the session with | node SHOULD NOT rely on any relation between Transfer IDs originating | |||
SESS_TERM reason code "Resource Exhaustion". | from each side of the TCPCL session. | |||
For bidirectional bundle transfers, a TCPCL node SHOULD NOT rely on | Although there is not a strict requirement for Transfer ID initial | |||
any relation between Transfer IDs originating from each side of the | values or ordering (see Section 8.11), in the absence of any other | |||
TCPCL session. | mechanism for generating Transfer IDs an entity SHALL use the | |||
following algorithm: The initial Transfer ID from each node is zero | ||||
and subsequent Transfer ID values are incremented from the prior | ||||
Transfer ID value by one. | ||||
5.2.2. Data Transmission (XFER_SEGMENT) | 5.2.2. Data Transmission (XFER_SEGMENT) | |||
Each bundle is transmitted in one or more data segments. The format | Each bundle is transmitted in one or more data segments. The format | |||
of a XFER_SEGMENT message follows in Figure 22. | of a XFER_SEGMENT message follows in Figure 22. | |||
+------------------------------+ | +------------------------------+ | |||
| Message Header | | | Message Header | | |||
+------------------------------+ | +------------------------------+ | |||
| Message Flags (U8) | | | Message Flags (U8) | | |||
skipping to change at page 37, line 46 ¶ | skipping to change at page 40, line 46 ¶ | |||
Transfer Extension Length and Transfer Extension Items: | Transfer Extension Length and Transfer Extension Items: | |||
Together these fields represent protocol extension data for this | Together these fields represent protocol extension data for this | |||
specification. The Transfer Extension Length and Transfer | specification. The Transfer Extension 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 to 1 on the message. The Transfer Extension Length is the | is set to 1 on the message. The Transfer Extension Length is the | |||
total number of octets to follow which are used to encode the | total number of octets to follow which are used to encode the | |||
Transfer Extension Item list. The encoding of each Transfer | Transfer Extension Item list. The encoding of each Transfer | |||
Extension Item is within a consistent data container as described | Extension Item is within a consistent data container as described | |||
in Section 5.2.5. The full set of transfer extension items apply | in Section 5.2.5. The full set of transfer extension items apply | |||
only to the assoicated single transfer. The order and | only to the associated single transfer. The order and | |||
mulitplicity of these transfer extension items MAY be significant, | multiplicity of these transfer extension items is significant, as | |||
as defined in the associated type specification(s). | defined in the associated type specification(s). | |||
Data length: A 64-bit unsigned integer indicating the number of | Data length: A 64-bit unsigned integer indicating the number of | |||
octets in the Data contents to follow. | octets in the Data contents to follow. | |||
Data contents: The variable-length data payload of the message. | Data contents: The variable-length data payload of the message. | |||
+----------+--------+-----------------------------------------------+ | +----------+--------+-----------------------------------------------+ | |||
| Name | Code | Description | | | Name | Code | Description | | |||
+----------+--------+-----------------------------------------------+ | +----------+--------+-----------------------------------------------+ | |||
| END | 0x01 | If bit is set, indicates that this is the | | | END | 0x01 | If bit is set, indicates that this is the | | |||
| | | last segment of the transfer. | | | | | last segment of the transfer. | | |||
| | | | | | | | | | |||
| START | 0x02 | If bit is set, indicates that this is the | | | START | 0x02 | If bit is set, indicates that this is the | | |||
| | | first segment of the transfer. | | | | | first segment of the transfer. | | |||
| | | | | | | | | | |||
| Reserved | others | | | Reserved | others | | |||
+----------+--------+-----------------------------------------------+ | +----------+--------+-----------------------------------------------+ | |||
Table 5: XFER_SEGMENT Flags | Table 5: XFER_SEGMENT Flags | |||
The flags portion of the message contains two optional values in the | The flags portion of the message contains two flag values in the two | |||
two low-order bits, denoted 'START' and 'END' in Table 5. The | low-order bits, denoted 'START' and 'END' in Table 5. The 'START' | |||
'START' flag SHALL be set to 1 when transmitting the first segment of | flag SHALL be set to 1 when transmitting the first segment of a | |||
a transfer. The 'END' flag SHALL be set to 1 when transmitting the | transfer. The 'END' flag SHALL be set to 1 when transmitting the | |||
last segment of a transfer. In the case where an entire transfer is | last segment of a transfer. In the case where an entire transfer is | |||
accomplished in a single segment, both the 'START' and 'END' flags | accomplished in a single segment, both the 'START' and 'END' flags | |||
SHALL be set to 1. | SHALL be set to 1. | |||
Once a transfer of a bundle has commenced, the node MUST only send | Once a transfer of a bundle has commenced, the entity MUST only send | |||
segments containing sequential portions of that bundle until it sends | segments containing sequential portions of that bundle until it sends | |||
a segment with the 'END' flag set to 1. No interleaving of multiple | a segment with the 'END' flag set to 1. No interleaving of multiple | |||
transfers from the same node is possible within a single TCPCL | transfers from the same node is possible within a single TCPCL | |||
session. Simultaneous transfers between two entities MAY be achieved | session. Simultaneous transfers between two entities MAY be achieved | |||
using multiple TCPCL sessions. | using multiple TCPCL sessions. | |||
5.2.3. Data Acknowledgments (XFER_ACK) | 5.2.3. Data Acknowledgments (XFER_ACK) | |||
Although the TCP transport provides reliable transfer of data between | Although the TCP transport provides reliable transfer of data between | |||
transport peers, the typical BSD sockets interface provides no means | transport peers, the typical BSD sockets interface provides no means | |||
to inform a sending application of when the receiving application has | to inform a sending application of when the receiving application has | |||
processed some amount of transmitted data. Thus, after transmitting | processed some amount of transmitted data. Thus, after transmitting | |||
some data, the TCPCL needs an additional mechanism to determine | some data, the TCPCL needs an additional mechanism to determine | |||
whether the receiving agent has successfully received the segment. | whether the receiving agent has successfully received and fully | |||
To this end, the TCPCL protocol provides feedback messaging whereby a | processed the segment. To this end, the TCPCL protocol provides | |||
receiving node transmits acknowledgments of reception of data | feedback messaging whereby a receiving node transmits acknowledgments | |||
segments. | of reception of data segments. | |||
The format of an XFER_ACK message follows in Figure 23. | 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) | | |||
+-----------------------------+ | +-----------------------------+ | |||
skipping to change at page 39, line 31 ¶ | skipping to change at page 42, line 31 ¶ | |||
flag bits SHALL be set to 0 by the sender. All reserved header | flag bits SHALL be set to 0 by the sender. All reserved header | |||
flag bits SHALL be ignored by the receiver. | flag bits SHALL be ignored by the receiver. | |||
Transfer ID: A 64-bit unsigned integer identifying the transfer | Transfer ID: A 64-bit unsigned integer identifying the transfer | |||
being acknowledged. | being acknowledged. | |||
Acknowledged length: A 64-bit unsigned integer indicating the total | Acknowledged length: A 64-bit unsigned integer indicating the total | |||
number of octets in the transfer which are being acknowledged. | number of octets in the transfer 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 after the segment has been fully | |||
XFER_ACK header SHALL be set to match the corresponding DATA_SEGMENT | processed. The flags portion of the XFER_ACK header SHALL be set to | |||
message being acknowledged. The acknowledged length of each XFER_ACK | match the corresponding XFER_SEGMENT message being acknowledged | |||
contains the sum of the data length fields of all XFER_SEGMENT | (including flags not decodable to the entity). The acknowledged | |||
messages received so far in the course of the indicated transfer. | length of each XFER_ACK contains the sum of the data length fields of | |||
The sending node SHOULD transmit multiple XFER_SEGMENT messages | all XFER_SEGMENT messages received so far in the course of the | |||
without waiting for the corresponding XFER_ACK responses. This | indicated transfer. The sending node SHOULD transmit multiple | |||
enables pipelining of messages on a transfer stream. | XFER_SEGMENT messages without waiting for the corresponding XFER_ACK | |||
responses. This enables pipelining of messages on a transfer stream. | ||||
For example, suppose the sending node transmits four segments of | For example, suppose the sending node transmits four segments of | |||
bundle data with lengths 100, 200, 500, and 1000, respectively. | bundle data with lengths 100, 200, 500, and 1000, respectively. | |||
After receiving the first segment, the node sends an acknowledgment | After receiving the first segment, the entity sends an acknowledgment | |||
of length 100. After the second segment is received, the node sends | of length 100. After the second segment is received, the entity | |||
an acknowledgment of length 300. The third and fourth | sends an acknowledgment of length 300. The third and fourth | |||
acknowledgments are of length 800 and 1800, respectively. | acknowledgments are of length 800 and 1800, respectively. | |||
5.2.4. Transfer Refusal (XFER_REFUSE) | 5.2.4. Transfer Refusal (XFER_REFUSE) | |||
The TCPCL supports a mechanism by which a receiving node can indicate | The TCPCL supports a mechanism by which a receiving node can indicate | |||
to the sender that it does not want to receive the corresponding | to the sender that it does not want to receive the corresponding | |||
bundle. To do so, upon receiving an XFER_SEGMENT message, the node | bundle. To do so, upon receiving an XFER_SEGMENT message, the entity | |||
MAY transmit a XFER_REFUSE message. As data segments and | MAY transmit a XFER_REFUSE message. As data segments and | |||
acknowledgments MAY cross on the wire, the bundle that is being | acknowledgments can cross on the wire, the bundle that is being | |||
refused SHALL be identified by the Transfer ID of the refusal. | refused SHALL be identified by the Transfer ID of the refusal. | |||
There is no required relation between the Transfer MRU of a TCPCL | There is no required relation between the Transfer MRU of a TCPCL | |||
node (which is supposed to represent a firm limitation of what the | node (which is supposed to represent a firm limitation of what the | |||
node will accept) and sending of a XFER_REFUSE message. A | node will accept) and sending of a XFER_REFUSE message. A | |||
XFER_REFUSE can be used in cases where the agent's bundle storage is | XFER_REFUSE can be used in cases where the agent's bundle storage is | |||
temporarily depleted or somehow constrained. A XFER_REFUSE can also | temporarily depleted or somehow constrained. A XFER_REFUSE can also | |||
be used after the bundle header or any bundle data is inspected by an | be used after the bundle header or any bundle data is inspected by an | |||
agent and determined to be unacceptable. | agent and determined to be unacceptable. | |||
A receiver MAY send an XFER_REFUSE message as soon as it receives any | A transfer receiver MAY send an XFER_REFUSE message as soon as it | |||
XFER_SEGMENT message. The sender MUST be prepared for this and MUST | receives any XFER_SEGMENT message. The transfer sender MUST be | |||
associate the refusal with the correct bundle via the Transfer ID | prepared for this and MUST associate the refusal with the correct | |||
fields. | bundle via the Transfer ID fields. | |||
The TCPCL itself does not have any required behavior to respond to an | ||||
XFER_REFUSE based on its Reason Code; the refusal is passed up as an | ||||
indication to the BP agent that the transfer has been refused. If a | ||||
transfer refusal has a Reason Code which is not decodable to the BP | ||||
agent, the agent SHOULD treat the refusal as having an Unknown | ||||
reason. | ||||
The format of the XFER_REFUSE message is as follows in Figure 24. | 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) | | |||
+-----------------------------+ | +-----------------------------+ | |||
skipping to change at page 41, line 11 ¶ | skipping to change at page 44, line 11 ¶ | |||
Transfer ID: A 64-bit unsigned integer identifying the transfer | Transfer ID: A 64-bit unsigned integer identifying the transfer | |||
being refused. | being refused. | |||
+------------+------+-----------------------------------------------+ | +------------+------+-----------------------------------------------+ | |||
| Name | Code | Description | | | Name | Code | Description | | |||
+------------+------+-----------------------------------------------+ | +------------+------+-----------------------------------------------+ | |||
| Unknown | 0x00 | Reason for refusal is unknown or not | | | Unknown | 0x00 | Reason for refusal is unknown or not | | |||
| | | specified. | | | | | specified. | | |||
| | | | | | | | | | |||
| Extension | 0x01 | A failure processing the Transfer Extension | | | Completed | 0x01 | The receiver already has the complete bundle. | | |||
| Failure | | Items ha occurred. | | ||||
| | | | | ||||
| Completed | 0x02 | The receiver already has the complete bundle. | | ||||
| | | The sender MAY consider the bundle as | | | | | The sender MAY consider the bundle as | | |||
| | | completely received. | | | | | completely received. | | |||
| | | | | | | | | | |||
| No | 0x03 | The receiver's resources are exhausted. The | | | No | 0x02 | The receiver's resources are exhausted. The | | |||
| Resources | | sender SHOULD apply reactive bundle | | | Resources | | sender SHOULD apply reactive bundle | | |||
| | | fragmentation before retrying. | | | | | fragmentation before retrying. | | |||
| | | | | | | | | | |||
| Retransmit | 0x04 | The receiver has encountered a problem that | | | Retransmit | 0x03 | The receiver has encountered a problem that | | |||
| | | requires the bundle to be retransmitted in | | | | | requires the bundle to be retransmitted in | | |||
| | | its entirety. | | | | | its entirety. | | |||
| | | | | ||||
| Not | 0x04 | Some issue with the bundle data or the | | ||||
| Acceptable | | transfer extension data was encountered. The | | ||||
| | | sender SHOULD NOT retry the same bundle with | | ||||
| | | the same extensions. | | ||||
| | | | | ||||
| Extension | 0x05 | A failure processing the Transfer Extension | | ||||
| Failure | | Items has occurred. | | ||||
+------------+------+-----------------------------------------------+ | +------------+------+-----------------------------------------------+ | |||
Table 6: XFER_REFUSE Reason Codes | Table 6: XFER_REFUSE Reason Codes | |||
The receiver MUST, for each transfer preceding the one to be refused, | The receiver MUST, for each transfer preceding the one to be refused, | |||
have either acknowledged all XFER_SEGMENTs or refused the bundle | have either acknowledged all XFER_SEGMENT messages or refused the | |||
transfer. | bundle transfer. | |||
The bundle transfer refusal MAY be sent before an entire data segment | The bundle transfer refusal MAY be sent before an entire data segment | |||
is received. If a sender receives a XFER_REFUSE message, the sender | is received. If a sender receives a XFER_REFUSE message, the sender | |||
MUST complete the transmission of any partially sent XFER_SEGMENT | MUST complete the transmission of any partially sent XFER_SEGMENT | |||
message. There is no way to interrupt an individual TCPCL message | message. There is no way to interrupt an individual TCPCL message | |||
partway through sending it. The sender MUST NOT commence | partway through sending it. The sender MUST NOT commence | |||
transmission of any further segments of the refused bundle | transmission of any further segments of the refused bundle | |||
subsequently. Note, however, that this requirement does not ensure | subsequently. Note, however, that this requirement does not ensure | |||
that an entity will not receive another XFER_SEGMENT for the same | that an entity will not receive another XFER_SEGMENT for the same | |||
bundle after transmitting a XFER_REFUSE message since messages MAY | bundle after transmitting a XFER_REFUSE message since messages can | |||
cross on the wire; if this happens, subsequent segments of the bundle | cross on the wire; if this happens, subsequent segments of the bundle | |||
SHALL also be refused with a XFER_REFUSE message. | SHALL also be refused with a XFER_REFUSE message. | |||
Note: If a bundle transmission is aborted in this way, the receiver | Note: If a bundle transmission is aborted in this way, the receiver | |||
MAY not receive a segment with the 'END' flag set to 1 for the | does 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' flag set to 1, indicating the start of a new transfer, | the 'START' flag 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 25. | Type-Length-Value (TLV) container form as indicated in Figure 25. | |||
The fields of the Transfer Extension Item are: | The fields of the Transfer Extension Item are: | |||
Flags: A one-octet field containing generic bit flags about the | Item Flags: A one-octet field containing generic bit flags about the | |||
Item, which are listed in Table 7. All reserved header flag bits | Item, which are listed in Table 7. All reserved header flag bits | |||
SHALL be set to 0 by the sender. All reserved header flag bits | SHALL be set to 0 by the sender. All reserved header flag bits | |||
SHALL be ignored by the receiver. If a TCPCL node receives a | 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 is 1, the node SHALL refuse the transfer with an XFER_REFUSE | flag is 1, the entity SHALL refuse the transfer with an | |||
reason code of "Extension Failure". If the CRITICAL flag is 0, an | XFER_REFUSE reason code of "Extension Failure". If the CRITICAL | |||
entity SHALL skip over and ignore any item with an unknown Item | flag is 0, an entity SHALL skip over and ignore any item with an | |||
Type. | unknown Item Type. | |||
Item Type: A 16-bit unsigned integer field containing the type of | Item Type: A 16-bit unsigned integer field containing the type of | |||
the extension item. This specification allocates an IANA registry | the extension item. This specification creates an IANA registry | |||
for such codes (see Section 9.4). | for such codes (see Section 9.4). | |||
Item Length: A 16-bit unsigned integer field containing the number | Item Length: A 16-bit unsigned integer field containing the number | |||
of Item Value octets to follow. | of Item Value octets to follow. | |||
Item Value: A variable-length data field which is interpreted | Item Value: A variable-length data field which is interpreted | |||
according to the associated Item Type. This specification places | according to the associated Item Type. This specification places | |||
no restrictions on an extension's use of available Item Value | no restrictions on an extension's use of available Item Value | |||
data. Extension specifications SHOULD avoid the use of large data | data. Extension specifications SHOULD avoid the use of large data | |||
lengths, as the associated transfer cannot begin until the full | lengths, as the associated transfer cannot begin until the full | |||
skipping to change at page 43, line 28 ¶ | skipping to change at page 46, line 28 ¶ | |||
The purpose of the Transfer Length extension is to allow entities to | The purpose of the Transfer Length extension is to allow entities to | |||
preemptively refuse bundles that would exceed their resources or to | preemptively refuse bundles that would exceed their resources or to | |||
prepare storage on the receiving node for the upcoming bundle data. | prepare storage on the receiving node for the upcoming bundle data. | |||
Multiple Transfer Length extension items SHALL NOT occur within the | Multiple Transfer Length extension items SHALL NOT occur within the | |||
same transfer. The lack of a Transfer Length extension item in any | same transfer. The lack of a Transfer Length extension item in any | |||
transfer SHALL NOT imply anything about the potential length of the | transfer SHALL NOT imply anything 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 | |||
flags are 1) the Transfer Length extension SHOULD NOT be present. | flags are 1) 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 26. | The format of the Transfer Length data is as follows in Figure 26. | |||
+----------------------+ | +----------------------+ | |||
| Total Length (U64) | | | Total Length (U64) | | |||
+----------------------+ | +----------------------+ | |||
Figure 26: 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 and send an XFER_REFUSE with a Reason | |||
Code of "Not Acceptable". | ||||
6. Session Termination | 6. Session Termination | |||
This section describes the procedures for ending a TCPCL session. | This section describes the procedures for terminating a TCPCL | |||
session. The purpose of terminating a session is to allow transfers | ||||
to complete before the session is closed but not allow any new | ||||
transfers to start. A session state change is necessary for this to | ||||
happen because transfers can be in-progress in either direction | ||||
(transfer stream) within a session. Waiting for a transfer to | ||||
complete in one direction does not control or influence the | ||||
possibility of a transfer in the other direction. Either peer of a | ||||
session can terminate an established session at any time. | ||||
6.1. Session Termination Message (SESS_TERM) | 6.1. Session Termination Message (SESS_TERM) | |||
To cleanly shut down a session, a SESS_TERM message SHALL be | To cleanly terminate a session, a SESS_TERM message SHALL be | |||
transmitted by either node at any point following complete | transmitted by either node at any point following complete | |||
transmission of any other message. When sent to initiate a | transmission of any other message. When sent to initiate a | |||
termination, the REPLY flag of a SESS_TERM message SHALL be 0. Upon | termination, the REPLY flag of a SESS_TERM message SHALL be 0. Upon | |||
receiving a SESS_TERM message after not sending a SESS_TERM message | receiving a SESS_TERM message after not sending a SESS_TERM message | |||
in the same session, an entity SHALL send an acknowledging SESS_TERM | in the same session, an entity SHALL send an acknowledging SESS_TERM | |||
message. When sent to acknowledge a termination, a SESS_TERM message | message. When sent to acknowledge a termination, a SESS_TERM message | |||
SHALL have identical data content from the message being acknowledged | SHALL have identical data content from the message being acknowledged | |||
except for the REPLY flag, which is set to 1 to indicate | except for the REPLY flag, which is set to 1 to indicate | |||
acknowledgement. | acknowledgement. | |||
After sending a SESS_TERM message, an entity MAY continue a possible | Once a SESS_TERM message is sent the state of that TCPCL session | |||
in-progress transfer in either direction. After sending a SESS_TERM | changes to Ending. While the session is in the Ending state, an | |||
message, an entity SHALL NOT begin any new outgoing transfer for the | entity MAY finish an in-progress transfer in either direction. While | |||
remainder of the session. After receving a SESS_TERM message, an | the session is in the Ending state, an entity SHALL NOT begin any new | |||
entity SHALL NOT accept any new incoming transfer for the remainder | outgoing transfer for the remainder of the session. While the | |||
of the session. | session is in the Ending state, an entity SHALL NOT accept any new | |||
incoming transfer for the remainder of the session. | ||||
Instead of following a clean shutdown sequence, after transmitting a | Instead of following a clean termination sequence, after transmitting | |||
SESS_TERM message an entity MAY immediately close the associated TCP | a SESS_TERM message an entity MAY immediately close the associated | |||
connection. When performing an unclean shutdown, a receiving node | TCP connection. When performing an unclean termination, a receiving | |||
SHOULD acknowledge all received data segments before closing the TCP | node SHOULD acknowledge all received XFER_SEGMENTs with an XFER_ACK | |||
connection. Not acknowledging received segments can result in | before closing the TCP connection. Not acknowledging received | |||
unnecessary retransmission. When performing an unclean shutodwn, a | segments can result in unnecessary bundle or bundle fragment | |||
retransmission. When performing an unclean termination, 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 close the TCP connection and | transfer. Any delay between request to close the TCP connection and | |||
actual closing of the connection (a "half-closed" state) MAY be | actual closing of the connection (a "half-closed" state) MAY be | |||
ignored by the TCPCL node. | ignored by the TCPCL entity. | |||
The TCPCL itself does not have any required behavior to respond to an | ||||
SESS_TERM based on its Reason Code; the termination is passed up as | ||||
an indication to the BP agent that the session state has changed. If | ||||
a termination has a Reason Code which is not decodable to the BP | ||||
agent, the agent SHOULD treat the termination as having an Unknown | ||||
reason. | ||||
The format of the SESS_TERM message is as follows in Figure 27. | 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) | | |||
+-----------------------------+ | +-----------------------------+ | |||
skipping to change at page 45, line 41 ¶ | skipping to change at page 49, line 19 ¶ | |||
| | | | | | | | | | |||
| Idle timeout | 0x01 | The session is being closed due to | | | Idle timeout | 0x01 | The session is being closed due to | | |||
| | | idleness. | | | | | idleness. | | |||
| | | | | | | | | | |||
| Version | 0x02 | The node cannot conform to the specified | | | Version | 0x02 | The node cannot conform to the specified | | |||
| mismatch | | TCPCL protocol version. | | | mismatch | | TCPCL protocol version. | | |||
| | | | | | | | | | |||
| Busy | 0x03 | The node is too busy to handle the current | | | Busy | 0x03 | The node is too busy to handle the current | | |||
| | | session. | | | | | session. | | |||
| | | | | | | | | | |||
| Contact | 0x04 | The node cannot interpret or negotiate | | | Contact | 0x04 | The node cannot interpret or negotiate a | | |||
| Failure | | contact header option. | | | Failure | | Contact Header or SESS_INIT option. | | |||
| | | | | | | | | | |||
| Resource | 0x05 | The node has run into some resource limit | | | Resource | 0x05 | The node has run into some resource limit | | |||
| Exhaustion | | and cannot continue the session. | | | Exhaustion | | and cannot continue the session. | | |||
+--------------+------+---------------------------------------------+ | +--------------+------+---------------------------------------------+ | |||
Table 9: SESS_TERM Reason Codes | Table 9: SESS_TERM Reason Codes | |||
A session shutdown MAY occur immediately after transmission of a | A session termination MAY occur immediately after transmission of a | |||
contact header (and prior to any further message transmit). This | Contact Header (and prior to any further message transmit). This | |||
MAY, for example, be used to notify that the node is currently not | can, for example, be used to notify that the entity is currently not | |||
able or willing to communicate. However, an entity MUST always send | able or willing to communicate. However, an entity MUST always send | |||
the contact header to its peer before sending a SESS_TERM message. | the Contact Header to its peer before sending a SESS_TERM message. | |||
If reception of the contact header itself somehow fails (e.g. an | If reception of the Contact Header itself somehow fails (e.g., an | |||
invalid "magic string" is recevied), an entity SHALL close the TCP | invalid "magic string" is received), an entity SHALL close the TCP | |||
connection without sending a SESS_TERM message. If the content of | connection without sending a SESS_TERM message. If the content of | |||
the Session Extension Items data disagrees with the Session Extension | the Session Extension Items data disagrees with the Session Extension | |||
Length (i.e. the last Item claims to use more octets than are present | Length (i.e., the last Item claims to use more octets than are | |||
in the Session Extension Length), the reception of the contact header | present in the Session Extension Length), the reception of the | |||
is considered to have failed. | SESS_INIT is considered to have failed. | |||
If a session is to be terminated before a protocol message has | If a session is to be terminated before a protocol message has | |||
completed being sent, then the node MUST NOT transmit the SESS_TERM | completed being sent, then the entity MUST NOT transmit the SESS_TERM | |||
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 termination of idle | |||
sessions. Determining the length of time to wait before ending 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). | |||
skipping to change at page 47, line 9 ¶ | skipping to change at page 50, line 38 ¶ | |||
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 can | 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 intended | |||
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 | |||
This section separates security considerations into threat categories | This section separates security considerations into threat categories | |||
based on guidance of BCP 72 [RFC3552]. | based on guidance of BCP 72 [RFC3552]. | |||
skipping to change at page 47, line 42 ¶ | skipping to change at page 51, line 27 ¶ | |||
to-end bundle security. The bundle security mechanisms defined in | 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 used without TLS security, the TCPCL exposes all bundle data to | When used without TLS security, the TCPCL exposes all bundle data to | |||
passive eavesdroppers. This can be avoided by always using TLS, even | passive eavesdroppers. This can be avoided by always using TLS, even | |||
if authentication is not available (see Section 8.10). | if authentication is not available (see Section 8.10). | |||
8.3. Threat: TCPCL Version Downgrade | 8.3. Threat: TCPCL Version Downgrade | |||
When a TCPCL entity supports multiple versions of the protocol it is | When a TCPCL entity supports multiple versions of the protocol it is | |||
possible for a malicious or misconfigued peer to use an older version | possible for a malicious or misconfigured peer to use an older | |||
of TCPCL which does not support transport security. It is up to | version of TCPCL which does not support transport security. A man- | |||
security policies within each TCPCL node to ensure that the TCPCL | in-the-middle attacker can also manipulate a Contact Header to | |||
version in use meets transport security requirements. | present a lower protocol version than desired. | |||
It is up to security policies within each TCPCL node to ensure that | ||||
the negotiated TCPCL version meets transport security requirements. | ||||
8.4. Threat: Transport Security Stripping | 8.4. Threat: Transport Security Stripping | |||
When security policy allows non-TLS sessions, TCPCL does not protect | When security policy allows non-TLS sessions, TCPCL does not protect | |||
against active network attackers. It is possible for a man-in-the- | against active network attackers. It is possible for a man-in-the- | |||
middle attacker to set the CAN_TLS flag to 0 on either side of the | middle attacker to set the CAN_TLS flag to 0 on either side of the | |||
Contact Header exchange. This leads to the "SSL Stripping" attack | Contact Header exchange. This leads to the "SSL Stripping" attack | |||
described in [RFC7457]. | described in [RFC7457]. | |||
The purpose of the CAN_TLS flag is to allow the use of TCPCL on | The purpose of the CAN_TLS flag is to allow the use of TCPCL on | |||
skipping to change at page 48, line 28 ¶ | skipping to change at page 52, line 16 ¶ | |||
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 can be insecure. | ciphersuite negotiated between the TLS peers can be insecure. | |||
Recommendations for ciphersuite use are included in BCP 195 | Recommendations for ciphersuite use are included in BCP 195 | |||
[RFC7525]. It is up to security policies within each TCPCL node to | [RFC7525]. 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. | requirements. | |||
8.6. Threat: Invalid Certificate Use | 8.6. Threat: Invalid Certificate Use | |||
There are many reasons, described in [RFC5280], why a certificate can | Even when TLS itself is operating properly an attacker can attempt to | |||
fail to validate, including using the certificate outside of its | exploit vulnerabilities within certificate check algorithms or | |||
valid time interval, using purposes for which it was not authorized, | configuration to establish a secure TCPCL session using an invalid | |||
or using it after it has been revoked by its CA. Validating a | certificate. A BP agent treats the peer Node ID within a TCPCL | |||
certificate is a complex task and may require network connectivity if | session as authoritative and an invalid certificate exploit could | |||
lead to bundle data leaking and/or denial of service to the Node ID | ||||
being impersonated. There are many reasons, described in [RFC5280], | ||||
why a certificate can fail to validate, including using the | ||||
certificate outside of its valid time interval, using purposes for | ||||
which it was not authorized, or using it after it has been revoked by | ||||
its CA. Validating a certificate is a complex task and can require | ||||
network connectivity outside of the primary TCPCL network path(s) if | ||||
a mechanism such as the Online Certificate Status Protocol (OCSP) is | a mechanism such as the Online Certificate Status Protocol (OCSP) is | |||
used by the CA. The configuration and use of particular certificate | used by the CA. The configuration and use of particular certificate | |||
validation methods are outside of the scope of this document. | validation methods are outside of the scope of this document. | |||
8.7. Threat: Symmetric Key Overuse | 8.7. Threat: Symmetric Key Overuse | |||
Even with a secure block cipher and securely-established session | Even with a secure block cipher and securely-established session | |||
keys, there are limits to the amount of plaintext which can be safely | keys, there are limits to the amount of plaintext which can be safely | |||
encrypted with a given set of keys as described in [AEAD-LIMITS]. | encrypted with a given set of keys as described in [AEAD-LIMITS]. | |||
When permitted by the negotiated TLS version (see [RFC8446]), it is | When permitted by the negotiated TLS version (see [RFC8446]), it is | |||
advisable to take advantage of session key updates to avoid those | advisable to take advantage of session key updates to avoid those | |||
limits. When key updates are not possible, establishing new TCPCL/ | limits. When key updates are not possible, renegotiation of the TLS | |||
TLS session is an alternative to limit session key use. | connection or establishing new TCPCL/TLS session are alternatives to | |||
limit session key use. | ||||
8.8. Threat: BP Node Impersonation | 8.8. Threat: BP Node Impersonation | |||
The certificates exchanged by TLS enable authentication of peer host | 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 | 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 | valid certificate or that the certificate does not validate either | |||
the host name or Node ID of the peer. Having a CA-validated | the host name or Node ID of the peer. Having a CA-validated | |||
certificate does not alone guarantee the identity of the network host | certificate does not alone guarantee the identity of the network host | |||
or BP node from which the certificate is provided; additional | or BP node from which the certificate is provided; additional | |||
validation procedures in Section 4.4.1 bind the host name or node ID | validation procedures in Section 4.4.2 bind the host name or node ID | |||
based on the contents of the certificate. | based on the contents of the certificate. | |||
The host name validation is a weaker form of authentication, because | The host name validation is a weaker form of authentication, because | |||
even if a peer is operating on an authenticated network host name it | 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 | can provide an invalid Node ID and cause bundles to be "leaked" to an | |||
invalid node. Especially in DTN environments, network names and | invalid node. Especially in DTN environments, network names and | |||
addresses of nodes can be time-variable so binding a certificate to a | addresses of nodes can be time-variable so binding a certificate to a | |||
Node ID is a more stable identity. Trusting an authenticated host | Node ID is a more stable identity. Trusting an authenticated host | |||
name can be feasable on a network secured by a private CA but is not | name can be feasible on a network secured by a private CA but is not | |||
advisable on the Internet when using a variety of public CAs. | advisable on the Internet when using a variety of public CAs. | |||
Node ID validation ensures that the peer to which a bundle is | Node ID validation ensures that the peer to which a bundle is | |||
transferred is in fact the node which the BP Agent expects it to be. | transferred is in fact the node which the BP Agent expects it to be. | |||
It is a reasonable policy to skip host name validation if | It is a reasonable policy to skip host name validation if | |||
certificates can be guaranteed to validate the peer's Node ID. In | certificates can be guaranteed to validate the peer's Node ID. In | |||
circumstances where certificates can only be issued to network host | circumstances where certificates can only be issued to network host | |||
names, Node ID validation is not possible but it could be reasonable | 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 | to assume that a trusted host is not going to present an invalid Node | |||
ID. | ID. Determining of when a host name authentication can be trusted to | |||
validate a Node ID is also a policy matter outside the scope of this | ||||
document. | ||||
8.9. Threat: Denial of Service | 8.9. Threat: Denial of Service | |||
The behaviors described in this section all amount to a potential | The behaviors described in this section all amount to a potential | |||
denial-of-service to a TCPCL entity. The denial-of-service could be | denial-of-service to a TCPCL entity. The denial-of-service could be | |||
limited to an individual TCPCL session, could affect other well- | limited to an individual TCPCL session, could affect other well- | |||
behaving sessions on an entity, or could affect all sessions on a | behaving sessions on an entity, or could affect all sessions on a | |||
host. | host. | |||
A malicious entity can continually establish TCPCL sessions and delay | A malicious entity can continually establish TCPCL sessions and delay | |||
skipping to change at page 49, line 49 ¶ | skipping to change at page 53, line 46 ¶ | |||
to be incorrectly behaving within TCPCL. | to be incorrectly behaving within TCPCL. | |||
An entity can send a large amount of data over a TCPCL session, | An entity can send a large amount of data over a TCPCL session, | |||
requiring the receiving entity to handle the data. The victim entity | requiring the receiving entity to handle the data. The victim entity | |||
can attempt to stop the flood of data by sending an XFER_REFUSE | can attempt to stop the flood of data by sending an XFER_REFUSE | |||
message, or forcibly terminate the session. | message, or forcibly terminate the session. | |||
There is the possibility of a "data dribble" attack in which an | There is the possibility of a "data dribble" attack in which an | |||
entity presents a very small Segment MRU which causes transfers to be | entity presents a very small Segment MRU which causes transfers to be | |||
split among an large number of very small segments and causes the | split among an large number of very small segments and causes the | |||
segmentation overhead to overwhelm the network througput. Similarly, | segmentation overhead to overwhelm the actual bundle data segments. | |||
an entity can present a very small Transfer MRU which will cause | Similarly, an entity can present a very small Transfer MRU which will | |||
resources to be wasted on establishing and upkeeping a TCPCL session | cause resources to be wasted on establishment and upkeep of a TCPCL | |||
over which a bundle could never be transferred. The victim entity | session over which a bundle could never be transferred. The victim | |||
can terminate the session during the negotiation of Section 4.7 if | entity can terminate the session during the negotiation of | |||
the MRUs are unacceptable. | Section 4.7 if the MRUs are unacceptable. | |||
The keepalive mechanism can be abused to waste throughput within a | The keepalive mechanism can be abused to waste throughput within a | |||
network link which would otherwise be usable for bundle | network link which would otherwise be usable for bundle | |||
transmissions. Due to the quantization of the Keepalive Interval | transmissions. Due to the quantization of the Keepalive Interval | |||
parameter the smallest Session Keepalive is one second, which should | parameter the smallest Session Keepalive is one second, which should | |||
be long enough to not flood the link. The victim entity can | be long enough to not flood the link. The victim entity can | |||
terminate the session during the negotiation of Section 4.7 if the | terminate the session during the negotiation of Section 4.7 if the | |||
Keepalive Interval is unacceptable. | Keepalive Interval is unacceptable. | |||
Finally, an attacker or a misconfigured entity can cause issues at | ||||
the TCP connection which will cause unnecessary TCP retransmissions | ||||
or connection resets, effectively denying the use of the overlying | ||||
TCPCL session. | ||||
8.10. Alternate Uses of TLS | 8.10. Alternate Uses of TLS | |||
This specification makes use of public key infrastructure (PKI) | This specification makes use of X.509 PKI certificate validation and | |||
certificate validation and authentication within TLS. There are | authentication within TLS. There are alternate uses of TLS which are | |||
alternate uses of TLS which are not necessarily incompatible with the | not necessarily incompatible with the security goals of this | |||
security goals of this specification, but are outside of the scope of | specification, but are outside of the scope of this document. The | |||
this document. | following subsections give examples of alternate TLS uses. | |||
8.10.1. TLS Without Authentication | 8.10.1. TLS Without Authentication | |||
In environments where PKI is available but there are restrictions on | In environments where PKI is available but there are restrictions on | |||
the issuance of certificates (including the contents of | the issuance of certificates (including the contents of | |||
certificates), it may be possible to make use of TLS in a way which | certificates), it may be possible to make use of TLS in a way which | |||
authenticates only the passive entity of a TCPCL session or which | authenticates only the passive entity of a TCPCL session or which | |||
does not authenticate either entity. Using TLS in a way which does | does not authenticate either entity. Using TLS in a way which does | |||
not authenticate both peer entities of each TCPCL session is outside | not authenticate both peer entities of each TCPCL session is outside | |||
of the scope of this document. | of the scope of this document. | |||
8.10.2. Non-Certificate TLS Use | 8.10.2. Non-Certificate TLS Use | |||
In environments where PKI is unavailable, alternate uses of TLS which | In environments where PKI is unavailable, alternate uses of TLS which | |||
do not require certificates such as [RFC5489] are available and can | do not require certificates such as pre-shared key (PSK) | |||
be used to ensure confidentality within TCPCL. Using non-PKI node | authentication [RFC5489] and the use of raw public keys [RFC7250] are | |||
authentication methods is outside of the scope of this document. | available and can be used to ensure confidentiality within TCPCL. | |||
Using non-PKI node authentication methods is outside of the scope of | ||||
this document. | ||||
8.11. Predictability of Transfer IDs | ||||
The only requirement on Transfer IDs is that they be unique with each | ||||
session from the sending peer only. The trivial algorithm of the | ||||
first transfer starting at zero and later transfers incrementing by | ||||
one causes absolutely predictable Transfer IDs. Even when a TCPCL | ||||
session is not TLS secured and there is a man-in-the-middle attacker | ||||
causing denial of service with XFER_REFUSE messages, it is not | ||||
possible to preemptively refuse a transfer so there is no benefit in | ||||
having unpredictable Transfer IDs within a session. | ||||
9. IANA Considerations | 9. IANA Considerations | |||
Registration procedures referred to in this section are defined in | Registration procedures referred to in this section are defined in | |||
[RFC8126]. | [RFC8126]. | |||
Some of the registries have been defined as version specific to | Some of the registries have been defined as version specific to | |||
TCPCLv4, and imports some or all codepoints from TCPCLv3. This was | TCPCLv4, and imports some or all codepoints from TCPCLv3. This was | |||
done to disambiguate the use of these codepoints between TCPCLv3 and | done to disambiguate the use of these codepoints between TCPCLv3 and | |||
TCPCLv4 while preserving the semantics of some of the codepoints. | TCPCLv4 while preserving the semantics of some of the codepoints. | |||
skipping to change at page 54, line 36 ¶ | skipping to change at page 58, line 36 ¶ | |||
4 Message Types" and initialize it with the contents of Table 12. | 4 Message Types" and initialize it with the contents of Table 12. | |||
The registration procedure is RFC Required within the lower range | The registration procedure is RFC Required within the lower range | |||
0x01--0xEF. Values in the range 0xF0--0xFF are reserved for use on | 0x01--0xEF. Values in the range 0xF0--0xFF are reserved for use on | |||
private networks for functions not published to the IANA. | private networks for functions not published to the IANA. | |||
Specifications of new message types need to define the encoding of | Specifications of new message types need to define the encoding of | |||
the message data as well as the purpose and relationship of the new | the message data as well as the purpose and relationship of the new | |||
message to existing session/transfer state within the baseline | message to existing session/transfer state within the baseline | |||
message sequencing. The use of new message types need to be | message sequencing. The use of new message types need to be | |||
negotiated between TCPCL entities within a session (using the session | negotiated between TCPCL entities within a session (using the session | |||
extension mechanism) so that the receving entity can properly decode | extension mechanism) so that the receiving entity can properly decode | |||
all message types used in the session. | all message types used in the session. | |||
Expert(s) are encouraged to favor new session/transfer extension | Expert(s) are encouraged to favor new session/transfer extension | |||
types over new message types. TCPCL messages are not self- | types over new message types. TCPCL messages are not self- | |||
delimiting, so care must be taken in introducing new message types. | delimiting, so care must be taken in introducing new message types. | |||
If an entity receives an unknown message type the only thing that can | If an entity receives an unknown message type the only thing that can | |||
be done is to send a MSG_REJECT and close the TCP connection; not | be done is to send a MSG_REJECT and close the TCP connection; not | |||
even a clean termination can be done at that point. | even a clean termination can be done at that point. | |||
+------------+--------------------------+ | +------------+--------------------------+ | |||
skipping to change at page 55, line 45 ¶ | skipping to change at page 59, line 45 ¶ | |||
IANA will create, under the "Bundle Protocol" registry [IANA-BUNDLE], | IANA will create, under the "Bundle Protocol" registry [IANA-BUNDLE], | |||
a sub-registry titled "Bundle Protocol TCP Convergence-Layer Version | a sub-registry titled "Bundle Protocol TCP Convergence-Layer Version | |||
4 XFER_REFUSE Reason Codes" and initialize it with the contents of | 4 XFER_REFUSE Reason Codes" and initialize it with the contents of | |||
Table 13. The registration procedure is Specification Required | Table 13. The registration procedure is Specification Required | |||
within the lower range 0x00--0xEF. Values in the range 0xF0--0xFF | within the lower range 0x00--0xEF. Values in the range 0xF0--0xFF | |||
are reserved for use on private networks for functions not published | are reserved for use on private networks for functions not published | |||
to the IANA. | to the IANA. | |||
Specifications of new XFER_REFUSE reason codes need to define the | Specifications of new XFER_REFUSE reason codes need to define the | |||
meaning of the reason and disambiguate it with pre-exisiting reasons. | meaning of the reason and disambiguate it with pre-existing reasons. | |||
Each refusal reason needs to be usable by the receving BP Agent to | Each refusal reason needs to be usable by the receiving BP Agent to | |||
make retransmission or re-routing decisions. | make retransmission or re-routing decisions. | |||
Expert(s) are encouraged to be biased towards approving registrations | Expert(s) are encouraged to be biased towards approving registrations | |||
unless they are abusive, frivolous, or actively harmful (not merely | unless they are abusive, frivolous, or actively harmful (not merely | |||
aesthetically displeasing, or architecturally dubious). | aesthetically displeasing, or architecturally dubious). | |||
+------------+--------------------------+ | +------------+--------------------------+ | |||
| Code | Refusal Reason | | | Code | Refusal Reason | | |||
+------------+--------------------------+ | +------------+--------------------------+ | |||
| 0x00 | Unknown | | | 0x00 | Unknown | | |||
| | | | | | | | |||
| 0x01 | Extension Failure | | | 0x01 | Completed | | |||
| | | | | | | | |||
| 0x02 | Completed | | | 0x02 | No Resources | | |||
| | | | | | | | |||
| 0x03 | No Resources | | | 0x03 | Retransmit | | |||
| | | | | | | | |||
| 0x04 | Retransmit | | | 0x04 | Not Acceptable | | |||
| | | | | | | | |||
| 0x05--0xEF | Unassigned | | | 0x05 | Extension Failure | | |||
| | | | ||||
| 0x06--0xEF | Unassigned | | ||||
| | | | | | | | |||
| 0xF0--0xFF | Private/Experimental Use | | | 0xF0--0xFF | Private/Experimental Use | | |||
+------------+--------------------------+ | +------------+--------------------------+ | |||
Table 13: 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 [IANA-BUNDLE], | IANA will create, under the "Bundle Protocol" registry [IANA-BUNDLE], | |||
a sub-registry titled "Bundle Protocol TCP Convergence-Layer Version | a sub-registry titled "Bundle Protocol TCP Convergence-Layer Version | |||
4 SESS_TERM Reason Codes" and initialize it with the contents of | 4 SESS_TERM Reason Codes" and initialize it with the contents of | |||
Table 14. The registration procedure is Specification Required | Table 14. The registration procedure is Specification Required | |||
within the lower range 0x00--0xEF. Values in the range 0xF0--0xFF | within the lower range 0x00--0xEF. Values in the range 0xF0--0xFF | |||
are reserved for use on private networks for functions not published | are reserved for use on private networks for functions not published | |||
to the IANA. | to the IANA. | |||
Specifications of new SESS_TERM reason codes need to define the | Specifications of new SESS_TERM reason codes need to define the | |||
meaning of the reason and disambiguate it with pre-exisiting reasons. | meaning of the reason and disambiguate it with pre-existing reasons. | |||
Each termination reason needs to be usable by the receving BP Agent | Each termination reason needs to be usable by the receiving BP Agent | |||
to make re-connection decisions. | to make re-connection decisions. | |||
Expert(s) are encouraged to be biased towards approving registrations | Expert(s) are encouraged to be biased towards approving registrations | |||
unless they are abusive, frivolous, or actively harmful (not merely | unless they are abusive, frivolous, or actively harmful (not merely | |||
aesthetically displeasing, or architecturally dubious). | aesthetically displeasing, or architecturally dubious). | |||
+------------+--------------------------+ | +------------+--------------------------+ | |||
| Code | Termination Reason | | | Code | Termination Reason | | |||
+------------+--------------------------+ | +------------+--------------------------+ | |||
| 0x00 | Unknown | | | 0x00 | Unknown | | |||
skipping to change at page 57, line 41 ¶ | skipping to change at page 61, line 41 ¶ | |||
IANA will create, under the "Bundle Protocol" registry [IANA-BUNDLE], | IANA will create, under the "Bundle Protocol" registry [IANA-BUNDLE], | |||
a sub-registry titled "Bundle Protocol TCP Convergence-Layer Version | a sub-registry titled "Bundle Protocol TCP Convergence-Layer Version | |||
4 MSG_REJECT Reason Codes" and initialize it with the contents of | 4 MSG_REJECT Reason Codes" and initialize it with the contents of | |||
Table 15. The registration procedure is Specification Required | Table 15. The registration procedure is Specification Required | |||
within the lower range 0x01--0xEF. Values in the range 0xF0--0xFF | within the lower range 0x01--0xEF. Values in the range 0xF0--0xFF | |||
are reserved for use on private networks for functions not published | are reserved for use on private networks for functions not published | |||
to the IANA. | to the IANA. | |||
Specifications of new MSG_REJECT reason codes need to define the | Specifications of new MSG_REJECT reason codes need to define the | |||
meaning of the reason and disambiguate it with pre-exisiting reasons. | meaning of the reason and disambiguate it with pre-existing reasons. | |||
Each rejection reason needs to be usable by the receving TCPCL Entity | Each rejection reason needs to be usable by the receiving TCPCL | |||
to make message sequencing and/or session termination decisions. | Entity to make message sequencing and/or session termination | |||
decisions. | ||||
Expert(s) are encouraged to be biased towards approving registrations | Expert(s) are encouraged to be biased towards approving registrations | |||
unless they are abusive, frivolous, or actively harmful (not merely | unless they are abusive, frivolous, or actively harmful (not merely | |||
aesthetically displeasing, or architecturally dubious). | aesthetically displeasing, or architecturally dubious). | |||
+------------+--------------------------+ | +------------+--------------------------+ | |||
| Code | Rejection Reason | | | Code | Rejection Reason | | |||
+------------+--------------------------+ | +------------+--------------------------+ | |||
| 0x00 | reserved | | | 0x00 | reserved | | |||
| | | | | | | | |||
skipping to change at page 58, line 34 ¶ | skipping to change at page 62, line 34 ¶ | |||
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 | |||
[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-19 (work in progress), | Version 7", draft-ietf-dtn-bpbis-23 (work in progress), | |||
January 2020. | February 2020. | |||
[IANA-BUNDLE] | [IANA-BUNDLE] | |||
IANA, "Bundle Protocol", | IANA, "Bundle Protocol", | |||
<https://www.iana.org/assignments/bundle/>. | <https://www.iana.org/assignments/bundle/>. | |||
[IANA-PORTS] | [IANA-PORTS] | |||
IANA, "Service Name and Transport Protocol Port Number | IANA, "Service Name and Transport Protocol Port Number | |||
Registry", <https://www.iana.org/assignments/service- | Registry", <https://www.iana.org/assignments/service- | |||
names-port-numbers/>. | names-port-numbers/>. | |||
skipping to change at page 59, line 20 ¶ | skipping to change at page 63, line 20 ¶ | |||
[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 | [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | |||
Resource Identifier (URI): Generic Syntax", STD 66, | Resource Identifier (URI): Generic Syntax", STD 66, | |||
RFC 3986, DOI 10.17487/RFC3986, January 2005, | RFC 3986, DOI 10.17487/RFC3986, January 2005, | |||
<https://www.rfc-editor.org/info/rfc3986>. | <https://www.rfc-editor.org/info/rfc3986>. | |||
[RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security | ||||
(TLS) Protocol Version 1.2", RFC 5246, | ||||
DOI 10.17487/RFC5246, August 2008, | ||||
<https://www.rfc-editor.org/info/rfc5246>. | ||||
[RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., | [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S., | |||
Housley, R., and W. Polk, "Internet X.509 Public Key | Housley, R., and W. Polk, "Internet X.509 Public Key | |||
Infrastructure Certificate and Certificate Revocation List | Infrastructure Certificate and Certificate Revocation List | |||
(CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008, | (CRL) Profile", RFC 5280, DOI 10.17487/RFC5280, May 2008, | |||
<https://www.rfc-editor.org/info/rfc5280>. | <https://www.rfc-editor.org/info/rfc5280>. | |||
[RFC6066] Eastlake 3rd, D., "Transport Layer Security (TLS) | [RFC6066] Eastlake 3rd, D., "Transport Layer Security (TLS) | |||
Extensions: Extension Definitions", RFC 6066, | Extensions: Extension Definitions", RFC 6066, | |||
DOI 10.17487/RFC6066, January 2011, | DOI 10.17487/RFC6066, January 2011, | |||
<https://www.rfc-editor.org/info/rfc6066>. | <https://www.rfc-editor.org/info/rfc6066>. | |||
skipping to change at page 60, line 26 ¶ | skipping to change at page 64, line 22 ¶ | |||
Luykx, A. and K. Paterson, "Limits on Authenticated | Luykx, A. and K. Paterson, "Limits on Authenticated | |||
Encryption Use in TLS", August 2017, | Encryption Use in TLS", August 2017, | |||
<http://www.isg.rhul.ac.uk/~kp/TLS-AEbounds.pdf>. | <http://www.isg.rhul.ac.uk/~kp/TLS-AEbounds.pdf>. | |||
[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/>. | <https://github.com/BSipos-RKF/dtn-bpbis-tcpcl/>. | |||
[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-15 (work in | Specification", draft-ietf-dtn-bpsec-21 (work in | |||
progress), January 2020. | progress), March 2020. | |||
[RFC2595] Newman, C., "Using TLS with IMAP, POP3 and ACAP", | [RFC2595] Newman, C., "Using TLS with IMAP, POP3 and ACAP", | |||
RFC 2595, DOI 10.17487/RFC2595, June 1999, | RFC 2595, DOI 10.17487/RFC2595, June 1999, | |||
<https://www.rfc-editor.org/info/rfc2595>. | <https://www.rfc-editor.org/info/rfc2595>. | |||
[RFC3552] Rescorla, E. and B. Korver, "Guidelines for Writing RFC | [RFC3552] Rescorla, E. and B. Korver, "Guidelines for Writing RFC | |||
Text on Security Considerations", BCP 72, RFC 3552, | Text on Security Considerations", BCP 72, RFC 3552, | |||
DOI 10.17487/RFC3552, July 2003, | DOI 10.17487/RFC3552, July 2003, | |||
<https://www.rfc-editor.org/info/rfc3552>. | <https://www.rfc-editor.org/info/rfc3552>. | |||
skipping to change at page 61, line 17 ¶ | skipping to change at page 65, line 17 ¶ | |||
Networking (DTN) Bundle Protocol and Licklider | Networking (DTN) Bundle Protocol and Licklider | |||
Transmission Protocol (LTP)", RFC 7122, | Transmission Protocol (LTP)", RFC 7122, | |||
DOI 10.17487/RFC7122, March 2014, | DOI 10.17487/RFC7122, March 2014, | |||
<https://www.rfc-editor.org/info/rfc7122>. | <https://www.rfc-editor.org/info/rfc7122>. | |||
[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>. | |||
[RFC7250] Wouters, P., Ed., Tschofenig, H., Ed., Gilmore, J., | ||||
Weiler, S., and T. Kivinen, "Using Raw Public Keys in | ||||
Transport Layer Security (TLS) and Datagram Transport | ||||
Layer Security (DTLS)", RFC 7250, DOI 10.17487/RFC7250, | ||||
June 2014, <https://www.rfc-editor.org/info/rfc7250>. | ||||
[RFC7435] Dukhovni, V., "Opportunistic Security: Some Protection | [RFC7435] Dukhovni, V., "Opportunistic Security: Some Protection | |||
Most of the Time", RFC 7435, DOI 10.17487/RFC7435, | Most of the Time", RFC 7435, DOI 10.17487/RFC7435, | |||
December 2014, <https://www.rfc-editor.org/info/rfc7435>. | December 2014, <https://www.rfc-editor.org/info/rfc7435>. | |||
[RFC7457] Sheffer, Y., Holz, R., and P. Saint-Andre, "Summarizing | [RFC7457] Sheffer, Y., Holz, R., and P. Saint-Andre, "Summarizing | |||
Known Attacks on Transport Layer Security (TLS) and | Known Attacks on Transport Layer Security (TLS) and | |||
Datagram TLS (DTLS)", RFC 7457, DOI 10.17487/RFC7457, | Datagram TLS (DTLS)", RFC 7457, DOI 10.17487/RFC7457, | |||
February 2015, <https://www.rfc-editor.org/info/rfc7457>. | February 2015, <https://www.rfc-editor.org/info/rfc7457>. | |||
[RFC7942] Sheffer, Y. and A. Farrel, "Improving Awareness of Running | [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 session 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 | o Renamed "Endpoint ID" to "Node ID" to conform with BPv7 | |||
terminology. | terminology. | |||
o Added session extension capability. | o Added session extension capability. | |||
skipping to change at page 62, line 20 ¶ | skipping to change at page 66, line 28 ¶ | |||
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. | (network byte order) 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. | 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. | |||
o Added TLS session security mechanism. | o Added TLS connection security mechanism. | |||
o Added Resource Exhaustion SESS_TERM reason code. | o Added Resource Exhaustion SESS_TERM reason code. | |||
Authors' Addresses | Authors' Addresses | |||
Brian Sipos | Brian Sipos | |||
RKF Engineering Solutions, LLC | RKF Engineering Solutions, LLC | |||
7500 Old Georgetown Road | 7500 Old Georgetown Road | |||
Suite 1275 | Suite 1275 | |||
Bethesda, MD 20814-6198 | Bethesda, MD 20814-6198 | |||
United States of America | United States of America | |||
Email: BSipos@rkf-eng.com | Email: BSipos@rkf-eng.com | |||
Michael Demmer | Michael Demmer | |||
University of California, Berkeley | University of California, Berkeley | |||
Computer Science Division | Computer Science Division | |||
445 Soda Hall | 445 Soda Hall | |||
Berkeley, CA 94720-1776 | Berkeley, CA 94720-1776 | |||
United States of America | United States of America | |||
Email: demmer@cs.berkeley.edu | Email: demmer@cs.berkeley.edu | |||
Joerg Ott | Joerg Ott | |||
End of changes. 193 change blocks. | ||||
574 lines changed or deleted | 749 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/ |