首页/网络/网络排障速查/ss -o:查看 TCP 定时器与重传

ss -o:查看 TCP 定时器与重传

连接卡住时用 -o 看内核在等什么:keepalive 探活倒计时、TIME-WAIT 剩余、重传定时器与已重传次数,直接读出内核状态。

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

ss -o 是什么

连接卡住时,单看 ESTAB 状态会得出错误结论:内核可能正在反复重传。ss 加 -o 会打印每条连接的定时器信息,直接读出内核在等什么——keepalive 探活倒计时、TIME-WAIT 剩余时间、未确认数据的重传计时以及已重传次数。配合 -t 只看 TCP、-n 不做解析,是判断『表面上连接还在、实际已经不通』最快的方式。

基本信息

适用平台Linux(iproute2 的 ss,内核 4.x 以上输出稳定)
关键选项-t TCP、-o 定时器、-n 数字显示、state 过滤
判读重点定时器类型、剩余时间、第三个数字(重传次数)
配套查看ss -i(拥塞与 RTT)、netstat -s/nstat(累计重传计数)

典型使用场景

  • 业务报『连接无响应』:确认内核是否已在重传并累计失败
  • 数据库连接异常断开:看 keepalive 间隔与探活配置是否与中间设备的老化时间冲突
  • TIME-WAIT 堆积:确认剩余时间与回收策略,判断端口耗尽风险
  • 区分两类『卡住』:应用没读数据(窗口相关)与网络丢包(重传相关)

查看定时器

查看定时器
# 只看已建立连接并带定时器
ss -ton state established | head -20
# 输出示例:
# ESTAB 0 0   10.0.0.5:22   10.0.0.9:51422  timer:(keepalive,118min,0)
# ESTAB 0 132 10.0.0.5:443  10.0.0.30:49110 timer:(on,394ms,0)
# ESTAB 0 0   10.0.0.5:3306 10.0.0.8:40001  timer:(timer,1min28sec,8)
# 只看与某个对端的连接
ss -ton state established '( dport = :3306 )'

定时器判读

输出含义处置建议
timer:(keepalive,118min,0)keepalive 探活,118 分钟后触发正常空闲连接,不要误判为即将断开
timer:(on,394ms,0)有未确认数据,等待 ACK 或重传计时结合 Send-Q 判断是拥塞还是对端无响应
timer:(timer,1min28sec,8)重传定时器,第三个数字 8 表示已重传 8 次重点嫌疑:链路或对端实际不通
Send-Q 持续不为 0应用写出的数据未被确认对照 timer 与重传次数判断方向
重传次数达到 net.ipv4.tcp_retries2(默认 15,对应约十几分钟到几十分钟)后内核才放弃连接,应用侧表现为 ETIMEDOUT。因此『连接还在』与『连接可用』是两件事。
排查时不要只看连接状态列:ESTAB 只说明状态机处于已建立,重传中的连接同样显示 ESTAB。必须结合 -o 的定时器与 -i 的 RTT 一起看。

易错点

  • 忽略正在重传的连接:表面是 ESTAB,实际早已不通,把排查方向引向应用层
  • 把 keepalive 倒计时当作即将断开:误判为连接异常,浪费大量排查时间
  • 忘记加 -n:DNS 故障时 ss 自己做反向解析会明显卡顿,拖慢现场取证
  • 只看单机 ss:连接卡住可能是对端未读数据导致窗口变小,需两端对照
  • 忽略 tcp_retries2 的等待时长:以为『没报错就是正常』,实际内核还在慢慢重试

数据来源与参考

  • man 8 ss(iproute2)
  • RFC 6298:TCP 重传计时器

相关工具

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