赞
踩
网络网络层之(6)ICMPv4协议
Author: Once Day Date: 2024年6月2日
一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…
漫漫长路,有人对你微笑过嘛…
全系列文章可参考专栏: 通信网络技术_Once-Day的博客-CSDN博客。
参考文章:
- 《TCP/IP详解卷一》
- RFC 792 - Internet Control Message Protocol (ietf.org)
- RFC 4884 - Extended ICMP to Support Multi-Part Messages (ietf.org)
- TCP/IP 笔记 - ICMPv4和ICMPv6 : Internet控制报文协议 - 野兽’ - 博客园 (cnblogs.com)
- 5.ICMPv4协议分析与实践_icmp v4-CSDN博客
- ICMP Echo Request/Reply消息格式 - IP报文格式大全(html) - 华为 (huawei.com)
- TCP/IP卷一:44—ICMP之(ICMP(控制报文协议)简介、ICMPv4、ICMPv6报文格式/报文处理)_大量的icmpv6报文-CSDN博客
ICMPv4是IPv4协议族中的一个重要协议,它主要用于传递网络层的控制和错误信息。与IP数据报不同,ICMPv4报文并不直接用于传输用户数据,而是辅助IP协议更好地完成数据传输任务。
ICMPv4报文封装在IP数据报中进行传输。报文主要由两部分组成:报头和数据部分。报头包含了类型、代码和校验和等重要信息,用于识别报文的类型和检测传输错误,数据部分携带了与具体报文类型相关的信息。
根据功能,ICMPv4报文可以分为两大类:差错报告报文和查询报文。
(1) 差错报告报文用于告知源主机在数据传输过程中遇到的各种错误情况:
(2) 查询报文则用于网络探测和管理:
常用的网络诊断工具如ping、traceroute都是基于ICMPv4实现的,可以利用它们快速判断网络状态,定位故障点。
以下是与ICMPv4相关的主要RFC文档列表:
ICMPv4报文格式由类型、代码和校验和三个固定字段组成,后面紧跟与具体报文类型相关的数据部分。
字段说明:
IPv4报文首部协议(proto)字段值为1,表示其携带了ICMPv4报文数据。
Type(类型,8位)标识ICMPv4报文的类型,不同的类型对应不同的报文格式和用途,如0表示回显应答,8表示回显请求等。
Code(代码,8位)与类型字段一起标识ICMPv4报文的具体含义,同一类型的报文可能有多个代码值,表示不同的错误原因或附加信息。
Checksum(校验和,16位)用于检测报文在传输过程中是否出现错误,计算时需要将校验和字段置零,然后对整个ICMP报文进行16位二进制反码求和。
Message Body(消息体,长度可变)携带与具体报文类型相关的数据,如错误信息、回显数据等,不同类型的报文有不同的消息体格式。
常见的ICMPv4报文类型如下:
类型 | 名称 | RFC文档 | 差错or查询 | 用途描述 |
---|---|---|---|---|
0 | Echo Reply | RFC792 | 查询 | 响应Echo Request,用于确认连通性和RTT测量 |
3 | Destination Unreachable | RFC792 | 差错 | 通知源主机目标不可达,具体原因在Code字段中说明 |
4 | Source Quench | RFC792 | 差错 | 通知源主机降低发送速率,避免拥塞(已废弃) |
5 | Redirect | RFC792 | 差错 | 通知源主机有更好的路由,优化路由路径 |
8 | Echo Request | RFC792 | 查询 | 请求目标主机回应,用于确认连通性和RTT测量 |
9 | Router Advertisement | RFC1256 | 查询 | 路由器定期或应请求发送,公告自身作为默认网关的可用性 |
10 | Router Solicitation | RFC1256 | 查询 | 主机发送该报文,请求路由器立即发送Router Advertisement |
11 | Time Exceeded | RFC792 | 差错 | 当TTL耗尽或分片重组超时时,告知源主机 |
12 | Parameter Problem | RFC792 | 差错 | IP首部存在问题导致无法处理时,告知源主机 |
13 | Timestamp | RFC792 | 查询 | 请求目标主机回送时间戳,用于时间同步(已废弃) |
14 | Timestamp Reply | RFC792 | 查询 | Timestamp查询的应答报文(已废弃) |
15 | Information Request | RFC792 | 查询 | 请求目标主机提供IP地址信息(已废弃) |
16 | Information Reply | RFC792 | 查询 | Information Request的应答报文(已废弃) |
17 | Address Mask Request | RFC1256 | 查询 | 请求子网掩码信息(已废弃) |
18 | Address Mask Reply | RFC1256 | 查询 | Address Mask Request的应答报文(已废弃) |
类型3、4、5、11、12属于差错报文,用于通知源主机存在的问题。
类型0、8、13、14、15、16属于查询报文,用于诊断连通性、测量时延等。
有些类型如Source Quench、Timestamp等已经被废弃不再使用。
ICMPv4中类型3、5、9、11、12的常见代码号如下:
类型 | 代码 | 名称 | 描述 |
---|---|---|---|
3 | 0 | Net Unreachable | 目标网络不可达 |
3 | 1 | Host Unreachable | 目标主机不可达 |
3 | 2 | Protocol Unreachable | 目标协议不可达 |
3 | 3 | Port Unreachable | 目标端口不可达 |
3 | 4 | Fragmentation Needed and Don’t Fragment was Set | 需要分片但设置了不分片位 |
3 | 5 | Source Route Failed | 源路由失败 |
3 | 6 | Destination Network Unknown | 目标网络未知 |
3 | 7 | Destination Host Unknown | 目标主机未知 |
3 | 8 | Source Host Isolated | 源主机被隔离 |
3 | 9 | Communication with Destination Network is Administratively Prohibited | 与目标网络的通信被管理员禁止 |
3 | 10 | Communication with Destination Host is Administratively Prohibited | 与目标主机的通信被管理员禁止 |
3 | 11 | Destination Network Unreachable for Type of Service | 对于此类服务,目标网络不可达 |
3 | 12 | Destination Host Unreachable for Type of Service | 对于此类服务,目标主机不可达 |
3 | 13 | 管理禁止通信 | 被过滤策略禁止的通信 |
3 | 14 | 违反主机优先级 | src/dest/port不准许的优先级 |
3 | 15 | 优先级终止生效 | 在最小Tos之下(RFC1812) |
5 | 0 | Redirect Datagram for the Network | 对特定网络重定向 |
5 | 1 | Redirect Datagram for the Host | 对特定主机重定向 |
5 | 2 | Redirect Datagram for the Type of Service and Network | 对特定类型服务和网络重定向 |
5 | 3 | Redirect Datagram for the Type of Service and Host | 对特定类型服务和主机重定向 |
9 | 0 | Normal Router Advertisement | 正常路由器通告 |
9 | 16 | Does Not Route Common Traffic | 不路由普通流量 |
11 | 0 | Time to Live exceeded in Transit | 传输过程中超过生存时间 |
11 | 1 | Fragment Reassembly Time Exceeded | 分片重组超时 |
12 | 0 | Pointer indicates the error | 参数问题,错误由指针指出 |
12 | 1 | Missing a Required Option | 缺少必需的选项 |
12 | 2 | Bad Length | 长度错误 |
在某些情况下,网络设备不会产生ICMPv4差错报文,以避免网络拥塞、安全问题或无用的错误报告:
广播或组播地址,当IP数据报的目标地址是广播或组播地址时,通常不会产生ICMPv4差错报文,如"目标不可达"或"超时"等。
分片,当接收到IP分片时,如果出现错误(如超时、目标不可达等),通常不会为每个分片生成单独的ICMPv4差错报文,而是等到全部分片到达后再生成一个差错报文。
ICMP差错报文,为了避免无限循环,当一个ICMP差错报文触发另一个差错时,通常不会再生成新的ICMP差错报文。
源地址不可达,当源IP地址不可达时(零地址、环回地址、广播地址或组播地址),通常不会生成ICMPv4差错报文,以避免网络拥塞和广播风暴。
作为链路层广播的数据报,避免产生大量的差错报文。
安全策略,根据网络管理员的安全策略,某些类型的ICMPv4报文可能会被禁用或过滤,如ping请求、重定向等。
ICMPv4的目的不可达报文(Destination Unreachable Message)是类型3的差错报文,用于在数据包无法送达目标时,由路由器或主机向源端发送,告知其发生了不可达的情况。
RFC 792报文的格式如下:
Destination Unreachable Message(RFC 792)
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| unused |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Internet Header + 64 bits of Original Data Datagram |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明如下:
RFC 4884报文格式如下(支持扩展数据结构):
Destination Unreachable Message(RFC 4884)
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| unused | Length | Next-Hop MTU* |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Internet Header + leading octets of original datagram |
| |
| // |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ICMP扩展头部以及零个或多个关联对象 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Next-Hop MTU
字段用于记录下一跳的MTU,并被PMTUD使用。当路由器或主机无法转发或处理接收到的数据包时,就会向源端发送一个相应的目的不可达报文。源端收到该报文后,可以根据Code值判断具体的不可达原因,并结合数据部分携带的原始报文信息进行问题的定位和调整。
Code字段表示不可达的具体原因,常见取值如下:
数据部分包含了引发该差错报文的原始IP数据报的IP头部和前64位数据,用于帮助源端定位和诊断问题。如果原始数据报小于64位,则截断后填充0。
ICMPv4定义了"Packet Too Big"(PTB)报文,用于在网络中发现和调整数据包的大小,以适应不同链路的MTU限制,这种机制称为"Path MTU Discovery"(PMTUD),对于优化网络性能和避免分片非常重要。
在ICMPv4中,PTB报文属于目的不可达报文(类型3)的一种特例,使用代码4表示。当一个路由器收到一个数据包,其大小超过了下一跳链路的MTU,且该数据包设置了"Don’t Fragment"(DF)标志时,路由器会丢弃该数据包,并向源主机发送一个PTB报文。
PTB报文的格式与普通的目的不可达报文类似,但在未使用字段中携带了下一跳链路的MTU值。源主机收到PTB报文后,会将该报文中指示的MTU值作为目标地址的Path MTU(PMTU),并据此调整后续数据包的大小。
如果源主机无法缩减数据包大小,则会中止发送并向上层应用报告错误。
ICMPv4的重定向报文(Redirect Message)是一种特殊的ICMP报文,用于通知主机更优的路由路径。当主机发送数据包时,如果路由器发现主机使用了次优的路由路径,则会向主机发送重定向报文,建议主机更新其路由表,以便后续数据包可以直接发送到更优的下一跳路由器。
Redirect Message(5)
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Gateway Internet Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Internet Header + 64 bits of Original Data Datagram |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
重定向类型(Code):
ICMPv4的超时报文(Time Exceeded Message)是一种重要的差错报文,用于通知源主机在数据包传输过程中发生了超时。这种超时通常分为两种情况:
下面是ICMPv4超时报文的格式:
Time Exceeded Message(11)
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| unused |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Internet Header + 64 bits of Original Data Datagram |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明:
超时代码(Code):
超时报文用于通知源主机在数据包传输过程中发生了异常,帮助源主机诊断和调试网络问题:
ICMPv4的参数问题报文(Parameter Problem Message)是一种重要的差错报文,用于通知源主机在数据包的首部中发现了错误或不完整的信息。当路由器或主机在处理数据包时检测到头部字段存在问题,无法正确解析或处理时,就会向源主机发送参数问题报文。
Parameter Problem Message(12)
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Pointer | unused |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Internet Header + 64 bits of Original Data Datagram |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明:
错误代码(Code):
参数问题报文用于通知源主机在发送数据包时出现了首部错误,帮助源主机诊断和调试网络问题:
ICMP回显请求和应答是我们日常网络应用中最常见的两种ICMP报文。它们构成了Ping程序的基础,让我们能够方便地检测网络的连通性和延迟。
Echo(8) or Echo Reply(0) Message
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 ...
+-+-+-+-+-
一个完整的ICMP回显请求或应答报文由以下几个字段依次组成:
最常见的应用莫过于Ping程序了。当我们在命令行中输入"ping 目标IP地址"时,源主机就会构造一系列ICMP回显请求报文,填入适当的标识符和序号,然后连续发送给目标主机。
目标主机收到请求后,会提取报文中的标识符和序号,构造对应的ICMP回显应答报文,再发送回源主机。源主机根据收到的ICMP应答,计算往返时间和丢包率,评估与目标主机之间的网络质量。
另一个常见的应用是traceroute程序,它通过逐步增加IP包的生存时间(TTL),结合ICMP超时错误和到达目标时的ICMP端口不可达错误,一跳一跳地探测到目标主机的网络路径。
ICMPv4 路由器请求和通告报文帮助主机自动发现附近的路由器,获取必要的配置信息。
路由器请求报文的ICMP类型值为 9,当一台主机希望自动获取路由器的信息时,它会在本地网络上广播一个路由器请求报文。这个报文的目标地址通常为受限广播地址255.255.255.255
或本地网段的广播地址。
路由器请求报文的格式非常简洁,除了公共的 ICMP 报头外,没有其他特殊字段:
ICMP Router Solicitation Message(9)
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
路由器通告报文的ICMP类型值为10,当路由器收到一个路由器请求报文或者自身的通告时间间隔到期时,它就会主动向本地网络发送一个路由器通告报文。这个报文通常以组播的形式发送,目标地址为 224.0.0.1。
ICMP Router Advertisement Message(10) 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 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Num Addrs |Addr Entry Size| Lifetime | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Router Address[1] | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Preference Level[1] | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Router Address[2] | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Preference Level[2] | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | . | | . | | . |
相比请求报文,通告报文的内容就丰富多了,除了ICMP报头,它还包含以下重要信息:
主机收到路由器通告报文后,会提取出路由器的IP地址,并根据报文中的生存时间设置老化定时器。在定时器到期之前,主机就可以使用通告的路由器地址作为默认网关,将目标不在本地网段的数据报文转发给路由器处理。
ICMP协议作为网络层的重要协议之一,在网络管理、故障诊断等方面发挥着关键作用。然而,由于其设计的开放性和灵活性,ICMP也常常被恶意利用,成为网络攻击的工具。
(1) ICMP洪泛攻击(ICMP Flood)是一种典型的拒绝服务(DoS)攻击方式。攻击者通过向目标主机或网络发送大量的ICMP请求报文(如Echo请求、时间戳请求等),耗尽目标的网络带宽和系统资源,导致其无法正常提供服务。
攻击者通常采用伪造源IP地址的方式,隐藏自己的真实身份,并利用僵尸网络放大攻击流量。当大量的ICMP请求同时到达目标时,网络设备的处理能力和带宽很快被耗尽,合法用户的请求无法得到及时响应,网络服务质量严重下降。
(2) **ICMP路由重定向攻击(ICMP Redirect)**用于路由器通知主机更优的路由路径。然而,恶意攻击者可以伪造ICMP重定向报文,引诱主机将数据报文发送到错误的路由器或恶意主机,造成数据泄露或中间人攻击。
攻击者通常在与目标主机相同的本地网络内,伪装成合法的路由器,向目标主机发送虚假的ICMP重定向报文。如果主机没有对报文来源进行严格验证,就可能误认为攻击者是可信的路由器,从而将敏感数据发送给攻击者,或者陷入恶意主机设置的"陷阱"。
(3) **ICMP目的不可达攻击(ICMP Destination Unreachable)**用于告知源主机目标主机或端口无法到达。攻击者可以利用这一机制,向目标主机发送伪造的目的不可达报文,导致目标主机错误地中断与合法主机的通信。
例如,攻击者监听到目标主机与某个合法服务器之间的通信后,就伪造一个源IP为该服务器、目标IP为目标主机的ICMP目的不可达报文,并声称服务器的某个端口不可达。目标主机收到报文后,可能会误认为服务器主动断开了连接,从而中断与服务器的通信。当攻击者持续发送这类报文时,目标主机与合法服务器之间的通信就会不断受到干扰。
(4) Ping of Death攻击,早期的一些操作系统和网络设备在处理超大的ICMP回显请求报文时存在缓冲区溢出漏洞。攻击者利用这一漏洞,构造一个超过最大允许长度(65535字节)的ICMP请求报文,在目标主机上引发系统崩溃或重启,造成拒绝服务。
为了防范ICMP报文攻击,网络管理员可以采取以下措施:
ICMP报文攻击是网络安全领域的一大挑战,攻击者利用ICMP的开放性和灵活性,通过多种手段破坏网络通信和服务。
也信美人终作土,不堪幽梦太匆匆......
如果这篇文章为您带来了帮助或启发,不妨点个赞
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。