【学习笔记】tcpdump+Wireshark抓包(1)

1. tcpdump 和 Wireshark 是什么?

1.1 抓包是在干什么?

网络上的通信,本质上是数据被拆成一个个 数据包(Packet),经过网卡发送和接收。

抓包 = 在某个网卡上,把经过的数据包 复制一份 保存下来,供后续分析。

XML 复制代码
应用程序(curl、浏览器)
        ↓
    操作系统网络栈
        ↓
      网卡(eth0 / lo)
        ↓
   tcpdump 在这里「旁听」并录音

1.2 tcpdump 是什么?

项目 说明
类型 命令行抓包工具
运行环境 服务器、虚拟机、无图形界面的机器;macOS 也自带
主要用途 生产环境抓包、写脚本、远程排障
输出 终端直接显示,或保存为 .pcap 文件
特点 轻量、资源占用小;Linux 几乎都能装;Mac 预装在 /usr/sbin/tcpdump
权限 抓包通常需要管理员权限(sudo

常见安装:

bash 复制代码
# Ubuntu / Debian
sudo apt install tcpdump

# CentOS / RHEL
sudo yum install tcpdump

# macOS(一般已自带,验证即可)
which tcpdump

1.3 Wireshark 是什么?

项目 说明
类型 图形界面 的网络协议分析工具
运行环境 个人电脑(Windows / macOS / Linux 桌面)
主要用途 打开 .pcap 文件,可视化分析协议细节
特点 协议解析强、过滤方便、适合深入分析

Wireshark 也能直接抓包,但生产服务器上更常用 tcpdump 抓 + Wireshark 看。

1.4 两者是什么关系?

搭档关系,不是二选一。

阶段 工具 做什么
tcpdump 在服务器上录包,保存文件
Wireshark 打开文件,图形化分析

1.5 最小上手例子(ping 抓包)

以下是mac操作的例子,直接打开mac终端即可,如果是Linux下学习,也是一样,只不过生成的 .pcap 文件需要用 scp 传到你的电脑上再让Wireshark打开。

项目 说明
目标 抓一次 ping 流量,用 Wireshark 打开看
终端 1(抓包) 开始录制,保存到桌面
终端 2(产生流量) 发 4 次 ping
停止抓包 终端 1 按 Ctrl + C
分析 用 Wireshark 打开 .pcap 文件

终端输入:

bash 复制代码
# 终端 1:抓 ICMP,保存文件
sudo tcpdump -i any icmp -w ~/Desktop/ping-demo.pcap

# 终端 2:产生 ping 流量
ping -c 4 114.114.114.114

命令含义(先记这 4 个就够):

参数 含义
-i any 在所有网卡上抓
icmp 只抓 ping 用的 ICMP 包(噪音少)
-w ~/Desktop/ping-demo.pcap 保存到桌面,给 Wireshark 用
(无 -c 一直抓,直到你按 Ctrl+C 停止

执行 tcpdump 的终端按下 control + c 之后,就会生成 .pcap 文件。

用 Wireshark 打开:

bash 复制代码
open -a Wireshark ~/Desktop/ping-demo.pcap

Wireshark 顶部过滤器输入:

bash 复制代码
icmp && ip.addr == 114.114.114.114

回车后,应 mainly 看到 10.2.73.219114.114.114.114 的包,噪音会少很多。

2.详细讲解实例

2.1 Wireshark 三个区域

界面结构:

bash 复制代码
┌─────────────────────────────────────────────────┐
│  ① 包列表(上面表格)                             | 
├──────────────────────┬──────────────────────────┤
│  ② 包详情(左下)      │  ③ 原始字节(右下)        │
└──────────────────────┴──────────────────────────┘
区域 位置 作用 小白先看什么
① 包列表 上方表格 一行 = 一个网络包,按时间排列 Source、Destination、Info
② 包详情 左下方 把一个包从外到里逐层展开 Frame → Ethernet → IP → ICMP/TCP
③ 原始字节 右下方 线上真实数据(十六进制 + ASCII) 初学阶段可暂时忽略

2.2 包列表各列含义

列名 含义 示例
No. 第几个包 17
Time 相对抓包开始过了多少秒 7.9
Source 谁发的(源 IP) 10.2.73.219
Destination 发给谁(目的 IP) 114.114.114.114
Protocol 什么协议 ICMP / TCP / DNS
Length 包大小(字节) 74
Info 一句话摘要 Echo (ping) request

Info 常见文字:

Info 文字 含义
Echo (ping) request 你的电脑发出 ping:「在吗?」
Echo (ping) reply 对方回复 pong:「在,收到了」
Destination unreachable (...) 中间设备:「到不了,被拦了」
(no response found!) Wireshark:只看到你发的,没看到回复

2.3 点开单个包:分层结构怎么读

双击某个具体的包可以放大看,上面部分每行左边的箭头点击后可展开看。

层级 名称 看什么
最外层 Frame 抓包元信息(大小、从哪块网卡抓到)
二层 Ethernet II MAC 地址(哪块网卡的硬件地址)
三层 Internet Protocol (IPv4) IP 地址(Source / Destination)
四层 ICMP / TCP / UDP 具体协议内容(ping、握手、DNS 等)

2.4 第一次看包,建议只看 4 个地方

  1. Info --- 一句话总结(最重要)
  2. IP 的 Source / Destination --- 谁发给谁
  3. Protocol --- 什么协议(ICMP / TCP / DNS...)
  4. 最里层 --- ping 看 Type 8/0;报错看 unreachable / prohibited 等

3. 抓包实践------ping 网关

终端 1:

cpp 复制代码
sudo tcpdump -i any icmp -w ~/Desktop/ping-gateway.pcap

终端 2:

bash 复制代码
# 先看网关是谁 以.1结尾
netstat -nr | grep default

# 假设显示网关是 10.2.255.1,就 ping 它
ping -c 4 10.2.255.1

-c 后面要跟「发几个包」的数字。

3.1 详看包列表

终端 1 按 Ctrl+C 停抓,用 Wireshark 打开 ping-gateway.pcap

bash 复制代码
open -a Wireshark ~/Desktop/ping-gateway.pcap  

顶部过滤器改成:

bash 复制代码
icmp && ip.addr == 10.2.72.1

回车后,应 mainly 看到 8 个包(4 个 request + 4 个 reply)

request 和 reply 的差别:

项目 request(如 No.4) reply(如 No.5)
Source 10.2.73.219(你) 10.2.72.1(网关)
Destination 10.2.72.1(网关) 10.2.73.219(你)
ICMP Type 8 0
Info Echo (ping) request Echo (ping) reply

目前见过的 Info 速查

Info 好/坏 谁发给谁 一句话
Echo (ping) request 正常 你 → 目标 你在 ping
Echo (ping) reply 正常 目标 → 你 ping 通了
Destination unreachable (Fragmentation needed) 异常 路由器 → 你 包太大过不去
Destination unreachable (Host administratively prohibited) 异常 防火墙 → 你 被策略禁止
(no response found!) 异常/未完成 --- 发了 ping 没抓到回复
字段 全称 含义 常见值 / 现象
id Identifier(标识符) 区分是哪一次 ping「会话」 同一次 ping 里,request 和 reply 的 id 相同
seq Sequence(序列号) 第几个 ping 包 第 1 次 ping seq=0,第 2 次 seq=1,依次 +1
ttl Time To Live(生存时间) 包最多还能经过几跳路由 常见 64、128、255;每过一台路由器减 1

3.2 详看单个包:

第 1 层 Frame

字段 含义
Frame Number 第几个包
Interface (en0) 从哪块网卡抓到
Process (ping) 哪个进程发的

第 2 层 Ethernet II

字段 含义
Source 源 MAC(谁发的)
Destination 目的 MAC(发给谁)

第 3 层 IPv4

字段 含义
Source 源 IP
Destination 目的 IP
TTL 还能经过几跳
Protocol 上层协议(ICMP)

第 4 层 ICMP

字段 含义
Type 8=request,0=reply
Identifier (id) 会话标识,request/reply 相同
Sequence Number (seq) 第几次 ping
Response frame 对应 reply 在第几号包

request / reply 对照

字段 request reply
Source IP 10.2.73.219 10.2.72.1
Destination IP 10.2.72.1 10.2.73.219
ICMP Type 8 0
id 相同 相同
seq 相同 相同

4. 抓包实践------curl 抓包

4.1 DNS

目的是看一下域名怎么变成 IP。

终端 1:抓包

bash 复制代码
sudo tcpdump -i any -w ~/Desktop/dns-test.pcap

终端 2:产生流量

bash 复制代码
nslookup www.baidu.com

这里如果设置了代理可能会抓不到dns,可以将代理关了。

bash 复制代码
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY all_proxy ALL_PROXY

终端 1: Ctrl + C 停抓

Wireshark 打开分析:

bash 复制代码
open -a Wireshark ~/Desktop/dns-test.pcap

然后进行过滤,输入dns,和之前一样的。

No.450 --- DNS 查询(query)

字段 含义
Source 10.2.73.219 你的电脑
Destination 10.2.255.2 DNS 服务器
Protocol DNS 域名解析
Info Standard query ... www.baidu.com 问:这个域名的 IP?

Info 怎么读:

部分 含义
Standard query 标准 DNS 查询
0x2129 查询 ID,用来和回复配对
A 要 A 记录(域名 → IPv4)
www.baidu.com 被查的域名

No.481 --- DNS 回复(response)

字段 含义
Source 10.2.255.2 DNS 服务器
Destination 10.2.73.219 你的电脑
Info Standard query response ... 对上面那条 query 的回答
0x2129 和 No.450 相同 说明是同一问一答

Info 里重点:

部分 含义
CNAME www.a.shifen.com www.baidu.com 是别名,真实名字是这个
A 110.242.6... 最终用来连接的 IPv4 地址
多个 A 百度有多个 IP,任选一个连

和 ping 对比(巩固)

项目 ping DNS
目的 测通不通 域名变 IP
协议 ICMP DNS over UDP
层数 4 层 5 层
关键层 ICMP DNS
成对包 request + reply query + response
端口 53

仔细看这个包的话其实是有5层的。前3层和前面说的差不多,我们这里着重说一下第4层和第5层。

第 4 层 UDP --- 端口(重要)

字段 含义 query 里 typical
Source Port 源端口 随机(如 57470)
Destination Port 目的端口 53(DNS 固定端口)

记一句:DNS 查问时,目的端口一定是 53。

response 里方向反过来:源端口 53,目的端口是我们自己这边的随机端口。

第 5 层 Domain Name System --- DNS 核心(最重要)

query(No.450)展开后看这些:

字段 含义 你的例子里
Transaction ID 查询编号,和 response 配对 0x2129
Flags: Standard query 这是一个「问」 query
Queries 问什么 www.baidu.com: type A
type A 要 IPv4 地址 要 IP,不是别的

response(No.481)展开后看这些:

字段 含义 你的例子里
Transaction ID 必须和 query 相同 0x2129
Flags: Standard query response 这是一个「答」 response
Queries 当初问的是什么 www.baidu.com
Answers 答案 CNAME → www.a.shifen.com
A 记录 最终 IP(可能多个) 110.242.6.x
  • DNS 阶段:把所有 IP 都告诉你
  • 连接阶段:通常只连其中一个
  • 若连不上,可能再试列表里的另一个

4.2 TCP 三次握手 + 四次挥手

终端 1:开始抓包

bash 复制代码
sudo tcpdump -i any -w ~/Desktop/tcp-http.pcap

看到 listening on any... 就说明在抓了。先开着别关。

终端 2:关掉代理,再 curl

bash 复制代码
# 若出现 Uses proxy 或 Connection to 127.0.0.1,说明还在走代理,要先 unset 再试。
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY all_proxy ALL_PROXY

curl -v http://www.example.com

curl 成功的话,终端里应能看到类似:

bash 复制代码
* Host www.example.com:80 was resolved.

* Connected to www.example.com (93.184.216.34) port 80

> GET / HTTP/1.1

< HTTP/1.1 200 OK

终端 1:停抓 : 按 Ctrl + C

打开 Wireshark

bash 复制代码
open -a Wireshark ~/Desktop/tcp-http.pcap
  • 服务器一般是 80(HTTP)
  • 我们自己这边是随机高端口(如 52341、57470),每次 curl 可能不同

顶部过滤器输入:

bash 复制代码
tcp.port == 80

三次握手:

然后看 Info 字段,找连续 3 个包,对应经典tcp三次握手的三步:

bash 复制代码
第 1 步 SYN 你 → 服务器 「我想连你」

第 2 步 SYN, ACK 服务器 → 你 「好,我也准备好了」

第 3 步 ACK 你 → 服务器 「收到,连上了」

对应图中就是159、166、167这三个包。主要说一下包的第4层TCP层。

字段 含义
Source Port 源端口(你这边多为随机,如 57872)
Destination Port 目的端口(HTTP 为 80,HTTPS 为 443)
Sequence Number (Seq) 序列号
Acknowledgment Number (Ack) 确认号
Flags SYN / ACK / FIN(判断握手、挥手)
Len 数据长度(握手时常为 0)

四次挥手:

Wireshark 里常把 FIN 和 ACK 合在一包 里显示为 [FIN, ACK],所以:

  • 理论上 4 次:FIN、ACK、FIN、ACK
  • 界面上可能 3~4 个包,且带 FIN 的通常就 2 个(你发一次、服务器发一次)

认法: 找两个带 FIN 的包(方向相反),前后再配上 ACK,就是挥手。

需要详细看的包字段和前面一样。

4.3 HTTP

发 HTTP 请求:168

包号 Info 含义
168 HTTP GET / HTTP/1.1 curl 请求首页

这就是 curl 在说:「把网站首页给我。」

收响应:173

包号 Info 含义
173 HTTP/1.1 200 OK 服务器返回成功和网页内容

200 OK = 请求成功。

请求包详情:

这里相对于tcp多了一层http层。

1. 请求行:GET / HTTP/1.1

部分 含义
GET 方法:获取资源(要网页,不是提交表单)
/ 路径:网站根目录首页
HTTP/1.1 协议版本

合起来:用 HTTP/1.1,GET 方式,要 www.example.com 的首页。

2. Host: www.example.com

和浏览器地址栏里的域名对应。

3. User-Agent: curl/8.4.0

  • 告诉服务器:我是 curl 8.4.0,不是 Chrome/Safari
  • 服务器有时会按不同客户端返回不同内容(初学知道即可)

4. Accept: */*

  • 表示:什么类型的内容我都能接受(*/* = 任意类型)

5. Wireshark 提示

Response in frame: 173

Full request URI: http://www.example.com/

  • 回复在 173 号包
  • 完整 URL 是 http://www.example.com/

响应包详情:

下面是响应包,对比请求多出来了两块

1. [2 Reassembled TCP Segments (873 bytes): #172(868), #173(5)]

含义:TCP 重组信息(Wireshark 算的,不是线上协议)

bash 复制代码
完整 HTTP 响应 = 873 字节

    ├─ No.172 带了 868 字节

    └─ No.173 带了 5 字节

TCP 只管按序传字节,一个 HTTP 响应可以拆成多个 TCP 包。Wireshark 把 #172 和 #173 拼回一条完整 HTTP 消息,并提示你:

提示项 含义
2 Reassembled TCP Segments 由 2 个 TCP 包拼成
873 bytes 拼完一共 873 字节
#172(868) 第 1 段在 172 号包,868 字节
#173(5) 第 2 段在 173 号包,5 字节

下面十六进制若以 48545450 开头,ASCII 就是 HTTP,说明拼出来的是完整 HTTP 响应。

为什么请求 168 没有: GET 只有 78 字节,一个 TCP 包就够,不需要重组。

2. Line-based text data: text/html

含义:HTTP 正文(网页 HTML)的展示方式

HTTP 响应分两部分:

bash 复制代码
HTTP/1.1 200 OK ← 响应头(状态、类型等)
Content-Type: text/html
(空行)
<!doctype html>... ← 正文(HTML)

Wireshark 常把响应拆成两块显示:

展示块 内容
Hypertext Transfer Protocol 状态行 + 响应头(200 OK、Content-Type 等)
Line-based text data: text/html 正文里的 HTML 文本

text/html 表示:按网页 HTML 来解析;1 lines 等是 Wireshark 对行数的统计。

为什么请求 168 没有: GET 只有请求头,几乎没有 body,所以没有「一整段 HTML 正文」可单独展开。

到目前为止已经尝试过tcpdump 抓包、Wireshark 看包、ICMP/DNS/TCP/HTTP 基本字段、三次握手与四次挥手、Seq/Ack、HTTP 请求响应、TCP 重组。