netstat -s 输出中真正有用的关键字段包括:TCP 块的 active/passive openings、failed connection attempts;UDP 块的 packet receive errors;IP 块的 fragments dropped after timeout;这些字段分别反映连接发起异常、SYN 阶段拒绝、socket 缓冲区溢出或校验失败、IP 分片重组超时等核心问题。

netstat -s 是查看 Linux 网络协议栈统计信息最直接的命令,但它输出冗长、字段含义隐晦,且不同内核版本间计数口径不一致——别硬记,得结合场景看关键字段。
netstat -s 输出里哪些字段真有用
默认执行 netstat -s 会按协议(IP、ICMP、TCP、UDP)分块输出,每块包含“输入/输出”“成功/失败”“重传/丢弃”等维度。实际排查时重点关注:
-
TCP块里的active connections openings和passive connection openings:前者是本机主动发起的连接数(如 curl、wget),后者是被客户端连上的监听连接数(如 nginx、sshd)。两者长期悬殊过大,可能说明服务端没被正常访问,或客户端连接逻辑异常。 -
TCP块里的failed connection attempts:不是“连接超时”,而是内核在 SYN 阶段就拒绝的次数(比如全连接队列满、SYN Cookies 关闭且半连接队列溢出)。值持续上升要立刻查ss -lnt的Send-Q和/proc/sys/net/ipv4/tcp_max_syn_backlog。 -
UDP块里的packet receive errors:通常对应recv() failed类应用层错误,但根源常是 socket 缓冲区溢出(net.core.rmem_default太小)或 UDP 包校验失败(网卡 offload 异常)。 -
IP块里的fragments dropped after timeout:说明有 IP 分片重组超时,多见于防火墙策略拦截了后续分片,或中间设备 MTU 不一致。
为什么 netstat -s 的数字和 /proc/net/snmp 对不上
/proc/net/snmp 是内核导出的原始 SNMP 计数器,而 netstat -s 是对它的格式化封装,二者底层来源相同,但存在三处关键差异:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 计数时机不同:
/proc/net/snmp统计的是协议栈各层入口/出口点的原始计数;netstat -s会对部分字段做聚合(如把多个 ICMP 类型错误合并为ICMP messages),还会跳过某些调试用字段。 - 单位不统一:
netstat -s中的segments sent out是 TCP 层的 segment 数,而/proc/net/snmp的TcpOutSegs含义一致;但netstat -s的datagrams在 UDP 块中指应用层报文数,/proc/net/snmp的UdpInDatagrams才对应,UdpNoPorts却不会出现在netstat -s的 UDP 错误汇总里。 - 权限影响:
netstat -s普通用户可执行,但部分字段(如涉及进程上下文的丢包原因)会被静默过滤;/proc/net/snmp则完全暴露,需自行解析。
替代方案:什么时候该换 ss 或 /proc 直读
netstat -s 适合快速概览,但以下情况必须绕开它:
- 想确认某个具体错误是否真实发生:比如怀疑
UDP port unreachable,netstat -s只显示UDP: packet receive errors总数,而cat /proc/net/snmp | grep UdpInErrors能看到UdpNoPorts是否上涨。 - 生产环境高频调用:
netstat -s解析开销大,尤其在高连接数机器上易卡顿;ss -s输出极简(只含 ESTAB/CLOSED/ORPHAN 连接数),awk '{print $2}' /proc/net/snmp提取指定字段也更快。 - 需要时间序列对比:
netstat -s无增量模式,两次执行需人工 diff;而watch -n 1 'cat /proc/net/snmp | grep TcpOutSegs'可直观观察每秒发包速率变化。
真正难的不是看懂 netstat -s 的字段名,而是理解每个数字背后对应的内核路径——比如 retransmitted 来自 tcp_retransmit_skb(),embryonic RST 来自 tcp_send_active_reset()。没 debug 过协议栈的人,很容易把计数增长归因为“网络差”,其实只是应用层 close() 调用缺失导致 TIME_WAIT 积压,进而挤占了半连接队列空间。

















