1. tcpdump 和 Wireshark 是什么?
1.1 抓包是在干什么?
网络上的通信,本质上是数据被拆成一个个 数据包(Packet),经过网卡发送和接收。
抓包 = 在某个网卡上,把经过的数据包 复制一份 保存下来,供后续分析。
应用程序(curl、浏览器)
↓
操作系统网络栈
↓
网卡(eth0 / lo)
↓
tcpdump 在这里「旁听」并录音
AI写代码
XML
1.2 tcpdump 是什么?
项目 说明
类型
命令行抓包工具
运行环境
服务器、虚拟机、无图形界面的机器;macOS 也自带
主要用途
生产环境抓包、写脚本、远程排障
输出
终端直接显示,或保存为 .pcap 文件
特点
轻量、资源占用小;Linux 几乎都能装;Mac 预装在 /usr/sbin/tcpdump
权限
抓包通常需要管理员权限(sudo)
常见安装:
# Ubuntu / Debian
sudo apt install tcpdump
# CentOS / RHEL
sudo yum install tcpdump
# macOS(一般已自带,验证即可)
which tcpdump
AI写代码
bash
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 文件
终端输入:
# 终端 1:抓 ICMP,保存文件
sudo tcpdump -i any icmp -w ~/Desktop/ping-demo.pcap
# 终端 2:产生 ping 流量
ping -c 4 114.114.114.114
AI写代码
bash
命令含义(先记这 4 个就够):
参数 含义
-i any
在所有网卡上抓
icmp
只抓 ping 用的 ICMP 包(噪音少)
-w ~/Desktop/ping-demo.pcap
保存到桌面,给 Wireshark 用
(无 -c)
一直抓,直到你按 Ctrl+C 停止
执行 tcpdump 的终端按下 control + c 之后,就会生成 .pcap 文件。
用 Wireshark 打开:
open -a Wireshark ~/Desktop/ping-demo.pcap
AI写代码
bash
Wireshark 顶部过滤器输入:
icmp && ip.addr == 114.114.114.114
AI写代码
bash
回车后,应 mainly 看到 10.2.73.219 ↔ 114.114.114.114 的包,噪音会少很多。
2.详细讲解实例
2.1 Wireshark 三个区域
界面结构:
┌─────────────────────────────────────────────────┐
│ ① 包列表(上面表格) |
├──────────────────────┬──────────────────────────┤
│ ② 包详情(左下) │ ③ 原始字节(右下) │
└──────────────────────┴──────────────────────────┘
AI写代码
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 个地方
Info — 一句话总结(最重要)
IP 的 Source / Destination — 谁发给谁
Protocol — 什么协议(ICMP / TCP / DNS…)
最里层 — ping 看 Type 8/0;报错看 unreachable / prohibited 等
3. 抓包实践——ping 网关
终端 1:
sudo tcpdump -i any icmp -w ~/Desktop/ping-gateway.pcap
AI写代码
cpp
运行
终端 2:
# 先看网关是谁 以.1结尾
netstat -nr | grep default
# 假设显示网关是 10.2.255.1,就 ping 它
ping -c 4 10.2.255.1
AI写代码
bash
-c 后面要跟「发几个包」的数字。
3.1 详看包列表
终端 1 按 Ctrl+C 停抓,用 Wireshark 打开 ping-gateway.pcap。
open -a Wireshark ~/Desktop/ping-gateway.pcap
AI写代码
bash
顶部过滤器改成:
icmp && ip.addr == 10.2.72.1
AI写代码
bash
回车后,应 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:抓包
sudo tcpdump -i any -w ~/Desktop/dns-test.pcap
AI写代码
bash
终端 2:产生流量
nslookup www.baidu.com
AI写代码
bash
这里如果设置了代理可能会抓不到dns,可以将代理关了。
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY all_proxy ALL_PROXY
AI写代码
bash
终端 1: Ctrl + C 停抓
Wireshark 打开分析:
open -a Wireshark ~/Desktop/dns-test.pcap
AI写代码
bash
然后进行过滤,输入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:开始抓包
sudo tcpdump -i any -w ~/Desktop/tcp-http.pcap
AI写代码
bash
看到 listening on any... 就说明在抓了。先开着别关。
终端 2:关掉代理,再 curl
# 若出现 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
AI写代码
bash
curl 成功的话,终端里应能看到类似:
* 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
AI写代码
bash
终端 1:停抓: 按 Ctrl + C。
打开 Wireshark
open -a Wireshark ~/Desktop/tcp-http.pcap
AI写代码
bash
服务器一般是 80(HTTP)
我们自己这边是随机高端口(如 52341、57470),每次 curl 可能不同
顶部过滤器输入:
tcp.port == 80
AI写代码
bash
三次握手:
然后看 Info 字段,找连续 3 个包,对应经典tcp三次握手的三步:
第 1 步 SYN 你 → 服务器 「我想连你」
第 2 步 SYN, ACK 服务器 → 你 「好,我也准备好了」
第 3 步 ACK 你 → 服务器 「收到,连上了」
AI写代码
bash
对应图中就是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
一台服务器上可能挂很多网站
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 算的,不是线上协议)
完整 HTTP 响应 = 873 字节
├─ No.172 带了 868 字节
└─ No.173 带了 5 字节
AI写代码
bash
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 响应分两部分:
HTTP/1.1 200 OK ← 响应头(状态、类型等)
Content-Type: text/html
(空行)
<!doctype html>... ← 正文(HTML)
AI写代码
bash
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 重组。
————————————————
版权声明:本文为CSDN博主「羚羊角uou」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2402_82757055/article/details/162073120