在日常工作中,我们经常需要检查网络是否连通。事实上,ping命令是基于ICMP协议实现的。 ICMP 是Internet 控制消息协议的缩写。它在TCP/IP 网络中用于发送控制消息并对通信环境中可能出现的各种问题提供反馈。通过这些信息,网络管理员可以诊断发生的问题并采取适当的措施来解决问题。本文介绍ICMP协议的工作原理。
ICMP报文格式
ICMP 从报文格式来看,ICMP是IP之上的上层协议,但ICMP共享IP的一些功能。因此,ICMP也被认为是与IP同层的协议,运行在网络层,作为IP协议的助手。如下图所示,ICMP是封装在IP数据包中发送的。 ICMP数据包本身被封装到一个IP数据报的数据区中,而这个IP数据报又被封装到帧数据中。 IP数据报头中的协议字段设置为1,表明该数据是ICMP消息。有关IP 消息格式的更多信息,请参阅《计算机网络传输中IP数据报文格式详解并结合Wireshark深入分析》。
ICMP报文的格式如下图所示。ICMP报文的前4个字节格式统一,包含三个字段:类型、代码、校验和。接下来的4 个字节与ICMP 类型相关,后面是数据部分。数据部分的长度也根据类型而变化。
类型:8 位。类型字段可以包含15个不同的值,描述ICMP消息的特定类型。代码:8 位数字。 ICMP报文的代码字段是一种校验和,用于进一步区分特定类型的几种不同情况,占16位。用于检查整个ICMP消息。计算方法与IP头校验和计算方法相同。
ICMP报文类型
ICMP 消息分为两大类:查询消息和错误消息。 ICMP 用于传达错误通知和信息请求的所有消息均由类型和代码组合表示。 ICMP报文通过类型表达其一般含义,当需要发送小块信息时,使用代码进行分类。
ICMP实现之ping命令
通过上面的讲解,您已经了解了ICMP协议的内容。接下来我们看一下ICMP的具体实现和应用。正如前面提到的,实际上有很多种类型的ICMP 消息用于提供网络通信各个方面的反馈。最常用的情况是您可以使用ping 命令来查明与网络上指定机器是否存在连接。等级。为了实现此功能,ping 命令使用两个ICMP 消息:ICMP 回显请求(类型8,代码0)和ICMP 回显应答(类型0,代码0)。
首先,源主机向目标主机发出ping 命令。除了类型和代码字段之外,此回显请求数据包还创建ICMP 回显请求消息数据包。还添加了标识符字段和序列号字段。标识符和序列号字段都是16 位字段,其中填充有例如进程号PID,以区分哪个应用程序发送了ICMP 数据包。每发送一个数据包,序列号的值就加1。此外,ICMP 消息的可选数据部分还存储发送请求的时间值,以计算往返时间。
当在IP地址为192.168.0.102的主机上执行ping 192.168.0.1命令时,通过WireShark抓包可以看到源主机构造了一个ICMP echo request消息包,如下图所示。可以看到ICMP报文的Type为8,对应的Code为0。这意味着echo (ping) request——ping echo 请求后跟校验和和其他字段以检查ICMP。消息结构。
当源主机发送的echo请求到达目标主机时,目标主机通过发送ICMP echo应答报文来响应该请求。从IP层的角度来看,这个ICMP回显应答消息本质上与发送的回显请求消息相同。唯一的区别是源IP地址字段和目的IP地址字段互换,并且类型字段填充0,表示回显应答。
通过WireShark抓包可以看到ICMP报文类型(Type)为0,对应的代码(Code)为0,表示Echo(ping)Reply——ping回显响应,如下图所示。
如果目的主机能够收到echo应答报文,则认为目的主机运行正常。此外,通过存储回声请求分组的发送时间和回声响应分组的接收时间之间的时间差,可以计算数据分组进行往返所需的时间。但是,如果收到的回显应答消息仅包含类型和代码,则发送主机无法确定它是否是对其发送的请求的响应。因此,上面提到的标识符和序列号字段是有意义的。通过将这两个值与回显回复消息中相同的字段值进行比较,发送主机可以轻松验证回显回复是否正确。执行ping命令,如果排查结果没有问题,屏幕上就会输出目标主机的IP地址、数据大小和往返时间。
版权声明:本文转载于网络,版权归作者所有。如有侵权,请联系本站编辑删除。