我正在运行iperf
两台服务器之间的测量,通过10Gbit链接连接。我试图将我观察到的最大窗口大小与系统配置参数相关联。TCP接收窗口大小高于net.core.rmem_max
特别是,我观察到最大窗口大小为3 MiB。但是,我无法在系统文件中找到相应的值。
通过运行sysctl -a
我得到以下值:
net.ipv4.tcp_rmem = 4096 87380 6291456
net.core.rmem_max = 212992
第一个值告诉我们,最大接收窗口大小为6 MIB。但是,TCP倾向于分配两倍的请求大小,所以最大接收器窗口大小应该为3 MiB,正如我测量的那样。从man tcp
:
注意,TCP实际分配在setsockopt的(2)调用请求缓冲区大小的两倍,因此后续的getsockopt(2)调用不会如要求返回缓冲区的大小相同setsockopt(2)调用。 TCP使用额外的空间用于管理目的和内部内核结构,并且与实际的TCP窗口相比,/ proc文件值反映了更大的大小。
但是,第二个值net.core.rmem_max
指出最大接收器窗口大小不能超过208 KiB。这被认为是硬限制,根据man tcp
:
tcp_rmem 最大值:由每个TCP套接字中使用的接收缓冲器的最大尺寸。此值不会覆盖全球
net.core.rmem_max
的。这不用于限制套接字上使用SO_RCVBUF声明的接收缓冲区的大小。
那么,怎么来,我观察到的最大窗口尺寸大于net.core.rmem_max
中指定的最大窗口尺寸?
NB:我也计算出的带宽-延迟产物:window_size = Bandwidth x RTT
大约是3 MIB(10 Gbps的@ 2毫秒RTT),从而验证我的流量捕获。
我开始赏金以找出是否时除外'man tcp'确实是错误的。 – nh2