lwip-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[lwip-devel] [bug #51138] RTT measurement after retransmission


From: Ambroz Bizjak
Subject: [lwip-devel] [bug #51138] RTT measurement after retransmission
Date: Mon, 29 May 2017 13:37:42 -0400 (EDT)
User-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36

URL:
  <http://savannah.nongnu.org/bugs/?51138>

                 Summary: RTT measurement after retransmission
                 Project: lwIP - A Lightweight TCP/IP stack
            Submitted by: abizjak
            Submitted on: Mon 29 May 2017 05:37:41 PM UTC
                Category: TCP
                Severity: 3 - Normal
              Item Group: Faulty Behaviour
                  Status: None
                 Privacy: Public
             Assigned to: None
             Open/Closed: Open
         Discussion Lock: Any
         Planned Release: None
            lwIP version: git head

    _______________________________________________________

Details:

Hi,
I was looking at the RTT measurement code in lwIP (for the implementation of
my own TCP/IP stack), and I think there is a problem with retransmitted
segments. I'm reporting this based on reading the code so I could have missed
something. Also sorry for the long message :)

Let's look at RFC 6298:
"TCP MUST use Karn's algorithm [KP87] for taking RTT samples.  That
is, RTT samples MUST NOT be made using segments that were
retransmitted (and thus for which it is ambiguous whether the reply
was for the first instance of the packet or a later instance). ..."

And at lwIP:

1) When a data segment is sent and no RTT measurement is pending, then a
measurement is started (rttest is 0 --> rttest is set to current time and
sequence number is noted).
http://git.savannah.gnu.org/cgit/lwip.git/tree/src/core/tcp_out.c?id=356da76cc8f2f6cea98005a17c287679615ce588#n1276

2) When an ACK acknowledges the sequence number of pending RTT measurement,
the measurement is completed and the related variables are updated.
http://git.savannah.gnu.org/cgit/lwip.git/tree/src/core/tcp_in.c?id=356da76cc8f2f6cea98005a17c287679615ce588#n1292

3) When the retransmission timeout expires, all segments are (re-)queued, any
pending RTT measurement is stopped (rttest=0;) and THEN segments are
transmitted (tcp_output).
http://git.savannah.gnu.org/cgit/lwip.git/tree/src/core/tcp_out.c?id=356da76cc8f2f6cea98005a17c287679615ce588#n1454

And tcp_output-->tcp_output_segment will happily start a new RTT measurement
with the first retransmitted segment. When that segment is finally ACKed, the
measurement will be complete and effective. Which is clearly wrong since the
ACK could have been in response to the original transmission in which case the
RTT would have been underestimated.

Fast retransmission (tcp_rexmit) seems to have this issue.

And now for a more general concern. I hope you have some idea what would be
the best behavior.

"RTT samples MUST NOT be made using segments that were retransmitted"

But what about if pending segments *before* the "RTT segment" are
retransmitted? A retransmission of a previous segment suggests that the ACK
that acknowledges the RTT  segment will be sent later. Because the original
ACK response to the RTT segment would be a duplicate ACK, and the first ACK
acknowledging the RTT segment would be in response to the retransmitted
previous segment.

My TCP implementation currently does roughly this (which is different from
lwIP):
1) A measurement is started only when a new segment (one that bumps snd_nxt)
is sent and no measurement is already active.
2) If a segment for which measurement is active is retransmitted, the
measurement it stopped (and no new measurement is started).

This will never underestimate the RTO even if (2) is not done, since the start
of measurement is always the first transmission of a segment. But it can and
will overestimate RTO in the face of retransmissions, and (2) doesn't really
help due to what I described above (loss of any segment delays the ACK of
later segments).

If (2) is changed so that *any* retransmission invalidates *any* pending
measurement (as lwIP tries to but currently fails to do), then I think the
problem is solved. What do you think about this solution? I have a concern
that it is too restrictive, that it will refuse to do any kind of RTT update
until complete recovery from any kind of loss, which could be detrimental.

May also help to look at the reference [KP87]. The Karn's algorithm is:

"When an acknowledgement arrives for a packet that has been sent more than
once (i.e., retransmitted at least once), ignore any round-trip measurement
based on this packet, thus avoiding the retransmission ambiguity problem. In
addition, the backed-off RTO for this packet is kept for the next packet. Only
when it (or a succeeding packet) is acknowledged without an intervening
retransmission will the RTO be recalculated from SRTT."

The first part seems to be oblivious to the possible ACK delay due to lost and
retransmitted segments. The remaining part is just some logic about keeping
RTO and when to update RTO, not about which RTT measurements are valid.




    _______________________________________________________

Reply to this item at:

  <http://savannah.nongnu.org/bugs/?51138>

_______________________________________________
  Message sent via/by Savannah
  http://savannah.nongnu.org/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]