我正在iperf
通过 10Gbit 链路连接的两台服务器之间运行测量。我正在尝试将我观察到的最大窗口大小与系统配置参数相关联。
特别是,我观察到最大窗口大小为 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 将额外空间用于管理目的和内部内核结构,并且 /proc 文件值反映了与实际 TCP 窗口相比更大的大小。
但是,第二个值net.core.rmem_max
表示最大接收器窗口大小不能超过 208 KiB。这应该是硬限制,根据man tcp
:
tcp_rmem max:每个 TCP 套接字使用的接收缓冲区的最大大小。此值不会覆盖全局
net.core.rmem_max
. 这不用于限制在套接字上使用 SO_RCVBUF 声明的接收缓冲区的大小。
那么,我怎么会观察到大于中指定的最大窗口大小net.core.rmem_max
?
注意:我还计算了带宽延迟乘积:window_size = Bandwidth x RTT
大约为 3 MiB(10 Gbps @ 2 毫秒 RTT),从而验证了我的流量捕获。