网络抓包实战:从 pcap 定位协议问题
更新时间:2026-09-17。网络协议域·实践。命令参数全集见 tcpdump 命令,本篇聚焦"抓什么、怎么过滤、在 Wireshark 里怎么看",并把前面各协议篇对号入座。
抓包是网络排障的终极手段:当 ping、ss、日志各执一词时,报文是地面真相。典型工作流是 tcpdump 在服务器/网关上抓并存成 pcap → 拖到 Wireshark 分析(或直接 tshark)。
一、tcpdump:先抓对、存下来
bash
# 抓某主机某端口,写文件(-s0 整包,-w 存 pcap),后台不解析名字(-nn)更快
sudo tcpdump -i any -nn -s0 -w /tmp/app.pcap host 10.0.0.5 and tcp port 443
# 常用过滤(BPF 表达式)
tcpdump -nn 'tcp port 8080'
tcpdump -nn 'host 10.0.0.5 and not port 22'
tcpdump -nn 'tcp[tcpflags] & tcp-syn != 0' # 只看 SYN(建连尝试)
tcpdump -nn 'icmp' # ping / ICMP 差错(见 ICMP 篇)
tcpdump -nn 'udp port 53' # DNS 查询
tcpdump -nn -A -s0 'tcp port 80' # -A 直接看 HTTP 明文内容要点:
- 先确定在哪一侧抓:客户端、服务端、还是中间网关——两端都抓能区分"包没发出"还是"发出没回来/被 RST"。
- 高流量环境尽量用精确的 host/port 过滤,避免抓太多;环形抓取
-C/-W防写满磁盘。 - 容器里抓要选对网卡(veth/bridge),或在宿主
any上按端口过滤。
二、Wireshark:显示过滤与核心视图
打开 pcap 后,显示过滤器(与 BPF 抓包过滤语法不同)常用:
bash
tcp.port == 443 && ip.addr == 10.0.0.5
tcp.flags.syn == 1 && tcp.flags.ack == 0 # 纯 SYN
tcp.analysis.retransmission # 重传
tcp.analysis.zero_window # 零窗口
tcp.analysis.duplicate_ack # 重复 ACK
tls # TLS 握手/记录
http # HTTP 请求响应
dns && dns.qry.name contains "example"
quic # HTTP/3 流量(UDP)- Follow → TCP Stream / TLS Stream:把一条连接的双向字节按顺序拼起来,是看"请求/响应到底发了什么、粘在哪"最快的方法(对照粘包拆包)。
- Statistics(统计)菜单:Conversations(谁和谁、字节/包数)、IO Graph(流量/重传随时间)、TCP Stream Graphs(RTT、吞吐、窗口)、Expert Information(异常告警汇总)。
- 颜色与
tcp.analysis.*:Wireshark 会自动标注重传、乱序、重复 ACK、零窗口等,优先看红色/黑色条目。
三、按问题类型对号入座
1. 建连慢/连不上:看握手
- 过滤 SYN,确认三次握手(SYN、SYN/ACK、ACK)是否完整、每跳间隔多久(见三次握手)。
- 只有 SYN 没有 SYN/ACK:服务没监听、被防火墙 DROP、或路由/ARP 问题(用 ss 确认监听、arp 解析)。
- 回 RST:端口未监听、连接已关闭、被重置;大量 RST 配合应用日志判断。
- SYN 到 SYN/ACK 间隔大:服务端 accept/全连接队列或负载问题。
2. 传数据卡顿:重传、RTT、窗口
tcp.analysis.retransmission密集、RTT 尖峰:网络丢包或拥塞,重传把丢包变成延迟(见重传与 RTO、拥塞控制)。zero_window/win=0:接收方应用读得慢(流控问题,见滑动窗口),查对端进程。- 一个段丢失后多条流一起卡:HTTP/2 over TCP 的 TCP 层队头阻塞(见 HTTP/2)。
- 稳定 ~40ms 才发下一段:Nagle 与延迟 ACK 交互(见 Nagle)。
3. TLS/HTTPS 问题
- Follow/TLS 视图看协商的版本(TLS 1.3?)、密码套件、证书链是否完整、ServerName(SNI),对照 TLS 握手、TLS 1.3、证书链。
- 握手 RTT 长、证书包多:见 HTTPS 性能;证书状态可看 OCSP/stapling。
- 告警(Alert:bad certificate、handshake failure、protocol_version)直接指向证书/版本/套件不匹配。
解密 HTTPS:让客户端把会话密钥写出来(设置环境变量 SSLKEYLOGFILE=keys.log,浏览器/curl/部分程序支持),Wireshark 在 TLS 协议设置里指定该 keylog 即可解密。ECDHE/TLS1.3 下仅有服务器私钥无法解密历史流量(前向保密,见 加密速览),必须靠 keylog。QUIC/HTTP3 同理且需开启对应 dissector;生产环境注意密钥日志的合规与清理。
4. DNS、HTTP 应用层
dns:查询/响应耗时、返回 A/AAAA/CNAME 链、是否 NXDOMAIN/负缓存(见 DNS 解析)。http/Follow Stream:请求行、Host、Connection、Content-Length/chunked、状态码、是否 keep-alive 复用(见 HTTP/1.1、keep-alive)。- 大请求/大响应卡住:结合 MTU/PMTUD,怀疑分片黑洞时用
ping -M do -s验证。
四、抓包注意事项
- 只在授权范围内抓包,pcap 可能含敏感数据/凭据(即使 TLS,元数据也敏感),妥善存放和销毁。
- 抓包本身有开销,生产用精确过滤、采样或镜像口;时钟要准(多端对比时对时)。
- 注意时间基准与方向,善用 Wireshark 的"设置时间参考"和会话着色。
- 抓不全(snaplen 太小、丢包计数
tcpdump统计 "packets dropped by kernel")会导致误判,适当增大缓冲-B。
相关阅读
总结
抓包实战 = 用 tcpdump 带精确 BPF 过滤在正确的一侧抓全并存 pcap(-s0 -w),再在 Wireshark 用显示过滤、Follow Stream 和统计/TCP 图分析:SYN 看建连、retransmission/dup-ACK/zero-window 看丢包与流控、TLS 版本/证书/Alert 看握手,HTTP/DNS 看应用层;解密 ECDHE/1.3/QUIC 必须靠 SSLKEYLOGFILE 而非服务器私钥,全程注意授权与 pcap 敏感数据。