Date: Fri, 12 May 2006 13:30:51 -0500 (CDT) From: Mike Silbersack <silby@silby.com> To: net@freebsd.org Subject: RFC: Updated window update algorithm Message-ID: <20060512132954.X1013@odysseus.silby.com>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --] 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@silby.com> To: freebsd-net@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 [-- Attachment #2 --] --- /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)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060512132954.X1013>
