网络问题排查的本质是“看数据包怎么走的、在哪里丢了、为什么慢了”。netstat 和 ss 帮你查看连接状态和统计信息,tcpdump 和 Wireshark 让你深入数据包内部观察每一个细节。本文详细讲解这四款工具的核心用法、TCP 状态机的实际意义、以及如何通过抓包分析定位网络延迟和丢包问题。
一、netstat vs ss:连接状态查看器
1.1 netstat(经典但已过时)
netstat 是传统的网络统计工具,但它逐行读取 /proc/net/ 下的文件,在连接数较多时(如 > 1000)性能极差,且输出信息有限。
常用命令:
# 查看所有监听端口
netstat -tulnp
# 查看所有 TCP 连接
netstat -ant
# 查看网络统计信息(重传、丢包等)
netstat -s
1.2 ss(现代替代,推荐)
ss(Socket Statistics)直接通过内核的 Netlink 接口获取数据,速度快、信息丰富,是 netstat 的完全替代品。
常用命令:

示例输出:
$ ss -ti
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.1.100:5432 192.168.1.50:45678
cubic wscale:7,7 rto:204 rtt:0.5/0.25 cwnd:10 send 10.0Mbps rcv_space:14600
关键信息:
cwnd:拥塞窗口大小。如果很小(如 2-3),说明网络拥塞或发送端受限。
rtt:往返时间。持续增大说明网络延迟增加。
rto:重传超时时间。频繁超时说明丢包严重。
1.3 TCP 状态机与常见问题状态
TCP 连接在不同阶段会处于不同的状态。理解这些状态是排查连接问题的基本功。
text
[CLOSED] –(主动打开)–> [SYN_SENT]
[LISTEN] –(被动打开)–> [SYN_RECV] –(三次握手完成)–> [ESTABLISHED]
[ESTABLISHED] –(主动关闭)–> [FIN_WAIT_1] –> [FIN_WAIT_2] –> [TIME_WAIT] –> [CLOSED]
[ESTABLISHED] –(被动关闭)–> [CLOSE_WAIT] –> [LAST_ACK] –> [CLOSED]
需要重点关注的状态:

TIME_WAIT 调优(适用于高并发短连接场景):
# 启用 TCP 时间戳,允许 TIME_WAIT 复用(需谨慎,仅在 NAT 环境外使用)
sysctl net.ipv4.tcp_tw_reuse=1
# 注意:tcp_tw_recycle 已在 Linux 4.12+ 中移除,不再使用。
二、tcpdump:命令行抓包神器
tcpdump 是 Linux 上最强大的命令行抓包工具,适合在无法使用图形界面的服务器上排查网络问题。
2.1 基本用法
# 抓取所有经过 eth0 接口的包(-i 指定网卡)
tcpdump -i eth0
# 抓取特定主机的包
tcpdump host 192.168.1.100
# 抓取特定端口的包
tcpdump port 80
# 抓取 TCP 包并显示详细信息(-v 详细,-n 不解析域名)
tcpdump -i any -nn -v tcp port 443
2.2 常用过滤器(BPF 语法)
![过滤器含义
host 10.0.0.1源或目标 IP 为 10.0.0.1
src host 10.0.0.1源 IP 为 10.0.0.1
dst port 80目标端口为 80
tcp[tcpflags] & tcp-syn != 0抓取 TCP SYN 包(三次握手)
icmp抓取 ICMP 包(如 ping)
not arp排除 ARP 广播包](https://i-blog.csdnimg.cn/direct/cdc1c43b9cae45eea2342eadba2f8d38.png)
2.3 保存和读取 pcap 文件
# 抓包并保存到文件(-w 写入)
tcpdump -i eth0 -w capture.pcap
# 读取 pcap 文件(-r 读取)
tcpdump -r capture.pcap
# 限制抓包数量(-c 100 表示只抓 100 个包)
tcpdump -c 100 -w sample.pcap
2.4 实战:抓取 TCP 三次握手
tcpdump -i any -nn 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0' -c 10
输出示例:
text
13:45:01.123456 IP 192.168.1.10.54321 > 10.0.0.1.80: Flags [S], seq 123456789
13:45:01.123567 IP 10.0.0.1.80 > 192.168.1.10.54321: Flags [S.], seq 987654321, ack 123456790
13:45:01.123678 IP 192.168.1.10.54321 > 10.0.0.1.80: Flags [.], ack 987654322
[S] = SYN(发起连接)
[S.] = SYN-ACK(响应连接)
[.] = ACK(确认)
如果只看到 [S] 而没有 [S.] 和 [.],说明对端未响应——可能是防火墙拦截或服务未启动。
三、Wireshark / TShark:数据包分析的高级武器
Wireshark 是图形化的网络分析工具,功能强大,适合从 pcap 文件中进行深入分析。在无图形界面的服务器上,可使用其命令行版本 tshark。
3.1 安装
# Ubuntu/Debian
sudo apt install wireshark tshark
# CentOS/RHEL(需 EPEL)
sudo yum install wireshark
3.2 tshark 命令行用法(远程服务器适用)
# 抓包并保存为 pcap(相当于 tcpdump)
tshark -i eth0 -w capture.pcap
# 读取 pcap 并显示层级信息(-Y 过滤)
tshark -r capture.pcap -Y "tcp.port==80" -T fields -e ip.src -e tcp.srcport -e tcp.flags
3.3 Wireshark GUI 核心功能
专家信息(Expert Info) :自动标记出重传、零窗口、Dup ACK 等异常事件。打开方式:分析 -> 专家信息。
TCP 流图(TCP Stream Graph) :绘制 TCP 序列号随时间的变化曲线,直观判断是否有重传或乱序。打开方式:统计 -> TCP 流图。
时间线分析:查看数据包之间的间隔,快速发现延迟点。
四、实战案例:Nginx 响应慢,用 tcpdump 定位重传
现象:用户反馈 Nginx 服务偶尔响应很慢,但 top 和 iostat 都显示正常。
排查步骤:
在 Nginx 服务器上抓包(持续 30 秒,捕获端口 80 或 443):
bash
tcpdump -i any port 80 -w nginx-slow.pcap
用 Wireshark 打开 nginx-slow.pcap,打开 专家信息(Expert Info) 。
观察是否有大量 TCP Retransmission(重传)或 Zero Window(零窗口)。
如果发现大量重传:说明网络层有丢包,需检查交换机或防火墙。
如果发现零窗口:说明 Nginx 应用读取速度跟不上发送速度(接收缓冲区满),需检查 Nginx 配置(如 proxy_buffer)或后端应用响应速度。
进一步分析:用 TCP 流图 查看序列号抖动,判断延迟是发生在三次握手阶段(连接建立慢)还是数据传输阶段(数据发送慢)。
五、小结
netstat 已过时,ss 是更快的现代替代,重点查看 TIME_WAIT(端口耗尽)和 CLOSE_WAIT(代码 bug)。
tcpdump 是服务器端抓包的必备工具,结合 BPF 过滤器可精准捕获目标流量。
Wireshark/tshark 提供专家级的分析能力,自动识别重传、零窗口等异常。
核心排查路径:先用 ss 查看连接状态和统计信息 → 发现异常后用 tcpdump 抓取数据包 → 用 Wireshark 深入分析包级细节。
