rfc7323v5.txt | rfc7323.txt | |||
---|---|---|---|---|
skipping to change at page 2, line 14 | skipping to change at page 3, line 7 | |||
(http://trustee.ietf.org/license-info) in effect on the date of | (http://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
1.1. TCP Performance . . . . . . . . . . . . . . . . . . . . . 3 | 1.1. TCP Performance . . . . . . . . . . . . . . . . . . . . . 4 | |||
1.2. TCP Reliability . . . . . . . . . . . . . . . . . . . . . 4 | 1.2. TCP Reliability . . . . . . . . . . . . . . . . . . . . . 5 | |||
1.3. Using TCP options . . . . . . . . . . . . . . . . . . . . 5 | 1.3. Using TCP options . . . . . . . . . . . . . . . . . . . . 6 | |||
1.4. Terminology . . . . . . . . . . . . . . . . . . . . . . . 6 | 1.4. Terminology . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
2. TCP Window Scale Option . . . . . . . . . . . . . . . . . . . 7 | 2. TCP Window Scale Option . . . . . . . . . . . . . . . . . . . 8 | |||
2.1. Introduction . . . . . . . . . . . . . . . . . . . . . . 7 | 2.1. Introduction . . . . . . . . . . . . . . . . . . . . . . 8 | |||
2.2. Window Scale Option . . . . . . . . . . . . . . . . . . . 7 | 2.2. Window Scale Option . . . . . . . . . . . . . . . . . . . 8 | |||
2.3. Using the Window Scale Option . . . . . . . . . . . . . . 8 | 2.3. Using the Window Scale Option . . . . . . . . . . . . . . 9 | |||
2.4. Addressing Window Retraction . . . . . . . . . . . . . . 9 | 2.4. Addressing Window Retraction . . . . . . . . . . . . . . 10 | |||
3. TCP Timestamps Option . . . . . . . . . . . . . . . . . . . . 10 | 3. TCP Timestamps Option . . . . . . . . . . . . . . . . . . . . 11 | |||
3.1. Introduction . . . . . . . . . . . . . . . . . . . . . . 10 | 3.1. Introduction . . . . . . . . . . . . . . . . . . . . . . 11 | |||
3.2. Timestamps Option . . . . . . . . . . . . . . . . . . . . 11 | 3.2. Timestamps Option . . . . . . . . . . . . . . . . . . . . 12 | |||
4. The RTTM Mechanism . . . . . . . . . . . . . . . . . . . . . 13 | 4. The RTTM Mechanism . . . . . . . . . . . . . . . . . . . . . 14 | |||
4.1. Introduction . . . . . . . . . . . . . . . . . . . . . . 13 | 4.1. Introduction . . . . . . . . . . . . . . . . . . . . . . 14 | |||
4.2. Updating the RTO Value . . . . . . . . . . . . . . . . . 14 | 4.2. Updating the RTO Value . . . . . . . . . . . . . . . . . 15 | |||
4.3. Which Timestamp to Echo . . . . . . . . . . . . . . . . . 15 | 4.3. Which Timestamp to Echo . . . . . . . . . . . . . . . . . 16 | |||
5. PAWS - Protection Against Wrapped Sequences . . . . . . . . . 17 | 5. PAWS - Protection Against Wrapped Sequences . . . . . . . . . 19 | |||
5.1. Introduction . . . . . . . . . . . . . . . . . . . . . . 17 | 5.1. Introduction . . . . . . . . . . . . . . . . . . . . . . 19 | |||
5.2. The PAWS Mechanism . . . . . . . . . . . . . . . . . . . 17 | 5.2. The PAWS Mechanism . . . . . . . . . . . . . . . . . . . 19 | |||
5.3. Basic PAWS Algorithm . . . . . . . . . . . . . . . . . . 19 | 5.3. Basic PAWS Algorithm . . . . . . . . . . . . . . . . . . 20 | |||
5.4. Timestamp Clock . . . . . . . . . . . . . . . . . . . . . 21 | 5.4. Timestamp Clock . . . . . . . . . . . . . . . . . . . . . 22 | |||
5.5. Outdated Timestamps . . . . . . . . . . . . . . . . . . . 22 | 5.5. Outdated Timestamps . . . . . . . . . . . . . . . . . . . 24 | |||
5.6. Header Prediction . . . . . . . . . . . . . . . . . . . . 23 | 5.6. Header Prediction . . . . . . . . . . . . . . . . . . . . 25 | |||
5.7. IP Fragmentation . . . . . . . . . . . . . . . . . . . . 24 | 5.7. IP Fragmentation . . . . . . . . . . . . . . . . . . . . 26 | |||
5.8. Duplicates from Earlier Incarnations of Connection . . . 25 | 5.8. Duplicates from Earlier Incarnations of Connection . . . 26 | |||
6. Conclusions and Acknowledgments . . . . . . . . . . . . . . . 25 | 6. Conclusions and Acknowledgments . . . . . . . . . . . . . . . 27 | |||
7. Security Considerations . . . . . . . . . . . . . . . . . . . 26 | 7. Security Considerations . . . . . . . . . . . . . . . . . . . 27 | |||
7.1. Privacy Considerations . . . . . . . . . . . . . . . . . 27 | 7.1. Privacy Considerations . . . . . . . . . . . . . . . . . 29 | |||
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 28 | 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 29 | |||
9. References . . . . . . . . . . . . . . . . . . . . . . . . . 28 | 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 30 | |||
9.1. Normative References . . . . . . . . . . . . . . . . . . 28 | 9.1. Normative References . . . . . . . . . . . . . . . . . . 30 | |||
9.2. Informative References . . . . . . . . . . . . . . . . . 28 | 9.2. Informative References . . . . . . . . . . . . . . . . . 30 | |||
Appendix A. Implementation Suggestions . . . . . . . . . . . . . 32 | Appendix A. Implementation Suggestions . . . . . . . . . . . . . 34 | |||
Appendix B. Duplicates from Earlier Connection Incarnations . . 33 | Appendix B. Duplicates from Earlier Connection Incarnations . . 35 | |||
B.1. System Crash with Loss of State . . . . . . . . . . . . . 33 | B.1. System Crash with Loss of State . . . . . . . . . . . . . 35 | |||
B.2. Closing and Reopening a Connection . . . . . . . . . . . 33 | B.2. Closing and Reopening a Connection . . . . . . . . . . . 35 | |||
Appendix C. Summary of Notation . . . . . . . . . . . . . . . . 35 | Appendix C. Summary of Notation . . . . . . . . . . . . . . . . 37 | |||
Appendix D. Event Processing Summary . . . . . . . . . . . . . . 36 | Appendix D. Event Processing Summary . . . . . . . . . . . . . . 38 | |||
Appendix E. Timestamps Edge Cases . . . . . . . . . . . . . . . 42 | Appendix E. Timestamps Edge Cases . . . . . . . . . . . . . . . 44 | |||
Appendix F. Window Retraction Example . . . . . . . . . . . . . 42 | Appendix F. Window Retraction Example . . . . . . . . . . . . . 44 | |||
Appendix G. RTO Calculation Modification . . . . . . . . . . . . 43 | Appendix G. RTO Calculation Modification . . . . . . . . . . . . 45 | |||
Appendix H. Changes from RFC 1323 . . . . . . . . . . . . . . . 44 | Appendix H. Changes from RFC 1323 . . . . . . . . . . . . . . . 46 | |||
1. Introduction | 1. Introduction | |||
The TCP protocol [RFC0793] was designed to operate reliably over | The TCP protocol [RFC0793] was designed to operate reliably over | |||
almost any transmission medium regardless of transmission rate, | almost any transmission medium regardless of transmission rate, | |||
delay, corruption, duplication, or reordering of segments. Over the | delay, corruption, duplication, or reordering of segments. Over the | |||
years, advances in networking technology have resulted in ever-higher | years, advances in networking technology have resulted in ever-higher | |||
transmission speeds, and the fastest paths are well beyond the domain | transmission speeds, and the fastest paths are well beyond the domain | |||
for which TCP was originally engineered. | for which TCP was originally engineered. | |||
skipping to change at page 29, line 22 | skipping to change at page 31, line 8 | |||
'88, Stanford, CA, August 1988, | '88, Stanford, CA, August 1988, | |||
<http://ee.lbl.gov/papers/congavoid.pdf>. | <http://ee.lbl.gov/papers/congavoid.pdf>. | |||
[Jacobson90a] | [Jacobson90a] | |||
Jacobson, V., "4BSD Header Prediction", ACM Computer | Jacobson, V., "4BSD Header Prediction", ACM Computer | |||
Communication Review, April 1990. | Communication Review, April 1990. | |||
[Jacobson90c] | [Jacobson90c] | |||
Jacobson, V., "Subject: modified TCP congestion avoidance | Jacobson, V., "Subject: modified TCP congestion avoidance | |||
algorithm", message to the End2End-Interest mailing list, | algorithm", message to the End2End-Interest mailing list, | |||
30 April 1990, <ftp://ftp.isi.edu/end2end/end2end- | 30 April 1990, <ftp://ftp.isi.edu/end2end/ | |||
interest-1990.mail>. | end2end-interest-1990.mail>. | |||
[Karn87] Karn, P. and C. Partridge, "Estimating Round-Trip Times in | [Karn87] Karn, P. and C. Partridge, "Estimating Round-Trip Times in | |||
Reliable Transport Protocols", Proceedings of SIGCOMM '87, | Reliable Transport Protocols", Proceedings of SIGCOMM '87, | |||
August 1987. | August 1987. | |||
[Kuehlewind10] | [Kuehlewind10] | |||
Kuehlewind, M. and B. Briscoe, "Chirping for Congestion | Kuehlewind, M. and B. Briscoe, "Chirping for Congestion | |||
Control - Implementation Feasibility", November 2010, | Control - Implementation Feasibility", November 2010, | |||
<bobbriscoe.net/projects/netsvc_i-f/chirp_pfldnet10.pdf>. | <http://bobbriscoe.net/projects/netsvc_i-f/ | |||
chirp_pfldnet10.pdf>. | ||||
[Kuzmanovic03] | [Kuzmanovic03] | |||
Kuzmanovic, A. and E. Knightly, "TCP-LP: Low-Priority | Kuzmanovic, A. and E. Knightly, "TCP-LP: Low-Priority | |||
Service via End-Point Congestion Control", 2003, | Service via End-Point Congestion Control", 2003, | |||
<www.cs.northwestern.edu/~akuzma/doc/TCP-LP-ToN.pdf>. | <www.cs.northwestern.edu/~akuzma/doc/TCP-LP-ToN.pdf>. | |||
[Ludwig00] | [Ludwig00] | |||
Ludwig, R. and K. Sklower, "The Eifel Retransmission | Ludwig, R. and K. Sklower, "The Eifel Retransmission | |||
Timer", ACM SIGCOMM Computer Communication Review Volume | Timer", ACM SIGCOMM Computer Communication Review Volume | |||
30 Issue 3, July 2000, | 30 Issue 3, July 2000, | |||
skipping to change at page 30, line 22 | skipping to change at page 32, line 8 | |||
[Medina05] | [Medina05] | |||
Medina, A., Allman, M., and S. Floyd, "Measuring the | Medina, A., Allman, M., and S. Floyd, "Measuring the | |||
Evolution of Transport Protocols in the Internet", ACM | Evolution of Transport Protocols in the Internet", ACM | |||
Computer Communication Review Volume 35, No. 2, April | Computer Communication Review Volume 35, No. 2, April | |||
2005, | 2005, | |||
<http://icir.net/floyd/papers/TCPevolution-Mar2005.pdf>. | <http://icir.net/floyd/papers/TCPevolution-Mar2005.pdf>. | |||
[RE-1323BIS] | [RE-1323BIS] | |||
Oppermann, A., "Subject: Re: [tcpm] I-D Action: draft- | Oppermann, A., "Subject: Re: [tcpm] I-D Action: draft- | |||
ietf.tcpm-1323bis-13.txt", message to the TCPM mailing | ietf.tcpm-1323bis-13.txt", message to the TCPM mailing | |||
list, 01 June 2013, <http://www.ietf.org/mail- | list, 01 June 2013, <http://www.ietf.org/ | |||
archive/web/tcpm/current/msg08001.html>. | mail-archive/web/tcpm/current/msg08001.html>. | |||
[RFC1072] Jacobson, V. and R. Braden, "TCP extensions for long-delay | [RFC1072] Jacobson, V. and R. Braden, "TCP extensions for long-delay | |||
paths", RFC 1072, October 1988. | paths", RFC 1072, October 1988. | |||
[RFC1122] Braden, R., "Requirements for Internet Hosts - | [RFC1122] Braden, R., "Requirements for Internet Hosts - | |||
Communication Layers", STD 3, RFC 1122, October 1989. | Communication Layers", STD 3, RFC 1122, October 1989. | |||
[RFC1185] Jacobson, V., Braden, B., and L. Zhang, "TCP Extension for | [RFC1185] Jacobson, V., Braden, B., and L. Zhang, "TCP Extension for | |||
High-Speed Paths", RFC 1185, October 1990. | High-Speed Paths", RFC 1185, October 1990. | |||
skipping to change at page 36, line 31 | skipping to change at page 38, line 22 | |||
Receive Sequence Variables | Receive Sequence Variables | |||
RCV.NXT: Receive next | RCV.NXT: Receive next | |||
RCV.WND: Receive window | RCV.WND: Receive window | |||
IRS: Initial receive sequence number | IRS: Initial receive sequence number | |||
Appendix D. Event Processing Summary | Appendix D. Event Processing Summary | |||
This appendix attempts to specify the algorithms unambiguously by | This appendix attempts to specify the algorithms unambiguously by | |||
presenting modifications to the Event Processing rules in Section 3.9 | presenting modifications to the Event Processing rules in Section 3.9 | |||
of RFC 793. | of RFC 793. The change bars ("|") indicate lines that are different | |||
from RFC 793. | ||||
OPEN Call | OPEN Call | |||
... | ... | |||
An initial send sequence number (ISS) is selected. Send a <SYN> | An initial send sequence number (ISS) is selected. Send a <SYN> | |||
segment of the form: | | segment of the form: | |||
| | ||||
<SEQ=ISS><CTL=SYN><TSval=Snd.TSclock><WSopt=Rcv.Wind.Shift> | | <SEQ=ISS><CTL=SYN><TSval=Snd.TSclock><WSopt=Rcv.Wind.Shift> | |||
... | ... | |||
SEND Call | SEND Call | |||
CLOSED STATE (i.e., TCB does not exist) | CLOSED STATE (i.e., TCB does not exist) | |||
... | ... | |||
LISTEN STATE | LISTEN STATE | |||
If the foreign socket is specified, then change the connection | If active and the foreign socket is specified, then change the | |||
from passive to active, select an ISS. Send a <SYN> segment | connection from passive to active, select an ISS. Send a SYN | |||
containing the options: <TSval=Snd.TSclock> and | | segment containing the options: <TSval=Snd.TSclock> and | |||
<WSopt=Rcv.Wind.Shift>. Set SND.UNA to ISS, SND.NXT to ISS+1. | | <WSopt=Rcv.Wind.Shift>. Set SND.UNA to ISS, SND.NXT to ISS+1. | |||
Enter SYN-SENT state. ... | Enter SYN-SENT state. ... | |||
SYN-SENT STATE | SYN-SENT STATE | |||
SYN-RECEIVED STATE | SYN-RECEIVED STATE | |||
... | ... | |||
ESTABLISHED STATE | ESTABLISHED STATE | |||
CLOSE-WAIT STATE | CLOSE-WAIT STATE | |||
Segmentize the buffer and send it with a piggybacked | Segmentize the buffer and send it with a piggybacked | |||
acknowledgment (acknowledgment value = RCV.NXT). ... | acknowledgment (acknowledgment value = RCV.NXT). ... | |||
If the urgent flag is set ... | If the urgent flag is set ... | |||
skipping to change at page 37, line 29 | skipping to change at page 39, line 14 | |||
... | ... | |||
ESTABLISHED STATE | ESTABLISHED STATE | |||
CLOSE-WAIT STATE | CLOSE-WAIT STATE | |||
Segmentize the buffer and send it with a piggybacked | Segmentize the buffer and send it with a piggybacked | |||
acknowledgment (acknowledgment value = RCV.NXT). ... | acknowledgment (acknowledgment value = RCV.NXT). ... | |||
If the urgent flag is set ... | If the urgent flag is set ... | |||
If the Snd.TS.OK flag is set, then include the TCP Timestamps | | If the Snd.TS.OK flag is set, then include the TCP Timestamps | |||
option <TSval=Snd.TSclock,TSecr=TS.Recent> in each data | | option <TSval=Snd.TSclock,TSecr=TS.Recent> in each data | |||
segment. | | segment. | |||
| | ||||
Scale the receive window for transmission in the segment | | Scale the receive window for transmission in the segment | |||
header: | | header: | |||
| | ||||
SEG.WND = (RCV.WND >> Rcv.Wind.Shift). | | SEG.WND = (RCV.WND >> Rcv.Wind.Shift). | |||
SEGMENT ARRIVES | SEGMENT ARRIVES | |||
... | ... | |||
If the state is LISTEN then | If the state is LISTEN then | |||
first check for an RST | first check for an RST | |||
... | ... | |||
skipping to change at page 38, line 13 | skipping to change at page 39, line 45 | |||
... | ... | |||
third check for a SYN | third check for a SYN | |||
If the SYN bit is set, check the security. If the ... | If the SYN bit is set, check the security. If the ... | |||
... | ... | |||
If the SEG.PRC is less than the TCB.PRC then continue. | If the SEG.PRC is less than the TCB.PRC then continue. | |||
Check for a Window Scale option (WSopt); if one is found, | | Check for a Window Scale option (WSopt); if one is found, | |||
save SEG.WSopt in Snd.Wind.Shift and set Snd.WS.OK flag on. | | save SEG.WSopt in Snd.Wind.Shift and set Snd.WS.OK flag on. | |||
Otherwise, set both Snd.Wind.Shift and Rcv.Wind.Shift to | | Otherwise, set both Snd.Wind.Shift and Rcv.Wind.Shift to | |||
zero and clear Snd.WS.OK flag. | | zero and clear Snd.WS.OK flag. | |||
| | ||||
Check for a TSopt option; if one is found, save SEG.TSval in | | Check for a TSopt option; if one is found, save SEG.TSval in | |||
the variable TS.Recent and turn on the Snd.TS.OK bit. | | the variable TS.Recent and turn on the Snd.TS.OK bit. | |||
Set RCV.NXT to SEG.SEQ+1, IRS is set to SEG.SEQ and any | Set RCV.NXT to SEG.SEQ+1, IRS is set to SEG.SEQ and any | |||
other control or text should be queued for processing later. | other control or text should be queued for processing later. | |||
ISS should be selected and a SYN segment sent of the form: | ISS should be selected and a SYN segment sent of the form: | |||
<SEQ=ISS><ACK=RCV.NXT><CTL=SYN,ACK> | <SEQ=ISS><ACK=RCV.NXT><CTL=SYN,ACK> | |||
If the Snd.WS.OK bit is on, include a WSopt | | If the Snd.WS.OK bit is on, include a WSopt | |||
<WSopt=Rcv.Wind.Shift> in this segment. If the Snd.TS.OK | | <WSopt=Rcv.Wind.Shift> in this segment. If the Snd.TS.OK | |||
bit is on, include a TSopt <TSval=Snd.TSclock, | | bit is on, include a TSopt <TSval=Snd.TSclock, | |||
TSecr=TS.Recent> in this segment. Last.ACK.sent is set to | | TSecr=TS.Recent> in this segment. Last.ACK.sent is set to | |||
RCV.NXT. | | RCV.NXT. | |||
SND.NXT is set to ISS+1 and SND.UNA to ISS. The connection | SND.NXT is set to ISS+1 and SND.UNA to ISS. The connection | |||
state should be changed to SYN-RECEIVED. Note that any | state should be changed to SYN-RECEIVED. Note that any | |||
other incoming control or data (combined with SYN) will be | other incoming control or data (combined with SYN) will be | |||
processed in the SYN-RECEIVED state, but processing of SYN | processed in the SYN-RECEIVED state, but processing of SYN | |||
and ACK should not be repeated. If the listen was not fully | and ACK should not be repeated. If the listen was not fully | |||
specified (i.e., the foreign socket was not fully | specified (i.e., the foreign socket was not fully | |||
specified), then the unspecified fields should be filled in | specified), then the unspecified fields should be filled in | |||
now. | now. | |||
skipping to change at page 39, line 11 | skipping to change at page 40, line 44 | |||
... | ... | |||
... | ... | |||
fourth check the SYN bit | fourth check the SYN bit | |||
... | ... | |||
If the SYN bit is on and the security/compartment and | If the SYN bit is on and the security/compartment and | |||
precedence are acceptable then, RCV.NXT is set to SEG.SEQ+1, | precedence are acceptable then, RCV.NXT is set to SEG.SEQ+1, | |||
IRS is set to SEG.SEQ, and any acknowledgments on the | IRS is set to SEG.SEQ. SND.UNA should be advanced to equal | |||
SEG.ACK (if there is an ACK), and any segments on the | ||||
retransmission queue which are thereby acknowledged should | retransmission queue which are thereby acknowledged should | |||
be removed. | be removed. | |||
Check for a Window Scale option (WSopt); if it is found, | | Check for a Window Scale option (WSopt); if it is found, | |||
save SEG.WSopt in Snd.Wind.Shift; otherwise, set both | | save SEG.WSopt in Snd.Wind.Shift; otherwise, set both | |||
Snd.Wind.Shift and Rcv.Wind.Shift to zero. | | Snd.Wind.Shift and Rcv.Wind.Shift to zero. | |||
| | ||||
Check for a TSopt option; if one is found, save SEG.TSval in | | Check for a TSopt option; if one is found, save SEG.TSval in | |||
variable TS.Recent and turn on the Snd.TS.OK bit in the | | variable TS.Recent and turn on the Snd.TS.OK bit in the | |||
connection control block. If the ACK bit is set, use | | connection control block. If the ACK bit is set, use | |||
Snd.TSclock - SEG.TSecr as the initial RTT estimate. | | Snd.TSclock - SEG.TSecr as the initial RTT estimate. | |||
If SND.UNA > ISS (our SYN has been ACKed), change the | If SND.UNA > ISS (our SYN has been ACKed), change the | |||
connection state to ESTABLISHED, form an <ACK> segment: | connection state to ESTABLISHED, form an <ACK> segment: | |||
<SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK> | <SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK> | |||
and send it. If the Snd.TS.OK bit is on, include a TSopt | | and send it. If the Snd.TS.OK bit is on, include a TSopt | |||
option <TSval=Snd.TSclock,TSecr=TS.Recent> in this <ACK> | | option <TSval=Snd.TSclock,TSecr=TS.Recent> in this <ACK> | |||
segment. Last.ACK.sent is set to RCV.NXT. | | segment. Last.ACK.sent is set to RCV.NXT. | |||
Data or controls that were queued for transmission may be | Data or controls that were queued for transmission may be | |||
included. If there are other controls or text in the | included. If there are other controls or text in the | |||
segment, then continue processing at the sixth step below | segment, then continue processing at the sixth step below | |||
where the URG bit is checked; otherwise, return. | where the URG bit is checked; otherwise, return. | |||
Otherwise, enter SYN-RECEIVED, form a <SYN,ACK> segment: | Otherwise, enter SYN-RECEIVED, form a <SYN,ACK> segment: | |||
<SEQ=ISS><ACK=RCV.NXT><CTL=SYN,ACK> | <SEQ=ISS><ACK=RCV.NXT><CTL=SYN,ACK> | |||
and send it. If the Snd.TS.OK bit is on, include a TSopt | | and send it. If the Snd.TS.OK bit is on, include a TSopt | |||
option <TSval=Snd.TSclock,TSecr=TS.Recent> in this segment. | | option <TSval=Snd.TSclock,TSecr=TS.Recent> in this segment. | |||
If the Snd.WS.OK bit is on, include a WSopt option | | If the Snd.WS.OK bit is on, include a WSopt option | |||
<WSopt=Rcv.Wind.Shift> in this segment. Last.ACK.sent is | | <WSopt=Rcv.Wind.Shift> in this segment. Last.ACK.sent is | |||
set to RCV.NXT. | | set to RCV.NXT. | |||
If there are other controls or text in the segment, queue | If there are other controls or text in the segment, queue | |||
them for processing after the ESTABLISHED state has been | them for processing after the ESTABLISHED state has been | |||
reached, return. | reached, return. | |||
fifth, if neither of the SYN or RST bits is set then drop the | fifth, if neither of the SYN or RST bits is set then drop the | |||
segment and return. | segment and return. | |||
Otherwise | Otherwise | |||
skipping to change at page 40, line 20 | skipping to change at page 42, line 4 | |||
first check the sequence number | first check the sequence number | |||
SYN-RECEIVED STATE | SYN-RECEIVED STATE | |||
ESTABLISHED STATE | ESTABLISHED STATE | |||
FIN-WAIT-1 STATE | FIN-WAIT-1 STATE | |||
FIN-WAIT-2 STATE | FIN-WAIT-2 STATE | |||
CLOSE-WAIT STATE | CLOSE-WAIT STATE | |||
CLOSING STATE | CLOSING STATE | |||
LAST-ACK STATE | LAST-ACK STATE | |||
TIME-WAIT STATE | TIME-WAIT STATE | |||
Segments are processed in sequence. Initial tests on | Segments are processed in sequence. Initial tests on | |||
arrival are used to discard old duplicates, but further | arrival are used to discard old duplicates, but further | |||
processing is done in SEG.SEQ order. If a segment's | processing is done in SEG.SEQ order. If a segment's | |||
contents straddle the boundary between old and new, only the | contents straddle the boundary between old and new, only the | |||
new parts should be processed. | new parts should be processed. | |||
Rescale the received window field: | | Rescale the received window field: | |||
| | ||||
TrueWindow = SEG.WND << Snd.Wind.Shift, | | TrueWindow = SEG.WND << Snd.Wind.Shift, | |||
| | ||||
and use "TrueWindow" in place of SEG.WND in the following | | and use "TrueWindow" in place of SEG.WND in the following | |||
steps. | | steps. | |||
| | ||||
Check whether the segment contains a Timestamps option and | | Check whether the segment contains a Timestamps option and | |||
if bit Snd.TS.OK is on. If so: | | if bit Snd.TS.OK is on. If so: | |||
| | ||||
If SEG.TSval < TS.Recent and the RST bit is off: | | If SEG.TSval < TS.Recent and the RST bit is off: | |||
| | ||||
If the connection has been idle more than 24 days, | | If the connection has been idle more than 24 days, | |||
save SEG.TSval in variable TS.Recent, else the segment | | save SEG.TSval in variable TS.Recent, else the segment | |||
is not acceptable; follow the steps below for an | | is not acceptable; follow the steps below for an | |||
unacceptable segment. | | unacceptable segment. | |||
| | ||||
If SEG.TSval >= TS.Recent and SEG.SEQ <= Last.ACK.sent, | | If SEG.TSval >= TS.Recent and SEG.SEQ <= Last.ACK.sent, | |||
then save SEG.TSval in variable TS.Recent. | | then save SEG.TSval in variable TS.Recent. | |||
There are four cases for the acceptability test for an | There are four cases for the acceptability test for an | |||
incoming segment: | incoming segment: | |||
... | ... | |||
If an incoming segment is not acceptable, an acknowledgment | If an incoming segment is not acceptable, an acknowledgment | |||
should be sent in reply (unless the RST bit is set; if so | should be sent in reply (unless the RST bit is set; if so | |||
drop the segment and return): | drop the segment and return): | |||
<SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK> | <SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK> | |||
Last.ACK.sent is set to SEG.ACK of the acknowledgment. If | | Last.ACK.sent is set to SEG.ACK of the acknowledgment. If | |||
the Snd.TS.OK bit is on, include the Timestamps option | | the Snd.TS.OK bit is on, include the Timestamps option | |||
<TSval=Snd.TSclock,TSecr=TS.Recent> in this <ACK> segment. | | <TSval=Snd.TSclock,TSecr=TS.Recent> in this <ACK> segment. | |||
Set Last.ACK.sent to SEG.ACK and send the <ACK> segment. | Set Last.ACK.sent to SEG.ACK and send the <ACK> segment. | |||
After sending the acknowledgment, drop the unacceptable | After sending the acknowledgment, drop the unacceptable | |||
segment and return. | segment and return. | |||
... | ... | |||
fifth check the ACK field, | fifth check the ACK field, | |||
if the ACK bit is off drop the segment and return | if the ACK bit is off drop the segment and return | |||
if the ACK bit is on | if the ACK bit is on | |||
... | ... | |||
ESTABLISHED STATE | ESTABLISHED STATE | |||
If SND.UNA < SEG.ACK <= SND.NXT then, set SND.UNA <- | If SND.UNA < SEG.ACK <= SND.NXT then, set SND.UNA <- | |||
SEG.ACK. Also compute a new estimate of round-trip time. | | SEG.ACK. Also compute a new estimate of round-trip time. | |||
If Snd.TS.OK bit is on, use Snd.TSclock - SEG.TSecr; | | If Snd.TS.OK bit is on, use Snd.TSclock - SEG.TSecr; | |||
otherwise, use the elapsed time since the first segment | | otherwise, use the elapsed time since the first segment | |||
in the retransmission queue was sent. Any segments on | | in the retransmission queue was sent. Any segments on | |||
the retransmission queue that are thereby entirely | the retransmission queue that are thereby entirely | |||
acknowledged... | acknowledged... | |||
... | ... | |||
seventh, process the segment text, | seventh, process the segment text, | |||
ESTABLISHED STATE | ESTABLISHED STATE | |||
FIN-WAIT-1 STATE | FIN-WAIT-1 STATE | |||
FIN-WAIT-2 STATE | FIN-WAIT-2 STATE | |||
... | ... | |||
Send an acknowledgment of the form: | Send an acknowledgment of the form: | |||
<SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK> | <SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK> | |||
If the Snd.TS.OK bit is on, include the Timestamps option | | If the Snd.TS.OK bit is on, include the Timestamps option | |||
<TSval=Snd.TSclock,TSecr=TS.Recent> in this <ACK> segment. | | <TSval=Snd.TSclock,TSecr=TS.Recent> in this <ACK> segment. | |||
Set Last.ACK.sent to SEG.ACK of the acknowledgment, and send | | Set Last.ACK.sent to SEG.ACK of the acknowledgment, and send | |||
it. This acknowledgment should be piggybacked on a segment | | it. This acknowledgment should be piggybacked on a segment | |||
being transmitted if possible without incurring undue delay. | being transmitted if possible without incurring undue delay. | |||
... | ... | |||
Appendix E. Timestamps Edge Cases | Appendix E. Timestamps Edge Cases | |||
While the rules laid out for when to calculate RTTM produce the | While the rules laid out for when to calculate RTTM produce the | |||
correct results most of the time, there are some edge cases where an | correct results most of the time, there are some edge cases where an | |||
incorrect RTTM can be calculated. All of these situations involve | incorrect RTTM can be calculated. All of these situations involve | |||
the loss of segments. It is felt that these scenarios are rare, and | the loss of segments. It is felt that these scenarios are rare, and | |||
End of changes. 21 change blocks. | ||||
125 lines changed or deleted | 127 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |