Subject: Re: TCP limited transmit
To: None <mallman@grc.nasa.gov>
From: venkat venkatsubra <venkats@austin.ibm.com>
List: tech-net
Date: 11/28/2000 18:53:24
Mark,
If i wanted to avoid adding the new field t_extra, won't the
following work too ? Also, is there a simple way to count
the number of times the 'Limited Transmit' code helped avoid
a retransmit timeout ? That is, helped a fast retransmit
to occur when otherwise it would have resulted in a
retransmit timeout ?
} else if (tp->t_dupacks > tcprexmtthresh) {
tp->snd_cwnd += tp->t_segsz;
(void) tcp_output(tp);
goto drop;
#ifdef MALLMAN
/* limited transmit algorithm */
} else if (do_lim_xmit &&
SEQ_LT(tp->snd_max, tp->snd_una +
tp->snd_cwnd + tp->t_segsz * 2)) {
tp->snd_cwnd += (tp->t_segsz * tp->t_dupacks);
(void) tcp_output (tp);
tp->snd_cwnd -= (tp->t_segsz * tp->t_dupacks);
goto drop;
#endif MALLMAN
}
} else {
tp->t_dupacks = 0;
Thanks!
Venkat
Mark Allman wrote:
>
> Folks-
>
> A slight change to TCP's algorithms (called Limited Transmit) is in
> the RFC Editor's queue and will be published as a proposed standard
> soon. The proposal basically calls for new data (if available) to
> be transmitted when the first and second duplicate ACKs arrive.
> Additional constraints are that cwnd is not supposed to be changed
> and we need to ensure that we don't oversubscribe cwnd by more than
> 2*segsz.
>
> I have hacked together some changes for netbsd to implement this
> change. I'm not sure what I have is the Right Way to do things, but
> it seems reasonable to me and it seems to work fine. I thought I'd
> submit these changes for possible inclusion in the standard version
> of netbsd.
>
> I added a "do_lim_xmit" global to allow turning the algorithm on and
> off via sysctl. I added a variable "t_extra" to the TCP control
> block to track the amount of data we have sent beyond the cwnd.
> Then, in tcp_input.c:
>
> } else if (tp->t_dupacks > tcprexmtthresh) {
> tp->snd_cwnd += tp->t_segsz;
> (void) tcp_output(tp);
> goto drop;
> #ifdef MALLMAN
> /* limited transmit algorithm */
> } else if (do_lim_xmit &&
> (tp->t_extra < (2 * tp->t_segsz))) {
> tp->t_extra += tp->t_segsz;
> tp->snd_cwnd += tp->t_extra;
> (void) tcp_output (tp);
> tp->snd_cwnd -= tp->t_extra;
> goto drop;
> #endif MALLMAN
> }
>
> } else {
> tp->t_dupacks = 0;
> #ifdef MALLMAN
> tp->t_extra = 0;
> #endif MALLMAN
>
> Basically, I temporarily bump cwnd by enough to generate one extra
> segment, send the segment and then deflate cwnd back down.
>
> Also note that everywhere that t_dupacks is set to zero, t_extra
> should also be set to zero (as shown above).
>
> allman
>
> ---
> http://roland.grc.nasa.gov/~mallman/