首页/网络/抓包与流量分析速查/从 tcpdump 输出判读 TCP 异常
TCP 流分析82 条

从 tcpdump 输出判读 TCP 异常

不要只看 Wireshark:tcpdump 文本输出同样能读出重传与异常(同 seq 重复、Ack 重复、窗口 0、Flags 变化),现场排障常常只有它。

为什么要读文本输出

现场排障时经常只有 tcpdump,既没有图形界面也不能随意安装工具。它的文本摘要其实能读出 TCP 的关键事件:同一个 seq 再次出现是重传,ack 号连续相同是重复确认,窗口字段为 0 是零窗口,Flags 由 S 变为 S. 说明握手完成。掌握这套读法,纯文本环境下也能完成大部分判读。

基本信息

适用平台Linux / macOS / BSD 上的 tcpdump
关键选项-nn 不解析名字、-ttt 显示与上一包的间隔、-S 显示绝对序列号
判读要点盯住 seq 与 ack 列的重复关系、Flags 变化与 length
局限不做分析标注,重传与乱序都需自行判断
补充手段落盘后用 Wireshark 复核关键会话

典型使用场景

  • 线上机器临时排查,无法安装图形分析工具
  • 把关键会话快速复制到工单里作为证据
  • 配合脚本做规则化判断,例如统计重复出现的序列号
  • 在带宽受限的链路上只保留文本,减少传输量
  • 与同事远程沟通时用统一格式描述报文特征

输出特征与事件

输出特征与事件
Flags [S]                    → 建连请求
Flags [.] seq 1:1 ack 1 win 0 → 纯确认且窗口为 0
同一 seq 再次出现             → 重传
Ack 号连续多次相同            → 重复确认

辅助命令

辅助命令
tcpdump -i eth0 -nn -ttt -c 100 'host 10.0.0.9 and tcp port 443'   # 看包间隔
tcpdump -i eth0 -nn -S -c 20 'tcp port 443'                        # 看绝对序列号

文本特征对照

文本特征对应事件说明
同一 seq 再次出现重传序列号停住后重复出现同一段
ack 号连续相同重复确认接收端在催要缺失的段
win 0零窗口接收端缓冲已满并要求暂停
Flags 由 [S] 变为 [S.]握手完成SYN 与 SYN-ACK 均已发出
length 0 的包纯确认未携带任何载荷
终端行宽有限,长选项输出会被折行,重要会话建议落盘后用 Wireshark 细读。
加 -ttt 看包间隔能直观发现停顿,加 -S 看绝对序列号便于跨包比对。

补充要点

  • 先用限量抓取熟悉本机的输出格式,再决定后续过滤条件
  • 把关键会话的文本输出与抓包文件一起留存:前者便于快速浏览,后者便于深入分析
  • 同一会话在两端的文本表现可能不同,重要结论要两端对照
  • 看不懂的输出先核对工具版本,不同版本的字段显示略有差异
文本判读的核心是找「重复」与「间隔」:序列号重复意味着重传,包间隔突然拉长意味着停顿。

易错点

  • 误把窗口探测的重传式小包当成链路丢包,结论方向整体偏掉
  • 只看单向抓包就判断丢包方向:重复确认与重传的因果关系需要对端证据
  • 用默认解析(未加 -nn)导致部分地址被反解成域名,反而看不清真实通信对象

数据来源与参考

  • man 8 tcpdump
  • RFC 9293
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌