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