| < draft-ietf-6lo-fragment-recovery-13.txt | draft-ietf-6lo-fragment-recovery-14.txt > | |||
|---|---|---|---|---|
| 6lo P. Thubert, Ed. | 6lo P. Thubert, Ed. | |||
| Internet-Draft Cisco Systems | Internet-Draft Cisco Systems | |||
| Updates: 4944 (if approved) 18 February 2020 | Updates: 4944 (if approved) 6 March 2020 | |||
| Intended status: Standards Track | Intended status: Standards Track | |||
| Expires: 21 August 2020 | Expires: 7 September 2020 | |||
| 6LoWPAN Selective Fragment Recovery | 6LoWPAN Selective Fragment Recovery | |||
| draft-ietf-6lo-fragment-recovery-13 | draft-ietf-6lo-fragment-recovery-14 | |||
| Abstract | Abstract | |||
| This draft updates RFC 4944 with a simple protocol to recover | This draft updates RFC 4944 with a simple protocol to recover | |||
| individual fragments across a route-over mesh network, with a minimal | individual fragments across a route-over mesh network, with a minimal | |||
| flow control to protect the network against bloat. | flow control to protect the network against bloat. | |||
| 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 | |||
| skipping to change at page 1, line 33 ¶ | skipping to change at page 1, line 33 ¶ | |||
| 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 21 August 2020. | This Internet-Draft will expire on 7 September 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 (https://trustee.ietf.org/ | Provisions Relating to IETF Documents (https://trustee.ietf.org/ | |||
| license-info) in effect on the date of publication of this document. | license-info) in effect on the date of publication of this document. | |||
| Please review these documents carefully, as they describe your rights | Please review these documents carefully, as they describe your rights | |||
| skipping to change at page 2, line 14 ¶ | skipping to change at page 2, line 14 ¶ | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | |||
| 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2.1. BCP 14 . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 2.1. BCP 14 . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2.2. References . . . . . . . . . . . . . . . . . . . . . . . 4 | 2.2. References . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2.3. New Terms . . . . . . . . . . . . . . . . . . . . . . . . 5 | 2.3. New Terms . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 3. Updating RFC 4944 . . . . . . . . . . . . . . . . . . . . . . 6 | 3. Updating RFC 4944 . . . . . . . . . . . . . . . . . . . . . . 6 | |||
| 4. Extending draft-ietf-6lo-minimal-fragment . . . . . . . . . . 6 | 4. Extending draft-ietf-6lo-minimal-fragment . . . . . . . . . . 6 | |||
| 4.1. Slack in the First Fragment . . . . . . . . . . . . . . . 7 | 4.1. Slack in the First Fragment . . . . . . . . . . . . . . . 6 | |||
| 4.2. Gap between frames . . . . . . . . . . . . . . . . . . . 7 | 4.2. Gap between frames . . . . . . . . . . . . . . . . . . . 7 | |||
| 4.3. Modifying the First Fragment . . . . . . . . . . . . . . 7 | 4.3. Flow Control . . . . . . . . . . . . . . . . . . . . . . 7 | |||
| 4.4. Modifying the First Fragment . . . . . . . . . . . . . . 8 | ||||
| 5. New Dispatch types and headers . . . . . . . . . . . . . . . 8 | 5. New Dispatch types and headers . . . . . . . . . . . . . . . 8 | |||
| 5.1. Recoverable Fragment Dispatch type and Header . . . . . . 8 | 5.1. Recoverable Fragment Dispatch type and Header . . . . . . 9 | |||
| 5.2. RFRAG Acknowledgment Dispatch type and Header . . . . . . 11 | 5.2. RFRAG Acknowledgment Dispatch type and Header . . . . . . 11 | |||
| 6. Fragment Recovery . . . . . . . . . . . . . . . . . . . . . . 12 | 6. Fragment Recovery . . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 6.1. Forwarding Fragments . . . . . . . . . . . . . . . . . . 14 | 6.1. Forwarding Fragments . . . . . . . . . . . . . . . . . . 14 | |||
| 6.1.1. Receiving the first fragment . . . . . . . . . . . . 15 | 6.1.1. Receiving the first fragment . . . . . . . . . . . . 15 | |||
| 6.1.2. Receiving the next fragments . . . . . . . . . . . . 15 | 6.1.2. Receiving the next fragments . . . . . . . . . . . . 16 | |||
| 6.2. Receiving RFRAG Acknowledgments . . . . . . . . . . . . . 16 | 6.2. Receiving RFRAG Acknowledgments . . . . . . . . . . . . . 16 | |||
| 6.3. Aborting the Transmission of a Fragmented Packet . . . . 16 | 6.3. Aborting the Transmission of a Fragmented Packet . . . . 17 | |||
| 6.4. Applying Recoverable Fragmentation along a Diverse | 6.4. Applying Recoverable Fragmentation along a Diverse | |||
| Path . . . . . . . . . . . . . . . . . . . . . . . . . . 17 | Path . . . . . . . . . . . . . . . . . . . . . . . . . . 18 | |||
| 7. Management Considerations . . . . . . . . . . . . . . . . . . 18 | 7. Management Considerations . . . . . . . . . . . . . . . . . . 18 | |||
| 7.1. Protocol Parameters . . . . . . . . . . . . . . . . . . . 18 | 7.1. Protocol Parameters . . . . . . . . . . . . . . . . . . . 18 | |||
| 7.2. Observing the network . . . . . . . . . . . . . . . . . . 20 | 7.2. Observing the network . . . . . . . . . . . . . . . . . . 21 | |||
| 8. Security Considerations . . . . . . . . . . . . . . . . . . . 21 | 8. Security Considerations . . . . . . . . . . . . . . . . . . . 21 | |||
| 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 21 | 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 22 | |||
| 10. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 22 | 10. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 11. Normative References . . . . . . . . . . . . . . . . . . . . 22 | 11. Normative References . . . . . . . . . . . . . . . . . . . . 23 | |||
| 12. Informative References . . . . . . . . . . . . . . . . . . . 23 | 12. Informative References . . . . . . . . . . . . . . . . . . . 24 | |||
| Appendix A. Rationale . . . . . . . . . . . . . . . . . . . . . 26 | Appendix A. Rationale . . . . . . . . . . . . . . . . . . . . . 26 | |||
| Appendix B. Requirements . . . . . . . . . . . . . . . . . . . . 27 | Appendix B. Requirements . . . . . . . . . . . . . . . . . . . . 28 | |||
| Appendix C. Considerations on Flow Control . . . . . . . . . . . 28 | Appendix C. Considerations on Flow Control . . . . . . . . . . . 29 | |||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 29 | Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 30 | |||
| 1. Introduction | 1. Introduction | |||
| In most Low Power and Lossy Network (LLN) applications, the bulk of | In most Low Power and Lossy Network (LLN) applications, the bulk of | |||
| the traffic consists of small chunks of data (on the order of a few | the traffic consists of small chunks of data (on the order of a few | |||
| bytes to a few tens of bytes) at a time. Given that an IEEE Std. | bytes to a few tens of bytes) at a time. Given that an IEEE Std. | |||
| 802.15.4 [IEEE.802.15.4] frame can carry a payload of 74 bytes or | 802.15.4 [IEEE.802.15.4] frame can carry a payload of 74 bytes or | |||
| more, fragmentation is usually not required. However, and though | more, fragmentation is usually not required. However, and though | |||
| this happens only occasionally, a number of mission critical | this happens only occasionally, a number of mission critical | |||
| applications do require the capability to transfer larger chunks of | applications do require the capability to transfer larger chunks of | |||
| skipping to change at page 3, line 16 ¶ | skipping to change at page 3, line 17 ¶ | |||
| end reliable transport is required. | end reliable transport is required. | |||
| "Transmission of IPv6 Packets over IEEE 802.15.4 Networks" [RFC4944] | "Transmission of IPv6 Packets over IEEE 802.15.4 Networks" [RFC4944] | |||
| defines the original 6LoWPAN datagram fragmentation mechanism for | defines the original 6LoWPAN datagram fragmentation mechanism for | |||
| LLNs. One critical issue with this original design is that routing | LLNs. One critical issue with this original design is that routing | |||
| an IPv6 [RFC8200] packet across a route-over mesh requires | an IPv6 [RFC8200] packet across a route-over mesh requires | |||
| reassembling the full packet at each hop, which may cause latency | reassembling the full packet at each hop, which may cause latency | |||
| along a path and an overall buffer bloat in the network. The "6TiSCH | along a path and an overall buffer bloat in the network. The "6TiSCH | |||
| Architecture" [I-D.ietf-6tisch-architecture] recommends using a | Architecture" [I-D.ietf-6tisch-architecture] recommends using a | |||
| fragment forwarding (FF) technique to alleviate those undesirable | fragment forwarding (FF) technique to alleviate those undesirable | |||
| effects. "LLN Minimal Fragment Forwarding" | effects. | |||
| [I-D.ietf-6lo-minimal-fragment] specifies the general behavior that | ||||
| all FF techniques including this specification follow, and presents | "LLN Minimal Fragment Forwarding" [FRAG-FWD] specifies the general | |||
| the associated caveats. In particular, the routing information is | behavior that all FF techniques including this specification follow, | |||
| fully indicated in the first fragment, which is always forwarded | and presents the associated caveats. In particular, the routing | |||
| first. A state is formed and used to forward all the next fragments | information is fully indicated in the first fragment, which is always | |||
| along the same path. The Datagram_Tag is locally significant to the | forwarded first. A state is formed and used to forward all the next | |||
| Layer-2 source of the packet and is swapped at each hop. | fragments along the same path. The Datagram_Tag is locally | |||
| significant to the Layer-2 source of the packet and is swapped at | ||||
| each hop, more in Section 6. With this specification the | ||||
| Datagram_Tag is encoded in one byte, and will saturate if there are | ||||
| more than 256 datagram that transit in the fragmented form over a | ||||
| same hop at the same time. This is not realistic at the time of this | ||||
| writing. Should this happen in a new 6LoWPAN technology, a node will | ||||
| need to use several Link-Layer addresses to increase its indexing | ||||
| capacity. | ||||
| "Virtual reassembly buffers in 6LoWPAN" | "Virtual reassembly buffers in 6LoWPAN" | |||
| [I-D.ietf-lwig-6lowpan-virtual-reassembly] (VRB) proposes a FF | [I-D.ietf-lwig-6lowpan-virtual-reassembly] (VRB) proposes a FF | |||
| technique that is compatible with [RFC4944] without the need to | technique that is compatible with [RFC4944] without the need to | |||
| define a new protocol. However, adding that capability alone to the | define a new protocol. However, adding that capability alone to the | |||
| local implementation of the original 6LoWPAN fragmentation would not | local implementation of the original 6LoWPAN fragmentation would not | |||
| address the inherent fragility of fragmentation (see | address the inherent fragility of fragmentation (see | |||
| [I-D.ietf-intarea-frag-fragile]) in particular the issues of | [I-D.ietf-intarea-frag-fragile]) in particular the issues of | |||
| resources locked on the receiver and the wasted transmissions due to | resources locked on the receiver and the wasted transmissions due to | |||
| the loss of a single fragment in a whole datagram. [Kent] compares | the loss of a single fragment in a whole datagram. [Kent] compares | |||
| skipping to change at page 4, line 9 ¶ | skipping to change at page 4, line 18 ¶ | |||
| sending fragments, wasting even more resources in the network and | sending fragments, wasting even more resources in the network and | |||
| possibly contributing to the condition that caused the loss to no | possibly contributing to the condition that caused the loss to no | |||
| avail since the datagram cannot arrive in its entirety. RFC 4944 is | avail since the datagram cannot arrive in its entirety. RFC 4944 is | |||
| also missing signaling to abort a multi-fragment transmission at any | also missing signaling to abort a multi-fragment transmission at any | |||
| time and from either end, and, if the capability to forward fragments | time and from either end, and, if the capability to forward fragments | |||
| is implemented, clean up the related state in the network. It is | is implemented, clean up the related state in the network. It is | |||
| also lacking flow control capabilities to avoid participating in | also lacking flow control capabilities to avoid participating in | |||
| congestion that may in turn cause the loss of a fragment and | congestion that may in turn cause the loss of a fragment and | |||
| potentially the retransmission of the full datagram. | potentially the retransmission of the full datagram. | |||
| This specification provides a method to forward fragments across a | This specification provides a method to forward fragments over | |||
| multi-hop route-over mesh, and a selective acknowledgment to recover | typically a few hops in a route-over 6LoWPAN mesh, and a selective | |||
| individual fragments between 6LoWPAN endpoints. The method is | acknowledgment to recover individual fragments between 6LoWPAN | |||
| designed to limit congestion loss in the network and addresses the | endpoints. The method is designed to limit congestion loss in the | |||
| requirements that are detailed in Appendix B. | network and addresses the requirements that are detailed in | |||
| Appendix B. | ||||
| 2. Terminology | 2. Terminology | |||
| 2.1. BCP 14 | 2.1. BCP 14 | |||
| 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.2. References | 2.2. References | |||
| In this document, readers will encounter terms and concepts that are | In this document, readers will encounter terms and concepts that are | |||
| discussed in "Problem Statement and Requirements for IPv6 over | discussed in "Problem Statement and Requirements for IPv6 over | |||
| Low-Power Wireless Personal Area Network (6LoWPAN) Routing" [RFC6606] | Low-Power Wireless Personal Area Network (6LoWPAN) Routing" [RFC6606] | |||
| "LLN Minimal Fragment Forwarding" [I-D.ietf-6lo-minimal-fragment] | "LLN Minimal Fragment Forwarding" [FRAG-FWD] introduces the generic | |||
| introduces the generic concept of a Virtual Reassembly Buffer (VRB) | concept of a Virtual Reassembly Buffer (VRB) and specifies behaviours | |||
| and specifies behaviours and caveats that are common to a large | and caveats that are common to a large family of FF techniques | |||
| family of FF techniques including this, which fully inherits from | including this, which fully inherits from that specification. It | |||
| that specification. | also defines terms used in this document: 6LoWPAN endpoints, | |||
| Compressed Form, Datagram_Tag, Datagram_Size, and Fragment_Offset. | ||||
| Past experience with fragmentation has shown that misassociated or | Past experience with fragmentation has shown that misassociated or | |||
| lost fragments can lead to poor network behavior and, occasionally, | lost fragments can lead to poor network behavior and, occasionally, | |||
| trouble at the application layer. The reader is encouraged to read | trouble at the application layer. The reader is encouraged to read | |||
| "IPv4 Reassembly Errors at High Data Rates" [RFC4963] and follow the | "IPv4 Reassembly Errors at High Data Rates" [RFC4963] and follow the | |||
| references for more information. | references for more information. | |||
| That experience led to the definition of "Path MTU discovery" | That experience led to the definition of "Path MTU discovery" | |||
| [RFC8201] (PMTUD) protocol that limits fragmentation over the | [RFC8201] (PMTUD) protocol that limits fragmentation over the | |||
| Internet. | Internet. | |||
| skipping to change at page 5, line 28 ¶ | skipping to change at page 5, line 36 ¶ | |||
| there is no further analysis of the packet's network layer header. | there is no further analysis of the packet's network layer header. | |||
| Rather, the label is used as an index into a table which specifies | Rather, the label is used as an index into a table which specifies | |||
| the next hop, and a new label". The MPLS technique is leveraged in | the next hop, and a new label". The MPLS technique is leveraged in | |||
| the present specification to forward fragments that actually do not | the present specification to forward fragments that actually do not | |||
| have a network layer header, since the fragmentation occurs below IP. | have a network layer header, since the fragmentation occurs below IP. | |||
| 2.3. New Terms | 2.3. New Terms | |||
| This specification uses the following terms: | This specification uses the following terms: | |||
| 6LoWPAN endpoints: The LLN nodes in charge of generating or | ||||
| expanding a 6LoWPAN header from/to a full IPv6 packet. The | ||||
| 6LoWPAN endpoints are the points where fragmentation and | ||||
| reassembly take place. | ||||
| Compressed Form: This specification uses the generic term Compressed | ||||
| Form to refer to the format of a datagram after the action of | ||||
| [RFC6282] and possibly [RFC8138] for RPL [RFC6550] artifacts. | ||||
| Datagram_Size: The size of the datagram in its Compressed Form | ||||
| before it is fragmented. The Datagram_Size is expressed in a unit | ||||
| that depends on the MAC layer technology, by default a byte. | ||||
| Datagram_Tag: An identifier of a datagram that is locally unique to | ||||
| the Layer-2 sender. Associated with the MAC address of the | ||||
| sender, this becomes a globally unique identifier for the | ||||
| datagram. | ||||
| Fragment_Offset: The offset of a particular fragment of a datagram | ||||
| in its Compressed Form. The Fragment_Offset is expressed in a | ||||
| unit that depends on the MAC layer technology and is by default a | ||||
| byte. | ||||
| RFRAG: Recoverable Fragment | RFRAG: Recoverable Fragment | |||
| RFRAG-ACK: Recoverable Fragment Acknowledgement | RFRAG-ACK: Recoverable Fragment Acknowledgement | |||
| RFRAG Acknowledgment Request: An RFRAG with the Acknowledgement | RFRAG Acknowledgment Request: An RFRAG with the Acknowledgement | |||
| Request flag ('X' flag) set. | Request flag ('X' flag) set. | |||
| NULL bitmap: Refers to a bitmap with all bits set to zero. | NULL bitmap: Refers to a bitmap with all bits set to zero. | |||
| FULL bitmap: Refers to a bitmap with all bits set to one. | FULL bitmap: Refers to a bitmap with all bits set to one. | |||
| Forward: The direction of a LSP path, followed by the RFRAG. | Forward: The direction of a LSP path, followed by the RFRAG. | |||
| skipping to change at page 6, line 33 ¶ | skipping to change at page 6, line 20 ¶ | |||
| where fragments can be forwarded end-to-end across a 6LoWPAN LLN, and | where fragments can be forwarded end-to-end across a 6LoWPAN LLN, and | |||
| where fragments that are lost on the way can be recovered | where fragments that are lost on the way can be recovered | |||
| individually. A new format for fragments is introduced and new | individually. A new format for fragments is introduced and new | |||
| dispatch types are defined in Section 5. | dispatch types are defined in Section 5. | |||
| [RFC8138] allows modifying the size of a packet en route by removing | [RFC8138] allows modifying the size of a packet en route by removing | |||
| the consumed hops in a compressed Routing Header. This requires that | the consumed hops in a compressed Routing Header. This requires that | |||
| Fragment_Offset and Datagram_Size (see Section 2.3) are also modified | Fragment_Offset and Datagram_Size (see Section 2.3) are also modified | |||
| en route, which is difficult to do in the uncompressed form. This | en route, which is difficult to do in the uncompressed form. This | |||
| specification expresses those fields in the Compressed Form and | specification expresses those fields in the Compressed Form and | |||
| allows modifying them en route (see Section 4.3) easily. | allows modifying them en route (see Section 4.4) easily. | |||
| Note that consistent with Section 2 of [RFC6282], for the | Note that consistent with Section 2 of [RFC6282], for the | |||
| fragmentation mechanism described in Section 5.3 of [RFC4944], any | fragmentation mechanism described in Section 5.3 of [RFC4944], any | |||
| header that cannot fit within the first fragment MUST NOT be | header that cannot fit within the first fragment MUST NOT be | |||
| compressed when using the fragmentation mechanism described in this | compressed when using the fragmentation mechanism described in this | |||
| specification. | specification. | |||
| 4. Extending draft-ietf-6lo-minimal-fragment | 4. Extending draft-ietf-6lo-minimal-fragment | |||
| This specification implements the generic FF technique specified in | This specification implements the generic FF technique defined in | |||
| "LLN Minimal Fragment Forwarding" [I-D.ietf-6lo-minimal-fragment] in | "LLN Minimal Fragment Forwarding" [FRAG-FWD], provides end-to-end | |||
| a fashion that enables end-to-end recovery of fragments and some | fragment recovery and mechanisms that can be used for flow control. | |||
| degree of flow control. | ||||
| 4.1. Slack in the First Fragment | 4.1. Slack in the First Fragment | |||
| [I-D.ietf-6lo-minimal-fragment] allows for refragmenting in | [FRAG-FWD] allows for refragmenting in intermediate nodes, meaning | |||
| intermediate nodes, meaning that some bytes from a given fragment may | that some bytes from a given fragment may be left in the VRB to be | |||
| be left in the VRB to be added to the next fragment. The reason for | added to the next fragment. The reason for this happening would be | |||
| this happening would be the need for space in the outgoing fragment | the need for space in the outgoing fragment that was not needed in | |||
| that was not needed in the incoming fragment, for instance because | the incoming fragment, for instance because the 6LoWPAN Header | |||
| the 6LoWPAN Header Compression is not as efficient on the outgoing | Compression is not as efficient on the outgoing link, e.g., if the | |||
| link, e.g., if the Interface ID (IID) of the source IPv6 address is | Interface ID (IID) of the source IPv6 address is elided by the | |||
| elided by the originator on the first hop because it matches the | originator on the first hop because it matches the source Link-Layer | |||
| source MAC address, but cannot be on the next hops because the source | address, but cannot be on the next hops because the source Link-Layer | |||
| MAC address changes. | address changes. | |||
| This specification cannot allow this operation since fragments are | This specification cannot allow this operation since fragments are | |||
| recovered end-to-end based on a sequence number. This means that the | recovered end-to-end based on a sequence number. This means that the | |||
| fragments that contain a 6LoWPAN-compressed header MUST have enough | fragments that contain a 6LoWPAN-compressed header MUST have enough | |||
| slack to enable a less efficient compression in the next hops that | slack to enable a less efficient compression in the next hops that | |||
| still fits in one MAC frame. For instance, if the IID of the source | still fits in one MAC frame. For instance, if the IID of the source | |||
| IPv6 address is elided by the originator, then it MUST compute the | IPv6 address is elided by the originator, then it MUST compute the | |||
| Fragment_Size as if the MTU was 8 bytes less. This way, the next hop | Fragment_Size as if the MTU was 8 bytes less. This way, the next hop | |||
| can restore the source IID to the first fragment without impacting | can restore the source IID to the first fragment without impacting | |||
| the second fragment. | the second fragment. | |||
| 4.2. Gap between frames | 4.2. Gap between frames | |||
| This specification introduces a concept of an inter-frame gap, which | [FRAG-FWD] requires that a configurable interval of time is inserted | |||
| is a configurable interval of time between transmissions to the same | between transmissions to the same next hop and in particular between | |||
| next hop. In the case of half duplex interfaces, this inter-frame | fragments of a same datagram. In the case of half duplex interfaces, | |||
| gap ensures that the next hop has completed processing of the | this inter-frame gap ensures that the next hop is done forwarding the | |||
| previous frame and is capable of receiving the next one. | previous frame and is capable of receiving the next one. | |||
| In the case of a mesh operating at a single frequency with | In the case of a mesh operating at a single frequency with | |||
| omnidirectional antennas, a larger inter-frame gap is required to | omnidirectional antennas, a larger inter-frame gap is required to | |||
| protect the frame against hidden terminal collisions with the | protect the frame against hidden terminal collisions with the | |||
| previous frame of the same flow that is still progressing along a | previous frame of the same flow that is still progressing along a | |||
| common path. | common path. | |||
| The inter-frame gap is useful even for unfragmented datagrams, but it | The inter-frame gap is useful even for unfragmented datagrams, but it | |||
| becomes a necessity for fragments that are typically generated in a | becomes a necessity for fragments that are typically generated in a | |||
| fast sequence and are all sent over the exact same path. | fast sequence and are all sent over the exact same path. | |||
| 4.3. Modifying the First Fragment | 4.3. Flow Control | |||
| The inter-frame gap is the only protection that [FRAG-FWD] imposes by | ||||
| default. This document enables to group fragments in windows and | ||||
| request intermediate acknowledgements so the number of in-flight | ||||
| fragments can be bounded. This document also adds an ECN mechanism | ||||
| that can be used to adapt the size of the window, the size of the | ||||
| fragments, and/or the inter-frame gap to protect the network. | ||||
| This specification enables the source endpoint to apply a flow | ||||
| control mechanism to tune those parameters, but the mechanism itself | ||||
| is out of scope. In most cases, the expectation is that most | ||||
| datagrams will represent only a few fragments, and that only the last | ||||
| fragment will be acknowledged. A basic implementation of the source | ||||
| endpoint is NOT REQUIRED to variate the size of the window, the | ||||
| duration of the inter-frame gap or the size of a fragment in the | ||||
| middle of the transmission of a datagram, and it MAY ignore the ECN | ||||
| signal or simply reset the window to 1 (see Appendix C for more) till | ||||
| the end of this datagram upon detecting a congestion. | ||||
| The size of the fragments is typically computed from the Link MTU to | ||||
| maximize the size of the resulting frames. The size of the window | ||||
| and the duration of the inter-frame gap SHOULD be configurable, to | ||||
| roughly adapt the size of the window to the number of hops in an | ||||
| average path, and to follow the general recommendations in | ||||
| [FRAG-FWD], respectively. | ||||
| 4.4. Modifying the First Fragment | ||||
| The compression of the Hop Limit, of the source and destination | The compression of the Hop Limit, of the source and destination | |||
| addresses in the IPv6 Header, and of the Routing Header may change en | addresses in the IPv6 Header, and of the Routing Header may change en | |||
| route in a Route-Over mesh LLN. If the size of the first fragment is | route in a Route-Over mesh LLN. If the size of the first fragment is | |||
| modified, then the intermediate node MUST adapt the Datagram_Size to | modified, then the intermediate node MUST adapt the Datagram_Size to | |||
| reflect that difference. | reflect that difference. | |||
| The intermediate node MUST also save the difference of Datagram_Size | The intermediate node MUST also save the difference of Datagram_Size | |||
| of the first fragment in the VRB and add it to the Datagram_Size and | of the first fragment in the VRB and add it to the Datagram_Size and | |||
| to the Fragment_Offset of all the subsequent fragments for that | to the Fragment_Offset of all the subsequent fragments for that | |||
| datagram. | datagram. | |||
| 5. New Dispatch types and headers | 5. New Dispatch types and headers | |||
| This specification enables the 6LoWPAN fragmentation sublayer to | This document specifies an alternate to the 6LoWPAN fragmentation | |||
| provide an MTU up to 2048 bytes to the upper layer, which can be the | sublayer [RFC4944] to emulate an Link MTU up to 2048 bytes for the | |||
| 6LoWPAN Header Compression sublayer that is defined in the | upper layer, which can be the 6LoWPAN Header Compression sublayer | |||
| "Compression Format for IPv6 Datagrams" [RFC6282] specification. In | that is defined in the "Compression Format for IPv6 Datagrams" | |||
| order to achieve this, this specification enables the fragmentation | [RFC6282] specification. This specification also provides a reliable | |||
| and the reliable transmission of fragments over a multihop 6LoWPAN | transmission of the fragments over a multihop 6LoWPAN route-over mesh | |||
| mesh network. | network and a minimal flow control to reduce the chances of | |||
| congestion loss. | ||||
| This specification provides a technique that is derived from MPLS to | A LoWPAN Fragment Forwarding [FRAG-FWD] technique derived from MPLS | |||
| forward individual fragments across a 6LoWPAN route-over mesh without | enables the forwarding of individual fragments across a 6LoWPAN | |||
| reassembly at each hop. The Datagram_Tag is used as a label; it is | route-over mesh without reassembly at each hop. The Datagram_Tag is | |||
| locally unique to the node that owns the source MAC address of the | used as a label; it is locally unique to the node that owns the | |||
| fragment, so together the MAC address and the label can identify the | source Link-Layer address of the fragment, so together the Link-Layer | |||
| fragment globally. A node may build the Datagram_Tag in its own | address and the label can identify the fragment globally. A node may | |||
| locally-significant way, as long as the chosen Datagram_Tag stays | build the Datagram_Tag in its own locally-significant way, as long as | |||
| unique to the particular datagram for the lifetime of that datagram. | the chosen Datagram_Tag stays unique to the particular datagram for | |||
| The result is that the label does not need to be globally unique but | the lifetime of that datagram. The result is that the label does not | |||
| also that it must be swapped at each hop as the source MAC address | need to be globally unique but also that it must be swapped at each | |||
| changes. | hop as the source Link-Layer address changes. | |||
| This specification extends RFC 4944 [RFC4944] with 2 new Dispatch | This specification extends RFC 4944 [RFC4944] with 2 new Dispatch | |||
| types, for Recoverable Fragment (RFRAG) and for the RFRAG | types, for Recoverable Fragment (RFRAG) and for the RFRAG | |||
| Acknowledgment back. The new 6LoWPAN Dispatch types are taken from | Acknowledgment back. The new 6LoWPAN Dispatch types are taken from | |||
| Page 0 [RFC8025] as indicated in Table 1 in Section 9. | Page 0 [RFC8025] as indicated in Table 1 in Section 9. | |||
| In the following sections, a "Datagram_Tag" extends the semantics | In the following sections, a "Datagram_Tag" extends the semantics | |||
| defined in [RFC4944] Section 5.3."Fragmentation Type and Header". | defined in [RFC4944] Section 5.3."Fragmentation Type and Header". | |||
| The Datagram_Tag is a locally unique identifier for the datagram from | The Datagram_Tag is a locally unique identifier for the datagram from | |||
| the perspective of the sender. This means that the Datagram_Tag | the perspective of the sender. This means that the Datagram_Tag | |||
| identifies a datagram uniquely in the network when associated with | identifies a datagram uniquely in the network when associated with | |||
| the source of the datagram. As the datagram gets forwarded, the | the source of the datagram. As the datagram gets forwarded, the | |||
| source changes and the Datagram_Tag must be swapped as detailed in | source changes and the Datagram_Tag must be swapped as detailed in | |||
| [I-D.ietf-6lo-minimal-fragment]. | [FRAG-FWD]. | |||
| 5.1. Recoverable Fragment Dispatch type and Header | 5.1. Recoverable Fragment Dispatch type and Header | |||
| In this specification, if the packet is compressed then the size and | In this specification, if the packet is compressed then the size and | |||
| offset of the fragments are expressed with respect to the Compressed | offset of the fragments are expressed with respect to the Compressed | |||
| Form of the packet form as opposed to the uncompressed (native) | Form of the packet form as opposed to the uncompressed (native) | |||
| packet form. | packet form. | |||
| The format of the fragment header is shown in Figure 1. It is the | The format of the fragment header is shown in Figure 1. It is the | |||
| same for all fragments. The format has a length and an offset, as | same for all fragments. The format has a length and an offset, as | |||
| well as a Sequence field. This would be redundant if the offset was | well as a Sequence field. This would be redundant if the offset was | |||
| computed as the product of the Sequence by the length, but this is | computed as the product of the Sequence by the length, but this is | |||
| not the case. The position of a fragment in the reassembly buffer is | not the case. The position of a fragment in the reassembly buffer is | |||
| neither correlated with the value of the Sequence field nor with the | neither correlated with the value of the Sequence field nor with the | |||
| order in which the fragments are received. This enables out-of- | order in which the fragments are received. This enables | |||
| sequence subfragmenting, e.g., a fragment seq. 5 that is retried end- | refragmenting to cope with an MTU deduction, see the example of the | |||
| to-end as smaller fragments seq. 5, 13 and 14 due to a change of MTU | fragment seq. 5 that is retried end-to-end as smaller fragments seq. | |||
| along the path between the 6LoWPAN endpoints. | 13 and 14 in Section 6.2. | |||
| 1 2 3 | 1 2 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |1 1 1 0 1 0 0|E| Datagram_Tag | | |1 1 1 0 1 0 0|E| Datagram_Tag | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |X| Sequence| Fragment_Size | Fragment_Offset | | |X| Sequence| Fragment_Size | Fragment_Offset | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| X set == Ack-Request | X set == Ack-Request | |||
| skipping to change at page 10, line 8 ¶ | skipping to change at page 10, line 19 ¶ | |||
| X: 1 bit; Ack-Request: when set, the sender requires an RFRAG | X: 1 bit; Ack-Request: when set, the sender requires an RFRAG | |||
| Acknowledgment from the receiver. | Acknowledgment from the receiver. | |||
| E: 1 bit; Explicit Congestion Notification; the "E" flag is reset by | E: 1 bit; Explicit Congestion Notification; the "E" flag is reset by | |||
| the source of the fragment and set by intermediate routers to | the source of the fragment and set by intermediate routers to | |||
| signal that this fragment experienced congestion along its path. | signal that this fragment experienced congestion along its path. | |||
| Fragment_Size: 10-bit unsigned integer; the size of this fragment in | Fragment_Size: 10-bit unsigned integer; the size of this fragment in | |||
| a unit that depends on the MAC layer technology. Unless | a unit that depends on the MAC layer technology. Unless | |||
| overridden by a more specific specification, that unit is the | overridden by a more specific specification, that unit is the | |||
| octet, which allows fragments up to 1024 bytes. | byte, which allows fragments up to 1024 bytes. | |||
| Datagram_Tag: 8 bits; an identifier of the datagram that is locally | Datagram_Tag: 8 bits; an identifier of the datagram that is locally | |||
| unique to the sender. | unique to the sender. | |||
| Sequence: 5-bit unsigned integer; the sequence number of the | Sequence: 5-bit unsigned integer; the sequence number of the | |||
| fragment in the acknowledgement bitmap. Fragments are numbered | fragment in the acknowledgement bitmap. Fragments are numbered | |||
| [0..N] where N is in [0..31]. A Sequence of 0 indicates the first | [0..N] where N is in [0..31]. A Sequence of 0 indicates the first | |||
| fragment in a datagram, but non-zero values are not indicative of | fragment in a datagram, but non-zero values are not indicative of | |||
| the position in the reassembly buffer. | the position in the reassembly buffer. | |||
| skipping to change at page 11, line 11 ¶ | skipping to change at page 11, line 22 ¶ | |||
| and the packet is also forwarded in an attempt to clean up the | and the packet is also forwarded in an attempt to clean up the | |||
| next hops along the path indicated by the IPv6 header (possibly | next hops along the path indicated by the IPv6 header (possibly | |||
| including a routing header). | including a routing header). | |||
| If the fragment cannot be forwarded or routed, then an abort | If the fragment cannot be forwarded or routed, then an abort | |||
| RFRAG-ACK is sent back to the source as described in | RFRAG-ACK is sent back to the source as described in | |||
| Section 6.1.2. | Section 6.1.2. | |||
| 5.2. RFRAG Acknowledgment Dispatch type and Header | 5.2. RFRAG Acknowledgment Dispatch type and Header | |||
| This specification also defines a 4-octet RFRAG Acknowledgment bitmap | This specification also defines a 4-byte RFRAG Acknowledgment bitmap | |||
| that is used by the reassembling endpoint to confirm selectively the | that is used by the reassembling endpoint to confirm selectively the | |||
| reception of individual fragments. A given offset in the bitmap maps | reception of individual fragments. A given offset in the bitmap maps | |||
| one-to-one with a given sequence number and indicates which fragment | one-to-one with a given sequence number and indicates which fragment | |||
| is acknowledged as follows: | is acknowledged as follows: | |||
| 1 2 3 | 1 2 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | RFRAG Acknowledgment Bitmap | | | RFRAG Acknowledgment Bitmap | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| skipping to change at page 12, line 30 ¶ | skipping to change at page 12, line 42 ¶ | |||
| 6. Fragment Recovery | 6. Fragment Recovery | |||
| The Recoverable Fragment header RFRAG is used to transport a fragment | The Recoverable Fragment header RFRAG is used to transport a fragment | |||
| and optionally request an RFRAG Acknowledgment that will confirm the | and optionally request an RFRAG Acknowledgment that will confirm the | |||
| good reception of one or more fragments. An RFRAG Acknowledgment is | good reception of one or more fragments. An RFRAG Acknowledgment is | |||
| carried as a standalone fragment header (i.e., with no 6LoWPAN | carried as a standalone fragment header (i.e., with no 6LoWPAN | |||
| payload) in a message that is propagated back to the 6LoWPAN endpoint | payload) in a message that is propagated back to the 6LoWPAN endpoint | |||
| that was the originator of the fragments. To achieve this, each hop | that was the originator of the fragments. To achieve this, each hop | |||
| that performed an MPLS-like operation on fragments reverses that | that performed an MPLS-like operation on fragments reverses that | |||
| operation for the RFRAG_ACK by sending a frame from the next hop to | operation for the RFRAG_ACK by sending a frame from the next hop to | |||
| the previous hop as known by its MAC address in the VRB. The | the previous hop as known by its Link-Layer address in the VRB. The | |||
| Datagram_Tag in the RFRAG_ACK is unique to the receiver and is enough | Datagram_Tag in the RFRAG_ACK is unique to the receiver and is enough | |||
| information for an intermediate hop to locate the VRB that contains | information for an intermediate hop to locate the VRB that contains | |||
| the Datagram_Tag used by the previous hop and the Layer-2 information | the Datagram_Tag used by the previous hop and the Layer-2 information | |||
| associated with it (interface and MAC address). | associated with it (interface and Link-Layer address). | |||
| The 6LoWPAN endpoint that fragments the packets at the 6LoWPAN level | The 6LoWPAN endpoint that fragments the packets at the 6LoWPAN level | |||
| (the sender) also controls the number of acknowledgments by setting | (the sender) also controls the number of acknowledgments by setting | |||
| the Ack-Request flag in the RFRAG packets. The sender may set the | the Ack-Request flag in the RFRAG packets. The sender may set the | |||
| Ack-Request flag on any fragment to perform congestion control by | Ack-Request flag on any fragment to perform congestion control by | |||
| limiting the number of outstanding fragments, which are the fragments | limiting the number of outstanding fragments, which are the fragments | |||
| that have been sent but for which reception or loss was not | that have been sent but for which reception or loss was not | |||
| positively confirmed by the reassembling endpoint. The maximum | positively confirmed by the reassembling endpoint. The maximum | |||
| number of outstanding fragments is controlled by the Window-Size. It | number of outstanding fragments is controlled by the Window-Size. It | |||
| is configurable and may vary in case of ECN notification. When the | is configurable and may vary in case of ECN notification. When the | |||
| skipping to change at page 13, line 10 ¶ | skipping to change at page 13, line 22 ¶ | |||
| reception of all the fragments it has received so far. | reception of all the fragments it has received so far. | |||
| The Ack-Request ('X') set in an RFRAG marks the end of a window. | The Ack-Request ('X') set in an RFRAG marks the end of a window. | |||
| This flag MUST be set on the last fragment if the sender wishes to | This flag MUST be set on the last fragment if the sender wishes to | |||
| protect the datagram, and it MAY be set in any intermediate fragment | protect the datagram, and it MAY be set in any intermediate fragment | |||
| for the purpose of flow control. | for the purpose of flow control. | |||
| This automatic repeat request (ARQ) process MUST be protected by a | This automatic repeat request (ARQ) process MUST be protected by a | |||
| Retransmission Time Out (RTO) timer, and the fragment that carries | Retransmission Time Out (RTO) timer, and the fragment that carries | |||
| the 'X' flag MAY be retried upon a time out for a configurable number | the 'X' flag MAY be retried upon a time out for a configurable number | |||
| of times (see Section 7.1). Upon exhaustion of the retries the | of times (see Section 7.1) with an exponential backoff. Upon | |||
| sender may either abort the transmission of the datagram or retry the | exhaustion of the retries the sender may either abort the | |||
| datagram from the first fragment with an 'X' flag set in order to | transmission of the datagram or resend the first fragment with an 'X' | |||
| reestablish a path and discover which fragments were received over | flag set in order to establish a new path for the datagram and obtain | |||
| the old path in the acknowledgment bitmap. When the sender of the | the list of fragments that were received over the old path in the | |||
| fragment knows that an underlying link-layer mechanism protects the | acknowledgment bitmap. When the sender of the fragment knows that an | |||
| fragments, it may refrain from using the RFRAG Acknowledgment | underlying link-layer mechanism protects the fragments, it may | |||
| mechanism, and never set the Ack-Request bit. | refrain from using the RFRAG Acknowledgment mechanism, and never set | |||
| the Ack-Request bit. | ||||
| The receiver MAY issue unsolicited acknowledgments. An unsolicited | The receiver MAY issue unsolicited acknowledgments. An unsolicited | |||
| acknowledgment signals to the sender endpoint that it can resume | acknowledgment signals to the sender endpoint that it can resume | |||
| sending if it had reached its maximum number of outstanding | sending if it had reached its maximum number of outstanding | |||
| fragments. Another use is to inform the sender that the reassembling | fragments. Another use is to inform the sender that the reassembling | |||
| endpoint aborted the processing of an individual datagram. | endpoint aborted the processing of an individual datagram. | |||
| The RFRAG Acknowledgment can optionally carry an ECN indication for | The RFRAG Acknowledgment has an ECN indication for flow control (see | |||
| flow control (see Appendix C). The receiver of a fragment with the | Appendix C). The receiver of a fragment with the 'E' (ECN) flag set | |||
| 'E' (ECN) flag set MUST echo that information by setting the 'E' | MUST echo that information by setting the 'E' (ECN) flag in the next | |||
| (ECN) flag in the next RFRAG Acknowledgment. | RFRAG Acknowledgment. | |||
| In order to protect the datagram, the sender transfers a controlled | In order to protect the datagram, the sender transfers a controlled | |||
| number of fragments and flags the last fragment of a window with an | number of fragments and flags the last fragment of a window with an | |||
| RFRAG Acknowledgment Request. The receiver MUST acknowledge a | RFRAG Acknowledgment Request. The receiver MUST acknowledge a | |||
| fragment with the acknowledgment request bit set. If any fragment | fragment with the acknowledgment request bit set. If any fragment | |||
| immediately preceding an acknowledgment request is still missing, the | immediately preceding an acknowledgment request is still missing, the | |||
| receiver MAY intentionally delay its acknowledgment to allow in- | receiver MAY intentionally delay its acknowledgment to allow in- | |||
| transit fragments to arrive. Because it might defeat the round-trip | transit fragments to arrive. Because it might defeat the round-trip | |||
| delay computation, delaying the acknowledgment should be configurable | delay computation, delaying the acknowledgment should be configurable | |||
| and not enabled by default. | and not enabled by default. | |||
| When enough fragments are received to cover the whole datagram, the | When enough fragments are received to cover the whole datagram, the | |||
| receiving endpoint reconstructs the packet, passes it to the upper | receiving endpoint reconstructs the packet, passes it to the upper | |||
| layer, sends an RFRAG Acknowledgment on the reverse path with a FULL | layer, sends an RFRAG Acknowledgment on the reverse path with a FULL | |||
| bitmap, and arms a short timer, e.g., on the order of an average | bitmap, and arms a short timer, e.g., on the order of an average | |||
| round-trip delay in the network. As the timer runs, the receiving | round-trip delay in the network. The FULL bitmap is used as opposed | |||
| endpoint absorbs the fragments that were still in flight for that | to a bitmap that acknowledges only the received fragments to let the | |||
| datagram without creating a new state. The receiving endpoint aborts | intermediate nodes know that the datagram is fully received. As the | |||
| the communication if it keeps going on beyond the duration of the | timer runs, the receiving endpoint absorbs the fragments that were | |||
| timer. | still in flight for that datagram without creating a new state. The | |||
| receiving endpoint aborts the communication if it keeps going on | ||||
| beyond the duration of the timer. | ||||
| Note that acknowledgments might consume precious resources so the use | Note that acknowledgments might consume precious resources so the use | |||
| of unsolicited acknowledgments should be configurable and not enabled | of unsolicited acknowledgments should be configurable and not enabled | |||
| by default. | by default. | |||
| An observation is that streamlining forwarding of fragments generally | An observation is that streamlining forwarding of fragments generally | |||
| reduces the latency over the LLN mesh, providing room for retries | reduces the latency over the LLN mesh, providing room for retries | |||
| within existing upper-layer reliability mechanisms. The sender | within existing upper-layer reliability mechanisms. The sender | |||
| protects the transmission over the LLN mesh with a retry timer that | protects the transmission over the LLN mesh with a retry timer that | |||
| is computed according to the method detailed in [RFC6298]. It is | is configured for a use case and may be adapted dynamically, e.g., | |||
| expected that the upper layer retries obey the recommendations in | according to the method detailed in [RFC6298]. It is expected that | |||
| [RFC8085], in which case a single round of fragment recovery should | the upper layer retries obey the recommendations in [RFC8085], in | |||
| fit within the upper layer recovery timers. | which case a single round of fragment recovery should fit within the | |||
| upper layer recovery timers. | ||||
| Fragments are sent in a round-robin fashion: the sender sends all the | Fragments are sent in a round-robin fashion: the sender sends all the | |||
| fragments for a first time before it retries any lost fragment; lost | fragments for a first time before it retries any lost fragment; lost | |||
| fragments are retried in sequence, oldest first. This mechanism | fragments are retried in sequence, oldest first. This mechanism | |||
| enables the receiver to acknowledge fragments that were delayed in | enables the receiver to acknowledge fragments that were delayed in | |||
| the network before they are retried. | the network before they are retried. | |||
| When a single frequency is used by contiguous hops, the sender should | When a single frequency is used by contiguous hops, the sender should | |||
| insert a delay between the frames (e.g., carrying fragments) that are | insert a delay between the frames (e.g., carrying fragments) that are | |||
| sent to the same next hop. The delay should cover multiple | sent to the same next hop. The delay should cover multiple | |||
| skipping to change at page 15, line 7 ¶ | skipping to change at page 15, line 21 ¶ | |||
| receiving the first fragment, the routers along the path install a | receiving the first fragment, the routers along the path install a | |||
| label-switched path (LSP), and the following fragments are label- | label-switched path (LSP), and the following fragments are label- | |||
| switched along that path. As a consequence, the next fragments can | switched along that path. As a consequence, the next fragments can | |||
| only follow the path that was set up by the first fragment and cannot | only follow the path that was set up by the first fragment and cannot | |||
| follow an alternate route. The Datagram_Tag is used to carry the | follow an alternate route. The Datagram_Tag is used to carry the | |||
| label, which is swapped in each hop. All fragments follow the same | label, which is swapped in each hop. All fragments follow the same | |||
| path and fragments are delivered in the order in which they are sent. | path and fragments are delivered in the order in which they are sent. | |||
| 6.1.1. Receiving the first fragment | 6.1.1. Receiving the first fragment | |||
| In Route-Over mode, the source and destination MAC addresses in a | In Route-Over mode, the source and destination Link-Layer addresses | |||
| frame change at each hop. The label that is formed and placed in the | in a frame change at each hop. The label that is formed and placed | |||
| Datagram_Tag is associated with the source MAC address and only valid | in the Datagram_Tag is associated with the source Link-Layer address | |||
| (and unique) for that source MAC address. Upon receiving the first | and only valid (and unique) for that source Link-Layer address. Upon | |||
| fragment (i.e., with a Sequence of zero), an intermediate router | receiving the first fragment (i.e., with a Sequence of zero), an | |||
| creates a VRB and the associated LSP state for the tuple (source MAC | intermediate router creates a VRB and the associated LSP state for | |||
| address, Datagram_Tag) and the fragment is forwarded along the IPv6 | the tuple (source Link-Layer address, Datagram_Tag) and the fragment | |||
| route that matches the destination IPv6 address in the IPv6 header as | is forwarded along the IPv6 route that matches the destination IPv6 | |||
| prescribed by [I-D.ietf-6lo-minimal-fragment], where the receiving | address in the IPv6 header as prescribed by [FRAG-FWD], where the | |||
| endpoint allocates a reassembly buffer. | receiving endpoint allocates a reassembly buffer. | |||
| The LSP state enables to match the (previous MAC address, | The LSP state enables to match the (previous Link-Layer address, | |||
| Datagram_Tag) in an incoming fragment to the tuple (next MAC address, | Datagram_Tag) in an incoming fragment to the tuple (next Link-Layer | |||
| swapped Datagram_Tag) used in the forwarded fragment and points at | address, swapped Datagram_Tag) used in the forwarded fragment and | |||
| the VRB. In addition, the router also forms a reverse LSP state | points at the VRB. In addition, the router also forms a reverse LSP | |||
| indexed by the MAC address of the next hop and the swapped | state indexed by the MAC address of the next hop and the swapped | |||
| Datagram_Tag. This reverse LSP state also points at the VRB and | Datagram_Tag. This reverse LSP state also points at the VRB and | |||
| enables matching the (next MAC address, swapped_Datagram_Tag) found | enables matching the (next Link-Layer address, swapped_Datagram_Tag) | |||
| in an RFRAG Acknowledgment to the tuple (previous MAC address, | found in an RFRAG Acknowledgment to the tuple (previous Link-Layer | |||
| Datagram_Tag) used when forwarding a Fragment Acknowledgment (RFRAG- | address, Datagram_Tag) used when forwarding a Fragment Acknowledgment | |||
| ACK) back to the sender endpoint. | (RFRAG-ACK) back to the sender endpoint. | |||
| The first fragment may be received a second time, indicating that it | The first fragment may be received a second time, indicating that it | |||
| did not reach the destination and was retried. In that case, it | did not reach the destination and was retried. In that case, it | |||
| SHOULD follow the same path as the first occurrence. It is up to | SHOULD follow the same path as the first occurrence. It is up to | |||
| sending endpoint to determine whether to abort a transmission and | sending endpoint to determine whether to abort a transmission and | |||
| then retry it from scratch, which may build an entirely new path. | then retry it from scratch, which may build an entirely new path. | |||
| 6.1.2. Receiving the next fragments | 6.1.2. Receiving the next fragments | |||
| Upon receiving the next fragment (i.e., with a non-zero Sequence), an | Upon receiving the next fragment (i.e., with a non-zero Sequence), an | |||
| intermediate router looks up a LSP indexed by the tuple (MAC address, | intermediate router looks up a LSP indexed by the tuple (Link-Layer | |||
| Datagram_Tag) found in the fragment. If it is found, the router | address, Datagram_Tag) found in the fragment. If it is found, the | |||
| forwards the fragment using the associated VRB as prescribed by | router forwards the fragment using the associated VRB as prescribed | |||
| [I-D.ietf-6lo-minimal-fragment]. | by [FRAG-FWD]. | |||
| If the VRB for the tuple is not found, the router builds an RFRAG-ACK | If the VRB for the tuple is not found, the router builds an RFRAG-ACK | |||
| to abort the transmission of the packet. The resulting message has | to abort the transmission of the packet. The resulting message has | |||
| the following information: | the following information: | |||
| * The source and destination MAC addresses are swapped from those | * The source and destination Link-Layer addresses are swapped from | |||
| found in the fragment | those found in the fragment | |||
| * The Datagram_Tag is set to the Datagram_Tag found in the fragment | * The Datagram_Tag is set to the Datagram_Tag found in the fragment | |||
| * A NULL bitmap is used to signal the abort condition | * A NULL bitmap is used to signal the abort condition | |||
| At this point the router is all set and can send the RFRAG-ACK back | At this point the router is all set and can send the RFRAG-ACK back | |||
| to the previous router. The RFRAG-ACK should normally be forwarded | to the previous router. The RFRAG-ACK should normally be forwarded | |||
| all the way to the source using the reverse LSP state in the VRBs in | all the way to the source using the reverse LSP state in the VRBs in | |||
| the intermediate routers as described in the next section. | the intermediate routers as described in the next section. | |||
| [I-D.ietf-6lo-minimal-fragment] indicates that the receiving endpoint | [FRAG-FWD] indicates that the receiving endpoint stores "the actual | |||
| stores "the actual packet data from the fragments received so far, in | packet data from the fragments received so far, in a form that makes | |||
| a form that makes it possible to detect when the whole packet has | it possible to detect when the whole packet has been received and can | |||
| been received and can be processed or forwarded". How this is | be processed or forwarded". How this is computed is implementation | |||
| computed is implementation specific but relies on receiving all the | specific but relies on receiving all the bytes up to the | |||
| bytes up to the Datagram_Size indicated in the first fragment. An | Datagram_Size indicated in the first fragment. An implementation may | |||
| implementation may receive overlapping fragments as the result of | receive overlapping fragments as the result of retries after an MTU | |||
| retries after an MTU change. | change. | |||
| 6.2. Receiving RFRAG Acknowledgments | 6.2. Receiving RFRAG Acknowledgments | |||
| Upon receipt of an RFRAG-ACK, the router looks up a reverse LSP | Upon receipt of an RFRAG-ACK, the router looks up a reverse LSP | |||
| indexed by the tuple (MAC address, Datagram_Tag), which are | indexed by the tuple (Link-Layer address, Datagram_Tag), which are | |||
| respectively the source MAC address of the received frame and the | respectively the source Link-Layer address of the received frame and | |||
| received Datagram_Tag. If it is found, the router forwards the | the received Datagram_Tag. If it is found, the router forwards the | |||
| fragment using the associated VRB as prescribed by | fragment using the associated VRB as prescribed by [FRAG-FWD], but | |||
| [I-D.ietf-6lo-minimal-fragment], but using the reverse LSP so that | using the reverse LSP so that the RFRAG-ACK flows back to the sender | |||
| the RFRAG-ACK flows back to the sender endpoint. | endpoint. | |||
| If the reverse LSP is not found, the router MUST silently drop the | If the reverse LSP is not found, the router MUST silently drop the | |||
| RFRAG-ACK message. | RFRAG-ACK message. | |||
| Either way, if the RFRAG-ACK indicates that the fragment was entirely | Either way, if the RFRAG-ACK indicates that the fragment was entirely | |||
| received (FULL bitmap), it arms a short timer, and upon timeout, the | received (FULL bitmap), it arms a short timer, and upon timeout, the | |||
| VRB and all the associated state are destroyed. Until the timer | VRB and all the associated state are destroyed. Until the timer | |||
| elapses, fragments of that datagram may still be received, e.g. if | elapses, fragments of that datagram may still be received, e.g. if | |||
| the RFRAG-ACK was lost on the way back and the source retried the | the RFRAG-ACK was lost on the way back and the source retried the | |||
| last fragment. In that case, the router forwards the fragment | last fragment. In that case, the router forwards the fragment | |||
| according to the state in the VRB. | according to the state in the VRB. | |||
| This specification does not provide a method to discover the number | This specification does not provide a method to discover the number | |||
| of hops or the minimal value of MTU along those hops. But should the | of hops or the minimal value of MTU along those hops. But should the | |||
| minimal MTU decrease, it is possible to retry a long fragment (say | minimal MTU decrease, it is possible to retry a long fragment (say | |||
| Sequence of 5) with first a shorter fragment of the same Sequence (5 | Sequence of 5) with several shorter fragments with a Sequence that | |||
| again) and then one or more other fragments with a Sequence that was | was not used before (e.g., 13 and 14). Fragment 5 is marked as | |||
| not used before (e.g., 13 and 14). Note that Path MTU Discovery is | abandoned and will not be retried anymore. Note that when thi | |||
| out of scope for this document. | smechanism is in place, it is hard to predict the total number of | |||
| fragments that will be needed or the final shape of the bitmap that | ||||
| would cover the whole packet. This is why the FULL bitmap is used | ||||
| when the receiving endpoint gets the whole datagram regardless of | ||||
| which fragments were actually used to do so. Intermediate nodes will | ||||
| unabiguously knw that the process is complete. Note that Path MTU | ||||
| Discovery is out of scope for this document. | ||||
| 6.3. Aborting the Transmission of a Fragmented Packet | 6.3. Aborting the Transmission of a Fragmented Packet | |||
| A reset is signaled on the forward path with a pseudo fragment that | A reset is signaled on the forward path with a pseudo fragment that | |||
| has the Fragment_Offset, Sequence, and Fragment_Size all set to 0, | has the Fragment_Offset, Sequence, and Fragment_Size all set to 0, | |||
| and no data. | and no data. | |||
| When the sender or a router on the way decides that a packet should | When the sender or a router on the way decides that a packet should | |||
| be dropped and the fragmentation process aborted, it generates a | be dropped and the fragmentation process aborted, it generates a | |||
| reset pseudo fragment and forwards it down the fragment path. | reset pseudo fragment and forwards it down the fragment path. | |||
| skipping to change at page 18, line 8 ¶ | skipping to change at page 18, line 23 ¶ | |||
| with Packet ARQ, Replication, Elimination and Overhearing (PAREO) | with Packet ARQ, Replication, Elimination and Overhearing (PAREO) | |||
| along the Track. This specification can be used along any subset of | along the Track. This specification can be used along any subset of | |||
| the complex Track where the first fragment is flooded. The last | the complex Track where the first fragment is flooded. The last | |||
| RFRAG Acknowledgment is flooded on that same subset in the reverse | RFRAG Acknowledgment is flooded on that same subset in the reverse | |||
| direction. Intermediate RFRAG Acknowledgments can be flooded on any | direction. Intermediate RFRAG Acknowledgments can be flooded on any | |||
| sub-subset of that reverse subset that reach back to the source. | sub-subset of that reverse subset that reach back to the source. | |||
| 7. Management Considerations | 7. Management Considerations | |||
| This specification extends "On Forwarding 6LoWPAN Fragments over a | This specification extends "On Forwarding 6LoWPAN Fragments over a | |||
| Multihop IPv6 Network" [I-D.ietf-6lo-minimal-fragment] and requires | Multihop IPv6 Network" [FRAG-FWD] and requires the same parameters in | |||
| the same parameters in the receiver and on intermediate nodes. There | the receiver and on intermediate nodes. There is no new parameter as | |||
| is no new parameter as echoing ECN is always on. These parameters | echoing ECN is always on. These parameters typically include the | |||
| typically include the reassembly time-out at the receiver and an | reassembly time-out at the receiver and an inactivity clean-up timer | |||
| inactivity clean-up timer on the intermediate nodes, and the number | on the intermediate nodes, and the number of messages that can be | |||
| of messages that can be processed in parallel in all nodes. | processed in parallel in all nodes. | |||
| The configuration settings introduced by this specification only | The configuration settings introduced by this specification only | |||
| apply to the sender, which is in full control of the transmission. | apply to the sender, which is in full control of the transmission. | |||
| LLNs vary a lot in size (there can be thousands of nodes in a mesh), | LLNs vary a lot in size (there can be thousands of nodes in a mesh), | |||
| in speed (from 10 Kbps to several Mbps at the PHY layer), in traffic | in speed (from 10 Kbps to several Mbps at the PHY layer), in traffic | |||
| density, and in optimizations that are desired (e.g., the selection | density, and in optimizations that are desired (e.g., the selection | |||
| of a RPL [RFC6550] Objective Function [RFC6552] impacts the shape of | of a RPL [RFC6550] Objective Function [RFC6552] impacts the shape of | |||
| the routing graph). | the routing graph). | |||
| For that reason, only a very generic guidance can be given on the | For that reason, only a very generic guidance can be given on the | |||
| settings of the sender and on whether complex algorithms are needed | settings of the sender and on whether complex algorithms are needed | |||
| to perform flow control or estimate the round-trip time. To cover | to perform flow control or estimate the round-trip time. To cover | |||
| the most complex use cases, this specification enables the sender to | the most complex use cases, this specification enables the sender to | |||
| vary the fragment size, the window size, and the inter-frame gap, | vary the fragment size, the window size, and the inter-frame gap, | |||
| based on the number of losses, the observed variations of the round- | based on the number of losses, the observed variations of the round- | |||
| trip time and the setting of the ECN bit. | trip time and the setting of the ECN bit. | |||
| 7.1. Protocol Parameters | 7.1. Protocol Parameters | |||
| The management system SHOULD be capable of providing the parameters | The management system SHOULD be capable of providing the parameters | |||
| listed in this section. | listed in this section and an implementation MUST abide by those | |||
| parameters and in particular never exceed the minimum and maximum | ||||
| configured boundaries. | ||||
| An implementation must control the rate at which it sends packets | An implementation must control the rate at which it sends packets | |||
| over the same path to allow the next hop to forward a packet before | over the same path to allow the next hop to forward a packet before | |||
| it gets the next. In a wireless network that uses the same frequency | it gets the next. In a wireless network that uses the same frequency | |||
| along a path, more time must be inserted to avoid hidden terminal | along a path, more time must be inserted to avoid hidden terminal | |||
| issues between fragments (more in Section 4.2). | issues between fragments (more in Section 4.2). | |||
| This is controlled by the following parameter: | This is controlled by the following parameter: | |||
| inter-frame gap: Indicates the minimum amount of time between | inter-frame gap: Indicates the minimum amount of time between | |||
| skipping to change at page 19, line 30 ¶ | skipping to change at page 19, line 48 ¶ | |||
| expected fluidity and the overhead of MAC and 6LoWPAN headers. | expected fluidity and the overhead of MAC and 6LoWPAN headers. | |||
| For a small MTU, the idea is to keep it close to the maximum, | For a small MTU, the idea is to keep it close to the maximum, | |||
| whereas for larger MTUs, it might makes sense to keep it short | whereas for larger MTUs, it might makes sense to keep it short | |||
| enough, so that the duty cycle of the transmitter is bounded, | enough, so that the duty cycle of the transmitter is bounded, | |||
| e.g., to transmit at least 10 frames per second. | e.g., to transmit at least 10 frames per second. | |||
| MaxFragmentSize: The MaxFragmentSize is the maximum value for the | MaxFragmentSize: The MaxFragmentSize is the maximum value for the | |||
| Fragment_Size. It MUST be lower than the minimum MTU along the | Fragment_Size. It MUST be lower than the minimum MTU along the | |||
| path. A large value augments the chances of buffer bloat and | path. A large value augments the chances of buffer bloat and | |||
| transmission loss. The value MUST be less than 512 if the unit | transmission loss. The value MUST be less than 512 if the unit | |||
| that is defined for the PHY layer is the octet. | that is defined for the PHY layer is the byte. | |||
| MinWindowSize: The minimum value of Window_Size that the sender can | MinWindowSize: The minimum value of Window_Size that the sender can | |||
| use. | use. A value of 1 is RECOMMENDED. | |||
| OptWindowSize: The OptWindowSize is the value for the Window_Size | OptWindowSize: The OptWindowSize is the value for the Window_Size | |||
| that the sender should use to start with. It is greater than or | that the sender should use to start with. It is greater than or | |||
| equal to MinWindowSize. It is less than or equal to | equal to MinWindowSize. It is less than or equal to | |||
| MaxWindowSize. The Window_Size should be maintained below the | MaxWindowSize. A rule of a thumb for OptWindowSize could be an | |||
| number of hops in the path of the fragment to avoid stacking | estimation of the one-way trip time divided by the inter-frame | |||
| fragments at the bottleneck on the path. If an inter-frame gap is | gap. If the acknowledgement back is too costly, it is possible to | |||
| used to avoid interference between fragments then the Window_Size | set this to 32, meaning that only the last Fragment is | |||
| should be at most on the order of the estimation of the trip time | acknowledged in the first round. | |||
| divided by the inter-frame gap. | ||||
| MaxWindowSize: The maximum value of Window_Size that the sender can | MaxWindowSize: The maximum value of Window_Size that the sender can | |||
| use. The value MUST be less than 32. | use. The value MUST be strictly less than 33. | |||
| An implementation may perform its estimate of the RTO or use a | An implementation may perform its estimate of the RTO or use a | |||
| configured one. The ARQ process is controlled by the following | configured one. The ARQ process is controlled by the following | |||
| parameters: | parameters: | |||
| MinARQTimeOut: The maximum amount of time a node should wait for an | MinARQTimeOut: The minimum amount of time a node should wait for an | |||
| RFRAG Acknowledgment before it takes the next action. | RFRAG Acknowledgment before it takes the next action. It MUST be | |||
| more than the maximum expected round-trip time in the respective | ||||
| network. | ||||
| OptARQTimeOut: The initial value of the RTO, which is the amount of | OptARQTimeOut: The initial value of the RTO, which is the amount of | |||
| time that a sender should wait for an RFRAG Acknowledgment before | time that a sender should wait for an RFRAG Acknowledgment before | |||
| it takes the next action. It is greater than or equal to | it takes the next action. It is greater than or equal to | |||
| MinARQTimeOut. It is less than or equal to MaxARQTimeOut. See | MinARQTimeOut. It is less than or equal to MaxARQTimeOut. See | |||
| Appendix C for recommendations on computing the round-trip time. | Appendix C for recommendations on computing the round-trip time. | |||
| By default a value of 3 times the maximum expected round-trip time | ||||
| in the respective network is RECOMMENDED. | ||||
| MaxARQTimeOut: The maximum amount of time a node should wait for the | MaxARQTimeOut: The maximum amount of time a node should wait for the | |||
| RFRAG Acknowledgment before it takes the next action. It must | RFRAG Acknowledgment before it takes the next action. It must | |||
| cover the longest expected round-trip time, and be several times | cover the longest expected round-trip time, and be several times | |||
| less than the time-out that covers the recomposition buffer at the | less than the time-out that covers the recomposition buffer at the | |||
| receiver, which is typically on the order of the minute. | receiver, which is typically on the order of the minute. An upper | |||
| bound can be estimated to ensure that the datagram is either fully | ||||
| transmitted or dropped before an upper layer decides to retry it. | ||||
| MaxFragRetries: The maximum number of retries for a particular | MaxFragRetries: The maximum number of retries for a particular | |||
| fragment. | fragment. A default value of 3 is RECOMMENDED. An upper bound | |||
| can be estimated to ensure that the datagram is either fully | ||||
| transmitted or dropped before an upper layer decides to retry it. | ||||
| MaxDatagramRetries: The maximum number of retries from scratch for a | MaxDatagramRetries: The maximum number of retries from scratch for a | |||
| particular datagram. | particular datagram. A default value of 1 is RECOMMENDED. An | |||
| upper bound can be estimated to ensure that the datagram is either | ||||
| fully transmitted or dropped before an upper layer decides to | ||||
| retry it. | ||||
| An implementation may be capable of performing flow control based on | An implementation may be capable of performing flow control based on | |||
| ECN; see in Appendix C. This is controlled by the following | ECN; see in Appendix C. This is controlled by the following | |||
| parameter: | parameter: | |||
| UseECN: Indicates whether the sender should react to ECN. The | UseECN: Indicates whether the sender should react to ECN. The | |||
| sender may react to ECN by varying the Window_Size between | sender may react to ECN by varying the Window_Size between | |||
| MinWindowSize and MaxWindowSize, varying the Fragment_Size between | MinWindowSize and MaxWindowSize, varying the Fragment_Size between | |||
| MinFragmentSize and MaxFragmentSize, and/or by increasing the | MinFragmentSize and MaxFragmentSize, and/or by increasing or | |||
| inter-frame gap. | reducing the inter-frame gap. | |||
| 7.2. Observing the network | 7.2. Observing the network | |||
| The management system should monitor the number of retries and of ECN | The management system should monitor the number of retries and of ECN | |||
| settings that can be observed from the perspective of both the sender | settings that can be observed from the perspective of both the sender | |||
| and the receiver, and may tune the optimum size of Fragment_Size and | and the receiver with regards to the other endpoint. It may then | |||
| of Window_Size, OptFragmentSize, and OptWindowSize, respectively, at | tune the optimum size of Fragment_Size and of Window_Size, | |||
| the sender. The values should be bounded by the expected number of | OptFragmentSize, and OptWindowSize, respectively, at the sender | |||
| hops and reduced beyond that when the number of datagrams that can | towards a particular receiver, applicable to the next datagrams. The | |||
| traverse an intermediate point may exceed its capacity and cause a | values should be bounded by the expected number of hops and reduced | |||
| congestion loss. The inter-frame gap is another tool that can be | beyond that when the number of datagrams that can traverse an | |||
| used to increase the spacing between fragments of the same datagram | intermediate point may exceed its capacity and cause a congestion | |||
| and reduce the ratio of time when a particular intermediate node | loss. The inter-frame gap is another tool that can be used to | |||
| holds a fragment of that datagram. | increase the spacing between fragments of the same datagram and | |||
| reduce the ratio of time when a particular intermediate node holds a | ||||
| fragment of that datagram. | ||||
| 8. Security Considerations | 8. Security Considerations | |||
| This document specifies an instantiation of a 6LoWPAN Fragment | This document specifies an instantiation of a 6LoWPAN Fragment | |||
| Forwarding technique. [I-D.ietf-6lo-minimal-fragment] provides the | Forwarding technique. [FRAG-FWD] provides the generic description of | |||
| generic description of Fragment Forwarding and this specification | Fragment Forwarding and this specification inherits from it. The | |||
| inherits from it. The generic considerations in the Security | generic considerations in the Security sections of [FRAG-FWD] apply | |||
| sections of [I-D.ietf-6lo-minimal-fragment] apply equally to this | equally to this document. | |||
| document. | ||||
| This specification does not recommend a particular algorithm for the | This specification does not recommend a particular algorithm for the | |||
| estimation of the duration of the RTO that covers the detection of | estimation of the duration of the RTO that covers the detection of | |||
| the loss of a fragment with the 'X' flag set; regardless, an attacker | the loss of a fragment with the 'X' flag set; regardless, an attacker | |||
| on the path may slow down or discard packets, which in turn can | on the path may slow down or discard packets, which in turn can | |||
| affect the throughput of fragmented packets. | affect the throughput of fragmented packets. | |||
| Compared to "Transmission of IPv6 Packets over IEEE 802.15.4 | Compared to "Transmission of IPv6 Packets over IEEE 802.15.4 | |||
| Networks" [RFC4944], this specification reduces the Datagram_Tag to 8 | Networks" [RFC4944], this specification reduces the Datagram_Tag to 8 | |||
| bits and the tag wraps faster than with [RFC4944]. But for a | bits and the tag wraps faster than with [RFC4944]. But for a | |||
| constrained network where a node is expected to be able to hold only | constrained network where a node is expected to be able to hold only | |||
| one or a few large packets in memory, 256 is still a large number. | one or a few large packets in memory, 256 is still a large number. | |||
| Also, the acknowledgement mechanism allows cleaning up the state | Also, the acknowledgement mechanism allows cleaning up the state | |||
| rapidly once the packet is fully transmitted or aborted. | rapidly once the packet is fully transmitted or aborted. | |||
| The abstract Virtual Recovery Buffer inherited from | The abstract Virtual Recovery Buffer inherited from [FRAG-FWD] may be | |||
| [I-D.ietf-6lo-minimal-fragment] may be used to perform a Denial-of- | used to perform a Denial-of-Service (DoS) attack against the | |||
| Service (DoS) attack against the intermediate Routers since the | intermediate Routers since the routers need to maintain a state per | |||
| routers need to maintain a state per flow. The particular VRB | flow. The particular VRB implementation technique described in | |||
| implementation technique described in | ||||
| [I-D.ietf-lwig-6lowpan-virtual-reassembly] allows realigning which | [I-D.ietf-lwig-6lowpan-virtual-reassembly] allows realigning which | |||
| data goes in which fragment, which causes the intermediate node to | data goes in which fragment, which causes the intermediate node to | |||
| store a portion of the data, which adds an attack vector that is not | store a portion of the data, which adds an attack vector that is not | |||
| present with this specification. With this specification, the data | present with this specification. With this specification, the data | |||
| that is transported in each fragment is conserved and the state to | that is transported in each fragment is conserved and the state to | |||
| keep does not include any data that would not fit in the previous | keep does not include any data that would not fit in the previous | |||
| fragment. | fragment. | |||
| 9. IANA Considerations | 9. IANA Considerations | |||
| skipping to change at page 22, line 30 ¶ | skipping to change at page 23, line 11 ¶ | |||
| +-------------+------+----------------------------------+-----------+ | +-------------+------+----------------------------------+-----------+ | |||
| Table 1: Additional Dispatch Value Bit Patterns | Table 1: Additional Dispatch Value Bit Patterns | |||
| 10. Acknowledgments | 10. Acknowledgments | |||
| The author wishes to thank Michel Veillette, Dario Tedeschi, Laurent | The author wishes to thank Michel Veillette, Dario Tedeschi, Laurent | |||
| Toutain, Carles Gomez Montenegro, Thomas Watteyne, and Michael | Toutain, Carles Gomez Montenegro, Thomas Watteyne, and Michael | |||
| Richardson for in-depth reviews and comments. Also many thanks to | Richardson for in-depth reviews and comments. Also many thanks to | |||
| Roman Danyliw, Peter Yee, Colin Perkins, Tirumaleswar Reddy Konda, | Roman Danyliw, Peter Yee, Colin Perkins, Tirumaleswar Reddy Konda, | |||
| and Erik Nordmark for their careful reviews and for helping through | Eric Vyncke, Benjamin Kaduk, Warren Kumari, Magnus Westerlund, Mirja | |||
| the IETF Last Call and IESG review process, and to Jonathan Hui, Jay | Kuhlewind, and Erik Nordmark for their careful reviews and for | |||
| Werb, Christos Polyzois, Soumitri Kolavennu, Pat Kinney, Margaret | helping through the IETF Last Call and IESG review process, and to | |||
| Wasserman, Richard Kelsey, Carsten Bormann, and Harry Courtice for | Jonathan Hui, Jay Werb, Christos Polyzois, Soumitri Kolavennu, Pat | |||
| their various contributions in the long process that lead to this | Kinney, Margaret Wasserman, Richard Kelsey, Carsten Bormann, and | |||
| document. | Harry Courtice for their various contributions in the long process | |||
| that lead to this document. | ||||
| 11. Normative References | 11. Normative References | |||
| [RFC6298] Paxson, V., Allman, M., Chu, J., and M. Sargent, | [RFC6298] Paxson, V., Allman, M., Chu, J., and M. Sargent, | |||
| "Computing TCP's Retransmission Timer", RFC 6298, | "Computing TCP's Retransmission Timer", RFC 6298, | |||
| DOI 10.17487/RFC6298, June 2011, | DOI 10.17487/RFC6298, June 2011, | |||
| <https://www.rfc-editor.org/info/rfc6298>. | <https://www.rfc-editor.org/info/rfc6298>. | |||
| [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, | |||
| skipping to change at page 23, line 30 ¶ | skipping to change at page 24, line 14 ¶ | |||
| [RFC8138] Thubert, P., Ed., Bormann, C., Toutain, L., and R. Cragie, | [RFC8138] Thubert, P., Ed., Bormann, C., Toutain, L., and R. Cragie, | |||
| "IPv6 over Low-Power Wireless Personal Area Network | "IPv6 over Low-Power Wireless Personal Area Network | |||
| (6LoWPAN) Routing Header", RFC 8138, DOI 10.17487/RFC8138, | (6LoWPAN) Routing Header", RFC 8138, DOI 10.17487/RFC8138, | |||
| April 2017, <https://www.rfc-editor.org/info/rfc8138>. | April 2017, <https://www.rfc-editor.org/info/rfc8138>. | |||
| [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
| 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
| May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
| [I-D.ietf-6lo-minimal-fragment] | [FRAG-FWD] Watteyne, T., Thubert, P., and C. Bormann, "On Forwarding | |||
| Watteyne, T., Thubert, P., and C. Bormann, "On Forwarding | ||||
| 6LoWPAN Fragments over a Multihop IPv6 Network", Work in | 6LoWPAN Fragments over a Multihop IPv6 Network", Work in | |||
| Progress, Internet-Draft, draft-ietf-6lo-minimal-fragment- | Progress, Internet-Draft, draft-ietf-6lo-minimal-fragment- | |||
| 10, 1 February 2020, <https://tools.ietf.org/html/draft- | 13, 5 March 2020, <https://tools.ietf.org/html/draft-ietf- | |||
| ietf-6lo-minimal-fragment-10>. | 6lo-minimal-fragment-13>. | |||
| 12. Informative References | 12. Informative References | |||
| [RFC8201] McCann, J., Deering, S., Mogul, J., and R. Hinden, Ed., | [RFC8201] McCann, J., Deering, S., Mogul, J., and R. Hinden, Ed., | |||
| "Path MTU Discovery for IP version 6", STD 87, RFC 8201, | "Path MTU Discovery for IP version 6", STD 87, RFC 8201, | |||
| DOI 10.17487/RFC8201, July 2017, | DOI 10.17487/RFC8201, July 2017, | |||
| <https://www.rfc-editor.org/info/rfc8201>. | <https://www.rfc-editor.org/info/rfc8201>. | |||
| [RFC7567] Baker, F., Ed. and G. Fairhurst, Ed., "IETF | [RFC7567] Baker, F., Ed. and G. Fairhurst, Ed., "IETF | |||
| Recommendations Regarding Active Queue Management", | Recommendations Regarding Active Queue Management", | |||
| skipping to change at page 27, line 29 ¶ | skipping to change at page 28, line 12 ¶ | |||
| higher than that traditionally experienced over the Internet with | higher than that traditionally experienced over the Internet with | |||
| IPv4 fragments. At the same time, the use of radios increases the | IPv4 fragments. At the same time, the use of radios increases the | |||
| probability of transmission loss and Mesh-Under techniques compound | probability of transmission loss and Mesh-Under techniques compound | |||
| that risk over multiple hops. | that risk over multiple hops. | |||
| Mechanisms such as TCP or application-layer segmentation could be | Mechanisms such as TCP or application-layer segmentation could be | |||
| used to support end-to-end reliable transport. One option to support | used to support end-to-end reliable transport. One option to support | |||
| bulk data transfer over a frame-size-constrained LLN is to set the | bulk data transfer over a frame-size-constrained LLN is to set the | |||
| Maximum Segment Size to fit within the link maximum frame size. | Maximum Segment Size to fit within the link maximum frame size. | |||
| Doing so, however, can add significant header overhead to each | Doing so, however, can add significant header overhead to each | |||
| 802.15.4 frame. In addition, deploying such a mechanism requires | 802.15.4 frame and cause extraneous acknowledgements across the LLN | |||
| that the end-to-end transport is aware of the delivery properties of | compared to the method in this specification. | |||
| the underlying LLN, which is a layer violation, and difficult to | ||||
| achieve from the far end of the IPv6 network. | ||||
| Appendix B. Requirements | Appendix B. Requirements | |||
| For one-hop communications, a number of Low Power and Lossy Network | For one-hop communications, a number of Low Power and Lossy Network | |||
| (LLN) link-layers propose a local acknowledgment mechanism that is | (LLN) link-layers propose a local acknowledgment mechanism that is | |||
| enough to detect and recover the loss of fragments. In a multihop | enough to detect and recover the loss of fragments. In a multihop | |||
| environment, an end-to-end fragment recovery mechanism might be a | environment, an end-to-end fragment recovery mechanism might be a | |||
| good complement to a hop-by-hop MAC level recovery. This draft | good complement to a hop-by-hop MAC level recovery. This draft | |||
| introduces a simple protocol to recover individual fragments between | introduces a simple protocol to recover individual fragments between | |||
| 6LoWPAN endpoints that may be multiple hops away. The method | 6LoWPAN endpoints that may be multiple hops away. | |||
| addresses the following requirements of an LLN: | ||||
| The method addresses the following requirements of an LLN: | ||||
| Number of fragments: The recovery mechanism must support highly | Number of fragments: The recovery mechanism must support highly | |||
| fragmented packets, with a maximum of 32 fragments per packet. | fragmented packets, with a maximum of 32 fragments per packet. | |||
| Minimum acknowledgment overhead: Because the radio is half duplex, | Minimum acknowledgment overhead: Because the radio is half duplex, | |||
| and because of silent time spent in the various medium access | and because of silent time spent in the various medium access | |||
| mechanisms, an acknowledgment consumes roughly as many resources | mechanisms, an acknowledgment consumes roughly as many resources | |||
| as a data fragment. | as a data fragment. | |||
| The new end-to-end fragment recovery mechanism should be able to | The new end-to-end fragment recovery mechanism should be able to | |||
| skipping to change at page 28, line 31 ¶ | skipping to change at page 29, line 15 ¶ | |||
| Appendix C. Considerations on Flow Control | Appendix C. Considerations on Flow Control | |||
| Considering that a multi-hop LLN can be a very sensitive environment | Considering that a multi-hop LLN can be a very sensitive environment | |||
| due to the limited queuing capabilities of a large population of its | due to the limited queuing capabilities of a large population of its | |||
| nodes, this draft recommends a simple and conservative approach to | nodes, this draft recommends a simple and conservative approach to | |||
| Congestion Control, based on TCP congestion avoidance. | Congestion Control, based on TCP congestion avoidance. | |||
| Congestion on the forward path is assumed in case of packet loss, and | Congestion on the forward path is assumed in case of packet loss, and | |||
| packet loss is assumed upon time out. The draft allows controlling | packet loss is assumed upon time out. The draft allows controlling | |||
| the number of outstanding fragments that have been transmitted but | the number of outstanding fragments that have been transmitted but | |||
| for which an acknowledgment was not received yet. It must be noted | for which an acknowledgment was not received yet. | |||
| that the number of outstanding fragments should not exceed the number | ||||
| of hops in the network, but the way to figure the number of hops is | ||||
| out of scope for this document. | ||||
| Congestion on the forward path can also be indicated by an Explicit | Congestion on the forward path can also be indicated by an Explicit | |||
| Congestion Notification (ECN) mechanism. Though whether and how ECN | Congestion Notification (ECN) mechanism. Though whether and how ECN | |||
| [RFC3168] is carried out over the LoWPAN is out of scope, this draft | [RFC3168] is carried out over the LoWPAN is out of scope, this draft | |||
| provides a way for the destination endpoint to echo an ECN indication | provides a way for the destination endpoint to echo an ECN indication | |||
| back to the source endpoint in an acknowledgment message as | back to the source endpoint in an acknowledgment message as | |||
| represented in Figure 4 in Section 5.2. | represented in Figure 4 in Section 5.2. While the support of echoing | |||
| the ECN at the receiver in mandatory, this specification does not | ||||
| provide the flow control mechanism that react to the congestion at | ||||
| teh sender endpoint. A minimalistic behaviour could be to reset the | ||||
| window to 1 so the fragments are sent and acknowledged one by one | ||||
| till the end of the datagram. | ||||
| It must be noted that congestion and collision are different topics. | It must be noted that congestion and collision are different topics. | |||
| In particular, when a mesh operates on the same channel over multiple | In particular, when a mesh operates on the same channel over multiple | |||
| hops, then the forwarding of a fragment over a certain hop may | hops, then the forwarding of a fragment over a certain hop may | |||
| collide with the forwarding of the next fragment that is following | collide with the forwarding of the next fragment that is following | |||
| over a previous hop but in the same interference domain. This draft | over a previous hop but in the same interference domain. This draft | |||
| enables end-to-end flow control, but leaves it to the sender stack to | enables end-to-end flow control, but leaves it to the sender stack to | |||
| pace individual fragments within a transmit window, so that a given | pace individual fragments within a transmit window, so that a given | |||
| fragment is sent only when the previous fragment has had a chance to | fragment is sent only when the previous fragment has had a chance to | |||
| progress beyond the interference domain of this hop. In the case of | progress beyond the interference domain of this hop. In the case of | |||
| skipping to change at page 29, line 22 ¶ | skipping to change at page 30, line 9 ¶ | |||
| fragment is a fragment that was sent but for which no explicit | fragment is a fragment that was sent but for which no explicit | |||
| acknowledgment was received yet. This means that the fragment might | acknowledgment was received yet. This means that the fragment might | |||
| be on the way, received but not yet acknowledged, or the | be on the way, received but not yet acknowledged, or the | |||
| acknowledgment might be on the way back. It is also possible that | acknowledgment might be on the way back. It is also possible that | |||
| either the fragment or the acknowledgment was lost on the way. | either the fragment or the acknowledgment was lost on the way. | |||
| From the sender standpoint, all outstanding fragments might still be | From the sender standpoint, all outstanding fragments might still be | |||
| in the network and contribute to its congestion. There is an | in the network and contribute to its congestion. There is an | |||
| assumption, though, that after a certain amount of time, a frame is | assumption, though, that after a certain amount of time, a frame is | |||
| either received or lost, so it is not causing congestion anymore. | either received or lost, so it is not causing congestion anymore. | |||
| This amount of time can be estimated based on the round-trip delay | This amount of time can be estimated based on the round-trip time | |||
| between the 6LoWPAN endpoints. The method detailed in "Computing | between the 6LoWPAN endpoints. For the lack of a more adapted | |||
| TCP's Retransmission Timer" [RFC6298] is recommended for that | technique, the method detailed in "Computing TCP's Retransmission | |||
| computation. | Timer" [RFC6298] may be used for that computation. | |||
| The reader is encouraged to read through "Congestion Control | The reader is encouraged to read through "Congestion Control | |||
| Principles" [RFC2914]. Additionally [RFC7567] and [RFC5681] provide | Principles" [RFC2914]. Additionally [RFC7567] and [RFC5681] provide | |||
| deeper information on why this mechanism is needed and how TCP | deeper information on why this mechanism is needed and how TCP | |||
| handles Congestion Control. Basically, the goal here is to manage | handles Congestion Control. Basically, the goal here is to manage | |||
| the number of fragments present in the network; this is achieved by | the number of fragments present in the network; this is achieved by | |||
| to reducing the number of outstanding fragments over a congested path | to reducing the number of outstanding fragments over a congested path | |||
| by throttling the sources. | by throttling the sources. | |||
| Section 6 describes how the sender decides how many fragments are | Section 6 describes how the sender decides how many fragments are | |||
| End of changes. 67 change blocks. | ||||
| 237 lines changed or deleted | 277 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||