网络网络层之(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博客
文章目录
1. 概述
1.1 ICMPv4介绍
ICMPv4是IPv4协议族中的一个重要协议,它主要用于传递网络层的控制和错误信息。与IP数据报不同,ICMPv4报文并不直接用于传输用户数据,而是辅助IP协议更好地完成数据传输任务。
ICMPv4报文封装在IP数据报中进行传输。报文主要由两部分组成:报头和数据部分。报头包含了类型、代码和校验和等重要信息,用于识别报文的类型和检测传输错误,数据部分携带了与具体报文类型相关的信息。
根据功能,ICMPv4报文可以分为两大类:差错报告报文和查询报文。
(1) 差错报告报文用于告知源主机在数据传输过程中遇到的各种错误情况:
- 目标不可达,数据包无法送达目标地址。
- 超时,数据包在网络中存在的时间超过限制。
- 重定向,通知源主机有更优的路由路径。
(2) 查询报文则用于网络探测和管理:
- 回显请求和应答,对应ping工具,用于连通性测试。
- 时间戳请求和应答,用于进行时间同步。
常用的网络诊断工具如ping、traceroute都是基于ICMPv4实现的,可以利用它们快速判断网络状态,定位故障点。
1.2 相关RFC文档
以下是与ICMPv4相关的主要RFC文档列表:
- RFC 792 - Internet Control Message Protocol (1981),定义了ICMPv4协议的基本规范,包括报文格式、类型和代码等。
- RFC 950 - Internet Standard Subnetting Procedure (1985),引入了子网编址的概念,通过子网掩码实现IP地址的划分。
- RFC 1122 - Requirements for Internet Hosts – Communication Layers (1989),定义了互联网主机在实现TCP/IP协议栈时需要遵循的各项要求。
- RFC 1191 - Path MTU Discovery (1990),提出了路径MTU发现机制,用于确定到达目标主机路径上的最小MTU。
- RFC 1256 - ICMP Router Discovery Messages (1991),引入了ICMPv4路由器发现报文,用于主机动态地发现本地网络上的路由器。
- RFC 1393 - Traceroute Using an IP Option (1993),描述了使用IP选项实现traceroute的方法。
- RFC 1812 - Requirements for IP Version 4 Routers (1995),定义了IPv4路由器的各项需求,其中包括对ICMPv4的处理要求。
- RFC 2463 - Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification (1998),定义了ICMPv6协议,作为IPv6协议族中与ICMPv4相对应的协议。
- RFC 4443 - Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification (2006),更新了ICMPv6协议的规范,取代了RFC 2463。
- RFC 4884 - Extended ICMP to Support Multi-Part Messages (2007),扩展了ICMPv4和ICMPv6,支持多部分消息,增加了对大型诊断消息的传输能力。
- RFC 5837 - ICMP Extensions for Multiprotocol Label Switching (2010),定义了用于MPLS的ICMPv4和ICMPv6扩展,支持MPLS网络的错误报告和诊断。
- RFC 5508 - NAT Behavioral Requirements for ICMP (2009),定义了网络地址转换(NAT)设备处理ICMPv4报文的行为要求,以保证NAT环境下ICMP的正确工作。
2. 报文格式
2.1 ICMPv4首部
ICMPv4报文格式由类型、代码和校验和三个固定字段组成,后面紧跟与具体报文类型相关的数据部分。
字段说明:
IPv4报文首部协议(proto)字段值为1,表示其携带了ICMPv4报文数据。
Type(类型,8位)标识ICMPv4报文的类型,不同的类型对应不同的报文格式和用途,如0表示回显应答,8表示回显请求等。
Code(代码,8位)与类型字段一起标识ICMPv4报文的具体含义,同一类型的报文可能有多个代码值,表示不同的错误原因或附加信息。
Checksum(校验和,16位)用于检测报文在传输过程中是否出现错误,计算时需要将校验和字段置零,然后对整个ICMP报文进行16位二进制反码求和。
Message Body(消息体,长度可变)携带与具体报文类型相关的数据,如错误信息、回显数据等,不同类型的报文有不同的消息体格式。
2.2 ICMPv4报文类型
常见的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等已经被废弃不再使用。
2.3 ICMPv4常见代码
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 | 长度错误 |
2.4 ICMPv4差错报文限制
在某些情况下,网络设备不会产生ICMPv4差错报文,以避免网络拥塞、安全问题或无用的错误报告:
广播或组播地址,当IP数据报的目标地址是广播或组播地址时,通常不会产生ICMPv4差错报文,如"目标不可达"或"超时"等。
分片,当接收到IP分片时,如果出现错误(如超时、目标不可达等),通常不会为每个分片生成单独的ICMPv4差错报文,而是等到全部分片到达后再生成一个差错报文。
ICMP差错报文,为了避免无限循环,当一个ICMP差错报文触发另一个差错时,通常不会再生成新的ICMP差错报文。
源地址不可达,当源IP地址不可达时(零地址、环回地址、广播地址或组播地址),通常不会生成ICMPv4差错报文,以避免网络拥塞和广播风暴。
作为链路层广播的数据报,避免产生大量的差错报文。
安全策略,根据网络管理员的安全策略,某些类型的ICMPv4报文可能会被禁用或过滤,如ping请求、重定向等。
2.5 ICMPv4目的不可达(类型3)
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 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明如下:
- Type(8位),值为3,表示目的不可达报文。
- Code(8位),表示不可达的具体原因,取值范围0~15。
- Checksum(16位),ICMPv4头部和数据部分的校验和。
- unused(32位),未使用字段,必须置0。
- Internet Header + 64 bits of Original Data Datagram,数据部分,包含引发差错报文的原始IP数据报的IP头部和至少64位数据。在不超过576字节的情况下,应尽量的多包涵原始数据。
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扩展头部以及零个或多个关联对象 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Type、Code、Checksum、unused字段与原有格式相同。
- Original IPv4 Header + data,数据部分,包含引发差错报文的原始IP数据报的IP头部和数据。与原有格式不同,该字段长度可变,不再限于64位,至少应包含128字节。
- Length,指示Original IPv4 Header + data字段的长度,单位为4字节(IPv4和IPv6单位不一样)。
- 代码为4(报文太大)时,
Next-Hop MTU
字段用于记录下一跳的MTU,并被PMTUD使用。
当路由器或主机无法转发或处理接收到的数据包时,就会向源端发送一个相应的目的不可达报文。源端收到该报文后,可以根据Code值判断具体的不可达原因,并结合数据部分携带的原始报文信息进行问题的定位和调整。
Code字段表示不可达的具体原因,常见取值如下:
- Net Unreachable(0),网络不可达。
- Host Unreachable(1),主机不可达。
- Protocol Unreachable(2),协议不可达。
- Port Unreachable(3),端口不可达。
- Fragmentation Needed and Don’t Fragment was Set(4),需要分片但禁止分片。
- Source Route Failed(5),源路由失败。
- Destination Network Unknown(6),目标网络未知。
- Destination Host Unknown(7),目标主机未知。
- Source Host Isolated(8),源主机被隔离。
- Communication with Destination Network Administratively Prohibited(9),目标网络通信被管理员禁止。
- Communication with Destination Host Administratively Prohibited(10),目标主机通信被管理员禁止。
- Destination Network Unreachable for Type of Service(11),对于当前服务类型,目标网络不可达。
- Destination Host Unreachable for Type of Service(12),对于当前服务类型,目标主机不可达。
数据部分包含了引发该差错报文的原始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),并据此调整后续数据包的大小。
如果源主机无法缩减数据包大小,则会中止发送并向上层应用报告错误。
2.6 ICMPv4重定向(类型5)
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 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- Type(8位),值为5,表示重定向报文。
- Code(8位),表示重定向的具体原因,取值范围0~3。
- Checksum(16位),ICMP报文的校验和。
- Gateway Internet Address(32位),建议的更优下一跳路由器的IP地址。
- Internet Header + 64 bits of Original Data Datagram,触发重定向报文的原始IP数据报的IP头部和前64位数据。
重定向类型(Code):
- Network Redirect(0),表示对特定网络的重定向。
- Host Redirect(1),表示对特定主机的重定向。
- Network Redirect for TOS(2),表示对特定网络和服务类型(TOS)的重定向。
- Host Redirect for TOS(3),表示对特定主机和服务类型(TOS)的重定向。
2.7 ICMPv4超时(类型11)
ICMPv4的超时报文(Time Exceeded Message)是一种重要的差错报文,用于通知源主机在数据包传输过程中发生了超时。这种超时通常分为两种情况:
- 传输过程中超过了IP头部中的生存时间(TTL)。
- 分片重组超时,相当于整个数据报被丢弃。
下面是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 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明:
- Type(8位),值为11,表示超时报文。
- Code(8位),表示超时的具体原因,取值范围0~1。
- Checksum(16位),ICMP报文的校验和。
- unused(32位),未使用字段,置0。
- Internet Header + 64 bits of Original Data Datagram,触发超时报文的原始IP数据报的IP头部和前64位数据。
超时代码(Code):
- Time to Live exceeded in Transit(0),表示数据包在传输过程中超过了IP头部中的TTL值。每经过一个路由器,IP头部的TTL值就会减1,当TTL减为0时,路由器会丢弃该数据包,并向源主机发送一个Code 0的超时报文。
- Fragment Reassembly Time Exceeded(1),表示分片重组超时。当一个数据包被分片传输时,目标主机需要在一定时间内收到所有分片并重组,如果超过了设定的时间阈值,就会触发Code 1的超时报文。
超时报文用于通知源主机在数据包传输过程中发生了异常,帮助源主机诊断和调试网络问题:
- Code 0的超时报文通常表明网络路径过长或存在路由环路,源主机可以据此调整TTL值或检查路由配置。Code 0的超时报文也被用于traceroute等网络诊断工具,以发现网络路径上的路由器。
- Code 1的超时报文提示分片重组过程出现了问题,可能是因为网络拥塞、分片丢失或目标主机资源不足等原因。
2.8 ICMPv4参数问题(类型12)
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 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明:
- Type(8位),值为12,表示参数问题报文。
- Code(8位),表示错误的具体原因,取值范围0~2。
- Checksum(16位),ICMP报文的校验和。
- Pointer(8位),指向数据包首部中发生错误的字节位置。
- unused(24位),未使用字段,置0。
- Internet Header + 64 bits of Original Data Datagram,触发参数问题报文的原始IP数据报的IP头部和前64位数据。
错误代码(Code):
- Pointer indicates the error(0),表示Pointer字段指向了数据包首部中发生错误的具体位置。
- Missing a Required Option(1),表示数据包缺少了某个必需的选项。
- Bad Length(2),表示数据包的长度存在问题,可能是总长度与首部长度和数据长度之和不一致,或者超过了网络的MTU限制。
参数问题报文用于通知源主机在发送数据包时出现了首部错误,帮助源主机诊断和调试网络问题:
- Code 0的参数问题报文通常表明数据包的某个首部字段存在无法识别或不合法的值,Pointer字段会指明具体的错误位置,源主机可以据此检查和修正数据包的构造过程。
- Code 1的参数问题报文提示数据包缺少了某个必需的首部选项,例如安全选项、源路由选项等,源主机需要检查上层协议和应用的设置,确保包含所有必需的选项。
- Code 2的参数问题报文表示数据包的长度字段存在问题,可能是上层协议计算错误或者数据包在传输过程中被截断,源主机需要检查数据包的封装和传输过程。
2.9 ICMPv4回显请求/应答(类型0/8)
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回显请求或应答报文由以下几个字段依次组成:
- 类型(Type,8位),回显请求的类型值为8,而回显应答的类型值则为0。
- 代码(Code,8位),对于回显请求和应答报文,代码字段的值通常都为0,表示这是一个标准的查询和响应过程。
- 校验和(Checksum,16位),ICMP报文的前4个字节和数据部分一起被用于计算校验和。
- 标识符(Identifier)和序号(Sequence Number),这两个字段各占2字节,它们的值由发送方任意指定,但在请求和应答报文中必须保持一致。
- 数据部分,在回显请求和应答中,这部分内容是完全一样的。数据的具体内容由请求方定义,应答方只需原封不动地返回即可。
最常见的应用莫过于Ping程序了。当我们在命令行中输入"ping 目标IP地址"时,源主机就会构造一系列ICMP回显请求报文,填入适当的标识符和序号,然后连续发送给目标主机。
目标主机收到请求后,会提取报文中的标识符和序号,构造对应的ICMP回显应答报文,再发送回源主机。源主机根据收到的ICMP应答,计算往返时间和丢包率,评估与目标主机之间的网络质量。
另一个常见的应用是traceroute程序,它通过逐步增加IP包的生存时间(TTL),结合ICMP超时错误和到达目标时的ICMP端口不可达错误,一跳一跳地探测到目标主机的网络路径。
2.10 ICMPv4路由器请求和通告(类型9/10)
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报头,它还包含以下重要信息:
- 地址数(Num Addrs),表示通告报文中包含的路由地址条目数量,每个块包含一个IPv4地址和相应的优先水平(Preference level)。
- 地址条目大小(Addr Entry Size),说明每个地址条目的大小,以 32 位字为单位。
- 生存周期(Lifetime),告知主机在收到下一个通告报文之前,本报文中的信息有效的时间,单位为秒。
- 路由器地址(Router Address),路由器拥有的一个或多个 IP 地址。
- 优先水平(Preference level),一个32位的有符号二进制补码整数,其值越大代表优先级越高。默认的优先水平是0,特殊值0x80000000表示这个地址不应该作为有效的默认路由。
主机收到路由器通告报文后,会提取出路由器的IP地址,并根据报文中的生存时间设置老化定时器。在定时器到期之前,主机就可以使用通告的路由器地址作为默认网关,将目标不在本地网段的数据报文转发给路由器处理。
3. ICMP攻击
3.1 洪泛攻击
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报文通过。
- 对ICMP报文进行速率限制,避免少量主机占用过多网络资源。
- 对ICMP报文的合法性进行验证,丢弃可疑的伪造报文。
- 及时更新系统和设备,修复已知的ICMP相关漏洞。
- 部署抗DDoS设备,实时监测和清洗恶意ICMP流量。
ICMP报文攻击是网络安全领域的一大挑战,攻击者利用ICMP的开放性和灵活性,通过多种手段破坏网络通信和服务。
Once Day
也信美人终作土,不堪幽梦太匆匆......
如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!
(。◕‿◕。)感谢您的阅读与支持~~~