-r 在做什么
-r 让 tcpdump 从已有的 pcap 文件读取报文,而不是从网卡实时抓取。它支持与在线抓包一样的过滤表达式与打印选项,因此同一份文件能用十几条不同条件反复分析,一次现场抓包可以支撑整场排障。离线分析还有一个明显好处:时间压力消失,可以先粗筛、再逐层收窄,不必担心错过报文。需要注意的是 pcapng 格式(Wireshark 的默认保存格式)在较旧版本的 tcpdump 上读不了,必要时先用 editcap 转换。
基本信息
| 语法 | tcpdump -r <文件> [选项] [过滤表达式] |
|---|---|
| 与 -i 的关系 | 互斥,同一条命令里不能同时指定接口与文件 |
| 支持格式 | 经典 pcap 直接可读,pcapng 需要较新版本 |
| 常用搭配 | -nn 稳定输出、-c 限制条数、-ttt 看间隔、-A/-X 看内容、-e 看二层 |
| 大文件处理 | 先按条件计数,再用 tshark 或 editcap 做统计与切片 |
典型使用场景
- 把现场抓到的文件带回本地,按不同假设反复筛选分析
- 用同一个文件验证多条思路:先按主机筛,再按端口筛,最后看标志位
- 统计某类报文的条数,例如纯 SYN、复位或重传的规模
- 与日志时间对齐:输出带日期的可读时间戳再逐条比对
- 切片留证:先截取故障时间窗,再分享给其他同事分析
常用示例
常用示例
tcpdump -nn -r /tmp/issue.pcap -c 20 # 先看前 20 条摘要
tcpdump -nn -r /tmp/issue.pcap 'tcp port 443' # 只筛 443 端口
tcpdump -nn -r /tmp/issue.pcap -tttt -c 10 # 带日期的时间戳
tcpdump -nn -r /tmp/issue.pcap -A 'tcp port 80' # 明文内容直接可读
tcpdump -nn -r /tmp/issue.pcap -e 'arp' -c 10 # 看二层头部
tcpdump -nn -r /tmp/issue.pcap -ttt 'port 3306' -c 30 # 看数据库流量间隔常用搭配与作用
| 选项 | 作用 | 使用说明 |
|---|---|---|
| -nn | 不做解析 | 离线分析保持输出稳定,便于与他人核对 |
| -c | 限制输出条数 | 先看几十条摸清结构,避免一次刷屏 |
| -tttt | 带日期的时间戳 | 与业务日志按时间对齐时用它 |
| -ttt | 相对上一包的间隔 | 看重传与响应间隔是否接近超时值 |
| -A / -X | 打印载荷内容 | 文本协议用 -A,二进制协议用 -X 看十六进制 |
| -e | 打印链路层头部 | 需要核对 MAC 与以太网类型时使用 |
读取时同样支持完整的过滤表达式,等于给同一份报文换视角。排障常见做法是先把文件按主机收窄,再叠加端口、标志位与异常标注条件,逐步逼近结论。
pcapng 与 pcap 是两种不同格式。用旧版本 tcpdump 直接读 Wireshark 保存的默认格式文件会报错,先用 editcap 转换格式再读。
切片与转换
切片与转换
capinfos a.pcap # 先看包数、时长与是否有截断标记
editcap -F pcap a.pcapng a.pcap # pcapng 转经典 pcap
editcap -A '2026-10-13 10:00:00' -B '2026-10-13 10:10:00' a.pcap win.pcap # 按时间切片
tshark -r a.pcap -Y 'tcp.analysis.retransmission' | wc -l # 交给 tshark 做统计判读要点
- 离线分析结论要标注抓包点位置,脱离位置的判读容易把方向搞反
- 先看整体规模再做细筛,直接在大文件上跑复杂条件会拖慢分析节奏
- 文件是否完整要看抓包起止时间:只覆盖问题时段一半的文件不能用来否定某个假设
- 同一个文件多次筛选条件时要记录用过哪些,避免重复劳动或得出互相矛盾的结论
- 先按会话维度统计规模,再对可疑会话逐条深入,比从第一条报文开始读更高效
- 把结论与所用过滤条件一起记录,别人复核时可以直接复现同一视图
离线分析的另一层价值是可以对同一份数据做定量结论:统计某端口上的建连次数、复位比例或重传条数,这些数字比单看几条报文更有说服力,也更容易放进工单与复盘材料里。