“Cannot assign requested address”源于短连接风暴、TIME_WAIT堆积与端口池过小;需同步减少新建连接(优先启用keep-alive或requests.Session)、加快端口回收(开启tcp_tw_reuse)、扩大端口范围(1024–65535)。
核心问题是:短连接风暴 + TIME_WAIT堆积 + 端口池太小 → “Cannot assign requested address”。这不是代码写错了,而是系统资源被高频 curl 耗尽。解决要从减少新建连接数、加快端口回收、扩大可用端口池三方面同步入手。
curl 默认每次请求都建新 TCP 连接,这是最大根源。必须强制复用:
-H "Connection: keep-alive",并用 --http1.1 显式指定协议(HTTP/2 默认复用,但部分服务端不兼容)curl --reuse(libcurl 7.62+ 支持),或更稳妥地:用 curl -K 配合配置文件批量复用同一 host 的连接requests.Session()、Go 的 http.Client(带 Transport 复用连接池),避免 shell curl 的进程开销和连接隔离默认 32768–60999(约 28k 端口)完全扛不住高并发 curl:
1024 65535:执行 echo "1024 65535" > /proc/sys/net/ipv4/ip_local_port_range
/etc/sysctl.conf 加一行 net.ipv4.ip_local_port_range = 1024 65535,再运行 sysctl -p
net.ipv4.tcp_tw_reuse = 1(要求 net.ipv4.tcp_timestamps = 1,现代内核默认已开)——它允许内核在时间戳校验安全前提下,把 TIME_WAIT 端口立刻用于新连接(仅对客户端 connect 有效)哪怕开了 reuse,大量短连接仍会短暂卡住端口。配合以下手段进一步缓解:
net.ipv4.tcp_fin_timeout = 30
tcp_tw_recycle(已废弃且 NAT 下必出问题,Linux 4.12+ 内核移除,设为 0 更安全)flock 或临时锁文件串行化,避免连接数指数级增长优化后要持续盯住关键指标:
ss -ant state time-wait | wc -l,应明显低于端口上限(如扩到 64k 后,稳定在 5k 以内较健康)cat /proc/sys/net/ipv4/ip_local_port_range
lsof -p $(pgrep -f "curl.*your-target") -iTCP,确认连接是否复用(源端口重复出现)