gpt4 book ai didi

sockets - 如何在客户端无错误地建立大量连接

转载 作者:数据小太阳 更新时间:2023-10-29 03:23:12 25 4
gpt4 key购买 nike

我用golang写了一个程序,用linux随机选择的本地端口向不同的远程ip发出大约2000qps的请求,并在连接建立后立即关闭请求,但仍然遇到bind: address already in use 定期出错

我做了什么:

  1. net.ipv4.ip_local_port_range 为 15000-65535
  2. net.ipv4.tcp_tw_recycle=1 net.ipv4.tcp_tw_reuse=1 net.ipv4.tcp_fin_timeout=30

上面是sockstat:

sockets: used 1200 TCP: inuse 2302 orphan 1603 tw 40940 alloc 2325 mem 201

我不明白为什么这个错误仍然存​​在,内核选择了可用的本地端口,内核会返回一个正在使用的端口吗?

最佳答案

这是 2012 年的一个很好的答案:

https://serverfault.com/questions/342741/what-are-the-ramifications-of-setting-tcp-tw-recycle-reuse-to-1#434669

截至 2018 年,tcp_tw_recycle 仅存在于 sysctl 二进制文件中,否则已从内核中消失:

https://github.com/torvalds/linux/search?utf8=%E2%9C%93&q=tcp_tw_recycle&type=

如上述答案所述,tcp_tw_reuse 仍在使用中:

https://github.com/torvalds/linux/blob/master/net/ipv4/tcp_ipv4.c#L128

但是,当 TCP_TIMEWAIT_LEN 正在使用时:

https://github.com/torvalds/linux/search?utf8=%E2%9C%93&q=TCP_TIMEWAIT_LEN&type=

该值是硬编码的:

https://github.com/torvalds/linux/blob/master/include/net/tcp.h#L120

而tcp_fin_timeout指的是不同的状态:

https://github.com/torvalds/linux/blob/master/Documentation/networking/ip-sysctl.txt#L294

可以相对安全地将本地端口范围更改为 1025-65535。

为了好玩,如果这个客户端正在与我控制的服务器和网络通信,我会构建一个带有不符合规范的 TCP_TIMEWAIT_LEN 的新内核,也许还会摆弄 tcp_max_tw_buckets:

https://github.com/torvalds/linux/blob/master/Documentation/networking/ip-sysctl.txt#L379

但在其他情况下这样做——如果此客户端在 NAT 后面并与普通公共(public)服务器通信——可能会造成破坏。

关于sockets - 如何在客户端无错误地建立大量连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49509208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com