rfc9187xml2.original.xml | rfc9187.xml | |||
---|---|---|---|---|
<?xml version='1.0' encoding='utf-8'?> | <?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [ | <!DOCTYPE rfc [ | |||
<!ENTITY RFC793 SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | <!ENTITY nbsp " "> | |||
.0793.xml"> | <!ENTITY zwsp "​"> | |||
<!ENTITY RFC1034 SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | <!ENTITY nbhy "‑"> | |||
C.1034.xml"> | <!ENTITY wj "⁠"> | |||
<!ENTITY RFC1035 SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
C.1035.xml"> | ||||
<!ENTITY RFC1982 SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
C.1982.xml"> | ||||
<!ENTITY RFC5925 SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
C.5925.xml"> | ||||
<!ENTITY RFC7323 SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | ||||
C.7323.xml"> | ||||
]> | ]> | |||
<rfc submissionType="IETF" docName="draft-touch-sne-02" category="info" ipr="tru | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" docName="draft-touch-sne-02" num | |||
st200902"> | ber="9187" submissionType="independent" category="info" ipr="trust200902" obsole | |||
<!-- Generated by id2xml 1.5.0 on 2021-12-09T00:38:40Z --> | tes="" updates="" xml:lang="en" symRefs="true" sortRefs="true" tocInclude="true" | |||
<?rfc strict="yes"?> | version="3"> | |||
<?rfc compact="yes"?> | ||||
<?rfc subcompact="no"?> | ||||
<?rfc symrefs="yes"?> | ||||
<?rfc sortrefs="no"?> | ||||
<?rfc text-list-symbols="o*+-"?> | ||||
<?rfc toc="yes"?> | ||||
<front> | ||||
<title abbrev="Sequence Number Extension">Sequence Number Extension for W | ||||
indowed Protocols</title> | ||||
<author initials="J." surname="Touch" fullname="Joe Touch"> | ||||
<organization abbrev="Independent consultant"></organization> | ||||
<address> | ||||
<postal> | ||||
<street></street> | ||||
<city>Manhattan Beach</city> | ||||
<region>CA</region> | ||||
<code>90266</code> | ||||
<country>USA</country> | ||||
</postal> | ||||
<phone>+1 (310) 560-0334</phone> | ||||
<email>touch@strayalpha.com</email> | ||||
</address> | ||||
</author> | ||||
<date year="2021" month="December"/> | ||||
<workgroup>ISE Stream</workgroup> | ||||
<!-- [rfced] Please insert any keywords (beyond those that appear in the title) | ||||
for use on https://www.rfc-editor.org/search. --> | ||||
<keyword>example</keyword> | ||||
<abstract><t> | <!-- xml2rfc v2v3 conversion 3.12.0 --> | |||
<!-- Generated by id2xml 1.5.0 on 2021-12-09T00:38:40Z --> | ||||
<front> | ||||
<title abbrev="Sequence Number Extension">Sequence Number Extension for Wind | ||||
owed Protocols</title> | ||||
<seriesInfo name="RFC" value="9187"/> | ||||
<author initials="J." surname="Touch" fullname="Joe Touch"> | ||||
<organization abbrev="Independent Consultant"/> | ||||
<address> | ||||
<postal> | ||||
<street/> | ||||
<city>Manhattan Beach</city> | ||||
<region>CA</region> | ||||
<code>90266</code> | ||||
<country>United States of America</country> | ||||
</postal> | ||||
<phone>+1 (310) 560-0334</phone> | ||||
<email>touch@strayalpha.com</email> | ||||
</address> | ||||
</author> | ||||
<date year="2022" month="January"/> | ||||
<workgroup>ISE Stream</workgroup> | ||||
<keyword>TCP-AO</keyword> | ||||
<keyword>TCP</keyword> | ||||
<abstract> | ||||
<t> | ||||
Sliding window protocols use finite sequence numbers to determine | Sliding window protocols use finite sequence numbers to determine | |||
segment placement and order. These sequence number spaces wrap | segment placement and order. These sequence number spaces wrap | |||
around and are reused during the operation of such protocols. This | around and are reused during the operation of such protocols. This | |||
document describes a way to extend the size of these sequence | document describes a way to extend the size of these sequence | |||
numbers at the endpoints to avoid the impact of that wrap and reuse | numbers at the endpoints to avoid the impact of that wrap and reuse | |||
without transmitting additional information in the packet header. | without transmitting additional information in the packet header. | |||
The resulting extended sequence numbers can be used at the endpoints | The resulting extended sequence numbers can be used at the endpoints | |||
in encryption and authentication algorithms to ensure input bit | in encryption and authentication algorithms to ensure input bit | |||
patterns do not repeat over the lifetime of a connection.</t> | patterns do not repeat over the lifetime of a connection.</t> | |||
</abstract> | ||||
</abstract> | </front> | |||
</front> | <middle> | |||
<section anchor="sect-1" numbered="true" toc="default"> | ||||
<middle> | <name>Introduction</name> | |||
<section title="Introduction" anchor="sect-1"><t> | <t> | |||
Protocols use sequence numbers to maintain ordering and, in sliding | Protocols use sequence numbers to maintain ordering and, in sliding | |||
window systems, to control the amount of outstanding unacknowledged | window systems, to control the amount of outstanding unacknowledged | |||
information. These sequence numbers are finite and thus commonly | information. These sequence numbers are finite and thus commonly | |||
wrap-around during long connections, reusing past values.</t> | wrap around during long connections, reusing past values.</t> | |||
<t> | ||||
<t> | It can be useful for protocols to keep track of this wrap around in | |||
It can be useful for protocols to keep track of this wrap-around in | ||||
a separate counter, such that the sequence number and counter | a separate counter, such that the sequence number and counter | |||
together form an equivalent number space that need not wrap. This | together form an equivalent number space that need not wrap. This | |||
technique was introduced as "sequence number extension" in TCP-AO | technique was introduced as "Sequence Number Extension" in the TCP Authentica | |||
<xref target="RFC5925"/>. The example provided there was intended to introduc | tion Option (TCP-AO) | |||
e the | <xref target="RFC5925" format="default"/>. The example provided there was int | |||
ended to introduce the | ||||
concept, but the pseudocode provided is not complete.</t> | concept, but the pseudocode provided is not complete.</t> | |||
<t> | ||||
<t> | This document presents the formal requirements for Sequence Number | |||
This document presents the formal requirements for sequence number | Extension (SNE), a code example, and a check sequence that can be | |||
extension (SNE), a code example, and a check sequence that can be | ||||
used to validate this and alternate implementations. Sequence | used to validate this and alternate implementations. Sequence | |||
numbers are used in a variety of protocols to support loss | numbers are used in a variety of protocols to support loss | |||
detection, reordering, flow control, and congestion control. | detection, reordering, flow control, and congestion control. | |||
Limitations in the size of a sequence number protocol field can | Limitations in the size of a sequence number protocol field can | |||
limit the ways in which these capabilities can be supported.</t> | limit the ways in which these capabilities can be supported.</t> | |||
<t> | ||||
<t> | ||||
Under certain conditions, it is possible for both endpoints of a | Under certain conditions, it is possible for both endpoints of a | |||
protocol to keep track of sequence number rollover and effectively | protocol to keep track of sequence number rollover and effectively | |||
extend the sequence number space without requiring modification of | extend the sequence number space without requiring modification of | |||
the sequence number field used within protocol messages. These | the sequence number field used within protocol messages. These | |||
conditions assume that the received sequence numbers never vary by | conditions assume that the received sequence numbers never vary by | |||
more than half the size of the space of the field used in messages, | more than half the size of the space of the field used in messages, | |||
i.e., they never hop forward or backward by more than half that | i.e., they never hop forward or backward by more than half that | |||
space. This constraint is typical in sliding window protocols, such | space. This constraint is typical in sliding window protocols, such | |||
as TCP. However, although both ends can track rollover | as TCP. However, although both ends can track rollover | |||
unambiguously, doing so can be surprizingly complex. This document | unambiguously, doing so can be surprisingly complex. This document | |||
provides examples and test cases to simplify that process.</t> | provides examples and test cases to simplify that process.</t> | |||
<t> | ||||
<t> | ||||
This document is intended for protocol designers who seek to use | This document is intended for protocol designers who seek to use | |||
larger sequence numbers at the endpoints without needing to extend | larger sequence numbers at the endpoints without needing to extend | |||
the sequence number field used in messages, such as for | the sequence number field used in messages, such as for | |||
authentication protocols, e.g., TCP-AO <xref target="RFC5925"/>. Use of exten | authentication protocols, e.g., TCP-AO <xref target="RFC5925" format="default | |||
ded | "/>. Use of extended | |||
sequence numbers should be part of a protocol specification, so that | sequence numbers should be part of a protocol specification so that | |||
both endpoints can ensure they comply with the requirements needed | both endpoints can ensure they comply with the requirements needed | |||
to enable their use in both locations.</t> | to enable their use in both locations.</t> | |||
<t> | ||||
<t> | The remainder of this document describes how SNE can be supported and pro | |||
The remainder of this document describes how sequence number | vides the | |||
extension can be supported and provides the pseudocode to | pseudocode to | |||
demonstrate how received messages can unambiguously determine the | demonstrate how received messages can unambiguously determine the | |||
appropriate extension value, as long as the reordering is | appropriate extension value, as long as the reordering is | |||
constrained. <xref target="sect-2"/> provides background on the concept, <xr ef target="sect-3"/> discusses currently known uses of SNE. <xref target="sect-4 "/> discusses how SNE | constrained. <xref target="sect-2" format="default"/> provides background on the concept. <xref target="sect-3" format="default"/> discusses currently known uses of SNE. <xref target="sect-4" format="default"/> discusses how SNE | |||
is used in protocol design and how it differs from in-band use of | is used in protocol design and how it differs from in-band use of | |||
sequence numbers. <xref target="sect-5"/> provides a framework for testing SN E | sequence numbers. <xref target="sect-5" format="default"/> provides a framewo rk for testing SNE | |||
implementations, including example code for the SNE function, and | implementations, including example code for the SNE function, and | |||
<xref target="sect-6"/> provides a sequence that can be used by that code for | <xref target="sect-6" format="default"/> provides a sequence that can be used | |||
validation. <xref target="sect-7"/> concludes with a discussion of security | by that code for | |||
validation. <xref target="sect-7" format="default"/> concludes with a discuss | ||||
ion of security | ||||
issues.</t> | issues.</t> | |||
</section> | ||||
</section> | <section anchor="sect-2" numbered="true" toc="default"> | |||
<name>Background</name> | ||||
<section title="Background" anchor="sect-2"><t> | <t> | |||
Protocols use sequence numbers to maintain message order. The | Protocols use sequence numbers to maintain message order. The | |||
transmitter typically increments them either once per message or by | transmitter typically increments them either once per message or by | |||
the length of the message. The receiver uses them to reorder | the length of the message. The receiver uses them to reorder | |||
messages and detect gaps due to inferred loss.</t> | messages and detect gaps due to inferred loss.</t> | |||
<t> | ||||
<t> | ||||
Sequence numbers are represented within those messages (e.g., in the | Sequence numbers are represented within those messages (e.g., in the | |||
headers) as values of a finite, unsigned number space. This space is | headers) as values of a finite, unsigned number space. This space is | |||
typically represented in a fixed-length bit string, whose values | typically represented in a fixed-length bit string, whose values | |||
range from [0..(2^N)-1], inclusive.</t> | range from 0..(2<sup>N</sup>)-1, inclusive.</t> | |||
<t> | ||||
<t> | ||||
The use of finite representations has repercussions on the use of | The use of finite representations has repercussions on the use of | |||
these values at both the transmitter and receiver. Without | these values at both the transmitter and receiver. Without | |||
additional constraints, when the number space "wraps around", it | additional constraints, when the number space "wraps around", it | |||
would be impossible for the receiver to distinguish between the uses | would be impossible for the receiver to distinguish between the uses | |||
of the same value.</t> | of the same value.</t> | |||
<t> | ||||
<t> | ||||
As a consequence, additional constraints are required. Transmitters | As a consequence, additional constraints are required. Transmitters | |||
are typically required to limit reuse until they can assume that | are typically required to limit reuse until they can assume that | |||
receivers would successfully differentiate the two uses of the same | receivers would successfully differentiate the two uses of the same | |||
value. The receiver always interprets values it sees based on the | value. The receiver always interprets values it sees based on the | |||
assumption that successive values never differ by just under half | assumption that successive values never differ by just under half | |||
the number space. A receiver cannot detect an error in that | the number space. A receiver cannot detect an error in that | |||
sequence, but it will incorrectly interpret numbers if reordering | sequence, but it will incorrectly interpret numbers if reordering | |||
violates this constraint.</t> | violates this constraint.</t> | |||
<t> | ||||
<t> | ||||
The constraint requires that "forward" values advance the values by | The constraint requires that "forward" values advance the values by | |||
less than half the sequence number space and ensuring that receivers | less than half the sequence number space, ensuring that receivers | |||
never experience a series of values that violate that rule.</t> | never experience a series of values that violate that rule.</t> | |||
<t> | ||||
<t> | ||||
We define a sequence space as follows:</t> | We define a sequence space as follows:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"><t>An unsigned integer range from 0..(2^N)-1, i. | <li>An unsigned integer within the range of 0..(2<sup>N</sup>)-1, i.e., | |||
e., for N bits</t> | for N bits.</li> | |||
<li>An operation that increments values in that space by K, where K < | ||||
<t>An operation that increments values in that space by K, where K < 2 | 2<sup>(N-1)</sup>, i.e., less than half the range. This operation is used exclu | |||
^(N-1), i.e., less than half the range. This operation is used exclusively by th | sively by the transmitter.</li> | |||
e transmitter.</t> | <li>An operation that compares two values in that space to determine | |||
their order, e.g., where X < Y implies that X comes before Y.< | ||||
<t>An operation that compares two values in that space to determine | /li> | |||
their order, e.g., where X < Y implies that X comes before Y</t> | </ul> | |||
<t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
We assume that both sides begin with the same initial value, which can be | We assume that both sides begin with the same initial value, which can be | |||
anywhere in the space. That value is either assumed (e.g., 0) before the | anywhere in the space. That value is either assumed (e.g., 0) before the | |||
protocol begins, or coordinated before other messages are exchanged (as | protocol begins or coordinated before other messages are exchanged (as | |||
with TCP Initial Sequence Numbers, i.e., ISNs <xref | with TCP Initial Sequence Numbers (ISNs) <xref target="RFC0793" format="defau | |||
target="RFC0793"/>). The receiver is assumed to always receive values that | lt"/>). It is assumed that the receiver always receives values that | |||
are always within (2^N)-1 but that successive received values never jump | are always within (2<sup>N</sup>)-1, but the successive received values never | |||
forward or backward by more than 2^(N-1)-1, i.e., just under half the | jump | |||
forward or backward by more than 2<sup>(N-1)</sup>-1, i.e., just under half t | ||||
he | ||||
range.</t> | range.</t> | |||
<t> | ||||
<t> | ||||
No other operations are supported. The transmitter is not permitted | No other operations are supported. The transmitter is not permitted | |||
to "backup", such that values are always used in "increment" order. | to "backup", such that values are always used in "increment" order. | |||
The receiver cannot experience loss or gaps larger than 2^(N-1)-1, | The receiver cannot experience loss or gaps larger than 2<sup>(N-1)</sup>-1, | |||
which is typically enforced either by assumption or by explicit | which is typically enforced either by assumption or by explicit | |||
endpoint coordination.</t> | endpoint coordination.</t> | |||
<t> | ||||
<t> | An SNE is a separate number space that | |||
A sequence number extension (SNE) is a separate number space that | ||||
can be combined with the sequence number to create a larger number | can be combined with the sequence number to create a larger number | |||
space that need not wrap around during a connection.</t> | space that need not wrap around during a connection.</t> | |||
<t> | ||||
<t> | ||||
On the transmit side, SNE is trivially accomplished by incrementing a local | On the transmit side, SNE is trivially accomplished by incrementing a local | |||
counter once each time the sequence number increment "wraps" around, or by | counter once each time the sequence number increment "wraps" around or by | |||
keeping a larger local sequence number whose least-significant part is the | keeping a larger local sequence number whose least-significant part is the | |||
message sequence number and most-significant part can be considered the | message sequence number and most-significant part can be considered the | |||
SNE. The transmitter typically does not need to maintain an SNE except when | SNE. The transmitter typically does not need to maintain an SNE except when | |||
used in local computations, such as for MACs in TCP-AO <xref target="RFC5925" | used in local computations, such as for Message Authentication Codes (MACs) i | |||
/>.</t> | n TCP-AO <xref target="RFC5925" format="default"/>.</t> | |||
<t> | ||||
<t> | ||||
The goal of this document is to demonstrate that SNE can be | The goal of this document is to demonstrate that SNE can be | |||
accomplished on the receiver side without transmitting additional | accomplished on the receiver side without transmitting additional | |||
information in messages. It defines the stateful function | information in messages. It defines the stateful function | |||
compute_sne() as follows:</t> | compute_sne() as follows:</t> | |||
<t indent="6">SNE = compute_sne(seqno)</t> | ||||
<figure><artwork><![CDATA[ | <t>The compute_sne() function accepts the sequence number seen in a | |||
SNE = compute_sne(seqno) | received message | |||
]]></artwork> | ||||
</figure> | ||||
<t> | ||||
Compute_sne() accepts the sequence number seen in a received message | ||||
and computes the corresponding SNE. The function includes persistent | and computes the corresponding SNE. The function includes persistent | |||
local state that tracks the largest currently received SNE, seqno | local state that tracks the largest currently received SNE and seqno | |||
combination. The concatenation of SNE and seqno emulates the | combination. The concatenation of SNE and seqno emulates the | |||
equivalent larger sequence number space that can avoid wrap around.</t> | equivalent larger sequence number space that can avoid wrap around.</t> | |||
<t> | ||||
<t> | ||||
Note that the function defined here is capable of receiving any | Note that the function defined here is capable of receiving any | |||
series of seqno values and computing their correct corresponding | series of seqno values and computing their correct corresponding | |||
SNE, as long as the series never "jumps" more than half the number | SNE, as long as the series never "jumps" more than half the number | |||
space "backward" from the largest value seen "forward".</t> | space "backward" from the largest value seen "forward".</t> | |||
</section> | ||||
</section> | <section anchor="sect-3" numbered="true" toc="default"> | |||
<name>Related Discussion</name> | ||||
<section title="Related Discussion" anchor="sect-3"><t> | <t> | |||
The DNS uses sequence numbers to determine when a Start of Authority | The DNS uses sequence numbers to determine when a Start of Authority | |||
(SOA) serial number is more recent than a previous one, even | (SOA) serial number is more recent than a previous one, even | |||
considering sequence space wrap <xref target="RFC1034"/><xref target="RFC1035 "/>. The use of | considering sequence space wrap <xref target="RFC1034" format="default"/><xre f target="RFC1035" format="default"/>. The use of | |||
wrapped sequence numbers for sliding windows in network protocols | wrapped sequence numbers for sliding windows in network protocols | |||
was first described as a sequence number space <xref target="IEN74"/>.</t> | was first described as a sequence number space <xref target="IEN74" format="d | |||
efault"/>.</t> | ||||
<t> | <t> | |||
A more recent discussion describes this as "serial number arithmetic" and def ines a comparison operator it claimed was missing | A more recent discussion describes this as "serial number arithmetic" and def ines a comparison operator it claimed was missing | |||
in IEN74 <xref target="RFC1982"/>. That document defines two operations: addi tion | in IEN-74 <xref target="RFC1982" format="default"/>. That document defines tw o operations: addition | |||
(presumably shifting the window forward) and comparison (defining | (presumably shifting the window forward) and comparison (defining | |||
the order of two values). Addition is defined in that document as | the order of two values). Addition is defined in that document as | |||
limited to value of 0..windowsize/2-1. Comparison is defined in that | limited to values within the range of 0..windowsize/2-1. Comparison is | |||
defined in that | ||||
document by a set of equations therein, but that document does not | document by a set of equations therein, but that document does not | |||
provide a way for a receiver to compute the correct equivalent SNE, | provide a way for a receiver to compute the correct equivalent SNE, | |||
especially including the potential for sequence number reordering, | especially including the potential for sequence number reordering, | |||
as is demonstrated in this document.</t> | as is demonstrated in this document.</t> | |||
</section> | ||||
</section> | <section anchor="sect-4" numbered="true" toc="default"> | |||
<name>Using SNE in Protocol Design</name> | ||||
<section title="Using SNE in Protocol Design" anchor="sect-4"><t> | <t> | |||
As noted in the introduction, message sequence numbers enable | As noted in the introduction, message sequence numbers enable | |||
reordering, loss detection, flow control, and congestion control. | reordering, loss detection, flow control, and congestion control. | |||
They are also used to differentiate otherwise potentially identical | They are also used to differentiate otherwise potentially identical | |||
messages that might repeat as part of a sequence or stream.</t> | messages that might repeat as part of a sequence or stream.</t> | |||
<t> | ||||
<t> | The size of the sequence number field used within transferred messages | |||
The size of sequence number field used within transferred messages | ||||
defines the ability of a protocol to tolerate reordering and gaps, | defines the ability of a protocol to tolerate reordering and gaps, | |||
notably limited to half the space of that field. E.g., a field of 8 | notably limited to half the space of that field. For example, a field of 8 | |||
bits can reorder and detect losses of smaller than 2^7, i.e., 127 | bits can reorder and detect losses of smaller than 2<sup>7</sup>, i.e., 127 | |||
messages. When used for these purposes - reordering, loss detection, | messages. When used for these purposes -- reordering, loss detection, | |||
flow control, and congestion control - the size of the field defines | flow control, and congestion control -- the size of the field defines | |||
the limits of those capabilities.</t> | the limits of those capabilities.</t> | |||
<t> | ||||
<t> | ||||
Sequence numbers are also used to differentiate messages; when used | Sequence numbers are also used to differentiate messages; when used | |||
this way, they can be problematic if they repeat for otherwise | this way, they can be problematic if they repeat for otherwise | |||
identical messages. Protocols using sequence numbers tolerate that | identical messages. Protocols using sequence numbers tolerate that | |||
repetition because they are aware of the rollover of these sequence | repetition because they are aware of the rollover of these sequence | |||
number spaces at both endpoints. In some cases, it can be useful to | number spaces at both endpoints. In some cases, it can be useful to | |||
track this rollover and use the rollover count as an extension to | track this rollover and use the rollover count as an extension to | |||
the sequence number, e.g., to differentiate authentication MACs. | the sequence number, e.g., to differentiate authentication MACs. | |||
This sequence number extension (SNE) is never transmitted in | This SNE is never transmitted in | |||
messages; the existing rules of sequence number ensure both ends can | messages; the existing rules of sequence numbers ensure both ends can | |||
keep track unambiguously - both for new messages and reordered | keep track unambiguously -- both for new messages and reordered | |||
messages.</t> | messages.</t> | |||
<t> | ||||
<t> | ||||
The constraints required to use SNE have already been presented as | The constraints required to use SNE have already been presented as | |||
background in <xref target="sect-2"/>. The transmitter must never send messag es | background in <xref target="sect-2" format="default"/>. The transmitter must never send messages | |||
out of sequence beyond half the range of the sequence number field | out of sequence beyond half the range of the sequence number field | |||
used in messages. A receiver uses this assumption to interpret | used in messages. A receiver uses this assumption to interpret | |||
whether received numbers are part of pre-wrap sequences or post-wrap | whether received numbers are part of pre-wrap sequences or post-wrap | |||
sequences. Note that a receiver cannot enforce or detect if the | sequences. Note that a receiver cannot enforce or detect if the | |||
transmitter has violated these assumptions on its own; it relies on | transmitter has violated these assumptions on its own; it relies on | |||
explicit coordination to ensure this property is maintained, such as | explicit coordination to ensure this property is maintained, such as | |||
the exchange of acknowledgements.</t> | the exchange of acknowledgements.</t> | |||
<t> | ||||
<t> | SNEs are intended for use when it is helpful for both ends to | |||
SNE are intended for use when it is helpful for both ends to | ||||
unambiguously determine whether the sequence number in a message has | unambiguously determine whether the sequence number in a message has | |||
wrapped, and whether a received message is pre-wrap or post-wrap for | wrapped and whether a received message is pre-wrap or post-wrap for | |||
each such wrap. This can be used by both endpoints to ensure all | each such wrap. This can be used by both endpoints to ensure all | |||
messages of arbitrarily long sequences can be differentiated, e.g., | messages of arbitrarily long sequences can be differentiated, e.g., | |||
ensuring unique message authentication codes (MACs).</t> | ensuring unique MACs.</t> | |||
<t> | ||||
<t> | SNE does not extend the actual sequence space of a protocol or | |||
SNE does not extend the actual sequence space of a protocol, or | ||||
(thus) its tolerance to reordering or gaps. It also cannot improve | (thus) its tolerance to reordering or gaps. It also cannot improve | |||
its dynamic range for flow control or congestion control, although | its dynamic range for flow control or congestion control, although | |||
there are other somewhat related methods that can, such as window | there are other somewhat related methods that can, such as window | |||
scaling <xref target="RFC7323"/> (which increases range at the expense of | scaling <xref target="RFC7323" format="default"/> (which increases range at t he expense of | |||
granularity).</t> | granularity).</t> | |||
<t> | ||||
<t> | ||||
SNE is not needed if messages are already unique over the entirety | SNE is not needed if messages are already unique over the entirety | |||
of a transfer sequence, e.g., either because the sequence number | of a transfer sequence, e.g., either because the sequence number | |||
field used in its messages never wraparound or because other fields | field used in its messages never wrap around or because other fields | |||
provide that disambiguation, such as timestamps.</t> | provide that disambiguation, such as timestamps.</t> | |||
</section> | ||||
</section> | <section anchor="sect-5" numbered="true" toc="default"> | |||
<name>Example Code</name> | ||||
<section title="Example Code" anchor="sect-5"><t> | <t> | |||
The following C code is provided as a verified example of sequence | The following C code is provided as a verified example of SNE | |||
number extension from 16 to 32 bits. The code includes both the | from 16 to 32 bits. The code includes both the | |||
framework used for validation and the compute_sne() function, the | framework used for validation and the compute_sne() function, the | |||
latter of which can be used operationally.</t> | latter of which can be used operationally.</t> | |||
<t> | ||||
<t> | ||||
A correct test will indicate "OK" for each test. An incorrect test | A correct test will indicate "OK" for each test. An incorrect test | |||
will indicate "ERROR" where applicable.</t> | will indicate "ERROR" where applicable.</t> | |||
<sourcecode name="compute_sne.c" type="c" markers="true"><![CDATA[ | ||||
<figure><artwork><![CDATA[ | ||||
<CODE BEGINS> | ||||
#include <stdio.h> | #include <stdio.h> | |||
#include <sys/param.h> | #include <sys/param.h> | |||
#define distance(x,y) (((x)<(y))?((y)-(x)):((x)-(y))) | #define distance(x,y) (((x)<(y))?((y)-(x)):((x)-(y))) | |||
#define SNEDEBUG 1 | #define SNEDEBUG 1 | |||
// This is the core code, stand-alone, to compute SNE from seqno | // This is the core code, stand-alone, to compute SNE from seqno | |||
// >> replace this function with your own code to test alternates | // >> replace this function with your own code to test alternates | |||
unsigned long compute_sne(unsigned long seqno) { | unsigned long compute_sne(unsigned long seqno) { | |||
skipping to change at line 392 ¶ | skipping to change at line 349 ¶ | |||
// to received SEQ | // to received SEQ | |||
// variables used to validate the computed SNE: | // variables used to validate the computed SNE: | |||
unsigned long SEG_HIGH; // input - xmitter side SNE | unsigned long SEG_HIGH; // input - xmitter side SNE | |||
// -> SNE should match this value | // -> SNE should match this value | |||
unsigned long long BIG_PREV; // prev 64-bit total seqno | unsigned long long BIG_PREV; // prev 64-bit total seqno | |||
unsigned long long BIG_THIS = 0; // current 64-bit total seqno | unsigned long long BIG_THIS = 0; // current 64-bit total seqno | |||
// -> THIS, PREV should never jump | // -> THIS, PREV should never jump | |||
// more than half the SEQ space | // more than half the SEQ space | |||
char *prompt = "Hex input (2 groups of 8 hex chars with a | char *prompt = "Input hex numbers only (0x is optional)\n\n") | |||
space): "; | "\tHex input\n" | |||
"\t(2 hex numbers separated by whitespace," | ||||
fprintf(stderr,"Input hex numbers only (0x is optional)\n\n"); | "each with 8 or fewer digits)"; | |||
fprintf(stderr,"%s\n",prompt); | fprintf(stderr,"%s\n",prompt); | |||
while (scanf("%lx %lx",&SEG_HIGH,&SEG_SEQ) == 2) { | while (scanf("%lx %lx",&SEG_HIGH,&SEG_SEQ) == 2) { | |||
BIG_PREV = BIG_THIS; | BIG_PREV = BIG_THIS; | |||
BIG_THIS = (((unsigned long long)SEG_HIGH) << 32) | BIG_THIS = (((unsigned long long)SEG_HIGH) << 32) | |||
| ((unsigned long long)SEG_SEQ); | | ((unsigned long long)SEG_SEQ); | |||
// given SEG_SEQ, compute SNE | // given SEG_SEQ, compute SNE | |||
SNE = compute_sne(SEG_SEQ); | SNE = compute_sne(SEG_SEQ); | |||
skipping to change at line 423 ¶ | skipping to change at line 380 ¶ | |||
((BIG_PREV < BIG_THIS)?"+":"-"), | ((BIG_PREV < BIG_THIS)?"+":"-"), | |||
(((distance(BIG_PREV,BIG_THIS)) > 0x7FFFFFFF) | (((distance(BIG_PREV,BIG_THIS)) > 0x7FFFFFFF) | |||
? "ILLEGAL JUMP" : ".")); | ? "ILLEGAL JUMP" : ".")); | |||
fprintf(stderr,"\n"); | fprintf(stderr,"\n"); | |||
fprintf(stderr,"\n"); | fprintf(stderr,"\n"); | |||
fprintf(stderr,"%s\n",prompt); | fprintf(stderr,"%s\n",prompt); | |||
} | } | |||
} | } | |||
<CODE ENDS> | ]]></sourcecode> | |||
]]></artwork> | </section> | |||
</figure> | <section anchor="sect-6" numbered="true" toc="default"> | |||
</section> | <name>Validation Suite</name> | |||
<t> | ||||
<section title="Validation Suite" anchor="sect-6"><t> | The following numbers are used to validate SNE | |||
The following numbers are used to validate sequence number extension | variants and are shown in the order they legitimately could be | |||
variants, and are shown in the order they legitimately could be | ||||
received. Each line represents a single 64-bit number, represented | received. Each line represents a single 64-bit number, represented | |||
as two hexadecimal 32-bit numbers with a space between. The numbers | as two hexadecimal 32-bit numbers with a space between. The numbers | |||
are formatted for use in the example code provided in <xref target="sect-5"/> | are formatted for use in the example code provided in <xref target="sect-5" f | |||
.</t> | ormat="default"/>.</t> | |||
<t> | ||||
<t> | ||||
A correctly operating extended sequence number system can receive | A correctly operating extended sequence number system can receive | |||
the least-significant half (the right side) and compute the correct | the least-significant half (the right side) and compute the correct | |||
most-significant half (the left side) correctly. It specifically | most-significant half (the left side) correctly. It specifically | |||
tests both forward and backward jumps in received values that | tests both forward and backward jumps in received values that | |||
represent legitimate reordering.</t> | represent legitimate reordering.</t> | |||
<sourcecode name="sne_testvectors.txt" type="test-vector"><![CDATA[ | ||||
<figure><artwork><![CDATA[ | ||||
00000000 00000000 | 00000000 00000000 | |||
00000000 30000000 | 00000000 30000000 | |||
00000000 90000000 | 00000000 90000000 | |||
00000000 70000000 | 00000000 70000000 | |||
00000000 a0000000 | 00000000 a0000000 | |||
00000001 00000001 | 00000001 00000001 | |||
00000000 e0000000 | 00000000 e0000000 | |||
00000001 00000000 | 00000001 00000000 | |||
00000001 7fffffff | 00000001 7fffffff | |||
00000001 00000000 | 00000001 00000000 | |||
skipping to change at line 472 ¶ | skipping to change at line 426 ¶ | |||
00000002 70000000 | 00000002 70000000 | |||
00000002 A0000000 | 00000002 A0000000 | |||
00000003 00004000 | 00000003 00004000 | |||
00000002 D0000000 | 00000002 D0000000 | |||
00000003 20000000 | 00000003 20000000 | |||
00000003 90000000 | 00000003 90000000 | |||
00000003 70000000 | 00000003 70000000 | |||
00000003 A0000000 | 00000003 A0000000 | |||
00000004 00004000 | 00000004 00004000 | |||
00000003 D0000000 | 00000003 D0000000 | |||
]]></artwork> | ]]></sourcecode> | |||
</figure> | </section> | |||
</section> | <section anchor="sect-7" numbered="true" toc="default"> | |||
<name>Security Considerations</name> | ||||
<section title="Security Considerations" anchor="sect-7"><t> | <t> | |||
Sequence numbers and their extensions can be useful in a variety of | Sequence numbers and their extensions can be useful in a variety of | |||
security contexts. Because the extension part (most significant | security contexts. Because the extension part (most-significant | |||
half) is determined by the previously exchanged sequence values | half) is determined by the previously exchanged sequence values | |||
(least significant half), the extension should not be considered as | (least-significant half), the extension should not be considered as | |||
adding entropy for the purposes of message authentication or | adding entropy for the purposes of message authentication or | |||
encryption.</t> | encryption.</t> | |||
</section> | ||||
<section anchor="sect-8" numbered="true" toc="default"> | ||||
<name>IANA Considerations</name> | ||||
<t>This document has no IANA actions.</t> | ||||
</section> | ||||
</middle> | ||||
<back> | ||||
<references> | ||||
<name>Informative References</name> | ||||
</section> | <reference anchor="IEN74"> | |||
<front> | ||||
<section title="IANA Considerations" anchor="sect-8"><t> | <title>Sequence Number Arithmetic</title> | |||
This document contains no IANA issues. This section should be | <author initials="W." surname="Plummmer" fullname="William W. Plummmer | |||
removed upon publication as an RFC.</t> | "> | |||
</section> | ||||
</middle> | ||||
<back> | ||||
<references title="Informative References"> | ||||
<reference anchor="IEN74"><front> | ||||
<title>Sequence Number Arithmetic</title> | ||||
<author initials="W." surname="Plummmer" fullname="W. Plummmer"> | ||||
</author> | </author> | |||
<date month="September" year="1978"/> | ||||
<date month="September" year="1978"/> | </front> | |||
</front> | <refcontent>IEN-74</refcontent> | |||
</reference> | ||||
<seriesInfo name="IEN" value="74"/> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | |||
</reference> | .0793.xml"/> | |||
&RFC793; | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | |||
&RFC1034; | .1034.xml"/> | |||
&RFC1035; | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | |||
&RFC1982; | .1035.xml"/> | |||
&RFC5925; | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | |||
&RFC7323; | .1982.xml"/> | |||
</references> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | |||
<section title="Acknowledgments" anchor="sect-10"><t> | .5925.xml"/> | |||
The need for this document was first noted by Juhamatti Kuusisaari | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | |||
.7323.xml"/> | ||||
</references> | ||||
<section anchor="sect-10" numbered="false" toc="default"> | ||||
<name>Acknowledgments</name> | ||||
<t> | ||||
The need for this document was first noted by <contact fullname="Juhamatti Ku | ||||
usisaari"/> | ||||
in April 2020 during discussions of the pseudocode in RFC 5925.</t> | in April 2020 during discussions of the pseudocode in RFC 5925.</t> | |||
</section> | ||||
<t> | </back> | |||
This document was prepared using 2-Word-v2.0.template.dot.</t> | </rfc> | |||
</section> | ||||
</back> | ||||
</rfc> | ||||
End of changes. 65 change blocks. | ||||
251 lines changed or deleted | 214 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/ |