Question on ACKs on out-of-window packets

Srinivas Neginhal sneginha at vmware.com
Thu Jun 3 12:42:20 UTC 2010


Hi,
     I had a question on how the current tcp_input()/tcp_do_segment() code handles ACKs on out-of-window packets.
     Specifically, The code to handle packets which fall entirely to the left of the window.

     Here is the scenario I am analyzing right now.


1. Client has sent out a window worth of data to the server and is waiting for acks, it can't send any more data.
2. The server is also sending data to the client.
3. The client has received everything the server had to send and has sent sent an ack for the last byte.
4. Further, for what ever reason the ACK the client sent to the server takes longer than usual time to get to the server.
5. The server decides to retransmit earlier packets. And it starts way back.
6. It retransmits an old packet but now piggybacks an ACK for all the data the client sent the server.

Now, say, this old packet has the following attributes
Sequence number: 100000 
Acknowledgement number : 300000
Packet Len: 1448 bytes.


Say the client has the following 
rcv_nxt: 105000.
wl1: 104000.


This entire packet falls to the left of the receive window. The ack on this packet would be processed but the window update won't happen.

Now at the same time if the server receives and processes the latest ACK the client sent in step 3 above (for 105000), it would stop all retransmission.
The server has no more data to send to the client. 
Also, since the server has already sent an ACK for all the data the client sent it, it won't send a pure ACK either.
The client would be stuck with a snd_wnd of 0.

At the least, wouldn't this trigger unnecessary window probes?
In my particular case, the persist timer has not been triggered either since tcp_output() never got called.

Solaris seems to have changed their window update code 
http://blogs.sun.com/kcpoon/entry/solaris_tcp_window_update

This is not really as per the RFC but would fix the problem I am dealing with.

Any thoughts?

Regards,
Srinivas


More information about the freebsd-net mailing list