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实验(华为设备)
下一篇 交换机的常见故障有哪些?