![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Hi David, hi TCPM Folks,in the 1323bis draft the PAWS check has a problem (discarding ACKs) if reordering is present on the reverse path and no data is piggybacked. Actually, it's not the PAWS check itself, it's the modification
of section 3.4: "Which Timestamp to Echo".
The important parts of the RFC1323 and the draft (in this order) are
---
(2) If Last.ACK.sent falls within the range of sequence numbers
of an incoming segment:
SEG.SEQ <= Last.ACK.sent < SEG.SEQ + SEG.LEN
then the TSval from the segment is copied to TS.Recent;
otherwise, the TSval is ignored.
---
(2) If:
SEG.TSval >= TS.recent and SEG.SEQ <= Last.ACK.sent
then SEG.TSval is copied to TS.Recent; otherwise, it is
ignored.
---
The addition of "SEG.TSval >= TS.recent" is not important for us at
moment. As the appendix said,
this check is included for consistency with the PAWS test only.The relevant paragraph is the change from "SEG.SEQ <= Last.ACK.sent < SEG.SEQ + SEG.LEN" to the reduced form "SEG.SEQ <= Last.ACK.sent". Again, the appendix said that this change was made since the original algorithm to control which timestamp is echoed was incorrect in two regards:
(1) It failed to update TSrecent for a retransmitted segment that resulted from a lost ACK.
(2) It failed if SEG.LEN = 0.It's right that the 1323bis algo fix these two problems, however, it's introduced the new problem mentioned
already above. Following situation: - One-way flow from TCP A to TCP B - Reordering on the reverse path Consequence - TCP A will discard all ACKs with were delayed- Harmful in the case ABC (RFC 3465) is off, since we count ACKs for slow-start and congestion avoidance
Examples are attached. Alex
PAWS Test 1323 time t TCP A TCP B 0 TS.Recent = 0 TS.Recent = 0 Last.ACK.Sent = 0 Last.ACK.Sent = 0 1 -> | ACK=Y, SEQ=X, TSval=1 | -> (data X) TS.Recent = 0 TS.Recent = 0 Last.ACK.Sent = Y Last.ACK.Sent = 0 2 (delayed) | ACK=X+1, SEQ=Y, TSval=102 | <- (ACK for data X) TS.Recent = 0 TS.Recent = 1 Last.ACK.Sent = Y Last.ACK.Sent = X+1 3 -> | ACK=Y, SEQ=X+1, TSval=3 | -> (data X+1) TS.Recent = 0 TS.Recent = 1 Last.ACK.Sent = Y Last.ACK.Sent = X+1 4 <- | ACK=X+2, SEQ=Y, TSval=104 | <- (ACK for data X+1) TS.Recent = 0 (!!!) TS.Recent = 3 Last.ACK.Sent = Y Last.ACK.Sent = X+2 5 <- | ACK=X, SEQ=Y, TSval=102 | (reordered from t=2 arrives) (ACK for data X)
PAWS Test 1323bis-01 time t TCP A TCP B 0 TS.Recent = 0 TS.Recent = 0 Last.ACK.Sent = 0 Last.ACK.Sent = 0 1 -> | ACK=Y, SEQ=X, TSval=1 | -> (data X) TS.Recent = 0 TS.Recent = 0 Last.ACK.Sent = Y Last.ACK.Sent = 0 2 (delayed) | ACK=X+1, SEQ=Y, TSval=102 | <- (ACK for data X) TS.Recent = 0 TS.Recent = 1 Last.ACK.Sent = Y Last.ACK.Sent = X+1 3 -> | ACK=Y, SEQ=X+1, TSval=3 | -> (data X+1) TS.Recent = 0 TS.Recent = 1 Last.ACK.Sent = Y Last.ACK.Sent = X+1 4 <- | ACK=X+2, SEQ=Y, TSval=104 | <- (ACK for data X+1) TS.Recent = 104 (!!!) TS.Recent = 3 Last.ACK.Sent = Y Last.ACK.Sent = X+2 5 <- | ACK=X, SEQ=Y, TSval=102 | (reordered from t=2 arrives) (ACK for data X) TS.Recent = 104 > TSval = 102 => ACK for data X is not acceptable
// // Dipl.-Inform. Alexander Zimmermann // Department of Computer Science, Informatik 4 // RWTH Aachen University // Ahornstr. 55, 52056 Aachen, Germany // phone: (49-241) 80-21422, fax: (49-241) 80-22220 // email: zimmermann at cs.rwth-aachen.de // web: http://www.umic-mesh.net //
Attachment:
PGP.sig
Description: Signierter Teil der Nachricht