tcpdump+Wireshark抓包(1)

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

上一篇 【转载】HCIE R&S 备考笔记 MPLS virtual private network OptionC实验(华为设备)
下一篇 交换机的常见故障有哪些?