在Linux上增大TCP接收窗口

2 投票
1 回答
2996 浏览
提问于 2025-04-17 16:11

类似于在C语言中设置TCP接收窗口以及在Linux中使用tcpdump为什么更改SO_RCVBUF的值不起作用?,我在使用ubuntu linux 2.6.32-45时,无法将初始的TCP接收窗口设置得大于5888。

#!/usr/bin/python
from socket import socket, SOL_SOCKET, SO_RCVBUF, TCP_WINDOW_CLAMP
sock = socket()
sock.setsockopt(SOL_SOCKET, SO_RCVBUF, 65536)
sock.setsockopt(SOL_SOCKET, TCP_WINDOW_CLAMP, 32768)
sock.connect(('google.com', 80))

tcpdump显示:

me > google: Flags [S], seq 3758517838, win 5840, options [mss 1460,sackOK,TS val 879735044 ecr 0,nop,wscale 6], length 0
google > me: Flags [S.], seq 597037042, ack 3758517839, win 62392, options [mss 1430,sackOK,TS val 541301157 ecr 879735044,nop,wscale 6], length 0
me > google: Flags [.], ack 1, win 92, options [nop,nop,TS val 879735051 ecr 541301157], length 0

sysctl -a | grep net.*mem显示:

net.core.wmem_max = 131071
net.core.rmem_max = 131071
net.core.wmem_default = 112640
net.core.rmem_default = 112640
net.core.optmem_max = 10240
net.ipv4.igmp_max_memberships = 20
net.ipv4.tcp_mem = 77376        103168  154752
net.ipv4.tcp_wmem = 4096        16384   3301376
net.ipv4.tcp_rmem = 4096        87380   3301376
net.ipv4.udp_mem = 77376        103168  154752
net.ipv4.udp_rmem_min = 4096
net.ipv4.udp_wmem_min = 4096

有没有其他因素限制了我的连接接收窗口的大小呢?

1 个回答

1

这看起来像是TCP慢启动的效果。2008年的一个内核线程提供了很好的解释(我链接到了该线程的最后一个回复):

如果你继续观察这个数据流,窗口的大小应该会增加,直到你设置的最大值。

撰写回答