tcp/sack: Force out more segments allowed by "pipe" during fast recovery
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Thu, 24 May 2012 08:09:57 +0000 (16:09 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Fri, 25 May 2012 07:11:55 +0000 (15:11 +0800)
commitccb518eadb169585edd353b50b1d0f665b45c3ee
tree84c6e66544d55bcff4ff5be792a0d8735ec7079b
parentba0d6f9911cce18ff8daa525328a9d8ffa315f33
tcp/sack: Force out more segments allowed by "pipe" during fast recovery

If some segments are cumulatively acked or SACKed, and HighRxt equals
snd_una, one segment (new or retransmit) will be forced out even if cwnd
and pipe don't allow it.  When large amount of segments are lost, i.e.
computed pipe could be large, this avoids unnecessary retransmit timeout
and could perform as good as NewReno.

Sysctl node net.inet.tcp.force_sackrxt could be tuned to burst out several
retransmits, default is 1 (should be good enough).  Set this sysctl to 0,
SACK based fast recovery will obey the computed pipe.

Several unnecessary retransmit timeout graph as described above:
http://leaf.dragonflybsd.org/~sephe/no_force_sack_rexmt2_15.xpl (starts @15s)
http://leaf.dragonflybsd.org/~sephe/no_force_sack_rexmt_54.xpl (starts @54s)
sys/netinet/tcp_input.c
sys/netinet/tcp_sack.c
sys/netinet/tcp_var.h