Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 12 Mar 2015 01:37:16 +1100
From:      Lawrence Stewart <lstewart@room52.net>
To:        tcpm@ietf.org
Cc:        Grenville Armitage <garmitage@swin.edu.au>
Subject:   TCP window updates combined with dup acks sent in response to packet loss
Message-ID:  <5500531C.1000109@room52.net>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------090509000204080901010707
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 7bit

[BCCed to freebsd-net@freebsd.org]

Hi all,

Please consider the code below from FreeBSD 10.1's TCP input processing:


        /*
         * In ESTABLISHED state: drop duplicate ACKs; ACK out of range
         * ACKs.  If the ack is in the range
         *      tp->snd_una < th->th_ack <= tp->snd_max
         * then advance tp->snd_una to th->th_ack and drop
         * data from the retransmission queue.  If this ACK reflects
         * more up to date window information we update our window
information.
         */
        case TCPS_ESTABLISHED:
        case TCPS_FIN_WAIT_1:
        case TCPS_FIN_WAIT_2:
        case TCPS_CLOSE_WAIT:
        case TCPS_CLOSING:
        case TCPS_LAST_ACK:
                if (SEQ_GT(th->th_ack, tp->snd_max)) {
                        TCPSTAT_INC(tcps_rcvacktoomuch);
                        goto dropafterack;
                }
                if ((tp->t_flags & TF_SACK_PERMIT) &&
                    ((to.to_flags & TOF_SACK) ||
                     !TAILQ_EMPTY(&tp->snd_holes)))
                        tcp_sack_doack(tp, &to, th->th_ack);

                /* Run HHOOK_TCP_ESTABLISHED_IN helper hooks. */
                hhook_run_tcp_est_in(tp, th, &to);

                if (SEQ_LEQ(th->th_ack, tp->snd_una)) {
                        if (tlen == 0 && tiwin == tp->snd_wnd) {
                                TCPSTAT_INC(tcps_rcvdupack);

                                <dupack processing omitted>


Now for a dupack to be treated as such for the purposes of triggering
fast retransmit/fast recovery, the dupack must not update the window as
per the "tiwin == tp->snd_wnd" condition above, which has existed since
at least BSD 4.4 (I didn't bother looking further back in history).

Grenville (CCed) has encountered proof of this condition forcing
connections to recover via RTO when legitimate dupacks sent in response
to a packet loss also contain a window update.

In the example tcpdump excerpt attached, the advertised receive window
is growing as the Linux receiver side app reads data from the socket
buffer while the dupacks are generated. The FreeBSD sender side sees
them as window updates and processes them as such, bypassing the dupack
processing code. The send window is consumed and because only dup acks
are returning, UNA is not advanced and so the connection stalls,
requiring two RTOs to recover from the 2 dropped packets.

With SACK in the mix as is the case for the provided example, it seems
obvious to me that the existence of SACK blocks could and should be used
to realise that a window update combined with a dupack is not a pure
window update and therefore should be processed by the dupack handling
code for fast retransmit/fast recovery purposes.

For connections without SACK, is there any existing guidance on how to
deal with this? My Google fu and skimming of the RFCs that seemed
relevant to this matter turned up nothing, and so I'm imagining a
potential algorithm for inferring if a window update can count as a
dupack for fast retransmit/fast recovery purposes or not. Wanted to get
some input from others before spending any more time on it though.

Cheers,
Lawrence

--------------090509000204080901010707
Content-Type: text/plain; charset=us-ascii;
 name="dupackwndupdate.txt"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="dupackwndupdate.txt"

MDA6MDA6MDAuMDAwMjQxIElQIDE3Mi4xNi4xMC42MC41MTY3NyA+IDE3Mi4xNi4xMS42My44
MjogRmxhZ3MgWy5dLCBhY2sgMTA4ODM0LCB3aW4gNzczNCwgb3B0aW9ucyBbbm9wLG5vcCxU
UyB2YWwgMjY0ODYxOTEgZWNyIDQxODMxOTQyNzhdLCBsZW5ndGggMAowMDowMDowMC4wMDAy
MTYgSVAgMTcyLjE2LjEwLjYwLjUxNjc3ID4gMTcyLjE2LjExLjYzLjgyOiBGbGFncyBbLl0s
IGFjayAxMDg4MzQsIHdpbiA3ODI0LCBvcHRpb25zIFtub3Asbm9wLFRTIHZhbCAyNjQ4NjE5
MSBlY3IgNDE4MzE5NDI3OCxub3Asbm9wLHNhY2sgMSB7MTEwMjgyOjExMTczMH1dLCBsZW5n
dGggMAowMDowMDowMC4wMDgwMjUgSVAgMTcyLjE2LjEwLjYwLjUxNjc3ID4gMTcyLjE2LjEx
LjYzLjgyOiBGbGFncyBbLl0sIGFjayAxMDg4MzQsIHdpbiA3OTE1LCBvcHRpb25zIFtub3As
bm9wLFRTIHZhbCAyNjQ4NjE5OSBlY3IgNDE4MzE5NDI3OCxub3Asbm9wLHNhY2sgMiB7MTEz
MTc4OjExNDYyNn1bfHRjcF0+CjAwOjAwOjAwLjAwMDIzMyBJUCAxNzIuMTYuMTAuNjAuNTE2
NzcgPiAxNzIuMTYuMTEuNjMuODI6IEZsYWdzIFsuXSwgYWNrIDEwODgzNCwgd2luIDgwMDUs
IG9wdGlvbnMgW25vcCxub3AsVFMgdmFsIDI2NDg2MjAwIGVjciA0MTgzMTk0Mjc4LG5vcCxu
b3Asc2FjayAyIHsxMTMxNzg6MTE2MDc0fVt8dGNwXT4KMDA6MDA6MDAuMDAwMjQ4IElQIDE3
Mi4xNi4xMC42MC41MTY3NyA+IDE3Mi4xNi4xMS42My44MjogRmxhZ3MgWy5dLCBhY2sgMTA4
ODM0LCB3aW4gODA5Niwgb3B0aW9ucyBbbm9wLG5vcCxUUyB2YWwgMjY0ODYyMDAgZWNyIDQx
ODMxOTQyNzgsbm9wLG5vcCxzYWNrIDIgezExMzE3ODoxMTc1MjJ9W3x0Y3BdPgowMDowMDow
MC4wMDAyMTcgSVAgMTcyLjE2LjEwLjYwLjUxNjc3ID4gMTcyLjE2LjExLjYzLjgyOiBGbGFn
cyBbLl0sIGFjayAxMDg4MzQsIHdpbiA4MTg2LCBvcHRpb25zIFtub3Asbm9wLFRTIHZhbCAy
NjQ4NjIwMCBlY3IgNDE4MzE5NDI3OCxub3Asbm9wLHNhY2sgMiB7MTEzMTc4OjExODk3MH1b
fHRjcF0+CjAwOjAwOjAwLjAwMDI2OSBJUCAxNzIuMTYuMTAuNjAuNTE2NzcgPiAxNzIuMTYu
MTEuNjMuODI6IEZsYWdzIFsuXSwgYWNrIDEwODgzNCwgd2luIDgyNzcsIG9wdGlvbnMgW25v
cCxub3AsVFMgdmFsIDI2NDg2MjAwIGVjciA0MTgzMTk0Mjc4LG5vcCxub3Asc2FjayAyIHsx
MTMxNzg6MTIwNDE4fVt8dGNwXT4KMDA6MDA6MDAuMDAwMjQyIElQIDE3Mi4xNi4xMC42MC41
MTY3NyA+IDE3Mi4xNi4xMS42My44MjogRmxhZ3MgWy5dLCBhY2sgMTA4ODM0LCB3aW4gODM2
Nywgb3B0aW9ucyBbbm9wLG5vcCxUUyB2YWwgMjY0ODYyMDEgZWNyIDQxODMxOTQyNzgsbm9w
LG5vcCxzYWNrIDIgezExMzE3ODoxMjE4NjZ9W3x0Y3BdPgowMDowMDowMC4wMDAyNTAgSVAg
MTcyLjE2LjEwLjYwLjUxNjc3ID4gMTcyLjE2LjExLjYzLjgyOiBGbGFncyBbLl0sIGFjayAx
MDg4MzQsIHdpbiA4NDU4LCBvcHRpb25zIFtub3Asbm9wLFRTIHZhbCAyNjQ4NjIwMSBlY3Ig
NDE4MzE5NDI3OCxub3Asbm9wLHNhY2sgMiB7MTEzMTc4OjEyMzMxNH1bfHRjcF0+CjAwOjAw
OjAwLjAwMDIwOSBJUCAxNzIuMTYuMTAuNjAuNTE2NzcgPiAxNzIuMTYuMTEuNjMuODI6IEZs
YWdzIFsuXSwgYWNrIDEwODgzNCwgd2luIDg1NDgsIG9wdGlvbnMgW25vcCxub3AsVFMgdmFs
IDI2NDg2MjAxIGVjciA0MTgzMTk0Mjc4LG5vcCxub3Asc2FjayAyIHsxMTMxNzg6MTI0NzYy
fVt8dGNwXT4KMDA6MDA6MDAuMDAwMjYzIElQIDE3Mi4xNi4xMC42MC41MTY3NyA+IDE3Mi4x
Ni4xMS42My44MjogRmxhZ3MgWy5dLCBhY2sgMTA4ODM0LCB3aW4gODYzOSwgb3B0aW9ucyBb
bm9wLG5vcCxUUyB2YWwgMjY0ODYyMDEgZWNyIDQxODMxOTQyNzgsbm9wLG5vcCxzYWNrIDIg
ezExMzE3ODoxMjYyMTB9W3x0Y3BdPgowMDowMDowMC4wMDAyNDQgSVAgMTcyLjE2LjEwLjYw
LjUxNjc3ID4gMTcyLjE2LjExLjYzLjgyOiBGbGFncyBbLl0sIGFjayAxMDg4MzQsIHdpbiA4
NzI5LCBvcHRpb25zIFtub3Asbm9wLFRTIHZhbCAyNjQ4NjIwMiBlY3IgNDE4MzE5NDI3OCxu
b3Asbm9wLHNhY2sgMiB7MTEzMTc4OjEyNzY1OH1bfHRjcF0+CjAwOjAwOjAwLjAwMDI0MyBJ
UCAxNzIuMTYuMTAuNjAuNTE2NzcgPiAxNzIuMTYuMTEuNjMuODI6IEZsYWdzIFsuXSwgYWNr
IDEwODgzNCwgd2luIDg4MjAsIG9wdGlvbnMgW25vcCxub3AsVFMgdmFsIDI2NDg2MjAyIGVj
ciA0MTgzMTk0Mjc4LG5vcCxub3Asc2FjayAyIHsxMTMxNzg6MTI5MTA2fVt8dGNwXT4KMDA6
MDA6MDAuMDAwMjE4IElQIDE3Mi4xNi4xMC42MC41MTY3NyA+IDE3Mi4xNi4xMS42My44Mjog
RmxhZ3MgWy5dLCBhY2sgMTA4ODM0LCB3aW4gODkxMCwgb3B0aW9ucyBbbm9wLG5vcCxUUyB2
YWwgMjY0ODYyMDIgZWNyIDQxODMxOTQyNzgsbm9wLG5vcCxzYWNrIDIgezExMzE3ODoxMzA1
NTR9W3x0Y3BdPgowMDowMDowMC4yODI3NjkgSVAgMTcyLjE2LjExLjYzLjgyID4gMTcyLjE2
LjEwLjYwLjUxNjc3OiBGbGFncyBbLl0sIHNlcSAxMDg4MzQ6MTEwMjgyLCBhY2sgMTAwLCB3
aW4gMTA0MCwgb3B0aW9ucyBbbm9wLG5vcCxUUyB2YWwgNDE4MzE5NDYzMiBlY3IgMjY0ODYy
MDJdLCBsZW5ndGggMTQ0OAowMDowMDowMC4wMDIyODQgSVAgMTcyLjE2LjEwLjYwLjUxNjc3
ID4gMTcyLjE2LjExLjYzLjgyOiBGbGFncyBbLl0sIGFjayAxMTE3MzAsIHdpbiA5MDAxLCBv
cHRpb25zIFtub3Asbm9wLFRTIHZhbCAyNjQ4NjQ4NyBlY3IgNDE4MzE5NDYzMixub3Asbm9w
LHNhY2sgMSB7MTEzMTc4OjEzMDU1NH1dLCBsZW5ndGggMAowMDowMDowMC4zMzE0MjggSVAg
MTcyLjE2LjExLjYzLjgyID4gMTcyLjE2LjEwLjYwLjUxNjc3OiBGbGFncyBbLl0sIHNlcSAx
MTE3MzA6MTEzMTc4LCBhY2sgMTAwLCB3aW4gMTA0MCwgb3B0aW9ucyBbbm9wLG5vcCxUUyB2
YWwgNDE4MzE5NDk2NiBlY3IgMjY0ODY0ODddLCBsZW5ndGggMTQ0OAo=
--------------090509000204080901010707--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5500531C.1000109>