连接状态一览是什么
一条连接在其生命周期中的每个时刻都处于某个确定状态,状态机共定义了十一个状态。查看连接的命令里那一列状态名,就是这些取值。它是服务排查里信息密度最高的字段之一:只看连接总数往往看不出问题,按状态分组统计却能立刻指出是建连失败、连接泄漏还是端口耗尽。理解每个状态归属哪一方、什么时候出现,比记住状态名字更重要。
基本信息
| 数量 | 状态机共十一个状态 |
|---|---|
| 表示 | 连接查看工具中的状态列 |
| 读取方式 | 按状态分组统计,而不是只看总数 |
| 关键区分 | 同一状态名在监听侧与连接侧含义不同 |
| 常用统计 | 按状态计数并排序,能快速看出异常聚集 |
十一个状态
| 状态 | 含义 | 典型所在方 |
|---|---|---|
| 已关闭 | 不存在连接或已完全释放 | 无 |
| 监听 | 等待入站连接 | 服务端 |
| 已发同步 | 已发出建连请求,等待对方回应 | 客户端 |
| 已收同步 | 收到建连请求并已回应 | 服务端 |
| 已建立 | 连接可用,可收发数据 | 双方 |
| 关闭等待一 | 已发出结束标志,等待对方确认 | 主动关闭方 |
| 关闭等待二 | 已收到确认,等待对方发出结束标志 | 主动关闭方 |
| 等待本端关闭 | 收到对方结束标志,等待本端应用关闭 | 被动关闭方 |
| 同时关闭 | 双方同时发出结束标志的少见情形 | 双方 |
| 最后确认 | 本端也不发了,等待对方最后确认 | 被动关闭方 |
| 停留等待 | 等待两倍报文最大生存时间后彻底释放 | 主动关闭方 |
按状态统计
按状态统计
ss -tan | awk 'NR>1{print $1}' | sort | uniq -c | sort -rn # 一眼看清各状态分布
ss -tan state time-wait | head # 只看停留等待的连接
ss -lntp | wc -l # 监听端口数量,确认服务是否都在听异常状态怎么定位
- 大量等待本端关闭:应用没有及时关闭连接,属于应用层问题
- 大量已发同步:对端不响应或中间设备丢包,连接建立不起来
- 大量关闭等待二:对端长时间不发出结束标志,通常是对方实现有问题
- 大量停留等待:短连接高频且主动关闭,端口与连接跟踪表压力大
同一个状态名在不同角色下含义不同:监听状态的接收队列表示已完成建连但未被应用接收的连接数,而连接状态的接收队列表示应用还没读走的字节数,读串了会得出完全相反的结论。
等待本端关闭的连接持续堆积是应用没有关闭连接(代码或连接池问题),不是内核或网络问题,调内核参数治不了,必须回到应用侧修。