git: tcp: Correct sending idle detection and implement part of RFC2861
Sepherosa Ziehau
sephe at crater.dragonflybsd.org
Wed Apr 18 02:32:31 PDT 2012
commit 3d127502478783869f3689073fdde11ca8bcad2f
Author: Sepherosa Ziehau <sephe at dragonflybsd.org>
Date: Wed Apr 18 15:31:26 2012 +0800
tcp: Correct sending idle detection and implement part of RFC2861
This commit mainly changes how cwnd is shinked after idle period on
the send side.
- Properly detect sending idle period according to RFC5681. The problem
of using reception time to detect sending idle period is described in
RFC5681 as:
"...
Using the last time a segment was received to determine whether or
not to decrease cwnd can fail to deflate cwnd in the common case of
persistent HTTP connections [HTH98]. In this case, a Web server
receives a request before transmitting data to the Web client. The
reception of the request makes the test for an idle connection fail,
and allows the TCP to begin transmission with a possibly
inappropriately large cwnd.
..."
This mainly affects HTTP/1.1 persistent connection performance after
the connection is idled for a long time. The impact probably should not
be drastic, since 80% HTTP/1.1 persistent connection delay between two
requests are less then minimum RTO (1 second) as discovered by:
"Overclocking the Yahoo! CDN for Faster Web Page Loads"
http://conferences.sigcomm.org/imc/2011/docs/p569.pdf
Sysctl node net.inet.tcp.idle_restart is added to disable the cwnd
shinking after idle period. It is on by default. And you can set it
to 0 to restore old behaviour against HTTP/1.1 persistent connection.
- Implement part of RFC2861, which decays cwnd after idle period according
to the length of sending idle period. The main difference between our
implementation and the RFC2861 is that we don't let cwnd go below the
value allowed by RFC5861.
Sysctl node net.inet.tcp.idle_cwv is added to disable CWV after sending
idle period. It is on by default. Disable net.inet.tcp.idle_restart
will also indirectly disable CWV after sending idle period.
The CWV during the application-limited period is not implemented by this
commit. It is just too conservative, as discovered by:
"Analysing TCP for Bursty Traffic, Int'l J. of Communications,
Network and System Sciences, 7(3), July 2010."
- Add statistics about how much sending idle happened
Summary of changes:
sys/netinet/tcp_output.c | 95 +++++++++++++++++++++++++++++++++++++++-------
sys/netinet/tcp_subr.c | 1 +
sys/netinet/tcp_var.h | 4 +-
usr.bin/netstat/inet.c | 1 +
4 files changed, 86 insertions(+), 15 deletions(-)
http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/3d127502478783869f3689073fdde11ca8bcad2f
--
DragonFly BSD source repository
More information about the Commits
mailing list