其他分享
首页 > 其他分享> > 浅谈ICMP协议

浅谈ICMP协议

作者:互联网

概念性问题
ICMP(Internet Control Message Protocol)用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。

ICMP 是 TCP/IP 模型中网络层的重要成员,与 IP 协议、ARP 协议、RARP 协议及 IGMP 协议共同构成 TCP/IP 模型中的网络层。ping 和 tracert是两个常用网络管理命令,ping 用来测试网络可达性,tracert 用来显示到达目的主机的路径。ping和 tracert 都利用 ICMP 协议来实现网络功能,它们是把网络协议应用到日常网络管理的典型实例。

ICMP协议的功能

  1. 确认IP包是否成功到达目标地址
  2. 通知在发送过程中IP包被丢弃的原因
    在这里插入图片描述

ICMP报文格式

ICMP报文包含在IP数据报中,IP报头在ICMP报文的最前面。一个ICMP报文包括IP报头(至少20字节)、ICMP报头(至少八字节)和ICMP报文(属于ICMP报文的数据部分)。当IP报头中的协议字段值为1时,就说明这是一个ICMP报文。ICMP报头如下图所示。
如下图:
在这里插入图片描述
字段说明:
在这里插入图片描述
ICMP大概分为两类报文:
一类是通知出错原因 ;一类是用于诊断查询
类型及含义如下:
在这里插入图片描述
Ping命令
ping 命令用来在IP 层次上调查与指定机器是否连通,调查数据包往复需要多少时间。为了实现这个功能,ping 命令使用了两个ICMP 报文。
在这里插入图片描述
解析过程:
1.向目标服务器发送回送请求。
首先,向目标服务器发出回送请求(类型是8,代码是0)报文(同2)。在这个回送请求报文里,除了类型和代码字段,还被追加了标识符和序号字段。标识符和序号字段分别是16 位的字段。ping 命令在发送回送请求报文时,在这两个字段里填入任意的值。对于标识符,应用程序执行期间送出的所有报文里填入相同的值。对于序号,每送出一个报文数值就增加1。而且,回送请求的选项数据部分用来装任意数据。这个任意数据用来调整ping 的交流数据包的大小。

2.鹦鹉学舌一样返回回送回答。
计算机送出的回送请求到达目标服务器后,服务器回答这一请求,向送信方发送回送请求(类型是0,代码是0)(同3)。这个ICMP 回送回答报文在IP 层来看,与被送来的回送请求报文基本上一样。不同的只是,源和目标IP 地址字段被交换了,类型字段里填入了表示回送回答的0。也就是,从送信方来看,自己送出的ICMP 报文从目标服务器那里象鹦鹉学舌那样原样返回了。
送信方的计算机可以通过收到回送回答报文,来确认目标服务器在工作着。进一步,记住发送回送请求报文的时间,与接收到回送回答报文的时间一比较,就能计算出报文一去一回往复所需要的时间(同4)。但是,收到的回送回答报文里写的只是类型和代码的话,发送方计算机将无法判断它是否是自己发出去请求的回答。因此,前面说到的标识符和序号字段就有它的意义了。将这两个值与回送回答报文中的相同字段值一比较,送行方计算机就能够简单地检测回送回答是否正确了。执行ping 命令而调查的结果没什么问题的话,就将目标服务器的IP 地址,数据大小,往复花费的时间打印到屏幕上。

3.用ping 命令不能确定与对方连通的原因大致有三个。
1)目标服务器不存在;2)花在数据包交流上的时间太长ping 命令认为超时;3)目标服务器不回答ping 命令。如果是原因2),通过ping 命令的选项来延长到超时的等待时间,就能正确显示结果了。如果原因是1)或3)的话,仅凭ping 命令的结果就不能判断是哪方了。正如这样,ping 命令不一定一定能判断对方是否存在。

traceroute命令
为了调查到通信对方的路径现在是怎么样了,使用的是traceroute 命令。它与ping 并列,是代表网络命令。这个traceroute 也是ICMP 的典型实现之一。
在这里插入图片描述
解析过程:
1.执行tracert命令。
在Windows 上执行tracert 命令后,首先计算机向目的服务器发送IP 数据包。Windows 上使用的是与ping 同样的ICMP 回送请求报文。但是,有一点和通常的回送请求不一样。那是,最初将IP 首部的TTL(生存时间)字段设为1 这一点。
路由器每转送一次数据包就将TTL 的值减1。当TTL 变为0 的时候,按规定将丢弃这个数据包。正如这样,与其说TTL 是时间,还不如说TTL 是经过路由器的个数。对于计算机发送出去的数据包,只要它与目标服务器不在同一局域网内,一定会被哪儿的路由器中继。这时如果TTL 的值是1,由于路由器的处理会变为0,则该数据包将会被丢弃(同2)。

2.用超时报文来通知送信方。
路由器丢弃数据包的同时,用ICMP 报文来通知错误。这时使用的ICMP 报文是,类型为11,代码为0 的ICMP 超时报文。而且在选项数据字段里,将填入原先数据包的IP 首部和ICMP 的开始8 字节。正如ping 命令的时候看到的,ICMP 回送请求的先头8 字节里包含了标识符和序号字段。因此,送信方的计算机看了超时报文后,就知道是针对自己发出的回送请求的错误通知。
计算机接到针对第一个数据包的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 回送回答报文的送信方知道了路经调查已经到了目标服务器,就结束了tracert 命令的执行(同6)。像这样,通过列出中途路由器返回的错误,就能知道构成到目标服务器路径的所有路由器的信息了。

4.操作系统不同则实现方法略微不同。
到这里,以Windows 上的tracert 命令为例看了原理,有些别的操作系统的traceroute 命令的原理略微不同。
具体来说,也有用向目标发送UDP 数据包代替ICMP 回送请求报文来实现的。虽说是用UDP,但途中的路由器的处理与図 8完全相同。只是UDP 数据包到达目标后的处理不同。目标计算机突然收到与通信无关的数据包,就返回ICMP 错误,因此根据返回数据包的内容来判断命令的中止。

注:此博客用于个人总结复习,大幅摘自别人的博客,非原创。
参考
1.https://blog.csdn.net/baidu_37964071/article/details/80514340
2.https://www.cnblogs.com/iiiiher/p/8513748.html

标签:协议,浅谈,IP,报文,ping,回送,ICMP,数据包
来源: https://blog.csdn.net/Ann0827/article/details/99679787