netstat -s 输出的是协议层错误分类统计,而非连接中断日志;它仅提供tcp/udp等协议的累计错误计数(如重传、syn超时、rst收发次数),无时间戳、ip或进程上下文,需结合/proc/net/snmp、tcpdump等工具定位具体中断原因。

netstat -s 输出的是协议层错误分类,不是连接中断日志
很多人以为 netstat -s 能直接列出“某次连接何时因何中断”,其实它只统计内核协议栈各层的累计错误事件,比如 TCP 重传、SYN 超时、RST 收发次数等。这些是分类汇总值,没有时间戳、源/目标 IP 或进程上下文。
关键点在于:netstat -s 的输出按协议分块(TCP、UDP、ICMP 等),每块里是计数器总和。例如 TCP 段里的 timeouts 表示 SYN 或重传超时总次数,retransmits 是重发报文总数——它们反映的是稳定性趋势,不是单次异常记录。
-
netstat -s必须 root 权限才能看到完整统计,否则部分字段(如某些 TCP 错误)可能为 0 - 输出中 “failed connection attempts” 和 “connection resets” 是排查主动断连的重点项
- UDP 块里的 “packet receive errors” 多由校验失败或缓冲区溢出引起,和 TCP 的重传机制无关
- 若发现
TCPSynRetrans高但TCPEstabResets低,说明问题集中在建连阶段(网络延迟或防火墙拦截),而非应用层主动关闭
/proc/net/snmp 和 /proc/net/netstat 提供更细粒度的 TCP 状态跃迁统计
这两个文件比 netstat -s 更底层,字段名更明确,适合写脚本做差值分析。比如 /proc/net/snmp 的 TCP 行包含 EstabResets(被动关闭连接数)、AttemptFails(SYN 发出后无响应)、RetransSegs(重传段数);而 /proc/net/netstat 还额外提供 TCPFastRetrans、TCPSlowStartRetrans 等细分类型。
注意:这些数值都是自启动以来的累加值,必须两次读取算差值才有意义。例如:
awk '$1=="Tcp:" {print $15,$16}' /proc/net/snmp # 输出 EstabResets 和 AttemptFails 当前值
-
AttemptFails持续上升 → 客户端发 SYN 后没收到 SYN-ACK,可能是目的端口未监听、防火墙丢包或路由不可达 -
EstabResets高于PassiveOpens→ 对端频繁 RST,常见于服务进程崩溃、负载过高被 kill 或连接池强制回收 -
TCPSynRetrans和TCPRetransSegs同时高 → 网络路径存在丢包,需结合 ping / mtr 判断中间节点 - 容器环境里
TCPRetransSegs异常但宿主机正常 → 问题在 veth pair 或 CNI 插件队列,不是物理网卡
真正定位“具体哪次中断”的唯一办法是抓包 + 连接状态回溯
netstat 类命令无法告诉你“192.168.1.100:52341 在 14:22:33 断开了,原因是 RST from 10.0.2.5”,这种粒度需要 tcpdump 或 ss -i 配合时间戳。
实操建议:
- 先用
ss -tni查看当前 ESTABLISHED 连接的重传队列(rtt、rto、qloss字段),有丢包迹象再抓包 - 对可疑端口抓包:
tcpdump -i eth0 'port 8080 and (tcp[tcpflags] & (tcp-rst|tcp-fin) != 0)' -w rst.pcap,过滤出带 RST/FIN 的包 - 用
tshark -r rst.pcap -T fields -e ip.src -e ip.dst -e tcp.flags.reset -e frame.time提取 RST 时间点和双方 IP - 如果中断发生在 TLS 握手后,
tcpdump只能看到 FIN/RST,得靠应用日志或openssl s_client -debug查证书/ALPN 协商失败
别依赖 netstat -i 看连接中断,它只统计链路层帧错误
netstat -i 显示的是接口收发包、错误、丢弃的总量,对应 OSI 第二层(MAC 层)。它里面的 errs、drop 是网卡驱动或内核收包队列的问题,比如 RX ring buffer 溢出、DMA 失败、CRC 校验错——和 TCP 连接是否中断没有直接因果关系。
常见误解:
- 看到
eth0的rx_errs高,就认为是“连接频繁中断”,其实可能只是交换机端口 CRC 错误多,上层 TCP 会自动重传掩盖掉 -
tx_dropped非零 ≠ 连接断开,它表示内核发送队列满后丢弃待发包,通常意味着本地处理不过来(CPU 或软中断瓶颈),而非链路故障 - 想确认物理链路是否稳定,必须用
ethtool eth0看Link detected和Speed,不是netstat -i - 容器里
netstat -i显示高tx_dropped,大概率是宿主机br0或veth的 txqueuelen 设置过小,调大ip link set dev vethxxx txqueuelen 10000再观察
真实场景中,连接异常中断的根因往往藏在协议栈不同层级的交叉线索里:/proc/net/snmp 里的重传计数、tcpdump 抓到的 RST 包方向、应用日志中的 close_notify 记录,三者对齐才能下结论。单靠一个命令的统计报表,永远只能看到拼图的一角。











