第24天:ICMP和网络诊断工具
今日目标
- 理解ICMP协议的作用和工作原理
- 掌握ICMP报文格式和类型
- 学习ICMPv6的特点
- 深入理解ping的工作原理
- 掌握traceroute的实现机制
- 学会使用各种网络诊断工具
- 实现自己的ping工具
1. ICMP协议概述
1.1 什么是ICMP?
ICMP = Internet Control Message Protocol(互联网控制消息协议)
ICMP是什么?
- IP层的辅助协议
- 用于错误报告和网络诊断
- 不传输用户数据
- 承载在IP数据包中
生活比喻:
如果IP是邮政系统,ICMP就是"查询回执"和"退信通知"
- 包裹到了吗?→ ping(回声请求/应答)
- 包裹为什么没到?→ 目标不可达
- 路线是什么?→ traceroute(时间超时)
特点:
✅ 网络层协议(但服务于IP)
✅ 错误报告
✅ 网络诊断
✅ 路径发现
为什么需要ICMP?
IP协议的局限性:
❌ IP尽力而为,不保证送达
❌ 不提供错误报告
❌ 不提供反馈机制
❌ 不知道网络状态
ICMP的作用:
✅ 报告传输错误
✅ 提供网络诊断
✅ 帮助调试网络
✅ 发现网络问题
常见场景:
- 目标主机不可达
- 网络拥塞(源抑制)
- 路由重定向
- 超时
- 参数错误
1.2 ICMP报文格式
基本格式:
所有ICMP报文的前8字节格式相同:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Rest of Header (4 bytes) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data Section |
| (可变长度) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明:
Type (类型, 8位):
- 标识ICMP消息类型
- 不同类型有不同功能
Code (代码, 8位):
- 进一步细分类型
- 提供更详细的信息
Checksum (校验和, 16位):
- 检测报文完整性
- 覆盖整个ICMP报文
Rest of Header (剩余头部, 32位):
- 根据类型而不同
- 可能包含ID、序列号等
1.3 ICMP报文类型
主要类型:
┌─────────┬────────────────────┬─────────────────┐
│ Type │ 名称 │ 用途 │
├─────────┼────────────────────┼─────────────────┤
│ 0 │ 回显应答 │ ping响应 │
│ 3 │ 目标不可达 │ 错误报告 │
│ 4 │ 源抑制 │ 拥塞控制 │
│ 5 │ 重定向 │ 路由优化 │
│ 8 │ 回显请求 │ ping请求 │
│ 11 │ 超时 │ TTL过期 │
│ 12 │ 参数问题 │ IP头部错误 │
│ 13 │ 时间戳请求 │ 时钟同步 │
│ 14 │ 时间戳应答 │ 时钟同步 │
└─────────┴────────────────────┴─────────────────┘
常用类型详解:
Type 0/8: 回显应答/请求(Echo Reply/Request)
- ping使用
- 测试连通性
Type 3: 目标不可达(Destination Unreachable)
Code 0: 网络不可达
Code 1: 主机不可达
Code 2: 协议不可达
Code 3: 端口不可达
Code 4: 需要分片但设置了DF标志
Code 6: 目标网络未知
Type 5: 重定向(Redirect)
Code 0: 网络重定向
Code 1: 主机重定向
Type 11: 超时(Time Exceeded)
Code 0: TTL在传输中过期
Code 1: 分片重组超时
2. ping工作原理
2.1 ping是什么?
ping = Packet Internet Groper(分组网络探测器)
功能:
- 测试网络连通性
- 测量往返时间(RTT)
- 检测丢包率
- 诊断网络问题
工作原理:
1. 发送ICMP回显请求(Type 8)
2. 目标主机收到后
3. 返回ICMP回显应答(Type 0)
4. 计算往返时间
生活比喻:
像在山谷里喊"喂~",听到回声就知道:
- 对面有山(主机存在)
- 距离多远(RTT)
- 回声清晰度(网络质量)
2.2 ping报文格式
ICMP回显请求/应答:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identifier | Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
请求:
Type = 8 (Echo Request)
Code = 0
应答:
Type = 0 (Echo Reply)
Code = 0
Identifier (标识符):
- 进程ID
- 区分不同ping进程
Sequence Number (序列号):
- 标识每个请求
- 递增
- 用于匹配请求和应答
- 检测丢包和乱序
Data (数据):
- 可变长度
- 通常包含时间戳
- 用于计算RTT
- 默认56字节(Linux)或32字节(Windows)
2.3 ping工作流程
完整流程:
1. 用户执行:ping www.google.com
2. DNS解析:
www.google.com → 142.250.185.14
3. 构造ICMP报文:
- Type = 8 (Echo Request)
- Code = 0
- ID = 进程ID
- Seq = 1, 2, 3... (递增)
- Data = 时间戳 + 填充数据
4. 封装IP数据包:
- 源IP:本机IP
- 目标IP:142.250.185.14
- 协议:ICMP (1)
- TTL:64(默认)
5. 发送数据包
6. 等待响应(超时时间通常1-5秒)
7. 收到ICMP回显应答:
- Type = 0 (Echo Reply)
- 验证ID和Seq匹配
- 计算RTT = 当前时间 - 时间戳
8. 显示结果:
64 bytes from 142.250.185.14: icmp_seq=1 ttl=55 time=15.2 ms
9. 重复步骤3-8(默认无限次,可指定次数)
10. 统计信息:
- 发送数量
- 接收数量
- 丢包率
- RTT(最小/平均/最大/标准差)
2.4 ping输出解析
示例输出:
$ ping -c 4 google.com
PING google.com (142.250.185.14) 56(84) bytes of data.
64 bytes from lax30s04-in-f14.1e100.net (142.250.185.14): icmp_seq=1 ttl=55 time=15.2 ms
64 bytes from lax30s04-in-f14.1e100.net (142.250.185.14): icmp_seq=2 ttl=55 time=14.8 ms
64 bytes from lax30s04-in-f14.1e100.net (142.250.185.14): icmp_seq=3 ttl=55 time=15.5 ms
64 bytes from lax30s04-in-f14.1e100.net (142.250.185.14): icmp_seq=4 ttl=55 time=15.1 ms
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 14.827/15.150/15.532/0.261 ms
输出解析:
第一行:
PING google.com (142.250.185.14) 56(84) bytes of data.
- 目标域名和IP
- 56字节数据 + 28字节头部(IP 20 + ICMP 8)= 84字节
响应行:
64 bytes from lax30s04-in-f14.1e100.net (142.250.185.14): icmp_seq=1 ttl=55 time=15.2 ms
- 64字节:IP数据包大小(实际ICMP部分)
- from:来源主机和IP
- icmp_seq:序列号(从1开始)
- ttl:剩余跳数(初始64,经过9跳,剩55)
- time:往返时间(RTT)
统计信息:
- 4 packets transmitted:发送4个
- 4 received:收到4个
- 0% packet loss:丢包率0%
- time 3005ms:总耗时
- rtt min/avg/max/mdev:RTT最小/平均/最大/标准差
常见情况:
1. 正常响应:
64 bytes from ...: time=15.2 ms
→ 网络正常
2. 请求超时:
Request timeout for icmp_seq 1
→ 包丢失或被过滤
3. 目标不可达:
From 192.168.1.1: icmp_seq=1 Destination Host Unreachable
→ 路由不可达或主机关闭
4. TTL过期:
From 10.0.0.1: icmp_seq=1 Time to live exceeded
→ TTL耗尽,通常是路由环路
5. 网络不可达:
Network is unreachable
→ 本地路由表无路由
2.5 ping常用选项
常用参数:
-c count (Linux) 或 -n count (Windows)
发送指定数量的包
ping -c 10 google.com
-i interval
设置发送间隔(秒)
ping -i 0.2 google.com # 每0.2秒一次
-s size
设置数据包大小(字节)
ping -s 1000 google.com
-t ttl (Linux) 或 -i ttl (Windows)
设置TTL值
ping -t 10 google.com
-W timeout
设置超时时间(秒)
ping -W 1 google.com
-f (flood ping, 需要root)
快速发送,不等待响应
sudo ping -f google.com
-q (quiet)
只显示统计信息
ping -q -c 100 google.com
实用技巧:
1. 持续监控连接质量:
ping -i 0.2 gateway
每0.2秒ping一次网关
2. 测试大包传输:
ping -s 1472 target
测试MTU(1500 - 28 = 1472)
3. 快速测试连通性:
ping -c 1 -W 1 target
只发一个包,1秒超时
4. 限制TTL测试路由:
ping -t 5 target
看5跳内是否可达
3. traceroute工作原理
3.1 traceroute是什么?
traceroute = 路由追踪
功能:
- 发现数据包传输路径
- 显示每一跳路由器
- 测量每一跳的延迟
- 诊断路由问题
生活比喻:
像是快递追踪:
- 北京集散中心 → 延迟10ms
- 石家庄分拨中心 → 延迟25ms
- 郑州转运中心 → 延迟40ms
- 武汉配送站 → 延迟55ms
- 目的地 → 延迟70ms
用途:
✅ 网络故障定位
✅ 路由路径分析
✅ 性能瓶颈诊断
✅ 网络拓扑发现
3.2 traceroute实现原理
核心技巧:利用TTL
原理:
TTL(Time To Live)递减机制
- 每经过一个路由器,TTL减1
- TTL减到0时,路由器丢弃包
- 路由器发送ICMP超时消息(Type 11)
traceroute利用这个机制:
第1轮:TTL=1
┌──────┐ TTL=1 ┌──────┐ TTL=0 ┌──────┐
│ 主机 │ ────────>│ R1 │ ────────>│ R2 │
└──────┘ └──────┘ └──────┘
│
│ ICMP Time Exceeded
▼
记录R1地址和时间
第2轮:TTL=2
┌──────┐ TTL=2 ┌──────┐ TTL=1 ┌──────┐ TTL=0 ┌──────┐
│ 主机 │ ────────>│ R1 │ ────────>│ R2 │ ────────>│ R3 │
└──────┘ └──────┘ └──────┘ └──────┘
│
│ ICMP Time Exceeded
▼
记录R2地址和时间
第3轮:TTL=3
...依此类推,直到到达目标主机
目标主机响应:
- 如果是UDP:端口不可达(Type 3, Code 3)
- 如果是ICMP:回显应答(Type 0)
两种实现方式:
1. 传统方式(UDP):
- 发送UDP包到高端口(33434+)
- TTL从1开始递增
- 中间路由器:返回ICMP超时
- 目标主机:返回ICMP端口不可达
- Linux/Unix默认使用
2. ICMP方式:
- 发送ICMP回显请求(Type 8)
- TTL从1开始递增
- 中间路由器:返回ICMP超时
- 目标主机:返回ICMP回显应答
- Windows默认使用(tracert)
对比:
┌─────────────┬──────────────┬──────────────┐
│ 特性 │ UDP方式 │ ICMP方式 │
├─────────────┼──────────────┼──────────────┤
│ 发送包类型 │ UDP │ ICMP │
│ 目标响应 │ 端口不可达 │ 回显应答 │
│ 防火墙友好 │ 较差 │ 较好 │
│ 默认平台 │ Linux/Unix │ Windows │
└─────────────┴──────────────┴──────────────┘
3.3 traceroute工作流程
详细流程(UDP方式):
1. 用户执行:traceroute google.com
2. DNS解析:获取目标IP
3. 初始化:
- TTL = 1
- 目标端口 = 33434(通常)
4. 第1跳:
a. 发送3个UDP包(TTL=1)到端口33434、33435、33436
b. 第一个路由器收到,TTL减1变成0
c. 路由器丢弃包,返回ICMP超时(Type 11, Code 0)
d. 记录路由器IP和3个响应时间
e. 显示:1 192.168.1.1 1.5ms 1.3ms 1.4ms
5. 第2跳:
a. TTL = 2
b. 发送3个UDP包
c. 经过第一个路由器(TTL=2→1)
d. 第二个路由器收到(TTL=1→0)
e. 返回ICMP超时
f. 显示:2 10.0.0.1 5.2ms 5.1ms 5.3ms
6. 继续递增TTL,重复步骤5
7. 到达目标:
- 目标主机收到UDP包
- 端口33434通常未使用
- 返回ICMP端口不可达(Type 3, Code 3)
- traceroute识别到达目标
- 停止
8. 超时处理:
- 如果2秒内未收到响应
- 显示 * 表示超时
- 可能原因:
* 路由器配置不响应ICMP
* 防火墙过滤
* 包丢失
9. 显示统计信息
特殊情况:
1. * * *(三个星号)
- 该跳无响应
- 可能被防火墙过滤
- 或路由器配置不回复ICMP
2. !H / !N / !P
- !H: 主机不可达
- !N: 网络不可达
- !P: 协议不可达
3. 相同IP重复出现
- 可能是负载均衡
- 或ECMP(等价多路径)
3.4 traceroute输出解析
示例输出:
$ traceroute google.com
traceroute to google.com (142.250.185.14), 30 hops max, 60 byte packets
1 192.168.1.1 (192.168.1.1) 1.234 ms 1.156 ms 1.089 ms
2 10.0.0.1 (10.0.0.1) 5.234 ms 5.178 ms 5.123 ms
3 172.16.0.1 (172.16.0.1) 10.456 ms 10.389 ms 10.234 ms
4 61.152.54.125 (61.152.54.125) 15.234 ms 15.178 ms 15.123 ms
5 61.152.25.90 (61.152.25.90) 20.456 ms 20.389 ms 20.234 ms
6 202.97.33.106 (202.97.33.106) 25.234 ms 25.178 ms 25.123 ms
7 * * *
8 108.170.252.1 (108.170.252.1) 45.234 ms 45.178 ms 45.123 ms
9 142.250.185.14 (142.250.185.14) 50.123 ms 50.089 ms 50.045 ms
解析:
第一行:
traceroute to google.com (142.250.185.14), 30 hops max, 60 byte packets
- 目标:google.com (142.250.185.14)
- 最大跳数:30
- 包大小:60字节
每一跳:
1 192.168.1.1 (192.168.1.1) 1.234 ms 1.156 ms 1.089 ms
│ │ │ │ │ │
│ │ │ └──────────┴──────────┴─ 3次往返时间
│ │ └─ 主机名(如果能解析)
│ └─ IP地址
└─ 跳数
特殊情况:
1. * * *
7 * * *
→ 该跳路由器不响应或被过滤
2. 请求超时后跳过
7 * * *
8 108.170.252.1 45.234 ms 45.178 ms 45.123 ms
→ 第7跳无响应,但第8跳可达(中间路由器被配置为不响应)
3. 延迟突然增加
5 ... 20.234 ms
6 ... 25.178 ms
7 ... 80.456 ms ← 突然增加
→ 可能的原因:
- 跨越长距离链路
- 卫星链路
- 拥塞
- 路由器负载高
4. 多个IP地址
3 172.16.0.1 (172.16.0.1) 10.456 ms
172.16.0.2 (172.16.0.2) 10.389 ms
172.16.0.1 (172.16.0.1) 10.234 ms
→ 负载均衡或ECMP
3.5 traceroute常用选项
常用参数:
-m max_ttl
设置最大TTL(默认30)
traceroute -m 20 google.com
-q nqueries
每跳发送的包数量(默认3)
traceroute -q 5 google.com
-w waittime
等待响应的超时时间(秒,默认5)
traceroute -w 2 google.com
-I
使用ICMP回显代替UDP(需要root)
sudo traceroute -I google.com
-T
使用TCP SYN代替UDP(需要root)
sudo traceroute -T google.com
-p port
设置起始端口号(默认33434)
traceroute -p 40000 google.com
-n
不解析主机名,只显示IP
traceroute -n google.com
-A
启用AS号查找
traceroute -A google.com
实用技巧:
1. 快速traceroute:
traceroute -q 1 -w 1 target
每跳只发1个包,1秒超时
2. ICMP方式(更容易通过防火墙):
sudo traceroute -I target
3. TCP方式(测试到特定端口):
sudo traceroute -T -p 80 target
追踪到80端口的路径
4. 不解析域名(更快):
traceroute -n target
4. ICMPv6
4.1 ICMPv6概述
ICMPv6 = ICMP for IPv6
相比ICMPv4的变化:
✅ 功能更强大
✅ 整合了更多功能
✅ 必须实现(不是可选)
✅ 简化了类型编码
ICMPv6承担的职责:
1. 错误报告(和ICMPv4类似)
2. 诊断功能(ping、traceroute)
3. 邻居发现(NDP)← 新增!
4. 多播组管理(MLD)← 新增!
协议号:58(IPv6 Next Header)
4.2 ICMPv6报文类型
类型分类:
1. 错误消息(0-127):
Type 1: 目标不可达
Type 2: 包太大
Type 3: 超时
Type 4: 参数问题
2. 信息消息(128-255):
Type 128: 回显请求
Type 129: 回显应答
Type 133: 路由器请求(RS)
Type 134: 路由器通告(RA)
Type 135: 邻居请求(NS)
Type 136: 邻居通告(NA)
Type 137: 重定向
邻居发现协议(NDP):
- 取代了IPv4的ARP
- 使用ICMPv6消息
- 类型133-137
多播侦听发现(MLD):
- 取代了IPv4的IGMP
- 管理多播组成员
4.3 邻居发现协议(NDP)
NDP功能:
1. 地址解析(替代ARP)
2. 路由器发现
3. 前缀发现
4. 邻居不可达检测
5. 重复地址检测(DAD)
6. 重定向
工作流程:
1. 邻居请求(NS)+ 邻居通告(NA):
主机A想发送给主机B
→ 发送NS:谁是2001:db8::2?
→ 主机B回复NA:我是,我的MAC是xx:xx:xx:xx:xx:xx
2. 路由器请求(RS)+ 路由器通告(RA):
新主机上线
→ 发送RS:有路由器吗?
→ 路由器回复RA:我在这,前缀是2001:db8::/64
3. 重复地址检测(DAD):
主机配置地址前
→ 发送NS(目标是自己的地址)
→ 如果收到NA:地址冲突!
→ 如果无响应:地址可用
对比ARP:
┌─────────────┬──────────────┬──────────────┐
│ 特性 │ ARP │ NDP │
├─────────────┼──────────────┼──────────────┤
│ 协议 │ 独立协议 │ ICMPv6 │
│ 广播 │ 使用 │ 不使用 │
│ 多播 │ 不支持 │ 使用 │
│ 额外功能 │ 无 │ 路由发现等 │
│ 安全 │ 较差 │ 可加密 │
└─────────────┴──────────────┴──────────────┘
4.4 ping6 和 traceroute6
IPv6版本的诊断工具:
ping6:
- 类似ping,用于IPv6
- 使用ICMPv6 Type 128/129
- 命令:ping6 ipv6.google.com
示例:
$ ping6 google.com
PING google.com(lax30s04-in-x0e.1e100.net (2607:f8b0:4005:80a::200e)) 56 data bytes
64 bytes from lax30s04-in-x0e.1e100.net (2607:f8b0:4005:80a::200e): icmp_seq=1 ttl=55 time=15.2 ms
traceroute6:
- 类似traceroute,用于IPv6
- 命令:traceroute6 ipv6.google.com
示例:
$ traceroute6 google.com
traceroute to google.com (2607:f8b0:4005:80a::200e), 30 hops max, 80 byte packets
1 fe80::1 1.234 ms 1.156 ms 1.089 ms
2 2001:db8::1 5.234 ms 5.178 ms 5.123 ms
...
5. 其他网络诊断工具
5.1 pathping / mtr
Windows pathping:
pathping = ping + traceroute
功能:
- 结合ping和traceroute
- 显示每一跳的丢包率
- 长时间统计(默认25秒每跳)
使用:
C:\> pathping google.com
输出:
Tracing route to google.com [142.250.185.14]
over a maximum of 30 hops:
0 MYCOMPUTER [192.168.1.100]
1 192.168.1.1
2 10.0.0.1
...
Computing statistics for 50 seconds...
Source to Here This Node/Link
Hop RTT Lost/Sent = Pct Lost/Sent = Pct Address
0 MYCOMPUTER [192.168.1.100]
0/ 100 = 0% |
1 1ms 0/ 100 = 0% 0/ 100 = 0% 192.168.1.1
0/ 100 = 0% |
2 5ms 2/ 100 = 2% 2/ 100 = 2% 10.0.0.1
5/ 100 = 5% |
3 15ms 5/ 100 = 5% 3/ 100 = 3% 172.16.0.1
Linux/Unix mtr:
mtr = My TraceRoute
功能:
- 实时更新的traceroute
- 持续监控每一跳
- 显示丢包率和延迟统计
- 交互式界面
使用:
$ mtr google.com
输出:
My traceroute [v0.93]
MYCOMPUTER (192.168.1.100) 2025-11-05T10:00:00+0000
Keys: Help Display mode Restart statistics Order of fields quit
Packets Pings
Host Loss% Snt Last Avg Best Wrst StDev
1. 192.168.1.1 0.0% 100 1.2 1.3 1.0 2.0 0.2
2. 10.0.0.1 2.0% 100 5.1 5.3 4.8 8.0 0.5
3. 172.16.0.1 5.0% 100 15.2 15.5 14.0 20.0 1.2
4. 61.152.54.125 0.0% 100 20.1 20.3 19.0 25.0 1.0
5. google.com 0.0% 100 50.2 50.5 49.0 55.0 1.5
实用选项:
-r # 报告模式(非交互)
-c 100 # 发送100个包后停止
-n # 不解析主机名
-b # 显示主机名和IP
示例:
mtr -r -c 50 google.com > report.txt
5.2 nslookup / dig / host
DNS诊断工具:
nslookup:
- 查询DNS记录
- 跨平台
使用:
$ nslookup google.com
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: google.com
Address: 142.250.185.14
dig:
- 更强大的DNS工具
- 详细输出
- Linux/Unix
使用:
$ dig google.com
; <<>> DiG 9.10.6 <<>> google.com
;; ANSWER SECTION:
google.com. 299 IN A 142.250.185.14
host:
- 简单DNS查询
- 快速查询
使用:
$ host google.com
google.com has address 142.250.185.14
google.com has IPv6 address 2607:f8b0:4005:80a::200e
5.3 netstat / ss
连接状态查看:
netstat(老工具):
- 显示网络连接
- 显示路由表
- 显示接口统计
常用选项:
-a # 所有连接
-t # TCP连接
-u # UDP连接
-n # 数字格式(不解析)
-p # 显示进程
-r # 路由表
-i # 接口统计
示例:
netstat -antp # 所有TCP连接,显示进程
ss(新工具,更快):
- netstat的现代替代品
- 更快,功能更强
常用选项:
-a # 所有套接字
-t # TCP
-u # UDP
-n # 数字格式
-p # 显示进程
-l # 监听套接字
示例:
ss -antp # 所有TCP连接,显示进程
ss -s # 统计摘要
5.4 tcpdump / wireshark
抓包分析工具:
tcpdump:
- 命令行抓包工具
- 强大的过滤器
- 适合服务器
基本使用:
tcpdump -i eth0 # 抓取eth0接口
tcpdump icmp # 只抓ICMP包
tcpdump host google.com # 指定主机
tcpdump port 80 # 指定端口
常用选项:
-i interface # 指定接口
-c count # 抓取数量
-w file # 保存到文件
-r file # 读取文件
-n # 不解析
-v # 详细输出
示例:
# 抓取ping包
tcpdump -i any icmp
# 抓取到google.com的包并保存
tcpdump -i eth0 host google.com -w capture.pcap
Wireshark:
- 图形化抓包工具
- 功能强大
- 详细分析
- 适合桌面使用
特点:
✅ 直观的界面
✅ 强大的过滤
✅ 协议解析
✅ 统计分析
✅ 流追踪
6. 实战项目:网络诊断工具套件
6.1 项目需求
功能需求:
1. 实现ping功能
- ICMP回显请求/应答
- RTT计算
- 统计信息
2. 实现traceroute功能
- TTL递增
- 路径发现
- 延迟测量
3. 网络质量测试
- 丢包率
- 延迟抖动
- 持续监控
4. 综合诊断报告
- 连通性测试
- 路径分析
- 性能评估
技术要求:
- Python实现
- 使用原始套接字
- 跨平台支持(尽量)
- 友好的输出
6.2 工具演示
# ping功能
python day24_network_diagnostic.py --ping google.com
# traceroute功能
sudo python day24_network_diagnostic.py --traceroute google.com
# 网络质量测试
python day24_network_diagnostic.py --quality google.com --count 100
# 综合诊断
python day24_network_diagnostic.py --diagnose google.com
7. 今日练习
练习1:ping分析
1. ping一个网站100次,观察:
- 平均RTT
- 最大/最小RTT
- 丢包率
- RTT分布
2. ping时修改包大小:
- 正常大小(56字节)
- MTU大小(1472字节)
- 超过MTU(2000字节)
观察有什么不同?
3. ping时修改TTL:
- TTL=1
- TTL=5
- TTL=64
观察结果的区别
练习2:traceroute分析
1. traceroute到一个国外网站:
- 记录总跳数
- 找出延迟最大的一跳
- 分析是否跨越长距离链路
2. 对比不同目标的路径:
- 国内网站
- 香港网站
- 美国网站
分析路由差异
3. 使用不同方法traceroute:
- UDP方式
- ICMP方式
- TCP方式
对比结果差异
练习3:实际故障诊断
场景:网站访问很慢
诊断步骤:
1. ping网站
- 能ping通吗?
- RTT多少?
- 有丢包吗?
2. traceroute
- 哪一跳延迟高?
- 有超时的跳吗?
3. nslookup
- DNS解析正常吗?
- 解析时间多长?
4. 综合分析:
- 问题在哪?
- 如何解决?
练习4:编程实现
实现一个简单的ping:
1. 构造ICMP回显请求
2. 发送数据包
3. 接收响应
4. 计算RTT
5. 显示结果
提示:
- 使用socket.IPPROTO_ICMP
- 需要root权限
- 计算校验和
8. 常见问题
Q1:为什么有些网站ping不通但能访问?
A:
- 服务器可能禁用了ICMP响应
- 防火墙过滤ICMP
- 这是安全配置
- 可以尝试TCP ping(如httping)
Q2:traceroute中的 * * * 是什么意思?
A:
- 该跳路由器不响应ICMP
- 可能被配置为不回复
- 或防火墙过滤
- 不一定表示故障
Q3:为什么ping的RTT有时突然变大?
A: 可能原因:
- 网络拥塞
- 路由器负载高
- 链路质量差
- 无线信号弱
- 后台下载/上传
Q4:ping和HTTP访问的延迟为什么不同?
A:
- ping只测ICMP往返(网络层)
- HTTP包括TCP握手+应用处理(多层)
- HTTP延迟 ≈ ping RTT + TCP握手 + 服务器处理
- 通常HTTP延迟 > ping RTT
Q5:如何测试到特定端口的连通性?
A:
# 使用telnet
telnet google.com 80
# 使用nc(netcat)
nc -zv google.com 80
# 使用nmap
nmap -p 80 google.com
# TCP traceroute
sudo traceroute -T -p 80 google.com
9. 总结
今天我们学习了:
核心知识点
ICMP协议:
- 网络层辅助协议
- 错误报告和诊断
- 主要类型和格式
ping工作原理:
- ICMP回显请求/应答
- RTT计算
- 丢包检测
traceroute原理:
- 利用TTL递减
- 路径发现
- UDP/ICMP/TCP方式
ICMPv6:
- 功能更强大
- 整合NDP和MLD
- 邻居发现协议
诊断工具:
- ping/ping6
- traceroute/traceroute6
- mtr/pathping
- netstat/ss
- tcpdump/wireshark
重点回顾
ICMP报文结构:
- Type(类型)
- Code(代码)
- Checksum(校验和)
- 数据部分
ping流程:
发送ICMP Echo Request (Type 8)
→ 目标返回Echo Reply (Type 0)
→ 计算RTT
traceroute流程:
TTL=1 → 第1跳返回超时
TTL=2 → 第2跳返回超时
...
直到目标主机
常用工具:
ping:测试连通性
traceroute:追踪路径
mtr:实时监控
tcpdump:抓包分析
实用技巧
1. 快速连通性测试:
ping -c 1 -W 1 target
2. 持续监控网络质量:
mtr target
3. 诊断DNS问题:
nslookup / dig
4. 查看连接状态:
ss -antp
5. 抓包分析:
tcpdump icmp -i any
明天预告
第25天:ARP协议和链路层
内容预览:
- ARP协议原理
- ARP缓存管理
- ARP欺骗和防御
- RARP和代理ARP
- 链路层其他协议
- 网络安全实践
继续加油! 🚀
今天我们深入学习了ICMP协议和各种网络诊断工具,这些是网络工程师日常工作的必备技能。理解ping和traceroute的原理,能让我们更好地诊断和解决网络问题。明天我们将学习ARP协议,了解IP地址如何映射到MAC地址!
进度:24/180天(13.3%)