您的位置  > 互联网

ICMP的数据包格式和报文的作用是什么协议

CMP协议主要用于检测网络通信故障并实现链路跟踪。 最典型的应用是PING和。

平:

通过发送echo请求报文和echo回复报文,检测源主机到目的主机的链路是否存在问题、目的端是否可达、通信时延等。

:

通过发送探测报文获取链路地址信息。 第一个检测报文的 TTL 为 1,当到达第一台路由器时,TTL 减 1 为 0,因此检测报文被丢弃,并向源主机发送 ICMP 超时报文。 此时,源主机获得第一个路由器的IP地址。

然后源主机发送第二个探测报文,TTL加1到2,第一路由器的TTL减1,并将探测报文转发给第二路由器。 此时,TTL减1为0,丢弃探测包,并向源主机发送ICMP超时报文,源主机获得第二路由器的IP地址; 以此类推,直到检测报文到达目的地,此时源主机就获得了第二台路由器的IP地址。 该跳路由的IP地址。

2. ICMP作为IP的上层协议

ICMP的内容放置在IP数据包的数据部分中,以便相互通信。 即从ICMP报文格式来看,ICMP是IP的上层协议。 然而,正如 RFC 中记录的那样,ICMP 卸载了 IP 的一些功能。 因此,它被认为是与IP同一层的协议。 我们看一下RFC规定的数据包格式和消息内容。

让我们更详细地看看数据包的格式。 IP数据包上实际上有很多用于传输ICMP消息的字段。 但实际上与ICMP协议相关的只有7小节。

1)协议;

2)源IP地址;

3)目的IP地址;

4)生存时间;

↑↑↑这四个字段包含在IP头中。

5)类型;

6) 代码;

7) 选项数据;

↑↑↑这三个字段包含在ICMP数据部分。

这里,1)协议字段值为1。2)和3)用于交换ICMP报文中的地址信息,没有特殊含义。 为了理解 ICMP 本身,三个字段 5)、6) 和 7) 很重要。 这里可以称为核心的重要字段是 5) 类型和 6) 代码。 ICMP 用于传达错误通知和信息查询的所有消息均由类型和代码的组合表示。

RFC定义了15种类型。 “数据包不可达”等错误通知和“echo ”等信息查询通过类型字段来区分。 ICMP报文通过类型来表达其一般含义,当需要传输少量信息时,可以通过代码进行分类。 另外,当需要向对方传输数据时,可以使用7)选项数据字段来放置。

可能的消息列表:

3. MTU在ICMP实现中的探索

所谓路径MTU探索,就是探索在不分割IP数据包的情况下可以与通信伙伴通信的MTU大小的功能。 MTU大小是指计算机一次可以发出的数据的最大长度,基本上由网络类型决定。

例如,以太网通常为1500字节,使用PPPoE的ADSL通常为1492字节。 为了实现此路径 MTU 发现,使用了 ICMP。 接下来,让我们仔细看看 MTU 探索是什么样子的。

路径MTU发现本身的原理非常简单。 首先,当向通信伙伴发送IP数据包时,在发送前在IP报头中设置分片禁止标志。 这是路径MTU探索的基础。 如果发送出大于1000字节的数据包,通信路径上会有一个地方MTU从1500字节变为1000字节。

因此,该路由器将不允许大于 1000 字节的数据包进入 MTU 为 1000 字节的网络。 路由器尝试对 IP 数据包进行分段。 但由于数据包的分片禁止标志有效,因此无法对其进行分片。 路由器丢弃IP数据包,并使用ICMP通知发送者“它想要分片,但不能分片”。 此时路由器发送的ICMP类型字段为3,代码字段为4。这意味着“需要分片但无法分片,无法发送到端点”。

此外,大多数路由器都会在数据选项部分填写 MTU 大小,该大小将在没有碎片的情况下通过。 收到ICMP报文后,知道可以不分片传输的数据大小,并临时改变MTU大小,然后继续通信。

4. ICMP 实现中更改路由

改变路由是指路由器向发送计算机指示路径改变的功能。 计算机根据自身的路由信息​​(路由表)确定传输目的地。 当您不知道要发送给谁时,请将数据包发送到设置为默认网关的路由器。 当指定为默认网关的路由器收到数据包并发现将数据包发送到 LAN 中的其他路由器会更快时,它会通过 ICMP 将此信息通知发送者。

此时使用类型为5、代码为1的ICMP更改路由消息。 在选项数据部分写入应发送到的路由器的 IP 地址。 它收到此消息后,重写自己的路由表,并在一段时间内通过指定的路由器与对方进行通信。

5、ICMP实现的源头抑制

数据包到达某个路由器后,可能会因为来不及处理而被丢弃。 此时,向发送方发送ICMP源抑制报文,以减慢发送速度。

6. ICMP 实现 ping 命令

ping命令用于调查IP层面是否连接到指定机器以及数据包往返需要多长时间。 为了实现这个功能,ping命令使用了两个ICMP报文。

1、向目标服务器发送环回请求:

首先,向目标服务器发送一条echo (类型8,代码0)消息(同2)。 在该回显请求消息中,除了类型和代码字段之外,还附加了标识符和序列号字段。 标识符和序列号字段分别是16位字段。 当ping命令发送echo请求消息时,在这两个字段中填写任意值。

对于标识符,在应用程序执行期间发送的所有消息中都会填充相同的值。 对于序列号,每发送一条消息,该值就加1。 此外,回显请求的选项数据部分用于保存任意数据。 该任意数据用于调整 ping 通信数据包的大小。

2.像鹦鹉一样返回并回复:

计算机发送的环回请求到达目标服务器后,服务器响应该请求,并向发送者(同3)发送环回请求(类型0,代码0)。 从IP层的角度来看,这个ICMP回显应答报文与发送的回显请求报文基本相同。

唯一的区别是源IP地址字段和目的IP地址字段互换,并且类型字段填充0以进行回显回复。 也就是说,从发送方的角度来看,自己发送的ICMP报文是从目标服务器返回的,就像人云亦云一样。

发送者的计算机可以通过接收回复消息来确认目标服务器正在工作。 此外,通过记住发送echo请求消息的时间,并将其与接收echo应答消息的时间进行比较,可以计算出消息来回所需的时间(同4)。

但是,如果在收到的回复应答消息中只写入类型和代码,则发送计算机将无法确定是否是对自己发送的请求的回复。 因此,前面提到的标识符和序列号字段都有其意义。 通过将这两个值与回显回复消息中的相同字段值进行比较,发送计算机可以简单地检查回显回复是否正确。

如果执行ping命令并且调查结果正常,屏幕上会打印目标服务器的IP地址、数据大小和往返时间。

3、ping命令无法确定与对方连接的原因大致有以下三种:

1)目标服务器不存在;

2)数据包交换时间过长,ping命令认为超时;

3) 目标服务器不应答ping命令。 如果是原因2,可以使用ping命令的选项来延长等待时间,直到超时,结果就能正确显示。 如果原因为1或3,仅凭ping命令的结果无法判断是哪一方。 就这样,ping命令不一定能确定对方是否存在。

7.ICMP实现命令

要了解现在的通信路径是什么,请使用该命令。 它与 ping 类似,代表网络命令。 这也是ICMP的典型实现之一。

1、执行命令:

在计算机上执行命令后,计算机首先向目的服务器发送IP数据包。 使用与 ping 相同的 ICMP 回显请求消息。 然而,与通常的回显请求有一点不同。 即IP头的TTL(Time to Live)字段初始设置为1。

路由器每转发一个数据包,TTL值就减1。 当TTL变为0时,数据包将按规定被丢弃。 就像这样,与其说TTL是时间,不如说TTL是经过的路由器数量。

对于计算机发送的数据包,只要与目标服务器不在同一个局域网内,就会被某处的路由器中继。 此时如果TTL的值为1,由于路由器的处理,会变成0,数据包就会被丢弃(同2)。

2. 使用超时消息通知发送方。

当路由器丢弃数据包时,它使用 ICMP 消息来通知错误。 此时使用的ICMP报文是类型为11、代码为0的ICMP超时报文。并且在选项数据字段中将填充原始数据包的IP头和ICMP的前8个字节。

从 ping 命令中可以看出,ICMP 回显请求的前 8 个字节包含标识符和序列号字段。 因此,发送方的计算机读取到超时消息后,就知道这是对其发出的 echo 请求的错误通知。

计算机收到第一个数据包的ICMP超时消息后,然后将TTL加1(TTL=2)并以相同的方式发送出去(与3相同)。 这次经过第一个路由器,TTL变为1,到达第二个路由器。

但第二个路由器和前一个路由器一样,将无法转发数据包,因为 TTL 变为 0。因此,和第一个路由器一样,数据包被丢弃,并返回 ICMP 超时消息。 之后,接收到错误的发送计算机会将 TTL 加 1,并重复相同的工作(与 4 相同)。

3. 只是目标服务器的响应不同。

通过这种方式逐一增加 TTL,在某个时刻 ICMP 回显请求消息将到达最终的目标服务器。 此时,仅目标服务器与途中路由器不同,不会返回ICMP超时消息。 为什么? 因为即使目标服务器收到TTL为1的数据包,也不会发生错误。

作为替代方案,服务器向发送计算机发送的 ICMP 回显请求消息返回 ICMP 回显应答消息。 即发送计算机与服务器之间的执行与ping命令相同(同5)。

收到ICMP echo应答消息的发送方知道路由调查已经到达目标服务器,并结束命令的执行(同6)。 这样,通过列出途中路由器返回的错误,就可以了解组成到目标服务器的路径的所有路由器的信息。

4. 根据操作系统的不同,实现方法略有不同。

此时就以上面的命令为例来看看原理。 其他操作系统中某些命令的原理略有不同。

具体地,也可以通过向目标发送UDP数据包而不是ICMP回显请求消息来实现。 虽然使用的是UDP,但途中路由器的处理与图8完全相同。 只是UDP数据包到达目的地后的处理有所不同。 如果目标计算机突然收到一个与通信无关的数据包,就会返回ICMP错误。 因此,命令的中止是根据返回的数据包的内容来判断的。

八、ICMP实现的端口扫描

所谓端口扫描就是检查服务器不需要的端口是否开放。 服务器管理员用来检查是否存在任何开放的安全漏洞。 它不像ping、ping那样是操作系统自带的工具。 您需要使用网络工具。

端口扫描大致分为“UDP端口扫描”和“TCP端口扫描”两种。 这里,UDP侧与ICMP相关。 对于使用 TCP 的通信,在通信之前必须遵循三次握手过程。 因此,您可以在更改端口号的同时尝试TCP连接来检查端口是打开还是关闭。 ICMP 不是特别需要的。 相反,UDP 没有这样的连接器。

因此,调查端口是否开放需要一些思考。 在这种情况下,使用 ICMP。 根据ICMP规范,当UDP数据包到达不存在的端口时,服务器需要返回“端口不可达”消息,这是ICMP的“端点不可达”之一。

具体来说,带有适当指定端口号的 UDP 数据包将被发送到您要调查的服务器。 这样,如果目标端口未开放,服务器将返回ICMP端口不可达消息。

发送方发送的UDP数据包的IP头和UDP头的前8个字节被放置在返回的ICMP数据包的选项数据字段中。 发送方使用此信息来识别错误通知是针对哪个 UDP 数据包并确定端口是否打开。

UDP 端口扫描会继续此通信,同时一一更改端口号。 这样,你就会知道哪个端口“似乎是开放的”。 但是UDP端口扫描和TCP端口扫描有很大的区别。

即即使没有返回ICMP端口不可达报文,也不能断定该端口是开放的。 端口扫描除了被管理员用来检查服务器上是否存在开放的漏洞外,在很多情况下也被用在服务器上,作为黑客非法访问的初步排查,需要非常谨慎地使用。

9.ICMP与安全的关系

9.1 为什么便捷的 ICMP 被终止?

为什么有一个设置项可以停止使用ICMP? 原因只有一个,那就是保证安全。 虽然 ICMP 是一种非常方便的协议,但在试图获得非法访问时可能会被黑客恶意使用。 因恶意使用ICMP而受到伤害的用户不断增加,因此出现了限制ICMP使用的意见。

9.2 ICMP报文攻击

那么ICMP实际上是如何被恶意利用的呢? 如果你要考虑安全相关的问题,不知道这一点就无从下手。 让我们看一下两个典型的恶意使用示例。

恶意利用ICMP最具代表性的例子就是所谓的“ping洪水”攻击。 它利用 ping 的原理向目标服务器发送大量 ICMP echo 请求。 这是指黑客连续向特定机器发送大量 ICMP 回显请求消息。

目标机器已经用尽了所有的努力来应答传入的ICMP回显请求,并且原来的通信处理变得不稳定。 此外,目标机器所连接的网络也可能因大量ICMP报文而陷入不可用状态。

与 ping 洪水类似,一种更令人震惊的用途是一种名为“smurf”的攻击。 smurf 同样,黑客也恶意使用ICMP回显请求消息。 这与 ping 洪水相同。 然而,在smurf中,针对ICMP回显请求实现了一些处理。

源IP地址伪装成攻击目标服务器的地址,目标地址不是攻击目标服务器的地址,而是成为中继站的网络的广播地址。

下面我们就来详细看看smurf的攻击过程吧!

黑客发送伪装的 ICMP 回显请求,该请求到达网络入口处的路由器,充当垫脚石。 这样,路由器就将环回请求转发给网络中的所有计算机(同2)。 如果有 100 台计算机,则环回请求将到达所有 100 台计算机。

接收到echo请求的计算机通过发送echo回复消息进行响应(与3相同)。 这样,黑客发送的ICMP回显请求报文一下子增加了100倍。

这样添加的ICMP回显应答报文并不是指向黑客的计算机,而是伪装成回显请求的源IP地址发送到攻击目标服务器。 相反,从数百台计算机发送的大量 ICMP 回显回复到达。

Smurf 与 ping Flood 攻击不同,因为到达服务器的是 ICMP echo 回复,服务器不需要返回回复。 但为了处理大量的ICMP,服务器承受着很大的负载。 互联网被炸毁也是同样的情况(同4)。

此外,还有许多ICMP被恶意使用的例子。 例如,错误通知或查询信息本身也有可能被黑客用来传达谎言。 这就像利用信鸽来扩大谎言的传播,通过传递与事实不同的信息来使人们做出错误的判断。

相反,也有发送错误信息并成为问题的例子。 例如,实现章节中看到的端口扫描可以被黑客用来调查攻击目标。 此外,颠覆“利用ICMP控制IP”常识的恶意使用手段也出现了。 这是一种利用ICMP的选项数据部分作为信息搬运工的方法。

黑客将此工具隐藏在服务器中,从外部控制服务器,窃取用户的个人信息和重要情报。 如上所述,单从安全角度来看,ICMP是有害无用的。

9.3 阻止ICMP后遇到麻烦

“阻止所有 ICMP 还不够吗?” 有些读者可能会这么认为。 但这样就太轻率了。 由于需要 ICMP 作为支持 IP 的协议,因此诞生了。 即使没有,也不意味着IP通信本身就完全没有用处。 事实上,会有几种困难的情况。

其典型例子是一个称为“黑洞路由器”的问题。 所谓黑洞路由器,就是通信路径上的IP数据包消失不留任何痕迹的现象。 原因是实现章节中解释的路径MTU探索功能不起作用。

假设通信路径上存在由于 MTU 大小不同而需要分片的路由器。 而且,出于安全考虑,计算机和路由器之间设置了防火墙,阻止ICMP报文通过。

在这种情况下,如果计算机进行路径MTU探索会发生什么?

1. 无法调整数据包长度

如果是IP数据包,对传输路径上的分片大小没有要求,那么它会毫无问题地到达对方。 另一方面,当数据包的长度需要分片时,发送就会出现问题。

正如在实现章节中看到的,这样的数据包到达连接到不同MTU大小的网络的路由器后,路由器将使用ICMP端点不可达消息来通知发送者。 原来的处理是发送方收到ICMP报文,根据路径MTU探索过程调整MTU大小,然后继续通信。

但是,在此示例中,ICMP 消息在其路径中被防火墙阻止。 路径MTU发现功能不起作用,MTU大小无法调整。

2、不了解原理就无法理解。

最近,我们在局域网内的计算机通过ADSL服务访问万维网时,经常会看到这种黑洞路由器的现象。 这种现象是由于ADSL线路的MTU大小、宽带路由器的设置以及路径MTU发现功能之​​间的相关性造成的。 糟糕的是,即使使用黑洞路由器,通信也不是完全不可能。 无论如何,吸入的只是长度需要分片的IP数据包。

即考虑WEB访问,连接WEB服务器时没有问题。 大部分以文本为主体的页面都可以显示,但包含较大图片的页面则无法显示。 黑洞路由器就是通过这种复杂而奇怪的现象来体现的。 如果你不了解路径MTU探索和黑洞路由器的原理,可能连猜测这种现象的原因都困难。

3.即使客户端被屏蔽也没有问题

从一开始就看出,在真实的万维网上,如果提前启用所有ICMP功能,就会给黑客提供各种可乘之机,就会出现安全问题。

另一方面,如果一一封锁,不仅会非常不方便,还会造成黑洞路由器等问题。 那么,如何充分利用ICMP呢? 客户端、服务器、路由器,从各个方面来看。

首先从客户开始。 许多最新的宽带路由器和个人防火墙都设置为阻止 ICMP。 然而,初始设置差异很大。 还有一些方法可以阻止所有 ICMP,反之亦然。 其中,有的只允许ping命令等部分ICMP报文通过。

事实证明,根据环境的不同,考虑安全性的方式差异很大,而且不一定是这样。 然而,最近的趋势是连接到万维网的个人计算机不响应不必要的 ICMP 消息。 例如,对于XP,如果使用操作系统自带的个人防火墙,则默认是阻止所有来自外部的ICMP消息。

那么路由器呢? 如果万维网中的路由器不小心阻塞了ICMP,就会出现黑洞路由器等问题。 还有,当大量数据包进来时,如果不发送ICMP源抑制报文,处理速度就会跟不上。 对于路由器来说,除了这种情况并考虑周围的网络环境外,最好判断是否拦截不必要的、可能引起攻击的ICMP报文。

服务器比较难判断。 例如,如果您不允许它响应 ping 命令,那么当它无法连接到服务器时,您将缺乏有效的调查手段。 不过,也确实存在遭受 ping 洪水攻击的可能性。 这些只能由管理者来判断。

10.ICMP协议详解

ICMP 协议是网络层协议。

新搭建的网络往往需要先进行简单的测试,验证网络是否畅通; 然而,IP协议不提供可靠的传输。 如果数据包丢失,IP协议无法通知传输层数据包是否丢失以及数据包丢失的原因。

所以我们需要一个协议来完成这样的功能——ICMP协议。

ICMP协议功能

ICMP协议的主要功能是:

1.确认IP包是否成功到达目标地址

2、通知IP包在发送过程中被丢弃的原因

如下所示:

我们需要注意以下几点:

1.ICMP基于IP协议工作,但它不属于传输层的功能,因此仍然被归类为网络层协议。

2. ICMP 只能与 IPv4 一起使用。 如果是IPv6则需要使用。

ICMP 报文格式

ICMP 消息包含在 IP 数据报中,IP 标头位于 ICMP 消息的前面。 ICMP报文包括IP报文头(至少20字节)、ICMP报文头(至少8字节)和ICMP报文(属于ICMP报文的数据部分)。 当IP头中的协议字段值为1时,表示这是一条ICMP消息。 ICMP报头如下图所示。

如下所示:

字段说明:

类型

阐明

类型

占用1个字节,标识ICMP报文的类型。 从类型值来看,ICMP报文可以分为两类。 第一类是错误消息,取值范围为1~127;第二类为信息消息,取值范围为128或以上。

代码

占用1个字节,标识ICMP报文对应的编码。 它与类型字段一起标识 ICMP 消息的详细类型。

校验和

这是对整个ICMP数据报的校验和,包括ICMP报文的数据部分,用于检查报文在传输过程中是否有错误(其计算方法与我们介绍的IP头中的校验和计算方法相同)一样的)

ICMP大致分为两类报文:

一种是通知错误原因; 另一种类型用于诊断查询。

其类型及含义如下:

类型(十进制)

内容

回显回复

目标无法实现

原点抑制

重定向或更改路线

回显请求

路由器公告

10

路由器请求

11

暂停

17 号

地址子网请求

18

地址子网回复

常见的 ICMP 报文

对应请求:

我们使用的 ping 操作包括相应的请求(类型字段值为 8)和响应(类型字段值为 0)ICMP 报文。

过程:

主机向节点发送类型字段值为 8 的 ICMP 消息。 如果途中没有异常(如果没有被路由丢弃,则目标没有响应ICMP或者传输失败),则目标返回一个类型字段值为0的ICMP消息,表明此主机存在。

目标不可达、源抑制和超时消息,

这三个消息的格式是相同的。

(1) 当路由器或主机无法传输数据时,使用目的地不可达消息(类型值3)。

例如:当我们要连接对方不存在的系统端口(端口号小于1024)时,就会返回一条类型字段值为3、代码字段值为3的ICMP报文。

常见的不可达类型包括网络不可达(code字段值为0)、主机不可达(code字段值为1)、协议不可达(code字段值为2)等。

(2)源抑制报文(类型字段值为4,代码字段值为0)起到流量控制的作用,通知主机减少数据报流量。 由于ICMP并不回复所传送的报文,因此只要报文停止,主机就会逐渐恢复传输速率。

(3)无连接网络的问题是数据报会丢失,或者在网络上徘徊很长时间而找不到目标,或者拥塞导致主机无法在规定时间内重新组装数据报段。 在这种情况下,将触发 ICMP 超时。 消息的生成。

超时消息的代码字段(类型字段值为11)有两个值:代码字段值为0表示传输超时,代码字段值为1表示分段重组超时。

时间戳请求

时间戳请求消息(类型值字段13)和时间戳响应消息(类型值字段14)用于测试两个主机之间数据报的传输时间。

传输时,主机填写原始时间戳。 接收方收到请求后,填写接受时间戳,并以类型值字段14的消息格式返回。发送方计算这个时间差。 (有些系统不响应此类消息)

ping 命令

用法如下:

请注意,这里 ping 的是域名,而不是 URL。 域名可以通过DNS解析为IP地址。

ping命令的作用

(1) 能够验证网络连通性。

(2) 响应时间和TTL(Time To Live in IP ,生命周期)都会被统计。

那么如何验证呢?

(1) ping 命令首先会向对端发送 ICMP Echo。

(2) 对端收到后,会返回ICMP Echo Reply。

(3)如果没有返回,则表示超时,会认为指定的网络地址不存在。

问题:

是23端口,ssh是22端口,那么ping什么端口呢?

答:ping命令基于ICMP,位于网络层。

端口号是传输层的内容。 因此ICMP根本不关注端口号等信息。

也是基于ICMP协议实现的。

功能:

打印出可执行主机以及它在到达目标主机之前经过了多少个路由器。

示例如下: