网络网络层之(6)ICMPv4协议

打印 上一主题 下一主题

主题 552|帖子 552|积分 1656

网络网络层之(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查询用途描述0Echo ReplyRFC792查询相应Echo Request,用于确认连通性和RTT丈量3Destination UnreachableRFC792不对通知源主机目标不可达,具体缘故原由在Code字段中说明4Source QuenchRFC792不对通知源主机低落发送速率,避免拥塞(已废弃)5RedirectRFC792不对通知源主机有更好的路由,优化路由路径8Echo RequestRFC792查询哀求目标主机回应,用于确认连通性和RTT丈量9Router AdvertisementRFC1256查询路由器定期或应哀求发送,公告自身作为默认网关的可用性10Router SolicitationRFC1256查询主机发送该报文,哀求路由器立即发送Router Advertisement11Time ExceededRFC792不对当TTL耗尽或分片重组超时时,告知源主机12Parameter ProblemRFC792不对IP首部存在问题导致无法处理惩罚时,告知源主机13TimestampRFC792查询哀求目标主机回送时间戳,用于时间同步(已废弃)14Timestamp ReplyRFC792查询Timestamp查询的应答报文(已废弃)15Information RequestRFC792查询哀求目标主机提供IP地址信息(已废弃)16Information ReplyRFC792查询Information Request的应答报文(已废弃)17Address Mask RequestRFC1256查询哀求子网掩码信息(已废弃)18Address Mask ReplyRFC1256查询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的常见代码号如下:
类型代码名称描述30Net Unreachable目标网络不可达31Host Unreachable目标主机不可达32Protocol Unreachable目标协议不可达33Port Unreachable目标端口不可达34Fragmentation Needed and Don’t Fragment was Set须要分片但设置了不分片位35Source Route Failed源路由失败36Destination Network Unknown目标网络未知37Destination Host Unknown目标主机未知38Source Host Isolated源主机被隔离39Communication with Destination Network is Administratively Prohibited与目标网络的通讯被管理员禁止310Communication with Destination Host is Administratively Prohibited与目标主机的通讯被管理员禁止311Destination Network Unreachable for Type of Service对于此类服务,目标网络不可达312Destination Host Unreachable for Type of Service对于此类服务,目标主机不可达313管理禁止通讯被过滤策略禁止的通讯314违背主机优先级src/dest/port不答应的优先级315优先级终止见效在最小Tos之下(RFC1812)50Redirect Datagram for the Network对特定网络重定向51Redirect Datagram for the Host对特定主机重定向52Redirect Datagram for the Type of Service and Network对特定类型服务和网络重定向53Redirect Datagram for the Type of Service and Host对特定类型服务和主机重定向90Normal Router Advertisement正常路由器告示916Does Not Route Common Traffic不路由普通流量110Time to Live exceeded in Transit传输过程中超过生存时间111Fragment Reassembly Time Exceeded分片重组超时120Pointer indicates the error参数问题,错误由指针指出121Missing a Required Option缺少必需的选项122Bad 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报文的格式如下:
  1.                         Destination Unreachable Message(RFC 792)
  2.         0                   1                   2                   3
  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
  4.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  5.    |     Type      |     Code      |          Checksum             |
  6.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  7.    |                             unused                            |
  8.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  9.    |      Internet Header + 64 bits of Original Data Datagram      |
  10.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码
字段说明如下:


  • 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报文格式如下(支持扩展数据结构):
  1.                         Destination Unreachable Message(RFC 4884)
  2.    0                   1                   2                   3
  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
  4.   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  5.   |     Type      |     Code      |          Checksum             |
  6.   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  7.   |     unused    |    Length     |         Next-Hop MTU*         |
  8.   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  9.   |      Internet Header + leading octets of original datagram    |
  10.   |                                                               |
  11.   |                           //                                  |
  12.   |                                                               |
  13.   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  14.   |             ICMP扩展头部以及零个或多个关联对象                      |
  15.   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码


  • 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定义了"acket Too Big"(PTB)报文,用于在网络中发现和调整数据包的大小,以适应不同链路的MTU限制,这种机制称为"ath 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报文,用于通知主机更优的路由路径。当主机发送数据包时,如果路由器发现主机使用了次优的路由路径,则会向主机发送重定向报文,发起主机更新其路由表,以便后续数据包可以直接发送到更优的下一跳路由器。
  1.                                                 Redirect Message(5)
  2.         0                   1                   2                   3
  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
  4.     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  5.     |     Type      |     Code      |          Checksum             |
  6.     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  7.     |                 Gateway Internet Address                      |
  8.     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  9.     |      Internet Header + 64 bits of Original Data Datagram      |
  10.     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码


  • 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超时报文的格式:
  1.                                                 Time Exceeded Message(11)
  2.      0                   1                   2                   3
  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
  4.     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  5.     |     Type      |     Code      |          Checksum             |
  6.     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  7.     |                             unused                            |
  8.     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  9.     |      Internet Header + 64 bits of Original Data Datagram      |
  10.     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码
字段说明:


  • 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)是一种重要的不对报文,用于通知源主机在数据包的首部中发现了错误或不完备的信息。当路由器或主机在处理惩罚数据包时检测到头部字段存在问题,无法精确剖析或处理惩罚时,就会向源主机发送参数问题报文。
  1.                                         Parameter Problem Message(12)
  2.         0                   1                   2                   3
  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
  4.     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  5.     |     Type      |     Code      |          Checksum             |
  6.     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  7.     |    Pointer    |                   unused                      |
  8.     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  9.     |      Internet Header + 64 bits of Original Data Datagram      |
  10.     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码
字段说明:


  • 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程序的基础,让我们可以或许方便地检测网络的连通性和延迟。
  1.                           Echo(8) or Echo Reply(0) Message
  2.         0                   1                   2                   3
  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
  4.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  5.    |     Type      |     Code      |          Checksum             |
  6.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  7.    |           Identifier          |        Sequence Number        |
  8.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  9.    |     Data ...
  10.    +-+-+-+-+-
复制代码
一个完备的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 报头外,没有其他特别字段:
  1.                                 ICMP Router Solicitation Message(9)
  2.        0                   1                   2                   3
  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
  4.       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  5.       |     Type      |     Code      |           Checksum            |
  6.       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  7.       |                           Reserved                            |
  8.       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码
路由器告示报文的ICMP类型值为10,当路由器收到一个路由器哀求报文或者自身的告示时间间隔到期时,它就会自动向当地网络发送一个路由器告示报文。这个报文通常以组播的形式发送,目标地址为 224.0.0.1
  1.                                 ICMP Router Advertisement Message(10)
  2.        0                   1                   2                   3
  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
  4.       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  5.       |     Type      |     Code      |           Checksum            |
  6.       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  7.       |   Num Addrs   |Addr Entry Size|           Lifetime            |
  8.       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  9.       |                       Router Address[1]                       |
  10.       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  11.       |                      Preference Level[1]                      |
  12.       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  13.       |                       Router Address[2]                       |
  14.       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  15.       |                      Preference Level[2]                      |
  16.       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  17.       |                               .                               |
  18.       |                               .                               |
  19.       |                               .                               |
复制代码
相比哀求报文,告示报文的内容就丰富多了,除了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

  

    也信美人终作土,不堪幽梦太急忙......
    如果这篇文章为您带来了帮助或启发,不妨点个赞

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表