| rfc9187.original | rfc9187.txt | |||
|---|---|---|---|---|
| ISE Stream J. Touch | ||||
| Internet Draft Independent consultant | ||||
| Intended status: Informational November 24, 2021 | ||||
| Expires: May 2022 | ||||
| Sequence Number Extension for Windowed Protocols | Independent Submission J. Touch | |||
| draft-touch-sne-02.txt | Request for Comments: 9187 Independent Consultant | |||
| Category: Informational January 2022 | ||||
| ISSN: 2070-1721 | ||||
| Sequence Number Extension for Windowed Protocols | ||||
| Abstract | Abstract | |||
| 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 | |||
| numbers at the endpoints to avoid the impact of that wrap and reuse | at the endpoints to avoid the impact of that wrap and reuse without | |||
| without transmitting additional information in the packet header. | transmitting additional information in the packet header. The | |||
| The resulting extended sequence numbers can be used at the endpoints | resulting extended sequence numbers can be used at the endpoints in | |||
| in encryption and authentication algorithms to ensure input bit | encryption and authentication algorithms to ensure input bit patterns | |||
| patterns do not repeat over the lifetime of a connection. | do not repeat over the lifetime of a connection. | |||
| Status of this Memo | ||||
| This document is not an Internet Standards Track specification; it | ||||
| is published for informational purposes. This is a contribution to | ||||
| the RFC Series, independently of any other RFC stream. | ||||
| This Internet-Draft is submitted in full conformance with the | ||||
| provisions of BCP 78 and BCP 79. This document may not be modified, | ||||
| and derivative works of it may not be created, except to format it | ||||
| for publication as an RFC or to translate it into languages other | ||||
| than English. | ||||
| Internet-Drafts are working documents of the Internet Engineering | Status of This Memo | |||
| Task Force (IETF), its areas, and its working groups. Note that | ||||
| other groups may also distribute working documents as Internet- | ||||
| Drafts. | ||||
| Internet-Drafts are draft documents valid for a maximum of six | This document is not an Internet Standards Track specification; it is | |||
| months and may be updated, replaced, or obsoleted by other documents | published for informational purposes. | |||
| at any time. It is inappropriate to use Internet-Drafts as | ||||
| reference material or to cite them other than as "work in progress." | ||||
| The list of current Internet-Drafts can be accessed at | This is a contribution to the RFC Series, independently of any other | |||
| http://www.ietf.org/ietf/1id-abstracts.txt | RFC stream. The RFC Editor has chosen to publish this document at | |||
| The list of Internet-Draft Shadow Directories can be accessed at | its discretion and makes no statement about its value for | |||
| http://www.ietf.org/shadow.html | implementation or deployment. Documents approved for publication by | |||
| the RFC Editor are not candidates for any level of Internet Standard; | ||||
| see Section 2 of RFC 7841. | ||||
| This Internet-Draft will expire on May 24, 2022. | Information about the current status of this document, any errata, | |||
| and how to provide feedback on it may be obtained at | ||||
| https://www.rfc-editor.org/info/rfc9187. | ||||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2022 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (http://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| carefully, as they describe your rights and restrictions with | carefully, as they describe your rights and restrictions with respect | |||
| respect to this document. Code Components extracted from this | to this document. | |||
| document must include Simplified BSD License text as described in | ||||
| Section 4.e of the Trust Legal Provisions and are provided without | ||||
| warranty as described in the Simplified BSD License. | ||||
| Table of Contents | Table of Contents | |||
| 1. Introduction...................................................2 | 1. Introduction | |||
| 2. Background.....................................................4 | 2. Background | |||
| 3. Related Discussion.............................................5 | 3. Related Discussion | |||
| 4. Using SNE in Protocol Design...................................6 | 4. Using SNE in Protocol Design | |||
| 5. Example Code...................................................7 | 5. Example Code | |||
| 6. Validation Suite..............................................10 | 6. Validation Suite | |||
| 7. Security Considerations.......................................11 | 7. Security Considerations | |||
| 8. IANA Considerations...........................................11 | 8. IANA Considerations | |||
| 9. References....................................................11 | 9. Informative References | |||
| 9.1. Normative References.....................................11 | Acknowledgments | |||
| 9.2. Informative References...................................11 | Author's Address | |||
| 10. Acknowledgments..............................................12 | ||||
| 1. Introduction | 1. Introduction | |||
| 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. | wrap around during long connections, reusing past values. | |||
| It can be useful for protocols to keep track of this wrap-around in | ||||
| a separate counter, such that the sequence number and counter | ||||
| together form an equivalent number space that need not wrap. This | ||||
| technique was introduced as "sequence number extension" in TCP-AO | ||||
| [RFC5925]. The example provided there was intended to introduce the | It can be useful for protocols to keep track of this wrap around in a | |||
| concept, but the pseudocode provided is not complete. | separate counter, such that the sequence number and counter together | |||
| form an equivalent number space that need not wrap. This technique | ||||
| was introduced as "Sequence Number Extension" in the TCP | ||||
| Authentication Option (TCP-AO) [RFC5925]. The example provided there | ||||
| was intended to introduce the concept, but the pseudocode provided is | ||||
| not complete. | ||||
| 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, | |||
| detection, reordering, flow control, and congestion control. | reordering, flow control, and congestion control. Limitations in the | |||
| Limitations in the size of a sequence number protocol field can | size of a sequence number protocol field can limit the ways in which | |||
| limit the ways in which these capabilities can be supported. | these capabilities can be supported. | |||
| 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. | provides examples and test cases to simplify that process. | |||
| 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 [RFC5925]. Use of extended | authentication protocols, e.g., TCP-AO [RFC5925]. 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 | |||
| to enable their use in both locations. | enable their use in both locations. | |||
| The remainder of this document describes how sequence number | The remainder of this document describes how SNE can be supported and | |||
| extension can be supported and provides the pseudocode to | provides the pseudocode to demonstrate how received messages can | |||
| demonstrate how received messages can unambiguously determine the | unambiguously determine the appropriate extension value, as long as | |||
| appropriate extension value, as long as the reordering is | the reordering is constrained. Section 2 provides background on the | |||
| constrained. Section 2 provides background on the concept, Section | concept. Section 3 discusses currently known uses of SNE. Section 4 | |||
| 3 discusses currently known uses of SNE. Section 4 discusses how SNE | discusses how SNE is used in protocol design and how it differs from | |||
| is used in protocol design and how it differs from in-band use of | in-band use of sequence numbers. Section 5 provides a framework for | |||
| sequence numbers. Section 5 provides a framework for testing SNE | testing SNE implementations, including example code for the SNE | |||
| implementations, including example code for the SNE function, and | function, and Section 6 provides a sequence that can be used by that | |||
| Section 6 provides a sequence that can be used by that code for | code for validation. Section 7 concludes with a discussion of | |||
| validation. Section 7 concludes with a discussion of security | security issues. | |||
| issues. | ||||
| 2. Background | 2. Background | |||
| 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. | messages and detect gaps due to inferred loss. | |||
| 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. | range from 0..(2^N)-1, inclusive. | |||
| 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. | of the same value. | |||
| 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 | |||
| the number space. A receiver cannot detect an error in that | number space. A receiver cannot detect an error in that sequence, | |||
| sequence, but it will incorrectly interpret numbers if reordering | but it will incorrectly interpret numbers if reordering violates this | |||
| violates this constraint. | constraint. | |||
| 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. | never experience a series of values that violate that rule. | |||
| We define a sequence space as follows: | We define a sequence space as follows: | |||
| o An unsigned integer range from 0..(2^N)-1, i.e., for N bits | * An unsigned integer within the range of 0..(2^N)-1, i.e., for N | |||
| bits. | ||||
| o An operation that increments values in that space by K, where K < | * An operation that increments values in that space by K, where K < | |||
| 2^(N-1), i.e., less than half the range. This operation is used | 2^(N-1), i.e., less than half the range. This operation is used | |||
| exclusively by the transmitter. | exclusively by the transmitter. | |||
| o An operation that compares two values in that space to determine | * An operation that compares two values in that space to determine | |||
| their order, e.g., where X < Y implies that X comes before Y | their order, e.g., where X < Y implies that X comes before Y. | |||
| We assume that both sides begin with the same initial value, which | 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) | can be anywhere in the space. That value is either assumed (e.g., 0) | |||
| before the protocol begins, or coordinated before other messages are | before the protocol begins or coordinated before other messages are | |||
| exchanged (as with TCP Initial Sequence Numbers, i.e., ISNs | exchanged (as with TCP Initial Sequence Numbers (ISNs) [RFC0793]). | |||
| [RFC793]). The receiver is assumed to always receive values that are | It is assumed that the receiver always receives values that are | |||
| always within (2^N)-1 but that successive received values never jump | always within (2^N)-1, but the successive received values never jump | |||
| forward or backward by more than 2^(N-1)-1, i.e., just under half | forward or backward by more than 2^(N-1)-1, i.e., just under half the | |||
| the range. | range. | |||
| 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^(N-1)-1, | |||
| which is typically enforced either by assumption or by explicit | which is typically enforced either by assumption or by explicit | |||
| endpoint coordination. | endpoint coordination. | |||
| A sequence number extension (SNE) is a separate number space that | An SNE is a separate number space that can be combined with the | |||
| can be combined with the sequence number to create a larger number | sequence number to create a larger number space that need not wrap | |||
| space that need not wrap around during a connection. | around during a connection. | |||
| On the transmit side, SNE is trivially accomplished by incrementing | On the transmit side, SNE is trivially accomplished by incrementing a | |||
| a local counter once each time the sequence number increment "wraps" | local counter once each time the sequence number increment "wraps" | |||
| around, or by keeping a larger local sequence number whose least- | around or by keeping a larger local sequence number whose least- | |||
| significant part is the message sequence number and most-significant | significant part is the message sequence number and most-significant | |||
| part can be considered the SNE. The transmitter typically does not | part can be considered the SNE. The transmitter typically does not | |||
| need to maintain an SNE except when used in local computations, such | need to maintain an SNE except when used in local computations, such | |||
| as for MACs in TCP-AO [RFC5925]. | as for Message Authentication Codes (MACs) in TCP-AO [RFC5925]. | |||
| 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: | compute_sne() as follows: | |||
| SNE = compute_sne(seqno) | SNE = compute_sne(seqno) | |||
| Compute_sne() accepts the sequence number seen in a received message | The compute_sne() function accepts the sequence number seen in a | |||
| and computes the corresponding SNE. The function includes persistent | received message and computes the corresponding SNE. The function | |||
| local state that tracks the largest currently received SNE, seqno | includes persistent local state that tracks the largest currently | |||
| combination. The concatenation of SNE and seqno emulates the | received SNE and seqno combination. The concatenation of SNE and | |||
| equivalent larger sequence number space that can avoid wrap around. | seqno emulates the equivalent larger sequence number space that can | |||
| avoid wrap around. | ||||
| 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, | |||
| SNE, as long as the series never "jumps" more than half the number | as long as the series never "jumps" more than half the number space | |||
| space "backward" from the largest value seen "forward". | "backward" from the largest value seen "forward". | |||
| 3. Related Discussion | 3. Related Discussion | |||
| 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 [RFC1034][RFC1035]. The use of | considering sequence space wrap [RFC1034][RFC1035]. The use of | |||
| wrapped sequence numbers for sliding windows in network protocols | wrapped sequence numbers for sliding windows in network protocols was | |||
| was first described as a sequence number space [IEN74]. | first described as a sequence number space [IEN74]. | |||
| A more recent discussion describes this as "serial number | A more recent discussion describes this as "serial number arithmetic" | |||
| arithmetic" and defines a comparison operator it claimed was missing | and defines a comparison operator it claimed was missing in IEN-74 | |||
| in IEN74 [RFC1982]. That document defines two operations: addition | [RFC1982]. That document defines two operations: addition | |||
| (presumably shifting the window forward) and comparison (defining | (presumably shifting the window forward) and comparison (defining the | |||
| the order of two values). Addition is defined in that document as | 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 | |||
| document by a set of equations therein, but that document does not | is defined in that document by a set of equations therein, but that | |||
| provide a way for a receiver to compute the correct equivalent SNE, | document does not provide a way for a receiver to compute the correct | |||
| especially including the potential for sequence number reordering, | equivalent SNE, especially including the potential for sequence | |||
| as is demonstrated in this document. | number reordering, as is demonstrated in this document. | |||
| 4. Using SNE in Protocol Design | 4. Using SNE in Protocol Design | |||
| 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. | messages that might repeat as part of a sequence or stream. | |||
| The size of sequence number field used within transferred messages | The size of the sequence number field used within transferred | |||
| defines the ability of a protocol to tolerate reordering and gaps, | messages defines the ability of a protocol to tolerate reordering and | |||
| notably limited to half the space of that field. E.g., a field of 8 | gaps, notably limited to half the space of that field. For example, | |||
| bits can reorder and detect losses of smaller than 2^7, i.e., 127 | a field of 8 bits can reorder and detect losses of smaller than 2^7, | |||
| messages. When used for these purposes - reordering, loss detection, | i.e., 127 messages. When used for these purposes -- reordering, loss | |||
| flow control, and congestion control - the size of the field defines | detection, flow control, and congestion control -- the size of the | |||
| the limits of those capabilities. | field defines the limits of those capabilities. | |||
| 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 | |||
| the sequence number, e.g., to differentiate authentication MACs. | sequence number, e.g., to differentiate authentication MACs. This | |||
| This sequence number extension (SNE) is never transmitted in | SNE is never transmitted in messages; the existing rules of sequence | |||
| messages; the existing rules of sequence number ensure both ends can | numbers ensure both ends can keep track unambiguously -- both for new | |||
| keep track unambiguously - both for new messages and reordered | messages and reordered messages. | |||
| messages. | ||||
| The constraints required to use SNE have already been presented as | The constraints required to use SNE have already been presented as | |||
| background in Section 2. The transmitter must never send messages | background in Section 2. 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. | the exchange of acknowledgements. | |||
| SNE are intended for use when it is helpful for both ends to | SNEs 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). | ensuring unique MACs. | |||
| 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) | |||
| (thus) its tolerance to reordering or gaps. It also cannot improve | its tolerance to reordering or gaps. It also cannot improve its | |||
| its dynamic range for flow control or congestion control, although | dynamic range for flow control or congestion control, although there | |||
| there are other somewhat related methods that can, such as window | are other somewhat related methods that can, such as window scaling | |||
| scaling [RFC7323] (which increases range at the expense of | [RFC7323] (which increases range at the expense of granularity). | |||
| granularity). | ||||
| 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 | |||
| of a transfer sequence, e.g., either because the sequence number | a transfer sequence, e.g., either because the sequence number field | |||
| field used in its messages never wraparound or because other fields | used in its messages never wrap around or because other fields | |||
| provide that disambiguation, such as timestamps. | provide that disambiguation, such as timestamps. | |||
| 5. Example Code | 5. Example Code | |||
| The following C code is provided as a verified example of sequence | The following C code is provided as a verified example of SNE from 16 | |||
| number extension from 16 to 32 bits. The code includes both the | to 32 bits. The code includes both the framework used for validation | |||
| framework used for validation and the compute_sne() function, the | and the compute_sne() function, the latter of which can be used | |||
| latter of which can be used operationally. | operationally. | |||
| 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. | will indicate "ERROR" where applicable. | |||
| <CODE BEGINS> | <CODE BEGINS> file "compute_sne.c" | |||
| #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 page 9, line 25 ¶ | skipping to change at line 368 ¶ | |||
| // 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 page 10, line 17 ¶ | skipping to change at line 401 ¶ | |||
| ? "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> | <CODE ENDS> | |||
| 6. Validation Suite | 6. Validation Suite | |||
| The following numbers are used to validate sequence number extension | The following numbers are used to validate SNE variants and are shown | |||
| variants, and are shown in the order they legitimately could be | in the order they legitimately could be received. Each line | |||
| received. Each line represents a single 64-bit number, represented | represents a single 64-bit number, represented as two hexadecimal | |||
| as two hexadecimal 32-bit numbers with a space between. The numbers | 32-bit numbers with a space between. The numbers are formatted for | |||
| are formatted for use in the example code provided in Section 5. | use in the example code provided in Section 5. | |||
| A correctly operating extended sequence number system can receive | A correctly operating extended sequence number system can receive the | |||
| the least-significant half (the right side) and compute the correct | least-significant half (the right side) and compute the correct most- | |||
| most-significant half (the left side) correctly. It specifically | significant half (the left side) correctly. It specifically tests | |||
| tests both forward and backward jumps in received values that | both forward and backward jumps in received values that represent | |||
| represent legitimate reordering. | legitimate reordering. | |||
| 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 | |||
| skipping to change at page 11, line 16 ¶ | skipping to change at line 445 ¶ | |||
| 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 | |||
| 7. Security Considerations | 7. Security Considerations | |||
| 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. | encryption. | |||
| 8. IANA Considerations | 8. IANA Considerations | |||
| This document contains no IANA issues. This section should be | ||||
| removed upon publication as an RFC. | ||||
| 9. References | ||||
| 9.1. Normative References | ||||
| 9.2. Informative References | This document has no IANA actions. | |||
| [IEN74] Plummmer, W., "Sequence Number Arithmetic," IEN 74, Sept. | 9. Informative References | |||
| 1978. | ||||
| [RFC793] Postel, J., "Transmission Control Protocol," RFC 793, | [IEN74] Plummmer, W., "Sequence Number Arithmetic", IEN-74, | |||
| September 1981. | September 1978. | |||
| [RFC1034] Mockapetris, P., "Domain Names - Concepts and Facilities," | [RFC0793] Postel, J., "Transmission Control Protocol", STD 7, | |||
| RFC 1034, Nov. 1987. | RFC 793, DOI 10.17487/RFC0793, September 1981, | |||
| <https://www.rfc-editor.org/info/rfc793>. | ||||
| [RFC1035] Mockapetris, P., "Domain Names - Implementation and | [RFC1034] Mockapetris, P., "Domain names - concepts and facilities", | |||
| Specification," Nov. 1987. | STD 13, RFC 1034, DOI 10.17487/RFC1034, November 1987, | |||
| <https://www.rfc-editor.org/info/rfc1034>. | ||||
| [RFC1982] Elz, R., Bush, R., "Serial Number Arithmetic," RFC 1982, | [RFC1035] Mockapetris, P., "Domain names - implementation and | |||
| Aug. 1996. | specification", STD 13, RFC 1035, DOI 10.17487/RFC1035, | |||
| November 1987, <https://www.rfc-editor.org/info/rfc1035>. | ||||
| [RFC5925] Touch, J., A. Mankin, R. Bonica, "The TCP Authentication | [RFC1982] Elz, R. and R. Bush, "Serial Number Arithmetic", RFC 1982, | |||
| Option," RFC 5925, June 2010. | DOI 10.17487/RFC1982, August 1996, | |||
| <https://www.rfc-editor.org/info/rfc1982>. | ||||
| [RFC7323] Borman, D., D. Braden, V. Jacobson, R. Scheffenegger, Ed., | [RFC5925] Touch, J., Mankin, A., and R. Bonica, "The TCP | |||
| "TCP Extensions for High Performance" RFC 7323, Sep. 2014. | Authentication Option", RFC 5925, DOI 10.17487/RFC5925, | |||
| June 2010, <https://www.rfc-editor.org/info/rfc5925>. | ||||
| 10. Acknowledgments | [RFC7323] Borman, D., Braden, B., Jacobson, V., and R. | |||
| Scheffenegger, Ed., "TCP Extensions for High Performance", | ||||
| RFC 7323, DOI 10.17487/RFC7323, September 2014, | ||||
| <https://www.rfc-editor.org/info/rfc7323>. | ||||
| The need for this document was first noted by Juhamatti Kuusisaari | Acknowledgments | |||
| in April 2020 during discussions of the pseudocode in RFC 5925. | ||||
| This document was prepared using 2-Word-v2.0.template.dot. | The need for this document was first noted by Juhamatti Kuusisaari in | |||
| April 2020 during discussions of the pseudocode in RFC 5925. | ||||
| Authors' Addresses | Author's Address | |||
| Joe Touch | Joe Touch | |||
| Manhattan Beach, CA 90266 USA | Manhattan Beach, CA 90266 | |||
| United States of America | ||||
| Phone: +1 (310) 560-0334 | Phone: +1 (310) 560-0334 | |||
| Email: touch@strayalpha.com | Email: touch@strayalpha.com | |||
| End of changes. 80 change blocks. | ||||
| 241 lines changed or deleted | 224 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/ | ||||