ss -o 不显示重传次数等统计值,仅通过 timer:(类型,剩余时间,重试次数) 显示 tcp 计时器状态,如 retrans、keepalive 等;准确重传统计需查 /proc/net/snmp 或 /proc/net/netstat。

ss -o 命令本身并不直接显示“计时器状态”和“重传信息”。这是常见的误解。实际起作用的是 ss -o 中的 -o 选项(即 --options),它用于显示 TCP 连接的 **计时器(timers)** 相关字段,例如重传定时器(retransmit timer)、持续定时器(persist timer)、保活定时器(keepalive timer)等,但不显示重传次数、已重传字节数等统计值——这些属于内核网络栈的内部状态,ss 默认不暴露。
TCP 计时器在 ss -o 输出中的含义
执行 ss -tno(-t 表示 TCP,-n 禁用解析,-o 显示计时器)后,每行末尾会出现类似:
timer:(on,248ms,0)
timer:(retrans,264ms,0)
其格式为:timer:(类型,剩余时间或间隔,重试次数),其中:
-
类型:常见有
on(通用定时器,多为重传相关)、retrans(明确重传定时器)、keepalive(保活)、persist(零窗口探测)、time_wait(TIME-WAIT 超时) -
剩余时间/间隔:单位是毫秒(ms)或分(min),表示该定时器下次触发前还剩多久;对
retrans来说,通常是当前 RTO(Retransmission Timeout)值 -
第三个数字:通常为 0;在部分内核版本中,对
retrans类型可能表示已发生的重传次数(但非常有限且不可靠,不建议依赖)
为什么看不到准确的重传统计?
ss 是连接快照工具,不是性能监控接口。真正记录重传行为的是:
-
/proc/net/snmp中的Tcp:行(如RetransSegs全局累计重传段数) -
/proc/net/netstat中的TcpExt:行(如TCPTimeouts、TCPRetransFail) -
netstat -s -t可汇总输出上述统计(但已逐步被弃用) - 更细粒度可使用
tcpdump或bpftrace实时捕获重传报文
如何结合 ss -o 定位潜在重传问题?
虽然不能直接看到“重传了几次”,但 ss -o 的计时器字段能反映连接是否处于异常等待状态:
- 若看到 timer:(retrans,1ms,0) 或极短时间(如
- 若大量连接显示 timer:(on,1000ms,0) 且长时间不变,可能是对端失联,本地反复超时重发
- timer:(keepalive,7200s,0) 正常;若突然变为 timer:(keepalive,15s,0),说明保活探测失败,连接可能已断
- 搭配
ss -tni查看rtt、rto、q(发送队列长度)、wscale等字段,综合判断拥塞或接收窗口问题
替代方案:获取真实重传数据
要获得可靠重传指标,请用以下命令:
- 查看全局 TCP 重传段总数:
awk '/RetransSegs/ {print $2}' /proc/net/snmp - 查看扩展 TCP 统计(含超时、SYN 重传等):
awk '/TCPTimeouts|TCPSynRetrans/ {print}' /proc/net/netstat - 实时观察某连接的重传行为(需 root):
sudo ss -ti 'dport = :80'→ 注意retrans字段(较新内核支持,非所有版本可用) - 用
cat /proc/net/snmp | grep -A1 Tcp对比前后差值,估算周期内重传增量










