RFC: Updated window update algorithm

Mike Silbersack silby at silby.com
Fri May 12 18:30:59 UTC 2006


It's been nearly four years, I was wondering if anyone has had a thought 
on this change yet.  :)

Mike "Silby" Silbersack

---------- Forwarded message ----------
Date: Tue, 30 Jul 2002 15:15:55 -0500 (CDT)
From: Mike Silbersack <silby at silby.com>
To: freebsd-net at freebsd.org
Subject: RFC: Updated window update algorithm

I'd appreciate if the tcp inclined could take a quick look over the
attached patch.  What it does is implement a simpler algorithm used to
determine whether or not to accept window updates.  Our existing algorithm
(the one in RFC793/1122) had a weakness in that it will ignore window
updates piggybacked on retransmitted packets.  In a unidirectional
transfer situation, this is not a problem.  However, in the case of a
bidirectional transfer, this could cause retransmission in one direction
to stall transmission in the other direction.

For more info on this case, see the thread at:

http://tcp-impl.grc.nasa.gov/tcp-impl/list/archive/2184.html

The algorithm I used in the attached patch is the one created by Alexey
Kuznetsov, currently used in Linux 2.4.

Any comments (on the algorithm or implementation) would be appreciated.

Thanks,

Mike "Silby" Silbersack
-------------- next part --------------
--- /usr/src/sys.old/netinet/tcp_input.c	Tue Jul 30 00:41:38 2002
+++ tcp_input.c	Tue Jul 30 14:15:40 2002
@@ -1939,11 +1939,15 @@
 	/*
 	 * Update window information.
 	 * Don't look at window if no ACK: TAC's send garbage on first SYN.
+	 * Update window if:
+	 * - New data acked
+	 * - New data sent to us
+	 * - Data has not advanced, but larger window is reported
 	 */
 	if ((thflags & TH_ACK) &&
 	    (SEQ_LT(tp->snd_wl1, th->th_seq) ||
-	    (tp->snd_wl1 == th->th_seq && (SEQ_LT(tp->snd_wl2, th->th_ack) ||
-	     (tp->snd_wl2 == th->th_ack && tiwin > tp->snd_wnd))))) {
+	     SEQ_LT(tp->snd_una, th->th_ack) ||
+	     ((th->th_seq == tp->snd_wl1) && (tiwin > tp->snd_wnd)))) {
 		/* keep track of pure window updates */
 		if (tlen == 0 &&
 		    tp->snd_wl2 == th->th_ack && tiwin > tp->snd_wnd)


More information about the freebsd-net mailing list