V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tool2d
V2EX  ›  编程

一行代码在软路由上,限制客户的 TCP 网速。

  •  
  •   tool2d · 2023-11-08 16:46:25 +08:00 · 731 次点击
    这是一个创建于 409 天前的主题,其中的信息可能已经有所发展或是发生改变。
    公司有免费 wifi ,没限速,可没想到有客户拿笔记本抖音直播。因为电信上传带宽极其有限,暴力使用就会造成集体卡顿。(下载无所谓,一般不会占满带宽)

    于是,就想办法从软路由源头上限制一下。搜索了一下,发现 TCP 自带流量控制,是一个叫 window size 的变量。

    原理是 [客户直播笔记本] 发送一个 TCP 包到 [软路由 PC ] ,这时候 [软路由 pc ] 会返回一个 [响应 ACK 数据包] ,如果里面 window size 很大,那代表软路由的网卡缓存富裕,暗示让客户直播笔记本使劲发送上传流量包。

    如果里面的 window size 被修改了,变得很小很小,那么就暗示 [客户直播笔记本],目前无法处理新的 TCP 数据包,客户操作系统就会自觉降低发送 TCP 包的频率,从而降低上传流量。而这一切对客户来说,都是无感知的。

    ========

    ipv4_header_t* ipv4_hdr = (ipv4_header_t*)(r_buffer + eth_len);
    if (ipv4_hdr->ip_protocol == IPPROTO_TCP)
    {
    tcp_header_t* tcp_hdr = (tcp_header_t*)(r_buffer + eth_len + ipv4_len);

    // 关键代码就这一句,实测网速限制效果,1024 = 700k/s, 2048 = 1300k/s, 4096 = 2300k/s, 8192 = 4100k/s
    ushort window_size = 8192;
    tcp_hdr->window = WORDSWAP(window_size);
    }

    在 github 搜了类似代码,是一个 tcp 包过滤器项目,编译后放到软路由上运行,效果很好。
    1 条回复    2023-11-08 16:48:33 +08:00
    lsylsy2
        1
    lsylsy2  
       2023-11-08 16:48:33 +08:00   ❤️ 1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2553 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 05:42 · PVG 13:42 · LAX 21:42 · JFK 00:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.