在定位网络或应用问题时,tcpdump 是工程师的第一道利器:它能在流量发生处立刻抓取原始包,为后续在 Wireshark 中做深度分析提供证据。本文从实战出发,讲清常用命令与过滤器、如何把抓到的 pcap 快速定位到"重传 / 握手 / RST / 分片 / MTU"类问题,给出系统化排查流程,并说明在 iOS 真机或代理不可用时如何用 USB 直连抓包工具作为补充(如抓包大师 Sniffmaster),把诊断做到端到端。
一、抓包准备与基本命令
抓包前先确认抓点(客户端 / 服务端 / 网关)与时间窗口。常用命令:
bash
# 抓指定主机与端口,完整包,写入文件
sudo tcpdump -i eth0 host 10.0.0.5 and port 443 -s 0 -w /tmp/cap.pcap
# 环形缓冲:每个文件 100MB,保留 10 个
sudo tcpdump -i any -s 0 -C 100 -W 10 -w /tmp/cap%03d.pcap
-s 0
是关键,确保抓取完整报文以便 TLS/HTTP 重组。若只需头部,可把 snaplen 缩小以节省 IO。
二、实用过滤表达式与快速查看
显示层过滤常用:
tcp
、udp
、icmp
:按协议筛选。tcp[tcpflags] & (tcp-syn) != 0
:只看 SYN 包(握手)。host a.b.c.d and port 80
:按主机端口过滤。
抓取后用 Wireshark 的 Follow TCP Stream、tcp.analysis.retransmission
、tcp.analysis.duplicate_ack
快速定位问题流。
三、典型问题的抓包判断逻辑
- 连接建立慢 / 无法建立:看三次握手(SYN → SYN/ACK → ACK)是否完整。若 SYN 无响应,先检查防火墙/路由。
- 大量重传或重复 ACK:表示链路丢包或中间设备丢弃包,观察重传发生点并在多点抓包对比。
- RST/FIN 频繁:应用主动断开或中间设备强制 reset,查看携带的 TCP code 与时间点对应的服务日志。
- 大包丢失 / 分片问题 :观察是否出现
ICMP Fragmentation Needed
,并检查 Path MTU。 - TLS 握手失败但 TCP 完成 :用 Wireshark 检查 TLS Alert(如
bad_certificate
)或 ClientHello/ServerHello 差异,判断是否为证书/ALPN/cipher 不兼容。
四、多点抓包与对比法
最可靠的方法是"客户端、中间节点、服务端"三点同时抓包,然后对比序号与时间线:如果客户端发送但中间未见,问题在接入链路;若中间可见但服务端未见,问题在上游设备。用 tshark -r cap.pcap -Y "tcp.analysis.retransmission"
批量统计重传率,做量化判断。
五、移动真机与代理受限场景的补充手段
当目标是 iOS 真机 App,且代理(Charles / mitmproxy)因 Pinning / mTLS 无法解密时,仍需底层证据。此时可以:
- 在服务端与近源处抓 tcpdump;
- 同时用 USB 直连工具从设备侧抓包,导出 pcap,再在 Wireshark 中对比 ClientHello、SNI 与 TLS Alert。
像 抓包大师(Sniffmaster) 等工具支持 USB 直连 iOS,并能按 App 过滤流量、导出 pcap,使你在不修改 App、无需越狱的前提下得到设备侧原始包,极大方便在 Pinning 或企业网络干扰场景下的定位。
六、实战排查流程(模板化)
- 明确问题与复现步骤,设定时间窗口。
- 在最接近问题的一端抓包(
-s 0
、限流过滤),同时在另一端抓取对比包。 - 用 Wireshark 检查三次握手、重传、Dup ACK、TLS 握手与 Alert。
- 若怀疑 MTU/分片或 ICMP,搜索相应 ICMP 消息并做
ping -M do -s
测试。 - 汇总 pcap、服务日志与时间戳,定位到网络设备或应用逻辑并给出修复建议(例如调整 MSS、修复防火墙规则、优化重试策略)。
七、合规与工程化建议
抓包会暴露敏感数据(token、个人信息),生产抓包前务必审批并做脱敏。把标准抓包脚本、过滤器与分析模板纳入团队知识库,定期用自动化脚本统计重传率、握手失败率并上报告警,形成闭环运维能力。