Python 修改 TCP 窗口大小不生效

2020-07-27 04:46:56 +08:00
 holinhot
from socket import socket, SOL_SOCKET, TCP_WINDOW_CLAMP, AF_INET, SOCK_STREAM, SOL_TCP
s = socket(AF_INET, SOCK_STREAM)
s.setsockopt(SOL_SOCKET, TCP_WINDOW_CLAMP, 500)

经过抓包测试还是用的系统自动计算出的窗口大小。

还是说现在系统内核不让自己改了吗
2075 次点击
所在节点    问与答
8 条回复
lcdtyph
2020-07-27 05:56:27 +08:00
这个 opt 的 level 是 IPPROTO_TCP,不是 SOL_SOCKET
setsockopt 是有返回值的,最好检查一下
holinhot
2020-07-27 07:03:47 +08:00
@lcdtyph
print(s.setsockopt(IPPROTO_TCP, TCP_WINDOW_CLAMP, 0))
None

返回是空
holinhot
2020-07-27 07:16:20 +08:00
@lcdtyph
返回是 0
Type "help", "copyright", "credits" or "license" for more information.
>>> from socket import socket, IPPROTO_TCP, TCP_WINDOW_CLAMP, AF_INET, SOCK_STREAM, SOL_TCP
>>>
>>> s = socket(AF_INET, SOCK_STREAM)
>>>
>>> s.setsockopt(IPPROTO_TCP, TCP_WINDOW_CLAMP, 0)
>>>
>>> s.getsockopt(IPPROTO_TCP, TCP_WINDOW_CLAMP)
0

23:15:01.484753 IP 127.0.0.1.http > 127.0.0.1.62668: Flags [S.], seq 2645892072, ack 98484869, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
23:15:01.521700 IP 127.0.0.1.http > 127.0.0.1.62668: Flags [.], ack 76, win 229, length 0

抓包还是不起作用
holinhot
2020-07-27 07:19:26 +08:00
@lcdtyph
不知道什么情况了
>>> s.setsockopt(IPPROTO_TCP, TCP_WINDOW_CLAMP, 1000)
>>> s.getsockopt(IPPROTO_TCP, TCP_WINDOW_CLAMP)
1152
>>>
>>> s.setsockopt(IPPROTO_TCP, TCP_WINDOW_CLAMP, 500)
>>> s.getsockopt(IPPROTO_TCP, TCP_WINDOW_CLAMP)
1152
>>> s.setsockopt(IPPROTO_TCP, TCP_WINDOW_CLAMP, 100)
>>> s.getsockopt(IPPROTO_TCP, TCP_WINDOW_CLAMP)
1152
>>> s.setsockopt(IPPROTO_TCP, TCP_WINDOW_CLAMP, 0)
>>> s.getsockopt(IPPROTO_TCP, TCP_WINDOW_CLAMP)
0
lcdtyph
2020-07-27 07:35:17 +08:00
@holinhot
kernel 会强行限制这个选项的最小值的,(SOCK_MIN_RCVBUF/2)
所以你不能设置的比这个值小
lcdtyph
2020-07-27 07:36:45 +08:00
holinhot
2020-07-27 08:49:00 +08:00
@lcdtyph 看了一下好像是关闭 tcp 连接时强制把 window_clamp 改为 0
holinhot
2020-07-27 09:01:32 +08:00
@holinhot if (!val) {
if (sk->sk_state != TCP_CLOSE) {
err = -EINVAL;
break;
}
tp->window_clamp = 0;
} else
tp->window_clamp = val < SOCK_MIN_RCVBUF / 2 ?
SOCK_MIN_RCVBUF / 2 : val;
break;
2.3
if (val==0) {
if (sk->state != TCP_CLOSE) {
err = -EINVAL;
break;
}
tp->window_clamp = 0;
} else {
tp->window_clamp = val<SOCK_MIN_RCVBUF/2 ?
SOCK_MIN_SNDBUF : val;
}
break;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/693313

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX