qidao123.com技术社区-IT企服评测·应用市场

标题: 网络网络层之(6)ICMPv4协议 [打印本页]

作者: 愛在花開的季節    时间: 2024-6-29 00:01
标题: 网络网络层之(6)ICMPv4协议
网络网络层之(6)ICMPv4协议

  
   Author: Once Day Date: 2024年6月2日


  一位热衷于Linux学习和开辟的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…


   漫漫长路,有人对你微笑过嘛…


  全系列文章可参考专栏: 通讯网络技术_Once-Day的博客-CSDN博客。


  参考文章:
  
  

  
1. 概述

1.1 ICMPv4介绍

ICMPv4是IPv4协议族中的一个重要协议,它重要用于传递网络层的控制和错误信息。与IP数据报不同,ICMPv4报文并不直接用于传输用户数据,而是辅助IP协议更好地完成数据传输任务
ICMPv4报文封装在IP数据报中进行传输。报文重要由两部分构成:报头和数据部分。报头包含了类型、代码和校验和等重要信息,用于识别报文的类型和检测传输错误,数据部分携带了与具体报文类型相关的信息。
根据功能,ICMPv4报文可以分为两大类:不对陈诉报文和查询报文。
(1) 不对陈诉报文用于告知源主机在数据传输过程中碰到的各种错误情况:

(2) 查询报文则用于网络探测和管理:

常用的网络诊断工具如ping、traceroute都是基于ICMPv4实现的,可以利用它们快速判断网络状态,定位故障点。
1.2 相关RFC文档

以下是与ICMPv4相关的重要RFC文档列表:

2. 报文格式

2.1 ICMPv4首部

ICMPv4报文格式由类型、代码和校验和三个固定字段构成,后面紧跟与具体报文类型相关的数据部分

字段说明:

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不对报文,以避免网络拥塞、安全问题或无用的错误陈诉:

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.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码
字段说明如下:

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.   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码

当路由器或主机无法转发或处理惩罚吸收到的数据包时,就会向源端发送一个相应的目的不可达报文。源端收到该报文后,可以根据Code值判断具体的不可达缘故原由,并结合数据部分携带的原始报文信息进行问题的定位和调整。
Code字段表现不可达的具体缘故原由,常见取值如下:

数据部分包含了引发该不对报文的原始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.     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码

重定向类型(Code):

2.7 ICMPv4超时(类型11)

ICMPv4的超时报文(Time Exceeded Message)是一种重要的不对报文,用于通知源主机在数据包传输过程中发生了超时。这种超时通常分为两种情况:

下面是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.     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码
字段说明:

超期间码(Code):

超时报文用于通知源主机在数据包传输过程中发生了异常,帮助源主机诊断和调试网络问题:

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.     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
复制代码
字段说明:

错误代码(Code):

参数问题报文用于通知源主机在发送数据包时出现了首部错误,帮助源主机诊断和调试网络问题

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回显哀求或应答报文由以下几个字段依次构成:

最常见的应用莫过于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报头,它还包含以下重要信息:

主机收到路由器告示报文后,会提取出路由器的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的开放性和灵活性,通过多种手段破坏网络通讯和服务。







   Once Day

  

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




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4