| rfc9616.original.xml | rfc9616.xml | |||
|---|---|---|---|---|
| <?xml version='1.0' encoding='UTF-8'?> | <?xml version='1.0' encoding='UTF-8'?> | |||
| <!DOCTYPE rfc> | ||||
| <rfc version='3' | <!DOCTYPE rfc [ | |||
| docName='draft-ietf-babel-rtt-extension-07' | <!ENTITY nbsp " "> | |||
| ipr='trust200902' | <!ENTITY zwsp "​"> | |||
| consensus='true' | <!ENTITY nbhy "‑"> | |||
| submissionType='IETF' | <!ENTITY wj "⁠"> | |||
| category='std' | ]> | |||
| xml:lang='en' | ||||
| xmlns:xi="http://www.w3.org/2001/XInclude"> | <rfc version='3' docName='draft-ietf-babel-rtt-extension-07' number="9616" updat | |||
| es="" obsoletes="" tocInclude="true" ipr='trust200902' consensus='true' submissi | ||||
| onType='IETF' category='std' xml:lang='en' xmlns:xi="http://www.w3.org/2001/XInc | ||||
| lude"> | ||||
| <front> | <front> | |||
| <title abbrev="Babel RTT Extension">Delay-based Metric Extension for the Babel R | <title abbrev="Babel RTT Extension">Delay-Based Metric Extension for the Babel R | |||
| outing Protocol</title> | outing Protocol</title> | |||
| <seriesInfo name="RFC" value="9616"/> | ||||
| <author fullname="Baptiste Jonglez" initials="B." surname="Jonglez"> | <author fullname="Baptiste Jonglez" initials="B." surname="Jonglez"> | |||
| <organization>ENS Lyon</organization> | <organization>ENS Lyon</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street></street> | ||||
| <city></city> | ||||
| <region></region> | ||||
| <code></code> | ||||
| <country>France</country> | <country>France</country> | |||
| </postal> | </postal> | |||
| <email>baptiste.jonglez@ens-lyon.org</email> | <email>baptiste.jonglez@ens-lyon.org</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author fullname="Juliusz Chroboczek" initials="J." surname="Chroboczek"> | <author fullname="Juliusz Chroboczek" initials="J." surname="Chroboczek"> | |||
| <organization>IRIF, Université Paris Cité</organization> | <organization>IRIF, Université Paris Cité</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street>Case 7014</street> | <street>Case 7014</street> | |||
| <city>75205 Paris Cedex 13</city> | <city>75205 Paris Cedex 13</city> | |||
| <region></region> | ||||
| <code></code> | ||||
| <country>France</country> | <country>France</country> | |||
| </postal> | </postal> | |||
| <email>jch@irif.fr</email> | <email>jch@irif.fr</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <date day="21" month="April" year="2024"/> | <date month="September" year="2024"/> | |||
| <area>RTG</area> | ||||
| <workgroup>babel</workgroup> | ||||
| <abstract> | <abstract> | |||
| <t>This document defines an extension to the Babel routing protocol that | <t>This document defines an extension to the Babel routing protocol that | |||
| measures the round-trip time (RTT) between routers and makes it possible | measures the round-trip time (RTT) between routers and makes it possible | |||
| to prefer lower latency links over higher latency ones.</t> | to prefer lower-latency links over higher-latency ones.</t> | |||
| </abstract> | </abstract> | |||
| </front> | </front> | |||
| <middle> | <middle> | |||
| <section title="Introduction"> | <section title="Introduction"> | |||
| <t>The Babel routing protocol <xref target="RFC8966"/> does not mandate | <t>The Babel routing protocol <xref target="RFC8966"/> does not mandate | |||
| a specific algorithm for computing metrics; existing implementations use | a specific algorithm for computing metrics; existing implementations use | |||
| a packet-loss based metric on wireless links and a simple hop-count metric | a packet-loss-based metric on wireless links and a simple hop-count metric | |||
| on all other types of links. While this strategy works reasonably well in | on all other types of links. While this strategy works reasonably well in | |||
| many networks, it fails to select reasonable routes in some topologies | many networks, it fails to select reasonable routes in some topologies | |||
| involving tunnels or VPNs.</t> | involving tunnels or VPNs.</t> | |||
| <figure anchor="fig-diamond"><name>Four routers in a diamond topology</name> | <figure anchor="fig-diamond"><name>Four Routers in a Diamond Topology</name> | |||
| <artwork><![CDATA[ | <artwork><![CDATA[ | |||
| +------------+ | +------------+ | |||
| | A (Paris) +---------------+ | | A (Paris) +---------------+ | |||
| +------------+ \ | +------------+ \ | |||
| / \ | / \ | |||
| / \ | / \ | |||
| / \ | / \ | |||
| +------------+ +------------+ | +------------+ +------------+ | |||
| | B (Paris) | | C (Tokyo) | | | B (Paris) | | C (Tokyo) | | |||
| +------------+ +------------+ | +------------+ +------------+ | |||
| \ / | \ / | |||
| \ / | \ / | |||
| \ / | \ / | |||
| +------------+ / | +------------+ / | |||
| | D (Paris) +---------------+ | | D (Paris) +---------------+ | |||
| +------------+ | +------------+ | |||
| ]]></artwork> | ]]></artwork> | |||
| </figure> | </figure> | |||
| <t>Consider for example the topology described in <xref target="fig-diamond"/>, | <t>For example, consider the topology described in <xref target="fig-diamond"/>, | |||
| with three routers A, B and D located in Paris and a fourth router | with three routers A, B, and D located in Paris and a fourth router | |||
| C located in Tokyo, connected through tunnels in a diamond topology. When | C located in Tokyo, connected through tunnels in a diamond topology. When | |||
| routing traffic from A to D, it is obviously preferable to use the local | routing traffic from A to D, it is obviously preferable to use the local | |||
| route through B, as this is likely to provide better service quality and | route through B as this is likely to provide better service quality and | |||
| lower monetary cost than the distant route through C. However, the | lower monetary cost than the distant route through C. However, the | |||
| existing implementations of Babel consider both routes as having the same | existing implementations of Babel consider both routes as having the same | |||
| metric, and will therefore route the traffic through C in roughly half the | metric; therefore, they will route the traffic through C in roughly half the | |||
| cases.</t> | cases.</t> | |||
| <t>In the first part of this document (<xref target="rtt-sampling"/>), | <t>In the first part of this document (<xref target="rtt-sampling"/>), | |||
| we specify an extension to the Babel routing protocol that produces | we specify an extension to the Babel routing protocol that produces | |||
| a sequence of accurate measurements of the round-trip time (RTT) between | a sequence of accurate measurements of the round-trip time (RTT) between | |||
| two Babel neighbours. These measurements are not directly usable as an | two Babel neighbours. These measurements are not directly usable as an | |||
| input to Babel's route selection procedure, since they tend to be noisy | input to Babel's route selection procedure since they tend to be noisy | |||
| and to cause a negative feedback loop, which might give rise to frequent | and to cause a negative feedback loop, which might give rise to frequent | |||
| oscillations. In a second part (<xref target="route-selection"/>), we | oscillations. In the second part (<xref target="route-selection"/>), we | |||
| define an algorithm that maps the sequence of RTT samples to a link cost | define an algorithm that maps the sequence of RTT samples to a link cost | |||
| that can be used for route selection.</t> | that can be used for route selection.</t> | |||
| <section title="Applicability"> | <section title="Applicability"> | |||
| <t>The extension defined in <xref target="rtt-sampling"/> provides | <t>The extension defined in <xref target="rtt-sampling"/> provides | |||
| a sequence of accurate but potentially noisy RTT samples. Since the | a sequence of accurate but potentially noisy RTT samples. Since the | |||
| round-trip time is a symmetric measure of delay, this protocol is only | RTT is a symmetric measure of delay, this protocol is only | |||
| applicable in environments where the symmetric delay is a good predictor | applicable in environments where the symmetric delay is a good predictor | |||
| of whether a link should be taken by routing traffic, which might not | of whether a link should be taken by routing traffic, which might not | |||
| necessarily be the case in networks built over exotic link technologies.</t> | necessarily be the case in networks built over exotic link technologies.</t> | |||
| <t>The extension makes minimal requirements on the nodes. In particular, | <t>The extension makes minimal requirements on the nodes. In particular, | |||
| it does not assume synchronised clocks, but only requires that clock drift | it does not assume synchronised clocks, and only requires that clock drift | |||
| be negligible during the time interval between two Hello TLVs. Since that | be negligible during the time interval between two Hello TLVs. Since that | |||
| is on the order of a few seconds, this requirement is met even with cheap | is on the order of a few seconds, this requirement is met even with cheap | |||
| crystal oscillators such as the ones used in consumer electronics.</t> | crystal oscillators, such as the ones used in consumer electronics.</t> | |||
| <t>The algorithm defined in <xref target="route-selection"/> makes | <t>The algorithm defined in <xref target="route-selection"/> depends on | |||
| a number of assumptions about the network. The assumption with most | a number of assumptions about the network. The assumption with the most | |||
| severe consequences is that all links below a certain RTT (rtt-min in | severe consequences is that all links below a certain RTT (rtt-min in | |||
| <xref target="cost-computation"/>) can be grouped in a single category of | <xref target="cost-computation"/>) can be grouped in a single category of | |||
| "good" links. While this is the case in wide-area overlay networks, it | "good" links. While this is the case in wide-area overlay networks, it | |||
| makes the algorithm inapplicable in networks where distinguishing between | makes the algorithm inapplicable in networks where distinguishing between | |||
| low-latency links is important.</t> | low-latency links is important.</t> | |||
| <t>There are other assumptions, but they are less likely to limit the | <t>There are other assumptions, but they are less likely to limit the | |||
| algorithm's applicability. The algorithm assumes that all links above | algorithm's applicability. The algorithm assumes that all links above | |||
| a certain RTT (rtt-max in <xref target="cost-computation"/>) can be | a certain RTT (rtt-max in <xref target="cost-computation"/>) are equally bad, an | |||
| assumed to be equally bad, and will only be used as a last resort. In | d they will only be used as a last resort. In | |||
| addition, in order to avoid oscillations, the algorithm is designed to | addition, in order to avoid oscillations, the algorithm is designed to | |||
| react slowly to RTT variations, thus causing suboptimal routing for | react slowly to RTT variations, thus causing suboptimal routing for | |||
| seconds or even minutes after an RTT change; while this is a desirable | seconds or even minutes after an RTT change; while this is a desirable | |||
| property in fixed networks, as it avoid excessive route oscillations, it | property in fixed networks, as it avoid excessive route oscillations, it | |||
| might be an issue with networks with high rates of node mobility.</t> | might be an issue with networks with high rates of node mobility.</t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section><name>Specification of Requirements</name> | <section><name>Specification of Requirements</name> | |||
| <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | <t> | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | |||
| "OPTIONAL" in this document are to be interpreted as described in BCP 14 | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14> | |||
| <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, | ", | |||
| they appear in all capitals, as shown here.</t> | "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | |||
| "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | ||||
| "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | ||||
| be | ||||
| interpreted as described in BCP 14 <xref target="RFC2119"/> <xref | ||||
| target="RFC8174"/> when, and only when, they appear in all capitals, as | ||||
| shown here. | ||||
| </t> | ||||
| </section> | </section> | |||
| <section title="RTT sampling" anchor="rtt-sampling"> | <section title="RTT Sampling" anchor="rtt-sampling"> | |||
| <section title="Data structures"> | <section title="Data Structures"> | |||
| <t>We assume that every Babel speaker maintains a local clock, that counts | <t>We assume that every Babel speaker maintains a local clock that counts | |||
| microseconds from an arbitrary origin. We do not assume that clocks are | microseconds from an arbitrary origin. We do not assume that clocks are | |||
| synchronised: clocks local to distinct nodes need not share a common | synchronised: clocks local to distinct nodes need not share a common | |||
| origin. The protocol will eventually recover if the clock is stepped, so | origin. The protocol will eventually recover if the clock is stepped, so | |||
| clocks need not persist across node reboots.</t> | clocks need not persist across node reboots.</t> | |||
| <t>Every Babel speaker maintains a Neighbour Table, described in | <t>Every Babel speaker maintains a Neighbour Table, described in | |||
| Section 3.2.4 of <xref target="RFC8966"/>. This extension extends every | <xref target="RFC8966" sectionFormat="of" section="3.2.4"/>. This extension ext ends every | |||
| entry in the Neighbour Table with the following data:</t> | entry in the Neighbour Table with the following data:</t> | |||
| <ul spacing="normal"> | <ul spacing="normal"> | |||
| <li>the Origin Timestamp, a 32-bit timestamp (modulo 2^32) according to | <li>the Origin Timestamp, a 32-bit timestamp (modulo 2<sup>32</sup>) according t o | |||
| the neighbour's clock;</li> | the neighbour's clock;</li> | |||
| <li>the Receive Timestamp, a 32-bit timestamp (modulo 2^32) according to | <li>the Receive Timestamp, a 32-bit timestamp (modulo 2<sup>32</sup>) according to | |||
| the local clock.</li> | the local clock.</li> | |||
| </ul> | </ul> | |||
| <t>Both values are initially undefined.</t> | <t>Both values are initially undefined.</t> | |||
| </section> | </section> | |||
| <section title="Protocol operation"> | <section title="Protocol Operation"> | |||
| <t>The RTT to a neighbour is estimated using an algorithm due to Mills | <t>The RTT to a neighbour is estimated using an algorithm due to Mills | |||
| <xref target="MILLS"/>, originally developed for the HELLO routing | <xref target="RFC891"/>, originally developed for the HELLO routing | |||
| protocol and later used in NTP <xref target="NTP"/>.</t> | protocol and later used in NTP <xref target="RFC5905"/>.</t> | |||
| <t>A Babel speaker periodically sends Hello messages to its neighbours | <t>A Babel speaker periodically sends Hello messages to its neighbours | |||
| (Section 3.4.1 of <xref target="RFC8966"/>). Additionally, it | (<xref target="RFC8966" sectionFormat="of" section="3.4.1"/>). Additionally, it | |||
| occasionally sends a set of IHU ("I Heard You") messages, at most one per | occasionally sends a set of IHU ("I Heard You") messages, at most one per | |||
| neighbour (Section 3.4.2 of <xref target="RFC8966"/>).</t> | neighbour (<xref target="RFC8966" sectionFormat="of" section="3.4.2"/>).</t> | |||
| <figure anchor="fig-seq"><name>Mill's algorithm</name> | <figure anchor="fig-seq"><name>Mills' Algorithm</name> | |||
| <artwork><![CDATA[ | <artwork><![CDATA[ | |||
| A B | A B | |||
| | | | | | | |||
| t1 + | | t1 + | | |||
| |\ | | |\ | | |||
| | \ | | | \ | | |||
| | \ | Hello(t1) | | \ | Hello(t1) | |||
| | \ | | | \ | | |||
| | \ | | | \ | | |||
| | \| | | \| | |||
| | + t1' | | + t1' | |||
| | | | | | | |||
| | | RTT = (t2 - t1) - (t2' - t1') | | | RTT = (t2 - t1) - (t2' - t1') | |||
| | | | | | | |||
| | + t2' | | + t2' | |||
| | /| | | /| | |||
| | / | | | / | | |||
| | / | | | / | | |||
| | / | Hello(t2') | | / | Hello(t2') | |||
| | / | IHU(t1, t1') | | / | IHU(t1, t1') | |||
| |/ | | |/ | | |||
| t2 + | | t2 + | | |||
| | | | | | | |||
| v v | v v | |||
| ]]></artwork> | ]]></artwork> | |||
| </figure> | </figure> | |||
| <t>In order to enable the computation of RTTs, a node A MUST include in | <t>In order to enable the computation of RTTs, a node A <bcp14>MUST</bcp14> incl | |||
| every Hello that it sends a timestamp t1 (according to A's local clock), | ude, in | |||
| every Hello that it sends, a timestamp t1 (according to A's local clock), | ||||
| as illustrated in <xref target="fig-seq"/>. When a node B receives A's | as illustrated in <xref target="fig-seq"/>. When a node B receives A's | |||
| timestamped Hello, it computes the time t1' at which the Hello was | timestamped Hello, it computes the time t1' at which the Hello was | |||
| received (according to B's local clock). It then MUST record the value t1 | received (according to B's local clock). It then <bcp14>MUST</bcp14> record the value t1 | |||
| in the Origin Timestamp field of the Neighbour Table entry corresponding | in the Origin Timestamp field of the Neighbour Table entry corresponding | |||
| to A, and the value t1' in the Receive Timestamp field of the Neighbour | to A and the value t1' in the Receive Timestamp field of the Neighbour | |||
| Table entry.</t> | Table entry.</t> | |||
| <t>When B sends an IHU to A, it checks whether both timestamps are defined | <t>When B sends an IHU to A, it checks whether both timestamps are defined | |||
| in the Neighbour Table. If that is the case, then it MUST ensure that its | in the Neighbour Table. If that is the case, then it <bcp14>MUST</bcp14> ensure that its | |||
| IHU TLV is sent in a packet that also contains a timestamped Hello TLV | IHU TLV is sent in a packet that also contains a timestamped Hello TLV | |||
| (either a normally scheduled Hello, or an unscheduled Hello, see | (either a normally scheduled Hello or an unscheduled Hello, see | |||
| Section 3.4.1 of <xref target="RFC8966"/>). It MUST include in the IHU | <xref target="RFC8966" sectionFormat="of" section="3.4.1"/>). It <bcp14>MUST</b | |||
| cp14> include in the IHU | ||||
| both the Origin Timestamp and the Receive Timestamp stored in the Neighbour | both the Origin Timestamp and the Receive Timestamp stored in the Neighbour | |||
| Table.</t> | Table.</t> | |||
| <t>Upon receiving B's packet, A computes the time t2 (according to its | <t>Upon receiving B's packet, A computes the time t2 (according to its | |||
| local clock) at which it was received. A MUST then verify that it | local clock) at which it was received. Node A <bcp14>MUST</bcp14> then verify t hat it | |||
| contains both a Hello TLV with timestamp t2' and an IHU TLV with two | contains both a Hello TLV with timestamp t2' and an IHU TLV with two | |||
| timestamps t1 and t1'. If that is the case, A computes the value | timestamps t1 and t1'. If that is the case, A computes the value:</t> | |||
| RTT = (t2 - t1) - (t2' - t1') (where all computations are done modulo | <artwork>RTT = (t2 - t1) - (t2' - t1')</artwork> <t>(where all computations are | |||
| 2^32), which is a measurement of the RTT between A and B. (A then stores | done modulo | |||
| 2<sup>32</sup>), which is a measurement of the RTT between A and B. (A then sto | ||||
| res | ||||
| the values t2' and t2 in its Neighbour Table, as B did before.)</t> | the values t2' and t2 in its Neighbour Table, as B did before.)</t> | |||
| <t>This algorithm has a number of desirable properties. First, the | <t>This algorithm has a number of desirable properties:</t> | |||
| <ol><li>The | ||||
| algorithm is symmetric: A and B use the same procedures for timestamping | algorithm is symmetric: A and B use the same procedures for timestamping | |||
| packets and computing RTT samples, and both nodes produce one RTT sample | packets and computing RTT samples, and both nodes produce one RTT sample | |||
| for each received (Hello, IHU) pair. Second, since there is no | for each received (Hello, IHU) pair.</li> | |||
| <li>Since there is no | ||||
| requirement that t1' and t2' be equal, the protocol is asynchronous: the | requirement that t1' and t2' be equal, the protocol is asynchronous: the | |||
| only change to Babel's message scheduling is the requirement that a packet | only change to Babel's message scheduling is the requirement that a packet | |||
| containing an IHU also contain a Hello. Third, since it only ever | containing an IHU also contain a Hello.</li> | |||
| <li>Since the algorithm only ever | ||||
| computes differences of timestamps according to a single clock, it does | computes differences of timestamps according to a single clock, it does | |||
| not require synchronised clocks. Fourth, it requires very little | not require synchronised clocks.</li> | |||
| <li>The algorithm requires very little | ||||
| additional state: a node only needs to store the two timestamps associated | additional state: a node only needs to store the two timestamps associated | |||
| with the last hello received from each neighbour. Finally, since it only | with the last hello received from each neighbour.</li> | |||
| <li>Since the algorithm only | ||||
| requires piggybacking one or two timestamps on each Hello and IHU TLV, | requires piggybacking one or two timestamps on each Hello and IHU TLV, | |||
| it makes efficient use of network resources.</t> | it makes efficient use of network resources.</li></ol> | |||
| <t>In principle, this algorithm is inaccurate in the presence of clock | <t>In principle, this algorithm is inaccurate in the presence of clock | |||
| drift (i.e., when A's and B's clocks are running at different frequencies). | drift (i.e., when A's clock and B's clock are running at different frequencies). | |||
| However, t2' - t1' is usually on the order of a few seconds, and | However, t2' - t1' is usually on the order of a few seconds, and | |||
| significant clock drift is unlikely to happen at that time scale.</t> | significant clock drift is unlikely to happen at that time scale.</t> | |||
| <t>In order for RTT values to be consistent between implementations, | <t>In order for RTT values to be consistent between implementations, | |||
| timestamps need to be computed at roughly the same point in the network | timestamps need to be computed at roughly the same point in the network | |||
| stack. Transmit timestamps SHOULD be computed just before the packet is | stack. Transmit timestamps <bcp14>SHOULD</bcp14> be computed just before the pa cket is | |||
| passed to the network stack (i.e., before it is subjected to any queueing | passed to the network stack (i.e., before it is subjected to any queueing | |||
| delays), and receive timestamps SHOULD be computed just after the packet | delays); receive timestamps <bcp14>SHOULD</bcp14> be computed just after the pac ket | |||
| is received from the network stack.</t> | is received from the network stack.</t> | |||
| </section> | </section> | |||
| <section title="Wrap-around and node restart" anchor="wraparound"> | <section title="Wrap-Around and Node Restart" anchor="wraparound"> | |||
| <t>Timestamp values are a count of microseconds stored as a 32-bit | <t>Timestamp values are a count of microseconds stored as a 32-bit | |||
| unsigned integer; thus, they wrap around every 71 minutes or so. What is | unsigned integer; thus, they wrap around every 71 minutes or so. What is | |||
| more, a node may occasionally reboot and restart its clock at an arbitrary | more, a node may occasionally reboot and restart its clock at an arbitrary | |||
| origin. For these reasons, very old timestamps or nonsensical timestamps | origin. For these reasons, very old timestamps or nonsensical timestamps | |||
| MUST NOT be used to yield RTT samples.</t> | <bcp14>MUST NOT</bcp14> be used to yield RTT samples.</t> | |||
| <t>The following algorithm can be used to achieve that. When a node | <t>The following algorithm can be used to discard obsolete samples. When a node | |||
| receives a packet containing a Hello and an IHU, it compares the current | receives a packet containing a Hello and an IHU, it compares the current | |||
| local time t2 with the Origin Timestamp contained in the IHU; if the | local time t2 with the Origin Timestamp contained in the IHU; if the | |||
| Origin Timestamp appears to be in the future, or if it is in the past by | Origin Timestamp appears to be in the future, or if it is in the past by | |||
| more than a time T (the value T = 3 minutes is recommended), then the | more than a time T (the value T = 3 minutes is recommended), then the | |||
| timestamps are still recorded in the neighbour table, but are not used for | timestamps are still recorded in the Neighbour Table, but they are not used for | |||
| computation of an RTT sample.</t> | computation of an RTT sample.</t> | |||
| <t>Similary, the node compares the Hello's timestamp with the Receive | <t>Similarly, the node compares the Hello's timestamp with the Receive | |||
| Timestamp recorded in the Neighbour Table; if the Hello's timestamp | Timestamp recorded in the Neighbour Table; if the Hello's timestamp | |||
| appears to be older than the recorded timestamp, or if it appears to be | appears to be older than the recorded timestamp, or if it appears to be | |||
| more recent by an interval larger than the value T, then the timestamps | more recent by an interval larger than the value T, then the timestamps | |||
| are not used for computation of an RTT sample.</t> | are not used for computation of an RTT sample.</t> | |||
| </section> | </section> | |||
| <section title="Implementation notes"> | <section title="Implementation Notes"> | |||
| <t>The accuracy of the computed RTT samples depends on Transmit Timestamps | <t>The accuracy of the computed RTT samples depends on Transmit Timestamps | |||
| being computed as late as possible before a packet containing a Hello TLV | being computed as late as possible before a packet containing a Hello TLV | |||
| is passed to the network stack, and Receive Timestamps being computed as | is passed to the network stack, and Receive Timestamps being computed as | |||
| early as possible after reception of a packet containing a (Hello, IHU) | early as possible after reception of a packet containing a (Hello, IHU) | |||
| pair. We have found the following implementation strategy to be | pair. We have found the following implementation strategy to be | |||
| useful.</t> | useful.</t> | |||
| <t>When a Hello TLV is buffered for transmission, we insert a PadN sub-TLV | <t>When a Hello TLV is buffered for transmission, we insert a PadN sub-TLV | |||
| (Section 4.7.2 of <xref target="RFC8966"/>) with a length of 4 octets | (Section 4.7.2 of <xref target="RFC8966"/>) with a length of 4 octets | |||
| within the TLV. When the packet is ready to be sent, we check whether it | within the TLV. When the packet is ready to be sent, we check whether it | |||
| contains a 4-octet PadN sub-TLV; if that's the case, we overwrite the PadN | contains a 4-octet PadN sub-TLV; if that's the case, we overwrite the PadN | |||
| sub-TLV with a Timestamp sub-TLV with the current time, and send out the | sub-TLV with a Timestamp sub-TLV with the current time, and send out the | |||
| packet.</t> | packet.</t> | |||
| <t>Conversely, when a packet is received, we immediately compute the | <t>Conversely, when a packet is received, we immediately compute the | |||
| current time and record it with the received packet. We then process the | current time and record it with the received packet. We then process the | |||
| packet as usual, and use the recorded timestamp in order to compute an RTT | packet as usual and use the recorded timestamp in order to compute an RTT | |||
| sample.</t> | sample.</t> | |||
| <t>The protocol is designed to survive the clock being reset when a node | <t>The protocol is designed to survive the clock being reset when a node | |||
| reboots; on POSIX systems, this makes it possible to use the | reboots; on POSIX systems, this makes it possible to use the | |||
| CLOCK_MONOTONIC clock for computing timestamps. If CLOCK_MONOTONIC is not | CLOCK_MONOTONIC clock for computing timestamps. If CLOCK_MONOTONIC is not | |||
| available, CLOCK_REALTIME may be used, since the protocol is able to | available, CLOCK_REALTIME may be used, since the protocol is able to | |||
| survive the clock being occasionally stepped.</t> | survive the clock being occasionally stepped.</t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section title="RTT-based route selection" anchor="route-selection"> | <section title="RTT-Based Route Selection" anchor="route-selection"> | |||
| <t>The protocol described above yields a series of RTT samples. While | <t>The protocol described above yields a series of RTT samples. While | |||
| these samples are fairly accurate, they are not directly usable as an | these samples are fairly accurate, they are not directly usable as an | |||
| input to the route selection procedure, for at least three reasons.</t> | input to the route selection procedure, for at least three reasons:</t> | |||
| <t>First of all, in the presence of bursty traffic, routers experience | <ol><li>In the presence of bursty traffic, routers experience | |||
| transient congestion, which causes occasional spikes in the measured RTT. | transient congestion, which causes occasional spikes in the measured RTT. | |||
| Thus, the RTT signal may be noisy, and requires smoothing before it can | Thus, the RTT signal may be noisy and require smoothing before it can | |||
| be used for route selection.</t> | be used for route selection.</li> | |||
| <t>Second, using the RTT signal for route selection gives rise to | <li>Using the RTT signal for route selection gives rise to | |||
| a negative feedback loop: when a route has a low RTT, it is deemed to be | a negative feedback loop. When a route has a low RTT, it is deemed to be | |||
| more desirable, which causes it to be used for more data traffic, which | more desirable; this causes it to be used for more data traffic, which | |||
| may lead to congestion, which in turn increases the RTT. Without some | may lead to congestion, which in turn increases the RTT. Without some | |||
| form of hysteresis, using RTT for route selection would lead to | form of hysteresis, using RTT for route selection would lead to | |||
| oscillations between parallel routes, which would lead to packet | oscillations between parallel routes, which would lead to packet | |||
| reordering and negatively affect upper-layer protocols (such as TCP).</t> | reordering and negatively affect upper-layer protocols (such as TCP).</li> | |||
| <t>Third, even in the absence of congestion, the RTT tends to exhibit some | <li>Even in the absence of congestion, the RTT tends to exhibit some | |||
| variation. If the RTTs of two parallel routes oscillate around | variation. If the RTTs of two parallel routes oscillate around | |||
| a common value, using the RTT as input to route selection will cause | a common value, using the RTT as input to route selection will cause | |||
| frequent routing oscillations, which, again, indicates the need for some | frequent routing oscillations, which, again, indicates the need for some | |||
| form of hysteresis.</t> | form of hysteresis.</li></ol> | |||
| <t>In this section, we describe an algorithm that integrates smoothing and | <t>In this section, we describe an algorithm that integrates smoothing and | |||
| hysteresis and has been shown to behave well both in simulation and | hysteresis. It has been shown to behave well both in simulation and | |||
| experimentally over the Internet <xref target="DELAY-BASED"/>, and is | experimentally over the Internet <xref target="DELAY-BASED"/> and is | |||
| RECOMMENDED when RTT information is being used for route selection. The | <bcp14>RECOMMENDED</bcp14> when RTT information is being used for route selectio | |||
| n. The | ||||
| algorithm is structured as follows:</t> | algorithm is structured as follows:</t> | |||
| <ul> | <ul> | |||
| <li>the RTT values are first smoothed in order to avoid instabilities due to | <li>the RTT values are first smoothed in order to avoid instabilities due to | |||
| outliers (<xref target="smoothing"/>);</li> | outliers (<xref target="smoothing"/>);</li> | |||
| <li>the resulting smoothed samples are mapped to a cost using a bounded, | <li>the resulting smoothed samples are mapped to a cost using a bounded, | |||
| non-linear mapping, which avoids | non-linear mapping, which avoids | |||
| instabilities at the lower and at the upper end of the RTT range | instabilities at the lower and upper end of the RTT range | |||
| (<xref target="cost-computation"/>);</li> | (<xref target="cost-computation"/>);</li> | |||
| <li>finally, a hysteresis filter is applied in order to limit the amount of | <li>a hysteresis filter is applied in order to limit the amount of | |||
| oscillation in the middle of the RTT range (<xref target="hysteresis"/>).</li> | oscillation in the middle of the RTT range (<xref target="hysteresis"/>).</li> | |||
| </ul> | </ul> | |||
| <section title="Smoothing" anchor="smoothing"> | <section title="Smoothing" anchor="smoothing"> | |||
| <t>The RTT samples provided by Mills' algorithm are fairly accurate, but | <t>The RTT samples provided by Mills' algorithm are fairly accurate, but | |||
| noisy: experiments indicate the occasional presence of individual samples | noisy: experiments indicate the occasional presence of individual samples | |||
| that are much larger than the expected value. Thus, some form of | that are much larger than the expected value. Thus, some form of | |||
| smoothing SHOULD be applied in order to avoid instabilities due to | smoothing <bcp14>SHOULD</bcp14> be applied in order to avoid instabilities due t o | |||
| occasional outliers.</t> | occasional outliers.</t> | |||
| <t>An implementation MAY use the exponential average algorithm, which is | <t>An implementation <bcp14>MAY</bcp14> use the exponential average algorithm, w hich is | |||
| simple to implement and appears to yield good results in practice <xref | simple to implement and appears to yield good results in practice <xref | |||
| target="DELAY-BASED"/>. The algorithm is parameterised by a constant α, | target="DELAY-BASED"/>. The algorithm is parameterised by a constant α, | |||
| where 0 < α < 1, which controls the amount of smoothing being | where 0 < α < 1, which controls the amount of smoothing being | |||
| applied. Fr each neighbour, it maintains a smoothed value RTT which is | applied. For each neighbour, it maintains a smoothed value RTT, which is | |||
| initially undefined. When the first sample RTT0 is measured, the smoothed | initially undefined. When the first sample RTT0 is measured, the smoothed | |||
| value is set to the value of RTT0. At each new sample RTTn, the smoothed | value is set to the value of RTT0. At each new sample RTTn, the smoothed | |||
| value is set to a weighted average of the previous smoothed value and the | value is set to a weighted average of the previous smoothed value and the | |||
| new sample:</t> | new sample:</t> | |||
| <artwork> RTT := α RTT + (1 - α) RTTn</artwork> | ||||
| <t>The smoothing constant α SHOULD be between 0.8 and 0.9; the value 0.836 | <sourcecode type="pseudocode"> RTT := α RTT + (1 - α) RTTn</sourcecode> | |||
| is the RECOMMENDED default.</t> | ||||
| <t>The smoothing constant α <bcp14>SHOULD</bcp14> be between 0.8 and 0.9; the va | ||||
| lue 0.836 | ||||
| is the <bcp14>RECOMMENDED</bcp14> default.</t> | ||||
| </section> | </section> | |||
| <section title="Cost computation" anchor="cost-computation"> | <section title="Cost Computation" anchor="cost-computation"> | |||
| <t>The smoothed RTT value obtained in the previous step needs to be mapped | <t>The smoothed RTT value obtained in the previous step needs to be mapped | |||
| to a link cost, suitable for input to the metric computation procedure | to a link cost, suitable for input to the metric computation procedure | |||
| (Section 3.5.2 of <xref target="RFC8966"/>). Obviously, the mapping | (<xref target="RFC8966" section="3.5.2" sectionFormat="of"/>). Obviously, the m apping | |||
| should be monotonic (larger RTTs imply larger costs). In addition, the | should be monotonic (larger RTTs imply larger costs). In addition, the | |||
| mapping should be constant beyond a certain value (all very bad links are | mapping should be constant beyond a certain value (all very bad links are | |||
| equally bad), so that congested links do not contribute to routing | equally bad) so that congested links do not contribute to routing | |||
| instability. The mapping should also be constant around 0, so that small | instability. The mapping should also be constant around 0, so that small | |||
| oscillations in the RTT of low-RTT links do not contribute to routing | oscillations in the RTT of low-RTT links do not contribute to routing | |||
| instability.</t> | instability.</t> | |||
| <figure anchor="fig-mapping"><name>Mapping from RTT to link cost</name> | <figure anchor="fig-mapping"><name>Mapping from RTT to Link Cost</name> | |||
| <artwork><![CDATA[ | <artwork><![CDATA[ | |||
| cost | cost | |||
| ^ | ^ | |||
| | | | | |||
| | | | | |||
| | C + max-rtt-penalty | | C + max-rtt-penalty | |||
| | +--------------------------- | | +--------------------------- | |||
| | /. | | /. | |||
| | / . | | / . | |||
| | / . | | / . | |||
| skipping to change at line 422 ¶ | skipping to change at line 433 ¶ | |||
| C +------------+ . | C +------------+ . | |||
| | . . | | . . | |||
| | . . | | . . | |||
| | . . | | . . | |||
| | . . | | . . | |||
| 0 +----------------------------------------------------> | 0 +----------------------------------------------------> | |||
| 0 rtt-min rtt-max RTT | 0 rtt-min rtt-max RTT | |||
| ]]></artwork> | ]]></artwork> | |||
| </figure> | </figure> | |||
| <t>Implementations SHOULD use the mapping described in figure <xref | <t>Implementations <bcp14>SHOULD</bcp14> use the mapping described in <xref | |||
| target="fig-mapping"/>, which is parameterised by three parameters | target="fig-mapping"/>, which is parameterised by three parameters: | |||
| rtt-min, rtt-max, and max-rtt-penalty. For RTT values below rtt-min, the | rtt-min, rtt-max, and max-rtt-penalty. For RTT values below rtt-min, the | |||
| link cost is just the nominal cost C of a single hop. Between rtt-min and | link cost is just the nominal cost C of a single hop. Between rtt-min and | |||
| rtt-max, the cost increases linearly; above rtt-max, the constant value | rtt-max, the cost increases linearly; above rtt-max, the constant value | |||
| max-rtt-penalty is added to the nominal cost.</t> | max-rtt-penalty is added to the nominal cost.</t> | |||
| <t>The value rtt-min should be slightly larger than the RTT of a local, | <t>The value rtt-min should be slightly larger than the RTT of a local, | |||
| uncongested link. The value rtt-max should be the RTT above which a link | uncongested link. The value rtt-max should be the RTT above which a link | |||
| should be avoided if possible, either because it is a long-distance link | should be avoided if possible, either because it is a long-distance link | |||
| or because it is congested; reducing the value of rtt-max improves | or because it is congested; reducing the value of rtt-max improves | |||
| stability, but prevents the protocol from discriminating between | stability, but prevents the protocol from discriminating between | |||
| high-latency links. As to max-rtt-penalty, it controls how much the | high-latency links. As for max-rtt-penalty, it controls how much the | |||
| protocol will penalise long-distance links. The default values | protocol will penalise long-distance links. The default values | |||
| rtt-min = 10ms, rtt-max = 120ms, and max-rtt-penalty = 150 are | rtt-min = 10 ms, rtt-max = 120 ms, and max-rtt-penalty = 150 are | |||
| RECOMMENDED.</t> | <bcp14>RECOMMENDED</bcp14>.</t> | |||
| </section> | </section> | |||
| <section title="Hysteresis" anchor="hysteresis"> | <section title="Hysteresis" anchor="hysteresis"> | |||
| <t>Even after applying a bounded mapping from smoothed RTT to a cost | <t>Even after applying a bounded mapping from smoothed RTT to a cost | |||
| value, the cost may fluctuate when a link's RTT is between rtt-min and | value, the cost may fluctuate when a link's RTT is between rtt-min and | |||
| rtt-max. Implementations SHOULD use a robust hysteresis algorithm, such | rtt-max. Implementations <bcp14>SHOULD</bcp14> use a robust hysteresis algorith | |||
| as the one described in Appendix A.3 of <xref target="RFC8966"/>.</t> | m, such | |||
| as the one described in <xref target="RFC8966" sectionFormat="of" section="A.3"/ | ||||
| >.</t> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section title="Backwards and forwards compatibility"> | <section title="Backwards and Forwards Compatibility"> | |||
| <t>This protocol extension stores the data that it requires within | <t>This protocol extension stores the data that it requires within | |||
| sub-TLVs of Babel's Hello and IHU TLVs. As discussed in Appendix D of | sub-TLVs of Babel's Hello and IHU TLVs. As discussed in | |||
| <xref target="RFC8966"/>, implementations that do not understand this | <xref target="RFC8966" sectionFormat="of" section="D"/>, implementations that do | |||
| not understand this | ||||
| extension will silently ignore the sub-TLVs while parsing the rest of the | extension will silently ignore the sub-TLVs while parsing the rest of the | |||
| TLVs that they contain. In effect, this extension supports building | TLVs that they contain. In effect, this extension supports building | |||
| hybrid networks consisting of extended and unextended routers, and while | hybrid networks consisting of extended and unextended routers; while | |||
| such networks might suffer from sub-optimal routing, they will not suffer | such networks might suffer from sub-optimal routing, they will not suffer | |||
| from blackholes or routing loops.</t> | from routing loops or other pathologies.</t> | |||
| <t>If a sub-TLV defined in this extension is longer than expected, the | <t>If a sub-TLV defined in this extension is longer than expected, the | |||
| additional data is silently ignored. This provision is made in order to | additional data is silently ignored. This provision is made in order to | |||
| allow a future version of this protocol to extend the packet format with | allow a future version of this protocol to extend the packet format with | |||
| additional data, for example high-precision or absolute timestamps.</t> | additional data, for example high-precision or absolute timestamps.</t> | |||
| </section> | </section> | |||
| <section title="Packet format"> | <section title="Packet Format"> | |||
| <t>This extension defines the Timestamp sub-TLV whose Type field has value | <t>This extension defines the Timestamp sub-TLV whose Type field has the value | |||
| 3. This sub-TLV can be contained within a Hello sub-TLV, in which case it | 3. This sub-TLV can be contained within a Hello sub-TLV, in which case it | |||
| carries a single timestamp, or within an IHU sub-TLV, in which case it | carries a single timestamp, or within an IHU sub-TLV, in which case it | |||
| carries two timestamps.</t> | carries two timestamps.</t> | |||
| <t>Timestamps are encoded as 32-bit unsigned integers (modulo 2^32), | <t>Timestamps are encoded as 32-bit unsigned integers (modulo 2<sup>32</sup>), | |||
| expressed in units of one microsecond, counting from an arbitrary origin. | expressed in units of one microsecond, counting from an arbitrary origin. | |||
| Timestamps wrap around every 4295 seconds, or rougly 71 minutes (see also | Timestamps wrap around every 4295 seconds, or roughly 71 minutes (see also | |||
| <xref target="wraparound"/>).</t> | <xref target="wraparound"/>).</t> | |||
| <section title="Timestamp sub-TLV in Hello TLVs"> | <section title="Timestamp Sub-TLV in Hello TLVs"> | |||
| <t>When contained within a Hello TLV, the Timestamp sub-TLV | <t>When contained within a Hello TLV, the Timestamp sub-TLV | |||
| has the following format:</t> | has the following format:</t> | |||
| <artwork><![CDATA[ | <artwork><![CDATA[ | |||
| 0 1 2 3 | 0 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Type = 3 | Length | Transmit timestamp | | | Type = 3 | Length | Transmit Timestamp | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | (continued) | | | (continued) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| ]]></artwork> | ]]></artwork> | |||
| <t>Fields:</t> | ||||
| <dl newline="false" spacing="normal" indent="10"> | <dl newline="false" spacing="normal" indent="10"> | |||
| <dt>Type</dt><dd>Set to 3 to indicate a Timestamp sub-TLV.</dd> | <dt>Type:</dt><dd>Set to 3 to indicate a Timestamp sub-TLV.</dd> | |||
| <dt>Length</dt><dd>The length of the body in octets, exclusive of the Type | <dt>Length:</dt><dd>The length of the body in octets, exclusive of the Type | |||
| and Length fields.</dd> | and Length fields.</dd> | |||
| <dt>Transmit timestamp</dt><dd>The time at which the packet containing | <dt>Transmit Timestamp:</dt><dd>The time at which the packet containing | |||
| this sub-TLV was sent, according to the sender's clock.</dd> | this sub-TLV was sent, according to the sender's clock.</dd> | |||
| </dl> | </dl> | |||
| <t>If the Length field is larger than the expected 4 octets, the sub-TLV | <t>If the Length field is larger than the expected 4 octets, the sub-TLV | |||
| MUST be processed normally (the first 4 octets are interpreted as | <bcp14>MUST</bcp14> be processed normally (the first 4 octets are interpreted as | |||
| described above), and any extra data contained in this sub-TLV MUST be | described above) and any extra data contained in this sub-TLV <bcp14>MUST</bcp14 | |||
| > be | ||||
| silently ignored. If the Length field is smaller than the expected | silently ignored. If the Length field is smaller than the expected | |||
| 4 octets, then this sub-TLV MUST be ignored (and the remainder of the | 4 octets, then this sub-TLV <bcp14>MUST</bcp14> be ignored (and the remainder of the | |||
| enclosing TLV processed as usual).</t> | enclosing TLV processed as usual).</t> | |||
| </section> | </section> | |||
| <section title="Timestamp sub-TLV in IHU TLVs"> | <section title="Timestamp Sub-TLV in IHU TLVs"> | |||
| <t>When contained in an IHU TLV, the Timestamp sub-TLV has the following | <t>When contained in an IHU TLV, the Timestamp sub-TLV has the following | |||
| format:</t> | format:</t> | |||
| <artwork><![CDATA[ | <artwork><![CDATA[ | |||
| 0 1 2 3 | 0 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 | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | Type = 3 | Length | Origin timestamp | | | Type = 3 | Length | Origin Timestamp | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | (continued) | Receive timestamp | | | (continued) | Receive Timestamp | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | (continued) | | | (continued) | | |||
| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| ]]></artwork> | ]]></artwork> | |||
| <t>Fields:</t> | ||||
| <dl newline="false" spacing="normal" indent="10"> | <dl newline="false" spacing="normal" indent="10"> | |||
| <dt>Type</dt><dd>Set to 3 to indicate a Timestamp sub-TLV.</dd> | <dt>Type:</dt><dd>Set to 3 to indicate a Timestamp sub-TLV.</dd> | |||
| <dt>Length</dt><dd>The length of the body in octets, exclusive of the Type | <dt>Length:</dt><dd>The length of the body in octets, exclusive of the Type | |||
| and Length fields.</dd> | and Length fields.</dd> | |||
| <dt>Origin timestamp</dt><dd>A copy of the transmit timestamp of the last | <dt>Origin Timestamp:</dt><dd>A copy of the Transmit Timestamp of the last | |||
| Timestamp sub-TLV contained in a Hello TLV received from the node to which | Timestamp sub-TLV contained in a Hello TLV received from the node to which | |||
| the enclosing IHU TLV applies.</dd> | the enclosing IHU TLV applies.</dd> | |||
| <dt>Receive timestamp</dt><dd>The time, according to the sender's clock, | <dt>Receive Timestamp:</dt><dd>The time, according to the sender's clock, | |||
| at which the last timestamped Hello TLV was received from the node to which | at which the last timestamped Hello TLV was received from the node to which | |||
| the enclosing IHU TLV applies.</dd> | the enclosing IHU TLV applies.</dd> | |||
| </dl> | </dl> | |||
| <t>If the Length field is larger than the expected 8 octets, the sub-TLV | <t>If the Length field is larger than the expected 8 octets, the sub-TLV | |||
| MUST be processed normally (the first 8 octets are interpreted as | <bcp14>MUST</bcp14> be processed normally (the first 8 octets are interpreted as | |||
| described above), and any extra data contained in this sub-TLV MUST be | described above), and any extra data contained in this sub-TLV <bcp14>MUST</bcp1 | |||
| 4> be | ||||
| silently ignored. If the Length field is smaller than the expected | silently ignored. If the Length field is smaller than the expected | |||
| 8 octets, then this sub-TLV MUST be ignored (and the remainder of the | 8 octets, then this sub-TLV <bcp14>MUST</bcp14> be ignored (and the remainder of the | |||
| enclosing TLV processed as usual).</t> | enclosing TLV processed as usual).</t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section title="IANA Considerations"> | <section title="IANA Considerations"> | |||
| <t>IANA has added the following entry to the "Babel Sub-TLV Types" | <t>IANA has added the following entry to the "Babel Sub-TLV Types" | |||
| registry:</t> | registry:</t> | |||
| <table align="center"> | <table align="center"> | |||
| <thead> | <thead> | |||
| <tr><th>Type</th><th>Name</th><th>Reference</th></tr> | <tr><th>Type</th><th>Name</th><th>Reference</th></tr> | |||
| </thead> | </thead> | |||
| <tbody> | <tbody> | |||
| <tr><td>3</td><td>Timestamp</td><td>(this document)</td></tr> | <tr><td>3</td><td>Timestamp</td><td>RFC 9616</td></tr> | |||
| </tbody> | </tbody> | |||
| </table> | </table> | |||
| </section> | </section> | |||
| <section title="Security Considerations"> | <section title="Security Considerations"> | |||
| <t>This extension adds additional timestamping data to two of the TLVs | <t>This extension adds timestamping data to two of the TLVs sent by | |||
| sent by a Babel router. By broadcasting the value of a reasonably | a Babel router. By broadcasting the value of a reasonably accurate | |||
| accurate local clock, they might make a node more susceptible to timing | local clock, these additional data might make a node more susceptible | |||
| attacks.</t> | to timing attacks.</t> | |||
| <t>Broadcasting an accurate time raises privacy issues. The timestamps | <t>Broadcasting an accurate time raises privacy issues. The timestamps | |||
| used by this protocol have an arbitrary origin, and therefore do not leak | used by this protocol have an arbitrary origin; therefore, they do not leak | |||
| a node's boot time or timezone. However, having access to accurate | a node's boot time or time zone. However, having access to accurate | |||
| timestamps could allow an attacker to determine the physical location of | timestamps could allow an attacker to determine the physical location of | |||
| a node. Nodes might avoid disclosure of location information by not | a node. Nodes might avoid disclosure of location information by not | |||
| including timestamp sub-TLVs in the TLVs that they send, which will cause | including Timestamp sub-TLVs in the TLVs that they send, which will cause | |||
| their neighbours to fall back to hop-count routing.</t> | their neighbours to fall back to hop-count routing.</t> | |||
| </section> | </section> | |||
| <section title="Acknowledgements"> | ||||
| <t>The authors are indebted to Jean-Paul Smets, who prompted the | ||||
| investigation that originally lead to this protocol. We are also grateful | ||||
| to Donald Eastlake, Toke Høiland-Jørgensen, Maria Matejka, David Schinazi, | ||||
| Pacal Thubert, Steffen Vogel, and Ondřej Zajiček.</t> | ||||
| </section> | ||||
| </middle> | </middle> | |||
| <back> | <back> | |||
| <references><name>References</name> | <references><name>References</name> | |||
| <references><name>Normative References</name> | <references><name>Normative References</name> | |||
| <reference anchor="RFC8966" target="https://www.rfc-editor.org/info/rfc8966"> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml" | |||
| <front> | /> | |||
| <title>The Babel Routing Protocol</title> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml" | |||
| <author initials="J." surname="Chroboczek" fullname="J. Chroboczek"/> | /> | |||
| <author initials="D." surname="Schinazi" fullname="D. Schinazi"/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8966.xml" | |||
| <date year="2021" month="January"/> | /> | |||
| </front> | ||||
| <seriesInfo name="RFC" value="8966"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8966"/> | ||||
| </reference> | ||||
| <reference anchor="RFC2119"><front> | ||||
| <title>Key words for use in RFCs to Indicate Requirement Levels</title> | ||||
| <author initials="S." surname="Bradner" fullname="S. Bradner"/> | ||||
| <date year="1997" month="March"/> | ||||
| </front> | ||||
| <seriesInfo name="BCP" value="14"/> | ||||
| <seriesInfo name="RFC" value="2119"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC2119"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8174"><front> | ||||
| <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title> | ||||
| <author initials="B." surname="Leiba" fullname="B. Leiba"/> | ||||
| <date year="2017" month="May"/> | ||||
| </front> | ||||
| <seriesInfo name="BCP" value="14"/> | ||||
| <seriesInfo name="RFC" value="8174"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8174"/> | ||||
| </reference> | ||||
| </references> | </references> | |||
| <references><name>Informative References</name> | <references><name>Informative References</name> | |||
| <reference anchor="DELAY-BASED"><front> | <reference anchor="DELAY-BASED" target="http://arxiv.org/abs/1403.3488"> | |||
| <title>A delay-based routing metric</title> | <front> | |||
| <author fullname="Baptiste Jonglez" initials="B." surname="Jonglez"/> | <title>A delay-based routing metric</title> | |||
| <author fullname="Juliusz Chroboczek" initials="J." surname="Chroboczek"/> | <author fullname="Baptiste Jonglez" initials="B." surname="Jonglez"/> | |||
| <date month="March" year="2014"/> | <author fullname="M. Boutier" initials="M." surname="Boutier"/> | |||
| </front> | <author fullname="Juliusz Chroboczek" initials="J." surname="Chroboczek"/> | |||
| <annotation>Available online from http://arxiv.org/abs/1403.3488</annotation> | <date month="March" year="2014"/> | |||
| </reference> | </front> | |||
| <seriesInfo name="DOI" value="10.48550/arXiv.1403.3488"/> | ||||
| <reference anchor="MILLS"><front> | ||||
| <title>DCN Local-Network Protocols</title> | ||||
| <author fullname="David L. Mills" initials="D. L." surname="Mills"/> | ||||
| <date month="December" year="1983"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="891"/> | ||||
| </reference> | </reference> | |||
| <reference anchor="NTP"><front> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.891.xml"/ | |||
| <title>Network Time Protocol Version 4: Protocol and Algorithms Specification</t | > | |||
| itle> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5905.xml" | |||
| <author initials='D.' surname='Mills' fullname='D. Mills'/> | /> | |||
| <author initials='J.' surname='Martin' fullname='J. Martin'/> | ||||
| <author initials='J.' surname='Burbank' fullname='J. Burbank'/> | ||||
| <author initials='W.' surname='Kasch' fullname='W. Kasch'/> | ||||
| <date year='2010' month='June' /> | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='5905' /> | ||||
| </reference> | ||||
| </references> | </references> | |||
| </references> | </references> | |||
| <section title="Acknowledgements" numbered="false"> | ||||
| <t>The authors are indebted to <contact fullname="Jean-Paul Smets"/>, who prompt | ||||
| ed the | ||||
| investigation that originally lead to this protocol. We are also grateful | ||||
| to <contact fullname="Donald Eastlake, 3rd"/>, <contact fullname="Toke Høiland-J | ||||
| ørgensen"/>, <contact fullname="Maria Matejka"/>, <contact fullname="David Schin | ||||
| azi"/>, | ||||
| <contact fullname="Pascal Thubert"/>, <contact fullname="Steffen Vogel"/>, and < | ||||
| contact fullname="Ondřej Zajiček"/>.</t> | ||||
| </section> | ||||
| </back> | </back> | |||
| </rfc> | </rfc> | |||
| End of changes. 113 change blocks. | ||||
| 219 lines changed or deleted | 209 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. | ||||