| rfc9768v10.txt | rfc9768.txt | |||
|---|---|---|---|---|
| Internet Engineering Task Force (IETF) B. Briscoe | Internet Engineering Task Force (IETF) B. Briscoe | |||
| Request for Comments: 9768 Independent | Request for Comments: 9768 Independent | |||
| Updates: 3168 M. Kühlewind | Updates: 3168 M. Kühlewind | |||
| Category: Standards Track Ericsson | Category: Standards Track Ericsson | |||
| ISSN: 2070-1721 R. Scheffenegger | ISSN: 2070-1721 R. Scheffenegger | |||
| NetApp | NetApp | |||
| March 2026 | April 2026 | |||
| More Accurate Explicit Congestion Notification (AccECN) Feedback in TCP | More Accurate Explicit Congestion Notification (AccECN) Feedback in TCP | |||
| Abstract | Abstract | |||
| Explicit Congestion Notification (ECN) is a mechanism by which | Explicit Congestion Notification (ECN) is a mechanism by which | |||
| network nodes can mark IP packets instead of dropping them to | network nodes can mark IP packets instead of dropping them to | |||
| indicate incipient congestion to the endpoints. Receivers with an | indicate incipient congestion to the endpoints. Receivers with an | |||
| ECN-capable transport protocol feed back this information to the | ECN-capable transport protocol feed back this information to the | |||
| sender. ECN was originally specified for TCP in such a way that only | sender. ECN was originally specified for TCP in such a way that only | |||
| skipping to change at line 256 ¶ | skipping to change at line 256 ¶ | |||
| AccECN uses, and Appendix B explains why AccECN uses flags in the | AccECN uses, and Appendix B explains why AccECN uses flags in the | |||
| main TCP header and quantifies the space left for future use. | main TCP header and quantifies the space left for future use. | |||
| 1.2. Goals | 1.2. Goals | |||
| [RFC7560] enumerates requirements that a candidate feedback scheme | [RFC7560] enumerates requirements that a candidate feedback scheme | |||
| needs to satisfy, under the headings: resilience, timeliness, | needs to satisfy, under the headings: resilience, timeliness, | |||
| integrity, accuracy (including ordering and lack of bias), | integrity, accuracy (including ordering and lack of bias), | |||
| complexity, overhead, and compatibility (both backward and forward). | complexity, overhead, and compatibility (both backward and forward). | |||
| It recognizes that a perfect scheme that fully satisfies all the | It recognizes that a perfect scheme that fully satisfies all the | |||
| requirements is unlikely and trade-offs between requirements are | requirements is unlikely and tradeoffs between requirements are | |||
| likely. Section 6 assesses the properties of AccECN against these | likely. Section 6 assesses the properties of AccECN against these | |||
| requirements and discusses the trade-offs. | requirements and discusses the tradeoffs. | |||
| The requirements document recognizes that a protocol as ubiquitous as | The requirements document recognizes that a protocol as ubiquitous as | |||
| TCP needs to be able to serve as-yet-unspecified requirements. | TCP needs to be able to serve as-yet-unspecified requirements. | |||
| Therefore, an AccECN receiver acts as a generic (mechanistic) | Therefore, an AccECN receiver acts as a generic (mechanistic) | |||
| reflector of congestion information with the aim that new sender | reflector of congestion information with the aim that new sender | |||
| behaviours can be deployed unilaterally in the future (see | behaviours can be deployed unilaterally in the future (see | |||
| Section 2.5). | Section 2.5). | |||
| 1.3. Terminology | 1.3. Terminology | |||
| skipping to change at line 647 ¶ | skipping to change at line 647 ¶ | |||
| above. | above. | |||
| Once a TCP Client (A) has sent the above SYN to declare that it | Once a TCP Client (A) has sent the above SYN to declare that it | |||
| supports AccECN, and once it has received the above SYN/ACK segment | supports AccECN, and once it has received the above SYN/ACK segment | |||
| that confirms that the TCP Server supports AccECN, the TCP Client | that confirms that the TCP Server supports AccECN, the TCP Client | |||
| MUST set both its half-connections into AccECN mode. The TCP Client | MUST set both its half-connections into AccECN mode. The TCP Client | |||
| MUST NOT enter AccECN mode (or any feedback mode) before it has | MUST NOT enter AccECN mode (or any feedback mode) before it has | |||
| received the first SYN/ACK. | received the first SYN/ACK. | |||
| Once in AccECN mode, a TCP Client or Server has the rights and | Once in AccECN mode, a TCP Client or Server has the rights and | |||
| obligations to participate in the ECN protocol defined in | obligations defined in Section 3.1.5 concerning use of ECN. | |||
| Section 3.1.5. | ||||
| The procedures for retransmission of SYNs or SYN/ACKs are given in | The procedures for retransmission of SYNs or SYN/ACKs are given in | |||
| Section 3.1.4. | Section 3.1.4. | |||
| It is RECOMMENDED that the AccECN protocol be implemented alongside | It is RECOMMENDED that the AccECN protocol be implemented alongside | |||
| Selective Acknowledgement (SACK) [RFC2018]. If SACK is implemented | Selective Acknowledgement (SACK) [RFC2018]. If SACK is implemented | |||
| with AccECN, Duplicate Selective Acknowledgement (D-SACK) [RFC2883] | with AccECN, Duplicate Selective Acknowledgement (D-SACK) [RFC2883] | |||
| MUST also be implemented. | MUST also be implemented. | |||
| 3.1.2. Backward Compatibility | 3.1.2. Backward Compatibility | |||
| skipping to change at line 2931 ¶ | skipping to change at line 2930 ¶ | |||
| if ((newlyAckedB > 0) || (newlyAckedT > 0)) | if ((newlyAckedB > 0) || (newlyAckedT > 0)) | |||
| d.cep = (ACE + DIVACE - (s.cep % DIVACE)) % DIVACE | d.cep = (ACE + DIVACE - (s.cep % DIVACE)) % DIVACE | |||
| Section 3.2.2.5 expects the Data Sender to assume that the ACE field | Section 3.2.2.5 expects the Data Sender to assume that the ACE field | |||
| cycled if it is the safest likely case under prevailing conditions. | cycled if it is the safest likely case under prevailing conditions. | |||
| The 3-bit ACE field in an arriving ACK could have cycled and become | The 3-bit ACE field in an arriving ACK could have cycled and become | |||
| ambiguous to the Data Sender if a sequence of ACKs goes missing that | ambiguous to the Data Sender if a sequence of ACKs goes missing that | |||
| covers a stream of data long enough to contain 8 or more CE marks. | covers a stream of data long enough to contain 8 or more CE marks. | |||
| We use the word 'missing' rather than 'lost', because some or all the | We use the word 'missing' rather than 'lost', because some or all the | |||
| missing ACKs might arrive eventually, but out of order. Even if some | missing ACKs might arrive eventually, but out of order. Even if some | |||
| of the missing ACKs were piggy-backed on data (i.e., not pure ACKs) | of the missing ACKs were piggybacked on data (i.e., not pure ACKs) | |||
| retransmissions will not repair the lost AccECN information, because | retransmissions will not repair the lost AccECN information, because | |||
| AccECN requires retransmissions to carry the latest AccECN counters, | AccECN requires retransmissions to carry the latest AccECN counters, | |||
| not the original ones. | not the original ones. | |||
| The phrase 'under prevailing conditions' allows for implementation- | The phrase 'under prevailing conditions' allows for implementation- | |||
| dependent interpretation. A Data Sender might take account of the | dependent interpretation. A Data Sender might take account of the | |||
| prevailing size of data segments and the prevailing CE marking rate | prevailing size of data segments and the prevailing CE marking rate | |||
| just before the sequence of missing ACKs. However, we shall start | just before the sequence of missing ACKs. However, we shall start | |||
| with the simplest algorithm, which assumes segments are all full- | with the simplest algorithm, which assumes segments are all full- | |||
| sized, and ultra-conservatively it assumes that ECN marking was 100% | sized, and ultra-conservatively it assumes that ECN marking was 100% | |||
| skipping to change at line 3119 ¶ | skipping to change at line 3118 ¶ | |||
| For this approach to be precise, it has to be assumed that spurious | For this approach to be precise, it has to be assumed that spurious | |||
| (unnecessary) retransmissions do not lead to double counting. This | (unnecessary) retransmissions do not lead to double counting. This | |||
| assumption is currently correct, given that RFC 3168 requires that | assumption is currently correct, given that RFC 3168 requires that | |||
| the Data Sender mark retransmitted segments as Not-ECT. However, the | the Data Sender mark retransmitted segments as Not-ECT. However, the | |||
| converse is not true; necessary retransmissions will result in | converse is not true; necessary retransmissions will result in | |||
| undercounting. | undercounting. | |||
| However, such precision is unlikely to be necessary. The only known | However, such precision is unlikely to be necessary. The only known | |||
| use of a count of Not-ECT marked bytes is to test whether equipment | use of a count of Not-ECT marked bytes is to test whether equipment | |||
| on the path is clearing the ECN field (perhaps due to an out-dated | on the path is clearing the ECN field (perhaps due to an outdated | |||
| attempt to clear, or bleach, what used to be the IPv4 ToS byte or the | attempt to clear, or bleach, what used to be the IPv4 ToS byte or the | |||
| IPv6 Traffic Class field). To detect bleaching, it will be | IPv6 Traffic Class field). To detect bleaching, it will be | |||
| sufficient to detect whether nearly all bytes arrive marked as Not- | sufficient to detect whether nearly all bytes arrive marked as Not- | |||
| ECT. Therefore, there ought to be no need to keep track of the | ECT. Therefore, there ought to be no need to keep track of the | |||
| details of retransmissions. | details of retransmissions. | |||
| Appendix B. Rationale for Usage of TCP Header Flags | Appendix B. Rationale for Usage of TCP Header Flags | |||
| B.1. Three TCP Header Flags in the SYN-SYN/ACK Handshake | B.1. Three TCP Header Flags in the SYN-SYN/ACK Handshake | |||
| skipping to change at line 3148 ¶ | skipping to change at line 3147 ¶ | |||
| Classic ECN used header flags rather than a TCP Option because it was | Classic ECN used header flags rather than a TCP Option because it was | |||
| considered more efficient to use a header flag for 1 bit of feedback | considered more efficient to use a header flag for 1 bit of feedback | |||
| per ACK, and this bit could be overloaded to indicate support for | per ACK, and this bit could be overloaded to indicate support for | |||
| Classic ECN during the handshake. During the development of ECN, 1 | Classic ECN during the handshake. During the development of ECN, 1 | |||
| bit crept up to 2, in order to deliver the feedback reliably and to | bit crept up to 2, in order to deliver the feedback reliably and to | |||
| work round some broken hosts that reflected the reserved flags during | work round some broken hosts that reflected the reserved flags during | |||
| the handshake. | the handshake. | |||
| In order to be backward compatible with RFC 3168, AccECN continues | In order to be backward compatible with RFC 3168, AccECN continues | |||
| this approach, using the 3rd least significant TCP header flag that | this approach, using the 3rd least significant TCP header flag that | |||
| had previously been allocated for the ECN-nonce (now historic). | had previously been allocated for the ECN-nonce (now Historic). | |||
| Then, whatever form of Server an AccECN Client encounters, the | Then, whatever form of Server an AccECN Client encounters, the | |||
| connection can fall back to the highest version of feedback protocol | connection can fall back to the highest version of feedback protocol | |||
| that both ends support, as explained in Section 3.1. | that both ends support, as explained in Section 3.1. | |||
| If AccECN capability negotiation had used the more orthodox approach | If AccECN capability negotiation had used the more orthodox approach | |||
| of a TCP Option, it would still have had to set the two ECN flags in | of a TCP Option, it would still have had to set the two ECN flags in | |||
| the main TCP header, in order to be able to fall back to Classic ECN | the main TCP header, in order to be able to fall back to Classic ECN | |||
| [RFC3168], or to disable ECN support, without another round of | [RFC3168], or to disable ECN support, without another round of | |||
| negotiation. Then AccECN would also have had to handle all the | negotiation. Then AccECN would also have had to handle all the | |||
| different ways that Servers currently respond to settings of the ECN | different ways that Servers currently respond to settings of the ECN | |||
| skipping to change at line 3212 ¶ | skipping to change at line 3211 ¶ | |||
| Despite availability of usable TCP header space being extremely | Despite availability of usable TCP header space being extremely | |||
| scarce, the AccECN protocol has taken all possible steps to ensure | scarce, the AccECN protocol has taken all possible steps to ensure | |||
| that there is space to negotiate possible future variants of the | that there is space to negotiate possible future variants of the | |||
| protocol, either if a variant of AccECN is required, or if a | protocol, either if a variant of AccECN is required, or if a | |||
| completely different ECN feedback approach is needed. | completely different ECN feedback approach is needed. | |||
| Future AccECN variants: When the AccECN capability is negotiated | Future AccECN variants: When the AccECN capability is negotiated | |||
| during TCP's three-way handshake, the rows in Table 2 tagged as | during TCP's three-way handshake, the rows in Table 2 tagged as | |||
| 'Nonce' and 'Broken' in the column for the capability of node B | 'Nonce' and 'Broken' in the column for the capability of node B | |||
| are unused by any current protocol defined in the RFC series. | are unused by any current protocol defined in the RFC Series. | |||
| These could be used by TCP Servers in the future to indicate a | These could be used by TCP Servers in the future to indicate a | |||
| variant of the AccECN protocol. In recent measurement studies in | variant of the AccECN protocol. In recent measurement studies in | |||
| which the response of large numbers of Servers to an AccECN SYN | which the response of large numbers of Servers to an AccECN SYN | |||
| has been tested, e.g., [Mandalari18], a very small number of SYN/ | has been tested, e.g., [Mandalari18], a very small number of SYN/ | |||
| ACKs arrive with the pattern tagged as 'Nonce', and a small but | ACKs arrive with the pattern tagged as 'Nonce', and a small but | |||
| more significant number arrive with the pattern tagged as | more significant number arrive with the pattern tagged as | |||
| 'Broken'. The 'Nonce' pattern could be a sign that a few Servers | 'Broken'. The 'Nonce' pattern could be a sign that a few Servers | |||
| have implemented the ECN-nonce [RFC3540], which has now been | have implemented the ECN-nonce [RFC3540], which has now been | |||
| reclassified as Historic [RFC8311], or it could be the random | reclassified as Historic [RFC8311], or it could be the random | |||
| result of some unknown middlebox behaviour. The greater | result of some unknown middlebox behaviour. The greater | |||
| End of changes. 8 change blocks. | ||||
| 9 lines changed or deleted | 8 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. | ||||