V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
holinhot
V2EX  ›  问与答

Python 修改 TCP 窗口大小不生效

  •  
  •   holinhot · 2020-07-27 04:46:56 +08:00 · 2059 次点击
    这是一个创建于 1340 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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)

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

    还是说现在系统内核不让自己改了吗
    8 条回复    2020-07-27 09:01:32 +08:00
    lcdtyph
        1
    lcdtyph  
       2020-07-27 05:56:27 +08:00 via iPhone
    这个 opt 的 level 是 IPPROTO_TCP,不是 SOL_SOCKET
    setsockopt 是有返回值的,最好检查一下
    holinhot
        2
    holinhot  
    OP
       2020-07-27 07:03:47 +08:00
    @lcdtyph
    print(s.setsockopt(IPPROTO_TCP, TCP_WINDOW_CLAMP, 0))
    None

    返回是空
    holinhot
        3
    holinhot  
    OP
       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
        4
    holinhot  
    OP
       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
        5
    lcdtyph  
       2020-07-27 07:35:17 +08:00 via iPhone
    @holinhot
    kernel 会强行限制这个选项的最小值的,(SOCK_MIN_RCVBUF/2)
    所以你不能设置的比这个值小
    lcdtyph
        6
    lcdtyph  
       2020-07-27 07:36:45 +08:00 via iPhone
    holinhot
        7
    holinhot  
    OP
       2020-07-27 08:49:00 +08:00
    @lcdtyph 看了一下好像是关闭 tcp 连接时强制把 window_clamp 改为 0
    holinhot
        8
    holinhot  
    OP
       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;
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1144 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:33 · PVG 02:33 · LAX 11:33 · JFK 14:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.