TCP congestion avoidance

Chuck Swiger cswiger at mac.com
Thu Feb 26 13:27:31 PST 2009


On Feb 26, 2009, at 1:02 PM, Ross Cameron wrote:
> Bump,...      Sorry guys (semi-urgent question and I really need the  
> help im
> not a fBSD guru)

As a suggestion, you ought to give the FreeBSD mailing lists at least  
a few hours, or better yet a day or so, before repeating a question  
due to lack of initial response.

> ---------- Forwarded message ----------
> From: Ross Cameron <ross.cameron at linuxpro.co.za>
> Date: Thu, Feb 26, 2009 at 10:13 AM
> Subject: TCP congestion avoidance
> To: freebsd-questions at freebsd.org
>
> Hi there all
>
> I spend most of my time maintaining an embedded Linux appliance for  
> a client
> of mine.  One of the features of this client is that depending on  
> connectivity types
> etc. if has the ability to choose between several different TCP  
> congestion
> avoidance algorythms.
>
> Now I have been approached by another client to produce a BSD  
> derived system
> (they're GPL alergic) and I would like to impliment a simmilar  
> feature on
> this new toolchain.
> Where can I find out what congestion avoidance algorythms FreeBSD  
> supports
> and how to plug them in and out during runtime (not at boot) ???

You should start with the output of "sysctl -ad net", in particular:

net.inet.tcp.slowstart_flightsize: Slow start flight size
net.inet.tcp.local_slowstart_flightsize: Slow start flight size for  
local networks
net.inet.tcp.newreno: Enable NewReno Algorithms
net.inet.tcp.delayed_ack: Delay ACK to try and piggyback it onto a  
data packet
net.inet.tcp.rfc3042: Enable RFC 3042 (Limited Transmit)
net.inet.tcp.rfc3390: Enable RFC 3390 (Increasing TCP's Initial  
Congestion Window)
net.inet.tcp.sack.enable: Enable/Disable TCP SACK support
net.inet.tcp.sack.maxholes: Maximum number of TCP SACK holes allowed  
per connection
net.inet.tcp.sack.globalmaxholes: Global maximum number of TCP SACK  
holes
net.inet.tcp.sack.globalholes: Global number of TCP SACK holes  
currently allocated
net.inet.tcp.inflight.enable: Enable automatic TCP inflight data  
limiting
net.inet.tcp.inflight.debug: Debug TCP inflight calculations
net.inet.tcp.inflight.rttthresh: RTT threshold below which inflight  
will deactivate itself
net.inet.tcp.inflight.min: Lower-bound for TCP inflight window
net.inet.tcp.inflight.max: Upper-bound for TCP inflight window
net.inet.tcp.inflight.stab: Inflight Algorithm Stabilization 20 = 2  
packets

These can be adjusted at runtime or even via setsockopt() for a few  
cases like TCP_NODELAY.  You might also find that the packet shaper  
capabilities of dummynet might be helpful for prioritizing traffic and  
managing odd links (ie, with a high bandwidth * delay cross product).

Beyond that, look into the source code such as /usr/src/sys/netinet/ 
tcp_output.c, netinet/tcp_sack.c, etc...

Regards,
-- 
-Chuck



More information about the freebsd-questions mailing list