首页/网络/抓包与流量分析速查/TCP 临时端口与耗尽
TCP 流分析82 条

TCP 临时端口与耗尽

客户端连接用的本地端口来自临时端口范围(net.ipv4.ip_local_port_range):短连接高频场景可能端口耗尽,表现为建连随机失败(EADDRNOTAVAIL)。

临时端口与耗尽

客户端发起连接时本地端口由内核从临时端口范围中挑选,四元组(源地址、源端口、目的地址、目的端口)必须唯一。短连接高频、且目标集中时,可用的本地端口会被正在使用或等待回收的连接占满,新建连接就开始随机失败,应用侧往往只看到笼统的连接失败或「地址不可用」。这类故障的特点是对端一切正常、失败呈间歇分布,用 ss 与内核参数一查即可分辨。

基本信息

适用平台Linux(参数位于 sysctl 的 net.ipv4 命名空间)
查看参数net.ipv4.ip_local_port_range
关联参数net.ipv4.tcp_tw_reuse、net.ipv4.ip_local_reserved_ports
典型错误EADDRNOTAVAIL,表现为建连失败而非超时

典型使用场景

  • 压测或大促期间出现间歇性建连失败,需要对端侧与本地端口两头排查
  • 网关或代理类服务出向连接突然出现失败率上升
  • 确认临时端口范围是否需要扩宽,以及是否与保留端口冲突
  • 分析等待回收状态连接堆积对可用端口的挤占
  • 为连接池配置提供依据:连接复用能显著降低端口压力
  • 对比启用端口复用前后的失败率变化

检查命令

检查命令
sysctl net.ipv4.ip_local_port_range        # 查看可用的临时端口区间
ss -tan | awk '{print $4}' | cut -d: -f2 | sort | uniq -c | sort -rn | head
# 上面统计本地端口的占用分布,集中在区间边缘即可疑
ss -tan state time-wait | wc -l            # 看等待回收的连接规模
ss -s                                      # 汇总视图,先看总量再钻取

ss 输出逐列读法

列含义异常表现
State连接状态大量等待回收状态说明回收跟不上建立
Recv-Q接收队列待读字节持续非零表示应用读取慢
Send-Q发送队列待发字节持续非零表示对端或链路受限
Local Address:Port本地地址与端口端口集中在区间两端说明接近耗尽
Peer Address:Port对端地址与端口目标集中在少数几个对端时更易耗尽
端口耗尽与等待回收状态堆积通常同时出现,两者要一起评估;只扩范围不解决应用连接泄漏,问题会平移而不是消失。
端口复用能缓解出向连接压力,但需要时间戳相关选项配合,改动属于协议栈级操作,验证后再逐步放量。

易错点

  • 把建连失败都归因于对端:端口耗尽的表现是随机失败、对端日志干净,先看本地端口分布再找对端
  • 只调大端口范围:应用侧连接不释放或连接池配置过小,扩范围只是把复发时间推后
  • 忽略保留端口设置:与保留区间重叠会让可用端口比预期更少
  • 用含糊的应用报错下结论:连接失败、超时、拒绝在应用层常混在一起,必须结合抓包与套接字状态判断

数据来源与参考

  • Linux ip-sysctl 文档
  • RFC 6056(端口选择)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌