| < draft-ietf-6lo-fragment-recovery-02.txt | draft-ietf-6lo-fragment-recovery-03.txt > | |||
|---|---|---|---|---|
| 6lo P. Thubert, Ed. | 6lo P. Thubert, Ed. | |||
| Internet-Draft Cisco Systems | Internet-Draft Cisco Systems | |||
| Updates: 4944 (if approved) January 23, 2019 | Updates: 4944 (if approved) May 20, 2019 | |||
| Intended status: Standards Track | Intended status: Standards Track | |||
| Expires: July 27, 2019 | Expires: November 21, 2019 | |||
| 6LoWPAN Selective Fragment Recovery | 6LoWPAN Selective Fragment Recovery | |||
| draft-ietf-6lo-fragment-recovery-02 | draft-ietf-6lo-fragment-recovery-03 | |||
| 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 July 27, 2019. | This Internet-Draft will expire on November 21, 2019. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2019 IETF Trust and the persons identified as the | Copyright (c) 2019 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
| the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
| described in the Simplified BSD License. | described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | |||
| 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2.1. BCP 14 . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 2.1. BCP 14 . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2.2. References . . . . . . . . . . . . . . . . . . . . . . . 4 | 2.2. References . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2.3. 6LoWPAN Acronyms . . . . . . . . . . . . . . . . . . . . 4 | 2.3. 6LoWPAN Acronyms . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2.4. Referenced Work . . . . . . . . . . . . . . . . . . . . . 4 | 2.4. Referenced Work . . . . . . . . . . . . . . . . . . . . . 4 | |||
| 2.5. New Terms . . . . . . . . . . . . . . . . . . . . . . . . 5 | 2.5. New Terms . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 3. Updating RFC 4944 . . . . . . . . . . . . . . . . . . . . . . 5 | 3. Updating RFC 4944 . . . . . . . . . . . . . . . . . . . . . . 5 | |||
| 4. Updating draft-watteyne-6lo-minimal-fragment . . . . . . . . 6 | 4. Updating draft-ietf-6lo-minimal-fragment . . . . . . . . . . 6 | |||
| 4.1. Slack in the First Fragment . . . . . . . . . . . . . . . 6 | 4.1. Slack in the First Fragment . . . . . . . . . . . . . . . 6 | |||
| 4.2. Modifying the First Fragment . . . . . . . . . . . . . . 6 | 4.2. Gap between frames . . . . . . . . . . . . . . . . . . . 6 | |||
| 4.3. Modifying the First Fragment . . . . . . . . . . . . . . 7 | ||||
| 5. New Dispatch types and headers . . . . . . . . . . . . . . . 7 | 5. New Dispatch types and headers . . . . . . . . . . . . . . . 7 | |||
| 5.1. Recoverable Fragment Dispatch type and Header . . . . . . 8 | 5.1. Recoverable Fragment Dispatch type and Header . . . . . . 8 | |||
| 5.2. RFRAG Acknowledgment Dispatch type and Header . . . . . . 9 | 5.2. RFRAG Acknowledgment Dispatch type and Header . . . . . . 10 | |||
| 6. Fragments Recovery . . . . . . . . . . . . . . . . . . . . . 11 | 6. Fragments Recovery . . . . . . . . . . . . . . . . . . . . . 12 | |||
| 7. Forwarding Fragments . . . . . . . . . . . . . . . . . . . . 13 | 6.1. Forwarding Fragments . . . . . . . . . . . . . . . . . . 14 | |||
| 7.1. Upon the first fragment . . . . . . . . . . . . . . . . . 13 | 6.1.1. Upon the first fragment . . . . . . . . . . . . . . . 14 | |||
| 7.2. Upon the next fragments . . . . . . . . . . . . . . . . . 13 | 6.1.2. Upon the next fragments . . . . . . . . . . . . . . . 14 | |||
| 7.3. Upon the RFRAG Acknowledgments . . . . . . . . . . . . . 14 | 6.2. Upon the RFRAG Acknowledgments . . . . . . . . . . . . . 15 | |||
| 8. Security Considerations . . . . . . . . . . . . . . . . . . . 14 | 6.3. Cancelling a Fragmented Packet . . . . . . . . . . . . . 15 | |||
| 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 15 | 7. Management Considerations . . . . . . . . . . . . . . . . . . 16 | |||
| 10. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 15 | 7.1. Protocol Parameters . . . . . . . . . . . . . . . . . . . 16 | |||
| 11. References . . . . . . . . . . . . . . . . . . . . . . . . . 15 | 7.2. Observing the network . . . . . . . . . . . . . . . . . . 17 | |||
| 11.1. Normative References . . . . . . . . . . . . . . . . . . 15 | 8. Security Considerations . . . . . . . . . . . . . . . . . . . 18 | |||
| 11.2. Informative References . . . . . . . . . . . . . . . . . 16 | 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 18 | |||
| Appendix A. Rationale . . . . . . . . . . . . . . . . . . . . . 18 | 10. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 18 | |||
| Appendix B. Requirements . . . . . . . . . . . . . . . . . . . . 19 | 11. References . . . . . . . . . . . . . . . . . . . . . . . . . 18 | |||
| Appendix C. Considerations On Flow Control . . . . . . . . . . . 20 | 11.1. Normative References . . . . . . . . . . . . . . . . . . 18 | |||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 21 | 11.2. Informative References . . . . . . . . . . . . . . . . . 19 | |||
| Appendix A. Rationale . . . . . . . . . . . . . . . . . . . . . 21 | ||||
| Appendix B. Requirements . . . . . . . . . . . . . . . . . . . . 22 | ||||
| Appendix C. Considerations On Flow Control . . . . . . . . . . . 23 | ||||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 25 | ||||
| 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 (in the order few bytes | the traffic consists of small chunks of data (in the order few bytes | |||
| to a few tens of bytes) at a time. Given that an IEEE Std. 802.15.4 | to a few tens of bytes) at a time. Given that an IEEE Std. 802.15.4 | |||
| [IEEE.802.15.4] frame can carry 74 bytes or more in all cases, | [IEEE.802.15.4] frame can carry 74 bytes or more in all cases, | |||
| fragmentation is usually not required. However, and though this | fragmentation is usually not required. However, and though this | |||
| happens only occasionally, a number of mission critical applications | happens only occasionally, a number of mission critical applications | |||
| do require the capability to transfer larger chunks of data, for | do require the capability to transfer larger chunks of data, for | |||
| skipping to change at page 3, line 14 ¶ | skipping to change at page 3, line 18 ¶ | |||
| "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 to | an IPv6 [RFC8200] packet across a route-over mesh requires to | |||
| reassemble the full packet at each hop, which may cause latency along | reassemble the full packet at each hop, which may cause latency along | |||
| a path and an overall buffer bloat in the network. The "6TiSCH | a path and an overall buffer bloat in the network. The "6TiSCH | |||
| Architecture" [I-D.ietf-6tisch-architecture] recommends to use a hop- | Architecture" [I-D.ietf-6tisch-architecture] recommends to use a hop- | |||
| by-hop fragment forwarding technique to alleviate those undesirable | by-hop fragment forwarding technique to alleviate those undesirable | |||
| effects. "LLN Minimal Fragment Forwarding" | effects. "LLN Minimal Fragment Forwarding" | |||
| [I-D.watteyne-6lo-minimal-fragment] proposes such a technique, in a | [I-D.ietf-6lo-minimal-fragment] proposes such a technique, in a | |||
| fashion that is compatible with [RFC4944] without the need to define | fashion that is compatible with [RFC4944] without the need to define | |||
| a new protocol. However, adding that capability alone to the local | a new protocol. | |||
| implementation of the original 6LoWPAN fragmentation would not | ||||
| address the bulk of the issues raised against it, and may create new | ||||
| issues like remnant state in the network. | ||||
| Another issue against [RFC4944] is that it does not define a | However, adding that capability alone to the local implementation of | |||
| mechanism to first discover the loss of a fragment along a multi-hop | the original 6LoWPAN fragmentation would not address the issues of | |||
| path (e.g. having exhausted the link-layer retries at some hop on the | resources locked and wasted transmissions due to the loss of a | |||
| way), and then to recover that loss. With RFC 4944, the forwarding | fragment. [RFC4944] does not define a mechanism to first discover a | |||
| of a whole datagram fails when one fragment is not delivered properly | fragment loss, and then to recover that loss. With RFC 4944, the | |||
| to the destination 6LoWPAN endpoint. End-to-end transport or | forwarding of a whole datagram fails when one fragment is not | |||
| application-level mechanisms may require a full retransmission of the | delivered properly to the destination 6LoWPAN endpoint. Constrained | |||
| datagram, wasting resources in an already constrained network. | memory resources are blocked on the receiver until the receiver times | |||
| out. | ||||
| In that situation, the source 6LoWPAN endpoint will not be aware that | That problem is exacerbated when forwarding fragments over multiple | |||
| a loss occurred and will continue sending all fragments for a | hops since a loss at an intermediate hop will not be discovered by | |||
| datagram that is already doomed. The original support is missing | either the source or the destination, and the source will keep on | |||
| signaling to abort a multi-fragment transmission at any time and from | sending fragments, wasting even more resources in the network and | |||
| either end, and, if the capability to forward fragments is | possibly contributing to the condition that caused the loss to no | |||
| implemented, clean up the related state in the network. It is also | avail since the datagram cannot arrive in its entirety. RFC 4944 is | |||
| lacking flow control capabilities to avoid participating to a | also missing signaling to abort a multi-fragment transmission at any | |||
| time and from either end, and, if the capability to forward fragments | ||||
| is implemented, clean up the related state in the network. It is | ||||
| also lacking flow control capabilities to avoid participating to a | ||||
| congestion that may in turn cause the loss of a fragment and trigger | congestion that may in turn cause the loss of a fragment and trigger | |||
| the retransmission of the full datagram. | the retransmission of the full datagram. | |||
| This specification proposes a method to forward fragments across a | This specification proposes a method to forward fragments across a | |||
| multi-hop route-over mesh, and to recover individual fragments | multi-hop route-over mesh, and to recover individual fragments | |||
| between LLN endpoints. The method is designed to limit congestion | between LLN endpoints. The method is designed to limit congestion | |||
| loss in the network and addresses the requirements that are detailed | loss in the network and addresses the requirements that are detailed | |||
| in Appendix B. | in Appendix B. | |||
| 2. Terminology | 2. Terminology | |||
| skipping to change at page 5, line 18 ¶ | skipping to change at page 5, line 24 ¶ | |||
| Quoting the "Multiprotocol Label Switching (MPLS) Architecture" | Quoting the "Multiprotocol Label Switching (MPLS) Architecture" | |||
| [RFC3031]: with MPLS, "packets are "labeled" before they are | [RFC3031]: with MPLS, "packets are "labeled" before they are | |||
| forwarded. At subsequent hops, there is no further analysis of the | forwarded. At subsequent hops, there is no further analysis of the | |||
| packet's network layer header. Rather, the label is used as an index | packet's network layer header. Rather, the label is used as an index | |||
| into a table which specifies the next hop, and a new label". The | into a table which specifies the next hop, and a new label". The | |||
| MPLS technique is leveraged in the present specification to forward | MPLS technique is leveraged in the present specification to forward | |||
| fragments that actually do not have a network layer header, since the | fragments that actually do not have a network layer header, since the | |||
| fragmentation occurs below IP. | fragmentation occurs below IP. | |||
| "LLN Minimal Fragment Forwarding" [I-D.watteyne-6lo-minimal-fragment] | "LLN Minimal Fragment Forwarding" [I-D.ietf-6lo-minimal-fragment] | |||
| introduces the concept of a Virtual Reassembly Buffer (VRB) and an | introduces the concept of a Virtual Reassembly Buffer (VRB) and an | |||
| associated technique to forward fragments as they come, using the | associated technique to forward fragments as they come, using the | |||
| datagram_tag as a label in a fashion similar to MLPS. This | Datagram_tag as a label in a fashion similar to MLPS. This | |||
| specification reuses that technique with slightly modified controls. | specification reuses that technique with slightly modified controls. | |||
| 2.5. New Terms | 2.5. New Terms | |||
| This specification uses the following terms: | This specification uses the following terms: | |||
| 6LoWPAN endpoints | 6LoWPAN endpoints | |||
| The LLN nodes in charge of generating or expanding a 6LoWPAN | The LLN nodes in charge of generating or expanding a 6LoWPAN | |||
| header from/to a full IPv6 packet. The 6LoWPAN endpoints are the | header from/to a full IPv6 packet. The 6LoWPAN endpoints are the | |||
| skipping to change at page 5, line 44 ¶ | skipping to change at page 5, line 50 ¶ | |||
| 3. Updating RFC 4944 | 3. Updating RFC 4944 | |||
| This specification updates the fragmentation mechanism that is | This specification updates the fragmentation mechanism that is | |||
| specified in "Transmission of IPv6 Packets over IEEE 802.15.4 | specified in "Transmission of IPv6 Packets over IEEE 802.15.4 | |||
| Networks" [RFC4944] for use in route-over LLNs by providing a model | Networks" [RFC4944] for use in route-over LLNs by providing a model | |||
| 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 fragment is introduces and new | individually. A new format for fragment is introduces and new | |||
| dispatch types are defined in Section 5. | dispatch types are defined in Section 5. | |||
| [RFC8138] allows to modifies the size of a packet en-route by | [RFC8138] allows to modify the size of a packet en-route by removing | |||
| removing the consumed hops in a compressed Routing Header. It | the consumed hops in a compressed Routing Header. It results that | |||
| results that the fragment_offset and datagram_size cannot be signaled | the fragment_offset and datagram_size cannot be signaled in the | |||
| in the uncompressed form. This specification expresses those fields | uncompressed form. This specification expresses those fields in the | |||
| in the compressed form and allows to modify them en-route (see | compressed form and allows to modify them en-route (see Section 4.3. | |||
| Section 4.2. | ||||
| Note that consistantly with in Section 2 of [RFC6282] for the | Note that consistently with in 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. Updating draft-watteyne-6lo-minimal-fragment | 4. Updating draft-ietf-6lo-minimal-fragment | |||
| This specification updates the fragment forwarding mechanism | This specification updates the fragment forwarding mechanism | |||
| specified in "LLN Minimal Fragment Forwarding" | specified in "LLN Minimal Fragment Forwarding" | |||
| [I-D.watteyne-6lo-minimal-fragment] by providing additional | [I-D.ietf-6lo-minimal-fragment] by providing additional operations to | |||
| operations to improve the management of the Virtual Reassembly Buffer | improve the management of the Virtual Reassembly Buffer (VRB). | |||
| (VRB). | ||||
| 4.1. Slack in the First Fragment | 4.1. Slack in the First Fragment | |||
| At the time of this writing, [I-D.watteyne-6lo-minimal-fragment] | At the time of this writing, [I-D.ietf-6lo-minimal-fragment] allows | |||
| allows for refragmenting in intermediate nodes, meaning that some | for refragmenting in intermediate nodes, meaning that some bytes from | |||
| bytes from a given fragment may be left in the VRB to be added to the | a given fragment may be left in the VRB to be added to the next | |||
| next fragment. The reason for this to happen would be the need for | fragment. The reason for this to happen would be the need for space | |||
| space in the outgoing fragment that was not needed in the incoming | in the outgoing fragment that was not needed in the incoming | |||
| fragment, for instance because the 6LoWPAN Header Compression is not | fragment, for instance because the 6LoWPAN Header Compression is not | |||
| as efficient on the outgoing link, e.g., if the Interface ID (IID) of | as efficient on the outgoing link, e.g., if the Interface ID (IID) of | |||
| the source IPv6 address is elided by the originator on the first hop | the source IPv6 address is elided by the originator on the first hop | |||
| because it matches the source MAC address, but cannot be on the next | because it matches the source MAC address, but cannot be on the next | |||
| hops because the source MAC address changes. | hops because the source MAC 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 the fragment number. This means that | recovered end-to-end based on the fragment number. This means that | |||
| the fragments that contain a 6LoWPAN-compressed header MUST have | the fragments that contain a 6LoWPAN-compressed header MUST have | |||
| enough slack to enable a less efficient compression in the next hops | enough 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 | that 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 | source 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 | the 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 | hop can restore the source IID to the first fragment without | |||
| impacting the second fragment. | impacting the second fragment. | |||
| 4.2. Modifying the First Fragment | 4.2. Gap between frames | |||
| This specification introduces a concept of Inter-Frame Gap, which is | ||||
| a configurable interval of time between transmissions to a same next | ||||
| hop. In the case of half duplex interfaces, this InterFrameGap | ||||
| ensures that the next hop has progressed the previous frame and is | ||||
| capable of receiving the next one. | ||||
| In the case of a mesh operating at a single frequency with | ||||
| omnidirectional antennas, a larger InterFrameGap is required protect | ||||
| the frame against hidden terminal collisions with the previous frame | ||||
| of a same flow that is still progressing alon a common path. | ||||
| The Inter-Frame Gap is useful even for unfragmented datagrams, but it | ||||
| becomes a necessity for fragments that are typically generated in a | ||||
| fast sequence and are all sent over the exact same path. | ||||
| 4.3. 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, and of the Routing Header may change en route in a Route- | addresses, and of the Routing Header may change en-route in a Route- | |||
| Over mesh LLN. If the size of the first fragment is modified, then | Over mesh LLN. If the size of the first fragment is modified, then | |||
| the intermediate node MUST adapt the datagram_size to reflect that | the intermediate node MUST adapt the datagram_size to reflect that | |||
| difference. | 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 specification enables the 6LoWPAN fragmentation sublayer to | |||
| provide an MTU up to 2048 bytes to the upper layer, which can be the | provide an MTU up to 2048 bytes to the upper layer, which can be the | |||
| 6LoWPAN Header Compression sublayer that is defined in the | 6LoWPAN Header Compression sublayer that is defined in the | |||
| "Compression Format for IPv6 Datagrams" [RFC6282] specification. In | "Compression Format for IPv6 Datagrams" [RFC6282] specification. In | |||
| order to achieve this, this specification enables the fragmentation | order to achieve this, this specification enables the fragmentation | |||
| and the reliable transmission of fragments over a multihop 6LoWPAN | and the reliable transmission of fragments over a multihop 6LoWPAN | |||
| mesh network. | mesh network. | |||
| This specification provides a technique that is derived from MPLS in | This specification provides a technique that is derived from MPLS in | |||
| order to forward individual fragments across a 6LoWPAN route-over | order to forward individual fragments across a 6LoWPAN route-over | |||
| mesh. The datagram_tag is used as a label; it is locally unique to | mesh. The Datagram_tag is used as a label; it is locally unique to | |||
| the node that is the source MAC address of the fragment, so together | the node that is the source MAC address of the fragment, so together | |||
| the MAC address and the label can identify the fragment globally. A | the MAC address and the label can identify the fragment globally. A | |||
| node may build the datagram_tag in its own locally-significant way, | node may build the Datagram_tag in its own locally-significant way, | |||
| as long as the selected tag stays unique to the particular datagram | as long as the selected tag stays unique to the particular datagram | |||
| for the lifetime of that datagram. It results that the label does | for the lifetime of that datagram. It results that the label does | |||
| not need to be globally unique but also that it must be swapped at | not need to be globally unique but also that it must be swapped at | |||
| each hop as the source MAC address changes. | each hop as the source MAC address changes. | |||
| This specification extends RFC 4944 [RFC4944] with 4 new Dispatch | This specification extends RFC 4944 [RFC4944] with 4 new Dispatch | |||
| types, for Recoverable Fragment (RFRAG) headers with or without | types, for Recoverable Fragment (RFRAG) headers with or without | |||
| Acknowledgment Request (RFRAG vs. RFRAG-ARQ), and for the RFRAG | Acknowledgment Request (RFRAG vs. RFRAG-ARQ), and for the RFRAG | |||
| Acknowledgment back, with or without ECN Echo (RFRAG-ACK vs. RFRAG- | Acknowledgment back, with or without ECN Echo (RFRAG-ACK vs. RFRAG- | |||
| ECHO). | ECHO). | |||
| (to be confirmed by IANA) The new 6LoWPAN Dispatch types use the | (to be confirmed by IANA) The new 6LoWPAN Dispatch types use the | |||
| Value Bit Pattern of 11 1010xx from page 0 [RFC8025], as follows: | Value Bit Pattern of 11 1010xx from page 0 [RFC8025], as follows: | |||
| Pattern Header Type | Pattern Header Type | |||
| +------------+------------------------------------------+ | +------------+------------------------------------------+ | |||
| | 11 101000 | RFRAG - Recoverable Fragment | | | 11 10100x | RFRAG - Recoverable Fragment | | |||
| | 11 101001 | RFRAG-ARQ - RFRAG with Ack Request | | | 11 10101x | RFRAG-ACK - RFRAG Acknowledgment | | |||
| | 11 101010 | RFRAG-ACK - RFRAG Acknowledgment | | +------------+------------------------------------------+ | |||
| | 11 101011 | RFRAG-ECHO - RFRAG Ack with ECN Echo | | ||||
| +------------+------------------------------------------+ | ||||
| Figure 1: Additional Dispatch Value Bit Patterns | Figure 1: Additional Dispatch Value Bit Patterns | |||
| In the following sections, the semantics of "datagram_tag" are | In the following sections, a "Datagram_tag" extends the semantics | |||
| unchanged from [RFC4944] Section 5.3. "Fragmentation Type and | defined in [RFC4944] Section 5.3."Fragmentation Type and Header". | |||
| Header." and is compatible with the fragment forwarding operation | The Datagram_tag is a locally unique identifier for the datagram from | |||
| described in [I-D.watteyne-6lo-minimal-fragment]. | the perspective of the sender. This means that the datagram-tag | |||
| identifies a datagram uniquely in the network when associated with | ||||
| the source of the datagram. As the datagram gets forwarded, the | ||||
| source changes and the Datagram_tag must be swapped as detailed in | ||||
| [I-D.ietf-6lo-minimal-fragment]. | ||||
| 5.1. Recoverable Fragment Dispatch type and Header | 5.1. Recoverable Fragment Dispatch type and Header | |||
| In this specification, the size and offset of the fragments are | In this specification, the size and offset of the fragments are | |||
| expressed on the compressed packet form as opposed to the | expressed on the compressed packet form as opposed to the | |||
| uncompressed - native - packet form. | uncompressed - native - packet form. | |||
| The format of the fragment header is the same for all fragments. The | ||||
| format indicates both a length and an offset, which seem be redundant | ||||
| with the sequence field, but is not. The position of a fragment in | ||||
| the recomposition buffer is neither correlated with the value of the | ||||
| sequence field nor with the order in which the fragments are | ||||
| received. This enables out-of-sequence and overlapping fragments, | ||||
| e.g., a fragment 5 that is retried as smaller fragments 5, 13 and 14 | ||||
| due to a change of MTU. | ||||
| There is no requirement on the receiver to check for contiguity of | ||||
| the received fragments, and the sender MUST ensure that when all | ||||
| fragments are acknowledged, then the datagram is fully received. | ||||
| This may be useful in particular in the case where the MTU changes | ||||
| and a fragment sequence is retried with a smaller fragment_size, the | ||||
| remainder of the original fragment being retried with new sequence | ||||
| values. | ||||
| The first fragment is recognized by a sequence of 0; it carries its | The first fragment is recognized by a sequence of 0; it carries its | |||
| fragment_size and the datagram_size of the compressed packet, whereas | fragment_size and the datagram_size of the compressed packet, whereas | |||
| the other fragments carry their fragment_size and fragment_offset. | the other fragments carry their fragment_size and fragment_offset. | |||
| The last fragment for a datagram is recognized when its | The last fragment for a datagram is recognized when its | |||
| fragment_offset and its fragment_size add up to the datagram_size. | fragment_offset and its fragment_size add up to the datagram_size. | |||
| Recoverable Fragments are sequenced and a bitmap is used in the RFRAG | Recoverable Fragments are sequenced and a bitmap is used in the RFRAG | |||
| Acknowledgment to indicate the received fragments by setting the | Acknowledgment to indicate the received fragments by setting the | |||
| individual bits that correspond to their sequence. | individual bits that correspond to their sequence. | |||
| 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 Requested | X set == Ack-Request | |||
| Figure 2: RFRAG Dispatch type and Header | Figure 2: RFRAG Dispatch type and Header | |||
| 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. For IEEE Std. | a unit that depends on the MAC layer technology. By default, that | |||
| 802.15.4, the unit is octet, and the maximum fragment size, which | unit is the octet which allows fragments up to 512 bytes. For | |||
| is constrained by the maximum frame size of 128 octet minus the | IEEE Std. 802.15.4, the unit is octet, and the maximum fragment | |||
| overheads of the MAC and Fragment Headers, is not limited by this | size, when it is constrained by the maximum frame size of 128 | |||
| encoding. | octet minus the overheads of the MAC and Fragment Headers, is not | |||
| limited by this encoding. | ||||
| X: 1 bit; Ack Requested: 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. | |||
| Sequence: 5 bit unsigned integer; the sequence number of the | Sequence: 5 bit unsigned integer; the sequence number of the | |||
| fragment. Fragments are sequence numbered [0..N] where N is in | fragment in the acknowledgement bitmap. Fragments are numbered | |||
| [0..31]. A sequence of 0 indicates the first fragment in a | [0..N] where N is in [0..31]. A Sequence of 0 indicates the first | |||
| datagram. For IEEE Std. 802.15.4, as long as the overheads enable | fragment in a datagram, but non-zero values are not indicative of | |||
| a fragment size of 64 octets or more, this enables to fragment a | the position in the recomposition buffer. | |||
| packet of 2047 octets. | ||||
| Fragment_offset: 16 bit unsigned integer; | Fragment_offset: 16 bit unsigned integer; | |||
| * When set to a non-0 value, the semantics of the Fragment_offset | * When the Fragment_offset is set to a non-0 value, its semantics | |||
| depends on the value of the Sequence. | depend on the value of the Sequence field. | |||
| + When the Sequence is not 0, this field indicates the offset | + For a first fragment (i.e. with a Sequence of 0), this field | |||
| of the fragment in the compressed form. The fragment should | indicates the datagram_size of the compressed datagram, to | |||
| be forwarded based on an existing VRB as described in | help the receiver allocate an adapted buffer for the | |||
| Section 7.2, or silently dropped if none is found. | reception and reassembly operations. The fragment may | |||
| stored for local recomposition, or it may be routed based on | ||||
| the destination IPv6 address, in which case a VRB state must | ||||
| be installed as described in Section 6.1.1. | ||||
| + For a first fragment (i.e. with a sequence of 0), this field | + When the Sequence is not 0, this field indicates the offset | |||
| is overloaded to indicate the total_size of the compressed | of the fragment in the compressed form. The fragment may be | |||
| packet, to help the receiver allocate an adapted buffer for | added to a local recomposition buffer or forwarded based on | |||
| the reception and reassembly operations. This format limits | an existing VRB as described in Section 6.1.2. | |||
| the maximum MTU on a 6LoWPAN link to 2047 bytes, but 1280 | ||||
| bytes is the recommended value to avoid issues with IPV6 | ||||
| Path MTU Discovery [RFC8201]. The fragment should be routed | ||||
| based on the destination IPv6 address, and an VRB state | ||||
| should be installed as described in Section 7.1. | ||||
| * When set to 0, this field indicates an abort condition and all | * A Fragment_offset that is set to a value of 0 indicates an | |||
| state regarding the datagram should be cleaned up once the | abort condition and all state regarding the datagram should be | |||
| processing of the fragment is complete; the processing of the | cleaned up once the processing of the fragment is complete; the | |||
| fragment depends on whether there is a VRB already established | processing of the fragment depends on whether there is a VRB | |||
| for this datagram, and the next hop is still reachable: | already established for this datagram, and the next hop is | |||
| still reachable: | ||||
| + if a VRB already exists and is not broken, the fragment is | + if a VRB already exists and is not broken, the fragment is | |||
| to be forwarded along the associated Label Switched Path | to be forwarded along the associated Label Switched Path | |||
| (LSP) as described in Section 7.2, but regardless of the | (LSP) as described in Section 6.1.2, but regardless of the | |||
| value of the Sequence field; | value of the Sequence field; | |||
| + else, if the Sequence is 0, then the fragment is to be | + else, if the Sequence is 0, then the fragment is to be | |||
| routed as described in Section 7.1 but no state is conserved | routed as described in Section 6.1.1 but no state is | |||
| afterwards. | conserved afterwards. In that case, the session if it | |||
| exists is aborted and the packet is also forwarded in an | ||||
| attempt to clean up the next hops as along the path | ||||
| indicated by the IPv6 header (possibly 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. | RFRAG-ACK is sent back to the source. | |||
| 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-octet RFRAG Acknowledgment bitmap | |||
| that is used by the reassembling end point to confirm selectively the | that is used by the reassembling end point 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. | one to one with a given sequence number. | |||
| The offset of the bit in the bitmap indicates which fragment is | The offset of the bit in the bitmap indicates which fragment is | |||
| acknowledged as follows: | 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 | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| ^ ^ | ^ ^ | |||
| | | bitmap indicating whether: | | | bitmap indicating whether: | |||
| | +--- Fragment with sequence 10 was received | | +----- Fragment with sequence 9 was received | |||
| +----------------------- Fragment with sequence 00 was received | +----------------------- Fragment with sequence 0 was received | |||
| Figure 3: RFRAG Acknowledgment bitmap encoding | Figure 3: RFRAG Acknowledgment bitmap encoding | |||
| Figure 4 shows an example Acknowledgment bitmap which indicates that | Figure 4 shows an example Acknowledgment bitmap which indicates that | |||
| all fragments from sequence 0 to 20 were received, except for | all fragments from sequence 0 to 20 were received, except for | |||
| fragments 1, 2 and 16 that were either lost or are still in the | fragments 1, 2 and 16 that were lost and must be retried. | |||
| network over a slower path. | ||||
| 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|0|0|1|1|1|1|1|1|1|1|1|1|1|1|1|0|1|1|1|1|0|0|0|0|0|0|0|0|0|0|0| | |1|0|0|1|1|1|1|1|1|1|1|1|1|1|1|1|0|1|1|1|1|0|0|0|0|0|0|0|0|0|0|0| | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 4: Expanding 3 octets encoding | Figure 4: Example RFRAG Acknowledgment Bitmap | |||
| The RFRAG Acknowledgment Bitmap is included in a RFRAG Acknowledgment | The RFRAG Acknowledgment Bitmap is included in a RFRAG Acknowledgment | |||
| header, as follows: | header, 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| |1 1 1 0 1 0 1 Y| datagram_tag | | |1 1 1 0 1 0 1|E| Datagram_tag | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | RFRAG Acknowledgment Bitmap (32 bits) | | | RFRAG Acknowledgment Bitmap (32 bits) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Figure 5: RFRAG Acknowledgment Dispatch type and Header | Figure 5: RFRAG Acknowledgment Dispatch type and Header | |||
| Y: 1 bit; Explicit Congestion Notification Echo | E: 1 bit; Explicit Congestion Notification Echo | |||
| When set, the sender indicates that at least one of the | When set, the sender indicates that at least one of the | |||
| acknowledged fragments was received with an Explicit Congestion | acknowledged fragments was received with an Explicit Congestion | |||
| Notification, indicating that the path followed by the fragments | Notification, indicating that the path followed by the fragments | |||
| is subject to congestion. | is subject to congestion. More in Appendix C. | |||
| RFRAG Acknowledgment Bitmap | RFRAG Acknowledgment Bitmap | |||
| An RFRAG Acknowledgment Bitmap, whereby setting the bit at offset | An RFRAG Acknowledgment Bitmap, whereby setting the bit at offset | |||
| x indicates that fragment x was received, as shown in Figure 3. | x indicates that fragment x was received, as shown in Figure 3. | |||
| All 0's is a NULL bitmap that indicates that the fragmentation | All 0's is a NULL bitmap that indicates that the fragmentation | |||
| process is aborted. All 1's is a FULL bitmap that indicates that | process is aborted. All 1's is a FULL bitmap that indicates that | |||
| the fragmentation process is complete, all fragments were received | the fragmentation process is complete, all fragments were received | |||
| at the reassembly end point. | at the reassembly end point. | |||
| 6. Fragments Recovery | 6. Fragments Recovery | |||
| The Recoverable Fragment headers RFRAG and RFRAG-ARQ are used to | The Recoverable Fragment headers RFRAG and RFRAG-ARQ are used to | |||
| transport a fragment and optionally request an RFRAG Acknowledgment | transport a fragment and optionally request an RFRAG Acknowledgment | |||
| that will confirm the good reception of a one or more fragments. An | that will confirm the good reception of a one or more fragments. An | |||
| RFRAG Acknowledgment can optionally carry an ECN indication; it is | RFRAG Acknowledgment is carried as a standalone header in a message | |||
| carried as a standalone header in a message that is sent back to the | that is sent back to the 6LoWPAN endpoint that was the source of the | |||
| 6LoWPAN endpoint that was the source of the fragments, as known by | fragments, as known by its MAC address. The process ensures that at | |||
| its MAC address. The process ensures that at every hop, the source | every hop, the source MAC address and the Datagram_tag in the | |||
| MAC address and the datagram_tag in the received fragment are enough | received fragment are enough information to send the RFRAG | |||
| information to send the RFRAG Acknowledgment back towards the source | Acknowledgment back towards the source 6LoWPAN endpoint by reversing | |||
| 6LoWPAN endpoint by reversing the MPLS operation. | the MPLS operation. | |||
| The 6LoWPAN endpoint that fragments the packets at 6LoWPAN level (the | The 6LoWPAN endpoint that fragments the packets at 6LoWPAN level (the | |||
| sender) also controls when the reassembling end point sends the RFRAG | sender) also controls the amount of acknowledgments by setting the | |||
| Acknowledgments by setting the Ack Requested flag in the RFRAG | Ack-Request flag in the RFRAG packets. The sender may set the Ack- | |||
| packets. It may set the Ack Requested flag on any fragment to | Request flag on any fragment to perform congestion control by | |||
| perform congestion control by limiting the number of outstanding | limiting the number of outstanding fragments, which are the fragments | |||
| fragments, which are the fragments that have been sent but for which | that have been sent but for which reception or loss was not | |||
| reception or loss was not positively confirmed by the reassembling | positively confirmed by the reassembling endpoint. Te maximum number | |||
| endpoint. When the sender of the fragment knows that an underlying | of outstanding fragments is the Window-Size. It is configurable and | |||
| link-layer mechanism protects the Fragments, it may refrain from | may vary in case of ECN notification. When it receives a fragment | |||
| using the RFRAG Acknowledgment mechanism, and never set the Ack | with the Ack-Request flag set, the 6LoWPAN endpoint that reassembles | |||
| Requested bit. When it receives a fragment with the ACK Request flag | the packets at 6LoWPAN level (the receiver) MUST send back an RFRAG | |||
| set, the 6LoWPAN endpoint that reassembles the packets at 6LoWPAN | Acknowledgment to confirm reception of all the fragments it has | |||
| level (the receiver) sends back an RFRAG Acknowledgment to confirm | received so far. | |||
| reception of all the fragments it has received so far. | ||||
| The Ack-Request bit marks the end of a window. It SHOULD be set on | ||||
| the last fragment to protect the datagram, and MAY be used in | ||||
| intermediate fragments for the purpose of flow control. This ARQ | ||||
| process MUST be protected by a ARQ timer, and the fragment that | ||||
| carries the Ack-Request flag MAY be retried upon time out a | ||||
| configurable amount of times. Upon exhaustion of the retries the | ||||
| sender may either abort the transmission of the datagram or retry the | ||||
| datagram from the first fragment with an Ack-Request in order to | ||||
| reestablish a path and discover which fragments were received over | ||||
| the old path. When the sender of the fragment knows that an | ||||
| underlying link-layer mechanism protects the fragments, it may | ||||
| refrain from using the RFRAG Acknowledgment mechanism, and never set | ||||
| the Ack-Request bit. | ||||
| The RFRAG Acknowledgment can optionally carry an ECN indication for | ||||
| flow control (see Appendix C). The receiver of a fragment with the | ||||
| 'E' (ECN) flag set MUST echo that information by setting the 'E' | ||||
| (ECN) flag in the next RFRAG Acknowledgment. | ||||
| The sender transfers a controlled number of fragments and MAY flag | The sender transfers a controlled number of fragments and MAY flag | |||
| the last fragment of a series with an RFRAG Acknowledgment Request. | the last fragment of a series with an RFRAG Acknowledgment Request. | |||
| The received MUST acknowledge a fragment with the acknowledgment | The receiver MUST acknowledge a fragment with the acknowledgment | |||
| request bit set. If any fragment immediately preceding an | request bit set. If any fragment immediately preceding an | |||
| acknowledgment request is still missing, the receiver MAY | acknowledgment request is still missing, the receiver MAY | |||
| intentionally delay its acknowledgment to allow in-transit fragments | intentionally delay its acknowledgment to allow in-transit fragments | |||
| to arrive. Delaying the acknowledgment might defeat the round trip | to arrive. Delaying the acknowledgment might defeat the round trip | |||
| delay computation so it should be configurable and not enabled by | delay computation so it should be configurable and not enabled by | |||
| default. | default. | |||
| 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 | |||
| skipping to change at page 12, line 29 ¶ | skipping to change at page 13, line 42 ¶ | |||
| 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 computed according to the method detailed in [RFC6298]. It is | |||
| expected that the upper layer retries obey the recommendations in | expected that the upper layer retries obey the recommendations in | |||
| "UDP Usage Guidelines" [RFC8085], in which case a single round of | "UDP Usage Guidelines" [RFC8085], in which case a single round of | |||
| fragment recovery should fit within the upper layer recovery timers. | 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 actually 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 | |||
| wait a reasonable amount of time between fragments so as to let a | wait a reasonable amount of time between fragments so as to let a | |||
| fragment progress a few hops and avoid hidden terminal issues. This | fragment progress a few hops and avoid hidden terminal issues. This | |||
| precaution is not required on channel hopping technologies such as | precaution is not required on channel hopping technologies such as | |||
| Time Slotted CHannel Hopping (TSCH) [RFC6554] | Time Slotted Channel Hopping (TSCH) [RFC6554] | |||
| When the sender decides that a packet should be dropped and the | ||||
| fragmentation process canceled, it sends a pseudo fragment with the | ||||
| fragment_offset, sequence and fragment_size all set to 0, and no | ||||
| data. Upon reception of this message, the receiver should clean up | ||||
| all resources for the packet associated to the datagram_tag. If an | ||||
| acknowledgment is requested, the receiver responds with a NULL | ||||
| bitmap. | ||||
| The receiver might need to cancel the process of a fragmented packet | ||||
| for internal reasons, for instance if it is out of reassembly | ||||
| buffers, or considers that this packet is already fully reassembled | ||||
| and passed to the upper layer. In that case, the receiver SHOULD | ||||
| indicate so to the sender with a NULL bitmap in a RFRAG | ||||
| Acknowledgment. Upon an acknowledgment with a NULL bitmap, the | ||||
| sender endpoint MUST abort the transmission of the fragmented | ||||
| datagram. | ||||
| 7. Forwarding Fragments | 6.1. Forwarding Fragments | |||
| It is assumed that the first Fragment is large enough to carry the | It is assumed that the first Fragment is large enough to carry the | |||
| IPv6 header and make routing decisions. If that is not so, then this | IPv6 header and make routing decisions. If that is not so, then this | |||
| specification MUST NOT be used. | specification MUST NOT be used. | |||
| This specification extends the Virtual Reassembly Buffer (VRB) | This specification extends the Virtual Reassembly Buffer (VRB) | |||
| technique to forward fragments with no intermediate reconstruction of | technique to forward fragments with no intermediate reconstruction of | |||
| the entire packet. The first fragment carries the IP header and it | the entire packet. It inherits operations like Datagram_tag | |||
| Switching and using a timer to clean the VRB when the traffic dries | ||||
| up. In more details, the first fragment carries the IP header and it | ||||
| is routed all the way from the fragmenting end point to the | is routed all the way from the fragmenting end point to the | |||
| reassembling end point. Upon the first fragment, the routers along | reassembling end point. Upon the first fragment, the routers along | |||
| the path install a label-switched path (LSP), and the following | the path install a label-switched path (LSP), and the following | |||
| fragments are label-switched along that path. As a consequence, | fragments are label-switched along that path. As a consequence, | |||
| alternate routes not possible for individual fragments. The | alternate routes not possible for individual fragments. The | |||
| datagram_tag is used to carry the label, that is swapped at each hop. | Datagram_tag is used to carry the label, that is swapped at each hop. | |||
| All fragments follow the same path and fragments are delivered in the | All fragments follow the same path and fragments are delivered in the | |||
| order at which they are sent. | order at which they are sent. | |||
| 7.1. Upon the first fragment | 6.1.1. Upon the first fragment | |||
| In Route-Over mode, the source and destination MAC addressed in a | In Route-Over mode, the source and destination MAC addressed in a | |||
| frame change at each hop. The label that is formed and placed in the | frame change at each hop. The label that is formed and placed in the | |||
| datagram_tag is associated to the source MAC and only valid (and | Datagram_tag is associated to the source MAC and only valid (and | |||
| unique) for that source MAC. Upon a first fragment (i.e. with a | unique) for that source MAC. Upon a first fragment (i.e. with a | |||
| sequence of zero), a VRB and the associated LSP state are created for | sequence of zero), a VRB and the associated LSP state are created for | |||
| the tuple (source MAC address, datagram_tag) and the fragment is | the tuple (source MAC address, Datagram_tag) and the fragment is | |||
| forwarded along the IPv6 route that matches the destination IPv6 | forwarded along the IPv6 route that matches the destination IPv6 | |||
| address in the IPv6 header as prescribed by | address in the IPv6 header as prescribed by | |||
| [I-D.watteyne-6lo-minimal-fragment]. The LSP state enables to match | [I-D.ietf-6lo-minimal-fragment]. The LSP state enables to match the | |||
| the (previous MAC address, datagram_tag) in an incoming fragment to | (previous MAC address, Datagram_tag) in an incoming fragment to the | |||
| the tuple (next MAC address, swapped datagram_tag) used in the | tuple (next MAC address, swapped Datagram_tag) used in the forwarded | |||
| forwarded fragment and points at the VRB. In addition, the router | fragment and points at the VRB. In addition, the router also forms a | |||
| also forms a Reverse LSP state indexed by the MAC address of the next | Reverse LSP state indexed by the MAC address of the next hop and the | |||
| hop and the swapped datagram_tag. This reverse LSP state also points | swapped Datagram_tag. This reverse LSP state also points at the VRB | |||
| at the VRB and enables to match the (next MAC address, | and enables to match the (next MAC address, swapped_Datagram_tag) | |||
| swapped_datagram_tag) found in an RFRAG Acknowledgment to the tuple | found in an RFRAG Acknowledgment to the tuple (previous MAC address, | |||
| (previous MAC address, datagram_tag) used when forwarding a Fragment | Datagram_tag) used when forwarding a Fragment Acknowledgment (RFRAG- | |||
| Acknowledgment (RFRAG-ACK) back to the sender endpoint. | ACK) back to the sender endpoint. | |||
| 7.2. Upon the next fragments | 6.1.2. Upon the next fragments | |||
| Upon a next fragment (i.e. with a non-zero sequence), the router | Upon a next fragment (i.e. with a non-zero sequence), the router | |||
| looks up a LSP indexed by the tuple (MAC address, datagram_tag) found | looks up a LSP indexed by the tuple (MAC address, Datagram_tag) found | |||
| in the fragment. If it is found, the router forwards the fragment | in the fragment. If it is found, the router forwards the fragment | |||
| using the associated VRB as prescribed by | using the associated VRB as prescribed by | |||
| [I-D.watteyne-6lo-minimal-fragment]. | [I-D.ietf-6lo-minimal-fragment]. | |||
| 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: | |||
| o The source and destination MAC addresses are swapped from those | o The source and destination MAC addresses are swapped from those | |||
| found in the fragment | found in the fragment | |||
| o The datagram_tag set to the datagram_tag found in the fragment | o The Datagram_tag set to the Datagram_tag found in the fragment | |||
| o A null bitmap is used to signal the abort condition | o 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. | |||
| 7.3. Upon the RFRAG Acknowledgments | 6.2. Upon the RFRAG Acknowledgments | |||
| Upon an RFRAG-ACK, the router looks up a Reverse LSP indexed by the | Upon an RFRAG-ACK, the router looks up a Reverse LSP indexed by the | |||
| tuple (MAC address, datagram_tag), which are respectively the source | tuple (MAC address, Datagram_tag), which are respectively the source | |||
| MAC address of the received frame and the received datagram_tag. If | MAC address of the received frame and the received Datagram_tag. If | |||
| it is found, the router forwards the fragment using the associated | it is found, the router forwards the fragment using the associated | |||
| VRB as prescribed by [I-D.watteyne-6lo-minimal-fragment], but using | VRB as prescribed by [I-D.ietf-6lo-minimal-fragment], but using the | |||
| the Reverse LSP so that the RFRAG-ACK flows back to the sender | Reverse LSP so that 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 either an error (NULL bitmap) | Either way, if the RFRAG-ACK indicates that the fragment was entirely | |||
| or that the fragment was entirely received (FULL bitmap), arms a | received (FULL bitmap), it arms a short timer, and upon timeout, the | |||
| short timer, and upon timeout, the VRB and all associate state are | VRB and all the associated state are destroyed. until the timer | |||
| destroyed. During that time, fragments of that datagram may still be | elapses, fragments of that datagram may still be received, e.g. if | |||
| received, e.g. if the RFRAG-ACK was lost on the way back and the | the RFRAG-ACK was lost on the way back and the source retried the | |||
| source retried the last fragment. In that case, the router sends an | last fragment. In that case, the router forwards the fragment | |||
| abort RFRAG-ACK along the Reverse LSP to complete the clean up. | according to the state in the VRB. | |||
| 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 | ||||
| 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 | ||||
| again) and then one or more other fragments with a sequence that was | ||||
| not used before (e.g., 13 and 14). | ||||
| 6.3. Cancelling a Fragmented Packet | ||||
| 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, and | ||||
| no data. | ||||
| When the sender or a router on the way decides that a packet should | ||||
| be dropped and the fragmentation process canceled, it generates a | ||||
| reset pseudo fragment and forwards it down the fragment path. | ||||
| Each router next along the path the way forwards the pseudo fragment | ||||
| based on the VRB state. If an acknowledgment is not requested, the | ||||
| VRB and all associated state are destroyed. | ||||
| Upon reception of the pseudo fragment, the receiver cleans up all | ||||
| resources for the packet associated to the Datagram_tag. If an | ||||
| acknowledgment is requested, the receiver responds with a NULL | ||||
| bitmap. | ||||
| The other way around, the receiver might need to cancel the process | ||||
| of a fragmented packet for internal reasons, for instance if it is | ||||
| out of reassembly buffers, or considers that this packet is already | ||||
| fully reassembled and passed to the upper layer. In that case, the | ||||
| receiver SHOULD indicate so to the sender with a NULL bitmap in a | ||||
| RFRAG Acknowledgment. Upon an acknowledgment with a NULL bitmap, the | ||||
| sender endpoint MUST abort the transmission of the fragmented | ||||
| datagram. | ||||
| 7. Management Considerations | ||||
| 7.1. Protocol Parameters | ||||
| There is no particular configuration on the receiver, as echoing ECN | ||||
| should always be on. The configuration only applies to the sender | ||||
| that is in control of the transmission. The management system SHOULD | ||||
| be capable of providing the parameters below: | ||||
| MinFragmentSize: The MinFragmentSize is the minimum value for the | ||||
| Fragment_Size. | ||||
| OptFragmentSize: The MinFragmentSize is the value for the | ||||
| Fragment_Size that the sender should use to start with. | ||||
| MaxFragmentSize: The MaxFragmentSize is the maximum value for the | ||||
| Fragment_Size. It MUST be lower than the minimum MTU along the | ||||
| path. A large value augments the chances of buffer bloat and | ||||
| transmission loss. The value MUST be less than 512 if the unit | ||||
| that is defined for the PHY layer is the octet. | ||||
| UseECN: Indicates whether the sender should react to ECN. When the | ||||
| sender reacts to ECN the Window_Size will vary between | ||||
| MinWindowSize and MaxWindowSize. | ||||
| MinWindowSize: The minimum value of Window_Size that the sender can | ||||
| use. | ||||
| OptWindowSize: The OptWindowSize is the value for the Window_Size | ||||
| that the sender should use to start with. | ||||
| MaxWindowSize: The maximum value of Window_Size that the sender can | ||||
| use. The value MUSt be less than 32. | ||||
| UseECN: Indicates whether the sender should react to ECN. When the | ||||
| sender reacts to ECN the sender SHOULD adapt the Window_Size | ||||
| between MinWindowSize and MaxWindowSize and it MAY adapt the | ||||
| Fragment_Size if that is supported. | ||||
| InterFrameGap: Indicates a minimum amount of time between | ||||
| transmissions. All packets to a same destination, and in | ||||
| particular fragments, may be subject to receive while | ||||
| transmitting and hidden terminal collisions with the next or | ||||
| the previous transmission as the fragments progress along a | ||||
| same path. The InterFrameGap protects the propagation of one | ||||
| transmission before the next one is triggered and creates a | ||||
| duty cycle that controls the ratio of air time and memory in | ||||
| intermediate nodes that a particular datagram will use. | ||||
| MinARQTimeOut: The maximum amount of time a node should wait for an | ||||
| RFRAG Acknowledgment before it takes a next action. | ||||
| OptARQTimeOut: The starting point of the value of the amount that a | ||||
| sender should wait for an RFRAG Acknowledgment before it takes | ||||
| a next action. | ||||
| MaxARQTimeOut: The maximum amount of time a node should wait for an | ||||
| RFRAG Acknowledgment before it takes a next action. | ||||
| MaxFragRetries: The maximum number of retries for a particular | ||||
| Fragment. | ||||
| MaxDatagramRetries: The maximum number of retries from scratch for a | ||||
| particular Datagram. | ||||
| 7.2. Observing the network | ||||
| The management system should monitor the amount of retries and of ECN | ||||
| settings that can be observed from the perspective of the both the | ||||
| sender and the receiver, and may tune the optimum size of | ||||
| Fragment_Size and of the Window_Size, OptWindowSize and OptWindowSize | ||||
| respectively, at the sender. The values should be bounded by the | ||||
| expected number of hops and reduced beyond that when the number of | ||||
| datagrams that can traverse an intermediate point may exceed its | ||||
| capacity and cause a congestion loss. The InterFrameGap is another | ||||
| tool that can be used to increase the spacing between fragments of a | ||||
| 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 | |||
| The process of recovering fragments does not appear to create any | The process of recovering fragments does not appear to create any | |||
| opening for new threat compared to "Transmission of IPv6 Packets over | opening for new threat compared to "Transmission of IPv6 Packets over | |||
| IEEE 802.15.4 Networks" [RFC4944]. | IEEE 802.15.4 Networks" [RFC4944]. | |||
| 9. IANA Considerations | 9. IANA Considerations | |||
| Need extensions for formats defined in "Transmission of IPv6 Packets | Need extensions for formats defined in "Transmission of IPv6 Packets | |||
| over IEEE 802.15.4 Networks" [RFC4944]. | over IEEE 802.15.4 Networks" [RFC4944]. | |||
| 10. Acknowledgments | 10. Acknowledgments | |||
| The author wishes to thank Thomas Watteyne and Michael Richardson for | The author wishes to thank Michel Veillette, Dario Tedeschi, Laurent | |||
| in-depth reviews and comments. Also many thanks to Jonathan Hui, Jay | Toutain, Thomas Watteyne and Michael Richardson for in-depth reviews | |||
| Werb, Christos Polyzois, Soumitri Kolavennu, Pat Kinney, Margaret | and comments. Also many thanks to Jonathan Hui, Jay Werb, Christos | |||
| Wasserman, Richard Kelsey, Carsten Bormann and Harry Courtice for | Polyzois, Soumitri Kolavennu, Pat Kinney, Margaret Wasserman, Richard | |||
| their various contributions. | Kelsey, Carsten Bormann and Harry Courtice for their various | |||
| contributions. | ||||
| 11. References | 11. References | |||
| 11.1. Normative References | 11.1. Normative References | |||
| [I-D.watteyne-6lo-minimal-fragment] | [I-D.ietf-6lo-minimal-fragment] | |||
| Watteyne, T., Bormann, C., and P. Thubert, "LLN Minimal | Watteyne, T., Bormann, C., and P. Thubert, "LLN Minimal | |||
| Fragment Forwarding", draft-watteyne-6lo-minimal- | Fragment Forwarding", draft-ietf-6lo-minimal-fragment-01 | |||
| fragment-02 (work in progress), July 2018. | (work in progress), March 2019. | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
| DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
| <https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
| [RFC4944] Montenegro, G., Kushalnagar, N., Hui, J., and D. Culler, | [RFC4944] Montenegro, G., Kushalnagar, N., Hui, J., and D. Culler, | |||
| "Transmission of IPv6 Packets over IEEE 802.15.4 | "Transmission of IPv6 Packets over IEEE 802.15.4 | |||
| Networks", RFC 4944, DOI 10.17487/RFC4944, September 2007, | Networks", RFC 4944, DOI 10.17487/RFC4944, September 2007, | |||
| <https://www.rfc-editor.org/info/rfc4944>. | <https://www.rfc-editor.org/info/rfc4944>. | |||
| skipping to change at page 16, line 18 ¶ | skipping to change at page 19, line 34 ¶ | |||
| 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>. | |||
| 11.2. Informative References | 11.2. Informative References | |||
| [I-D.ietf-6tisch-architecture] | [I-D.ietf-6tisch-architecture] | |||
| Thubert, P., "An Architecture for IPv6 over the TSCH mode | Thubert, P., "An Architecture for IPv6 over the TSCH mode | |||
| of IEEE 802.15.4", draft-ietf-6tisch-architecture-19 (work | of IEEE 802.15.4", draft-ietf-6tisch-architecture-20 (work | |||
| in progress), December 2018. | in progress), March 2019. | |||
| [IEEE.802.15.4] | [IEEE.802.15.4] | |||
| IEEE, "IEEE Standard for Low-Rate Wireless Networks", | IEEE, "IEEE Standard for Low-Rate Wireless Networks", | |||
| IEEE Standard 802.15.4, DOI 10.1109/IEEE | IEEE Standard 802.15.4, DOI 10.1109/IEEE | |||
| P802.15.4-REVd/D01, | P802.15.4-REVd/D01, | |||
| <http://ieeexplore.ieee.org/document/7460875/>. | <http://ieeexplore.ieee.org/document/7460875/>. | |||
| [RFC2914] Floyd, S., "Congestion Control Principles", BCP 41, | [RFC2914] Floyd, S., "Congestion Control Principles", BCP 41, | |||
| RFC 2914, DOI 10.17487/RFC2914, September 2000, | RFC 2914, DOI 10.17487/RFC2914, September 2000, | |||
| <https://www.rfc-editor.org/info/rfc2914>. | <https://www.rfc-editor.org/info/rfc2914>. | |||
| skipping to change at page 20, line 29 ¶ | skipping to change at page 23, line 40 ¶ | |||
| saturation of the radio network and congestion collapse. | saturation of the radio network and congestion collapse. | |||
| The recovery mechanism should provide means for controlling the | The recovery mechanism should provide means for controlling the | |||
| number of fragments in transit over the LLN. | number of fragments in transit over the LLN. | |||
| 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 to control | packet loss is assumed upon time out. The draft allows to control | |||
| 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. It must be noted | |||
| that the number of outstanding fragments should not exceed the number | 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 | of hops in the network, but the way to figure the number of hops is | |||
| out of scope for this document. | 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 | |||
| End of changes. 73 change blocks. | ||||
| 211 lines changed or deleted | 370 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/ | ||||