目录
[1. 缩写词:](#1. 缩写词:)
[2. ICMP的目的:](#2. ICMP的目的:)
[2.1 什么是ICMP:](#2.1 什么是ICMP:)
[2.2 什么时候使用ICMP:](#2.2 什么时候使用ICMP:)
[3. ICMP 头部:](#3. ICMP 头部:)
[4. ICMP 报文类型:](#4. ICMP 报文类型:)
[4.1 目标不可达:](#4.1 目标不可达:)
[4.2 重定向:](#4.2 重定向:)
[4.3 超时:](#4.3 超时:)
[4.4 Ping(回波请求和回波回复):](#4.4 Ping(回波请求和回波回复):)
[5. ICMP如何工作:](#5. ICMP如何工作:)
[5.1 目标不可达:](#5.1 目标不可达:)
[5.2 重定向:](#5.2 重定向:)
[5.3 超时:](#5.3 超时:)
1. 缩写词:
|------------------|-----------------------------------|
| Abbreviation | Meaning |
| ToS | Type of Service |
| ICMP | Internet Control Message Protocol |
| IP | Internet Protocol |
| MTU | Maximum Transmission Unit |
| TTL | Time To Live |
2. ICMP的目的:
2.1 什么是ICMP:
- ICMP - Internet Control Message Protocol,互联网控制消息协议,是一种辅助协议,是IP不可或缺的一部分。
- 这意味着每个IP设备都必须支持ICMP,ICMP消息被封装在协议号为1的IP数据包中。
2.2 什么时候使用ICMP:
当网络设备想要报告错误消息、提出路由建议或诊断网络性能时,使用此协议。
3. ICMP 头部:
- 类型:此字段指示ICMP消息的类型。请参阅第3节了解此字段的值。
- 代码:此字段表示附加信息。例如:如果类型为"Destination Unreachable",则代码将提供问题的答案:"为什么目标不可达?"。请参阅第3节了解此字段的值。
- 校验和:此字段用于检查ICMP标头和封装数据中的错误。
- 标头其余部分:此字段因消息类型/代码而异。
此标头用于封装ICMP数据。内容取决于ICMP消息类型。
- 对于错误消息,将发送导致错误的数据包的IP报头和IP有效载荷的前8个字节。
- 对于回显消息,回显请求中的数据必须在回显回复中回显。例如,如果请求中有500个字节,那么这500个字节必须在回复中回显。
注意:并非所有ICMP消息都封装数据。例如,ping可以有一个0字节的有效载荷,其中只包含ICMP报头。
4. ICMP 报文类型:
有许多消息类型。在这篇文章中,我们主要关注两种流行的类型:
- 错误消息。这种类型有三种形式:
- 无法到达目的地。
- 重定向。
- 时间已过。
- 查询消息。这种类型有两种形式:
- 回声请求。
- 回声回复
4.1 目标不可达:
- 目标不可达消息用于通知主机数据包无法到达其目标。
- ICMP类型=3。
- ICMP代码见下表:
|-----|-------------------------------------------|-----------------|
| * 0 | Destination network unreachable | 目标网络无法连接 |
| 1 | Destination host unreachable | 目标主机不可达 |
| 2 | Destination protocol unreachable | 无法访问目标协议 |
| 3 | Destination port unreachable | 无法访问目标端口 |
| 4 | Fragmentation needed and DF-bit set | 需要分段和DF-bit set |
| 13 | Communication administratively prohibited | 行政禁止通信 |
- 本例中的header如下:
- 红色框表示数据包无法到达目的地。
- 蓝色框表示数据包无法到达目的地的原因。
- 粉红色框仅用于代码4。
- 绿色框表示哪个数据包无法到达目的地。
4.2 重定向:
- 路由器使用重定向消息通知主机使用不同的路由器(更好的路由)到达目的地。
- ICMP Type=5。
- ICMP Code见下表:
|---|------------------------------|---------------------------------|---------------------------|
| 0 | Redirect for network | 主机不仅应重定向到此目标IP,还应重定向到同一网络中的所有目标 | Prohibited since RFC 1812 |
| 1 | Redirect for host | 主机应将所有数据包重定向到此目标IP | |
| 2 | Redirect for ToS and network | 与Code 0相同,但仅适用于与此代码具有相同ToS值的数据包 | Prohibited since RFC 1812 |
| 3 | Redirect for ToS and host | 与Code 1相同,但仅适用于与此代码具有相同ToS值的数据包 | |
- 本例中的header如下:
- IP地址:此字段表示应将数据包发送到的路由器的IP地址,而不是此路由器。
- IP报头和原始数据报数据的前8个字节:此字段指示导致发送此重定向消息的消息。
4.3 超时:
- 超时消息用于两种情况:
- 通知发送方路由器无法转发数据包,因为IP TTL已过期。
- 通知发送方,由于并非所有碎片都及时到达,设备必须丢弃碎片数据包。
- ICMP Type=11。
- ICMP Code见下表:
|---|-----------------------------------|
| 0 | TTL exceeded in transit |
| 1 | Fragment reassembly time exceeded |
- 本例中的header如下:
- IP报头和原始数据报数据的前8个字节:此字段指示导致发送此超时消息的消息。
4.4 Ping(回波请求和回波回复):
- 如果主机收到回声请求,它应该向请求的源发送回声回复。
- 对于回显请求,ICMP Type=0。对于回显应答,ICMP Type=0。
- ICMP Code = 0.
- 本例中的header如下:
- 标识符:此字段用于跟踪它发送的ping。对于发送的每个ping序列,此值将递增1。应答消息将使用与请求消息相同的标识符。
- 例如:ping 8.8.8.8,主机将发送5个标识符为0的Echo请求。那么。ping 1.1.1.1,主机将发送5个标识符为1的回声请求。
- 序列号:此字段用于跟踪一系列中的每个请求和应答交换。
- 例如:ping 8.8.8.8,主机将发送5个标识符为0的Echo请求。请求1和应答1将具有相应的序列号=0,请求2和应答2将具有相应序列号=1,。。。
- 注意:此序列号可以解释为大端阶或小端阶(下图中的蓝色框)。示例:Wireshark显示两者。
- 有效载荷:此字段只是一串ASCII字符。注:
- 请求的有效载荷必须在回复中发回。
- Ping可以在没有有效载荷的情况下发送。消息大小为28字节(IP报头+ICMP报头)。
5. ICMP如何工作:
5.1 目标不可达:
- 步骤1:PC1向R1发送一个数据包(目的地为PC3)。
- 步骤2:R1有一个匹配的路由,因此它将数据包转发给R2。
- 步骤3:R2没有与目标192.168.3.10匹配的路由,因此它丢弃了数据包。→ 解释一下?
- 步骤4:R2向PC1发送ICMP目标不可达消息。
5.2 重定向:
- 步骤1:PC1向R1发送数据包(目的地SRV1)。
- 步骤2:R1将数据包转发到目的地R2。
- 步骤3:R1向PC1发送ICMP重定向,说明:"发送到SRV1 IP地址的数据包应通过R2发送"。
- 步骤4:PC1通过R2而不是R1向SRV1发送未来的数据包。
5.3 超时:
- 步骤1:PC1向R1发送一个TTL=2的数据包(目标PC3)。
- 步骤2:R1接收到一个数据包,并意识到必须将其转发给R2,然后将TTL减为1并转发给R2。
- 步骤3:R2接收到一个数据包,并意识到必须将其转发给R3,然后将TTL减为1,这将导致TTL=0。然后,R2丢弃该数据包。
- 步骤4:R2向PC1发送ICMP超时消息。