首页/网络/网络排障速查/本地端口耗尽(Cannot assign requested address)

本地端口耗尽(Cannot assign requested address)

客户端报 connect: Cannot assign requested address 多为本地临时端口用尽:短连接频率乘保持时间超出端口池容量;靠 tw_reuse、扩大端口范围与连接池三管齐下解决。

网络排障速查网络更新于 2026-10-13

本地端口耗尽是什么

客户端报「无法分配请求地址」时,多半不是对端拒绝,而是本机的临时端口用尽了:本地端口池大小有限,短连接频率乘以连接保持时间超过池容量,就会出现无法建立新连接的报错。这个报错出现在本机侧,与服务端是否监听无关。判断的关键是同时满足两个条件——处于回收态的连接数接近端口池上限,且报错集中在高频外连的进程上。

基本信息

典型报错绑定或连接时提示无法分配请求地址
资源对象本地端口池,默认约 2.8 万个,可用内核参数查看实际范围
缓解方向扩大端口范围、启用连接复用、改长连接或用连接池
本质只有到同一目标的四元组才真正争抢端口
验证方式同时看回收态连接数量与报错进程,必要时再用聚合分布确认

典型使用场景

  • 短连接密集型服务运行一段时间后开始报无法连接,重启即恢复
  • 压测或活动期间客户端报连接失败,服务端却一切正常
  • 网关与代理设备在高并发下出现零星建连失败
  • 判断整改是否有效:改用连接池后观察报错是否消失
  • 容量评估:用连接速率与保持时间估算需要多大的端口池

确认与量化

确认与量化
curl -sS -o /dev/null --connect-timeout 3 http://<目标>:80/; echo "rc=$?"   # 复现报错
ss -s | grep -i timewait                     # 回收态连接总量
ss -Htan state time-wait | wc -l             # 精确计数回收态连接
ss -Htan '( dport = :80 or dport = :443 )' | wc -l   # 到特定目标的连接数
cat /proc/net/sockstat | grep -i tcp         # 内核侧套接字使用统计
sysctl net.ipv4.ip_local_port_range          # 本地端口池范围
ss -tanp | awk '{print $NF}' | sort | uniq -c | sort -rn | head   # 按进程聚合找高频外连

判据与动作

判据含义动作
回收态连接数接近端口池上限本地端口池接近用尽扩大端口范围并启用连接复用
报错集中在某几个进程高频外连进程占用大量端口改造成长连接或引入连接池
目标单一且频率高到同一目标的四元组争抢最激烈复用连接或按目标分散出口
报错随机出现在各进程可能是句柄或内存不足核对进程资源上限与其他资源指标
判定方法:同时看到回收态连接数接近端口池上限、且报错集中在高频外连的进程,即可确认;不满足这两个条件时,要排查是否句柄或内存不足等其他资源问题导致建连失败。
只扩大端口范围而不做连接复用,请求速率继续上升后仍会打满,只是把故障推迟。参数的调整要配合应用侧的连接复用一起做,并在调整前后各记录一次基线。

易错点

  • 把该报错当成远端拒绝:它其实是本机资源不足,目标服务可能完全正常
  • 只扩大端口范围不做连接复用,请求量上来后仍会打满
  • 在 IPv6 或容器环境中按 IPv4 的端口池口径估算容量,结论偏乐观
  • 没确认报错进程就重启服务,问题在重启后一段时间复现,排查信息却已丢失
  • 把建连失败一概归因端口耗尽,忽略句柄上限与内存等同样会导致建连失败

数据来源与参考

  • man 7 ip(EADDRNOTAVAIL 语义)
  • Linux 内核文档:ip_local_port_range

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌