TCP 是网络故障排查的第一层:当应用表现为“慢”“丢包”“连接重试”时,先看 TCP。本文从工具、抓取方法、核心指标、典型问题诊断步骤,到与 TLS/HTTPS 交互的分析技巧,给出工程化的实战流程,帮助你把“看不懂的 pcap”变成可执行的定位与落地修复建议。
一、常用工具与抓包方式tcpdump(服务器/命令行首选):轻量、可在生产直接抓包并写 pcap。
示例:tcpdump -i eth0 -s 0 -w /tmp/cap.pcap tcp port 443(抓 443 端口全部 TCP 包)
Wireshark(交互式分析):解析协议层、流重组、统计(IO graph、Expert info)。
tshark / PyShark:脚本化分析与批量处理。
Scapy:造包与测试(TCP RST、伪造重传等)。
Sniffmaster / USB 直连工具:真机(iOS/Android)抓包时能直接导出 pcap,便于分析移动端的 TCP 行为。
二、抓包前的准备与采样建议明确抓包点:是客户端、服务端还是中间网络(负载均衡、NAT)?抓在最接近问题面的位置。
限制范围:按 IP、端口、用户会话过滤,减少噪声。示例:tcpdump -i any host 10.0.0.5 and port 443 -w cap.pcap。
抓完整包:-s 0 捕获完整报文体,便于 TLS/HTTP 分析(若合规允许)。
时间窗口:对重现时段抓取,或用 ring buffer(-W、-C)避免磁盘耗尽。
三、Wireshark 常用过滤与视图显示过滤(Display filter)示例:
tcp.analysis.retransmission:显示被识别的重传包
tcp.analysis.duplicate_ack:重复 ACK,常见接收端通知丢包
tcp.analysis.fast_retransmission:快速重传
tcp.window_size_scalefactor / tcp.window_size_value:窗口相关
Follow TCP Stream(右键)用于按连接重组应用层数据,便于查看请求/响应序列。
IO Graph:观察吞吐随时间的变化,能快速定位抖动/吞吐骤降时刻。
四、核心 TCP 指标与意义三次握手(SYN / SYN-ACK / ACK):握手耗时高提示 RTT 或中间丢包。
重传(Retransmission / Fast Retransmit):说明丢包或接收端未及时 ACK。
重复 ACK(Dup ACK):常见于接收端告知丢失的数据段号。
连接重置(RST) / FIN:连接被主动关闭或异常终止。
TCP 窗口与窗口缩放(Window / Window Scale):小窗口可限速,高延迟下需 window scaling。
拥塞控制事件(慢启动、拥塞避免):拥塞导致吞吐下降,需要观察 cwnd 与 ssthresh(Wireshark 中可见拥塞指示)。
五、典型故障诊断流程(实战步骤)定位症状对应时段的 pcap,用 IO Graph 或过滤时间段。
检查握手与连接建立耗时:若 SYN 后长时间无 SYN-ACK 或 SYN-ACK 丢失,怀疑网络中断或服务器 SYN backlog 问题。
观察重传/重复 ACK:
若大量重传且伴随重复 ACK,说明下游出现丢包;
若重传但无重复 ACK,说明 ACK 丢失或接收端异常。
计算 RTT 与吞吐:Wireshark 能估算 RTT;RTT 高+窗口小直接影响带宽(带宽≈窗口/RTT)。
分析拥塞与丢包位置:结合 tcpdump 在多点抓包(客户端/中间/服务端)对比,确认丢包发生在何处。
结合应用层(若可见)分析:若抓到 TLS 握手或 HTTP 请求,结合应用日志对照请求重试或超时。
验证并提出修复方向:例如增大服务器 accept queue、优化 NIC 驱动、调整 TCP 参数(拥塞算法、窗口缩放)、修复 MTU/分片问题。
六、关于 MTU 与分片问题大包丢失往往与 Path MTU 或中间设备丢弃分片有关。用 ping -M do -s <size> 测试路径 MTU。
在 pcap 中,若看到 ICMP Fragmentation Needed(Type 3 Code 4),说明需降低 MSS。调整 server TCP MSS/clamping 或开启 PMTUD。
七、HTTPS/TLS 下的 TCP 分析要点虽然内容加密,但 TCP 层行为仍能反映问题:TLS 握手被中断、证书下载慢、应用重试都能从 TCP 层观察到。
对于 iOS/移动端 HTTPS 问题:先用 Sniffmaster 或代理工具抓取 pcap(看是否为握手失败、客户端证书问题或 Pinning 导致握手异常);再用 Wireshark 检查 ClientHello、ServerHello 的协议、cipher 与证书链交互。
注意:在合规范围内才能解密 TLS;若无私钥,只能做流量时序/握手分析。
八、进阶:利用脚本与自动化提升效率PyShark / tshark 可批量提取重传计数、计算每流 RTT、统计延迟分布。
Scapy 可生成复现包(例如故意触发重传、发送 RST)用于复现服务端行为。
在 CI 中加入流量监控脚本,定时对关键链路运行轻量抓包并上报统计(重传率、平均 RTT、TCP 建立失败率)。
九、实用排查案例(简要示例)场景:用户报告页面加载慢,后台多次重试。 步骤:抓取客户端到后端的 pcap → 看到大量 tcp.analysis.retransmission 与 tcp.analysis.duplicate_ack,IO Graph 显示吞吐波动 → 在中间路由抓包发现丢包集中在某一路由器出口 → 结论:链路抖动/丢包;建议:调整该链路流量、检查链路错误、在服务器端增加重试回退策略并监控丢包率。
把 TCP 抓包分析做成常规流程:抓取(精确过滤)→ 重现(或对时段抓包)→ 指标检查(重传、RTT、窗口)→ 定位(多点对比)→ 修复建议。
在移动/HTTPS 场景中,结合直连抓包工具(如 Sniffmaster)与 Wireshark,能把“看不到明文”这一障碍最小化,用 TCP 层行为仍可完成绝大部分网络定位。
遇到复杂问题时,多点抓包(客户端/中间/服务端)是唯一可行的方法,它能把网络问题从“模糊”变成“可证”的工程问题。