4.4.1ICMP报文的种类
ICMP(Internet Control Message Protocol)是IP协议的辅助协议,主要用于传递控制消息、错误报告和诊断信息。其报文分为两大类:查询报文和错误报告报文。
1. 错误报告报文(Error Messages)
用于网络传输过程中出现错误时的通知,目的主机或路由器需要及时处理这些报文。
1.1 目的不可达(Destination Unreachable)- 类型3
-
用途:通知源主机数据报无法传递到目标。
-
代码字段(Code):
0 - 网络不可达(Network Unreachable) 1 - 主机不可达(Host Unreachable) 2 - 协议不可达(Protocol Unreachable) 3 - 端口不可达(Port Unreachable) 4 - 需要分片但禁止分片(Fragmentation Needed)
-
示例:目标主机防火墙禁止访问某协议或端口。
1.2 源点抑制(Source Quench)- 类型4
- 用途:通知源主机降低发送数据速率(过时功能,现由TCP拥塞控制替代)。
- 代码字段:固定值为0。
1.3 时间超时(Time Exceeded)- 类型11
-
用途:TTL(生存时间)减至0时触发。
-
代码字段:
0 - TTL超时(数据包未到达目标) 1 - 分片重组超时(分片数据未在限定时间内完成重组)
-
示例:
traceroute
工具依赖此报文检测路径上的路由器。
1.4 参数问题(Parameter Problem)- 类型12
- 用途:报告IP头字段错误(如校验和错误、选项字段无效)。
- 代码字段:固定值为0或1。
1.5 重定向(Redirect)- 类型5
-
用途:路由器通知源主机更优的下一跳路由。
-
代码字段:
0 - 对网络重定向 1 - 对主机重定向
2. 查询报文(Query Messages)
用于网络诊断或通信双方的状态确认。
2.1 回显请求与应答(Echo Request & Reply)- 类型8/0
- 用途:验证网络连通性(如
ping
命令)。 - 工作流程:
- 回显请求(Type=8):源主机发送请求。
- 回显应答(Type=0):目标主机响应。
2.2 时间戳请求与应答(Timestamp Request & Reply)- 类型13/14
- 用途:同步网络设备的时间或测量网络时延。
- 数据字段:包含请求发送时间戳、接收时间戳和应答时间戳。
2.3 地址掩码请求与应答(Address Mask Request & Reply)- 类型17/18
- 用途:获取子网掩码(现多由DHCP替代)。
- 代码字段:固定值为0。
ICMP报文分类
关键点总结
- 错误报文优先级:ICMP错误报文不触发新错误(避免无限循环)。
- 查询报文示例:
ping
命令依赖回显请求与应答实现连通性测试。 - 错误报文时延:如接收缓冲满载,错误报文可能被延迟或丢弃。
通过上述分类和机制,ICMP帮助IP协议更健壮地处理网络异常和诊断需求。
4.4.2ICMP的应用举例
一、ICMP应用场景概述
ICMP(Internet Control Message Protocol)不是独立的传输协议,而是一个辅助IP协议的"信使协议"。常见的应用场景包括:
- 网络诊断(如Ping命令)
- 错误状态反馈(如目标不可达、超时等)
- 路由优化(如重定向报文)
- 路径特征探测(如TTL超时)
二、经典应用举例
1. Ping命令(网络连通性测试)
- 实现原理:依靠ICMP的Echo Request(类型8)和Echo Reply(类型0)报文
- 流程解析:
- 关键细节:
- 包含标识符(标识进程)和序列号(识别丢失/重复的包)
- 利用回复中的Timestamp计算往返时间(RTT)
- 如果TTL耗尽但仍未到达目的主机,中间路由器会返回Type 11(超时)报文
2. Traceroute(路径追踪)
- 实现原理:利用逐级递增TTL触发沿路路由器返回ICMP超时报文
- 流程示例:
- 技术细节:
- Windows系统使用ICMP报文实现,Linux默认使用UDP+ICMP实现
- 目的端口设置为不常用的高位端口(通常为33434-33534)
- 如果收到Type 3(目标不可达)或Type 0(Echo Reply),停止探测
3. 路由重定向(优化网络流量)
当路由器发现主机选择了次优路径时,会发送Type 5的ICMP重定向报文:
- 重定向类型:
- Code 0:重定向网络
- Code 1:重定向主机
- Code 2:重定向TOS和网络
- Code 3:重定向TOS和主机
4. MTU路径发现(避免分片丢包)
- 原理:发送DF(Don’t Fragment)标记的探测包,触发ICMP Fragmentation Needed(Type 3, Code 4)报文
- 流程关键点:
三、ICMP差错报文工作机制
所有ICMP差错报文必须包含原始IP首部+前8字节负载,使接收方能准确定位问题来源。
示例:端口不可达(Type 3, Code 3)
当主机收到UDP包但目标端口无监听服务时:
四、扩展思考
- 防火墙与ICMP:某些场景会过滤ICMP(如类型8/0用于隐蔽扫描)
- ICMP攻击面:Ping Flood、Smurf攻击均基于ICMP报文
- IPv6的ICMPv6:整合了旧版ARP和IGMP的功能(如邻居发现)