TCP Rx window auto sizing relies on TCP timestamp option?
Vlad Zolotarov
vladz at cloudius-systems.com
Mon Aug 11 12:16:51 UTC 2014
Hi, I have the most strange question about the TCP Rx window auto sizing
implementation in a FreeBSD networking stack.
When I looked at the FreeBSD code (hash
9abce0e567c9a5a0520cdd94d5c633c7baf9a184) I noticed that
the mentioned above feature will not be "enabled" if there isn't a TCP
timestamp option present in the current TCP session:
See sys/netinet/tcp_input.c: line 1813 in tcp_do_segment() function:
if (V_tcp_do_autorcvbuf &&
*to.to_tsecr* && <-------- this is what I'm talking about
(so->so_rcv.sb_flags & SB_AUTOSIZE))
So, if i read the code correctly, if there isn't a TS option (negotiated
and thus present in every received packet) the receive socket buffer
won't grow thus preventing the growth of the Rx window.
If that's the case this is very strange since TS option is not promised
and even more - in many cases it won't be present.
For example in Linux this feature is disabled by default (controlled by
/proc/sys/net/ipv4/tcp_timestamps).
This is how I actually noticed the problem the first place: I ran iperf
test where Linux was an initiator and a transmitter (iperf -c) FreeBSD
box was a receiver (iperf -s) and I noticed that the Rx window wasn't
opening up because Linux box hasn't negotiated the TS option in the SYN.
As a result, the throughput numbers were significantly lower compared to
Linux-to-Linux setup (Linux uses a Dynamic Right-Sizing (DRS) algorithm
http://public.lanl.gov/radiant/pubs.html#DRS, which doesn't rely on TS).
Could anybody comment on this, pls.?
Did I miss anything?
Is it true that FreeBSD assumes that TS option is always present and if
not how can I cause an Rx Window to open up when TS option hasn't been
negotiated?
thanks in advance,
vlad
More information about the freebsd-net
mailing list