tcpdump 是什么
tcpdump 是命令行抓包的事实标准:它把网卡上的报文按过滤器条件抓下来,既能直接打印成一行一包的摘要,也能原样写入文件留给图形化工具分析。相比在应用里打日志,它能看到『包到底有没有到、对端有没有回、被谁重置』这类应用层看不见的事实,因此在争议排查里是最硬的证据。用它的第一原则是先用最小的过滤条件抓到样本,再逐步加条件收窄,而不是一上来就写复杂表达式。
基本信息
| 适用平台 | Linux 与 macOS;Windows 上可用系统自带的抓包工具或图形化抓包软件 |
|---|---|
| 权限要求 | 需要 root 或具备原始套接字能力,普通用户直接运行会报权限不足 |
| 常用开关 | -i 选网卡、-nn 不做名称解析、-c 限包数、-w 落盘、-r 回读、-s 设置抓取长度 |
| 输出形式 | 默认一行一包摘要,-A 显示文本内容,-X 以十六进制与文本同时显示 |
| 网卡选择 | -D 列出可用网卡,any 表示所有网卡但可能缺少链路层头部 |
典型使用场景
- 证明流量是否到达:本机抓包看到请求却没有响应,责任立刻清晰
- 验证策略放行:用抓包确认某个端口的报文到底有没有被放过去
- 抓握手与断开:确认连接是被拒绝、被重置还是超时
- 留存证据:把现场抓到的报文落盘,供后续与对方共同复盘
- 验证抓包点视角:在链路两端同时抓,判断丢包发生在哪一段
常用示例
常用示例
tcpdump -D # 先列出可抓的网卡
tcpdump -i eth0 -nn -c 20 port 80 # 抓 20 个 80 端口报文,不解析名称
tcpdump -i eth0 -nn 'host 10.0.0.5 and tcp port 443' # 主机加端口组合过滤
tcpdump -i eth0 -nn -A 'tcp port 80' | head -50 # 以文本形式看报文内容
tcpdump -i any -nn -c 10 # 所有网卡抓 10 个包,注意链路层头部
tcpdump -i eth0 -nn -e -c 10 arp # 加 -e 显示链路层地址输出逐列读法
| 字段 | 含义 | 正常与异常 |
|---|---|---|
| 时间戳 | 报文到达本机的时间 | 用于与业务日志、告警时间对齐 |
| 源与目的地址端口 | 两个方向的收发关系 | 看方向才能判断是谁先发的、谁没回 |
| 标志位 | 标记项如握手、确认、结束、重置 | 只出现请求标志而始终没有响应标志即为异常 |
| 序号与确认号 | 相对序号与确认进度 | 序号缺口是丢包的直接证据 |
| 长度 | 本次抓取到的字节数 | 数值被截断说明抓取长度设置过小 |
| 窗口字段 | 对端允许接收的字节数 | 数值为零表示对端已满,发送被迫暂停 |
现场一律加上关闭名称解析的开关:它同时关闭地址与服务名解析,既避免解析服务拖慢输出,也避免显示结果误导判断。
在通用网卡上抓包可能看不到以太网头部,需要分析链路层信息时必须指定具体网卡,而不是用 any。
先跑一个只带计数上限的极小抓包(例如只抓几个包),确认网卡名与权限都没问题,再把范围放大,可避免长时间空等才发现条件写错。
抓包会把业务数据一并记录,可能包含凭据与个人信息;落盘文件要按敏感数据处理,用完及时清理或限制访问。