当前位置: 首页 > 后端技术 > PHP

网络协议5——ICMP与ping

时间:2023-03-30 02:31:28 PHP

在日常开发中,我们经常会遇到检查网络是否畅通、域名是否与IP地址对应等小需求。这个时候用的最多的应该就是ping命令了。那么你知道ping命令是如何工作的吗?今天,我们就来认识一下ping命令及其对应的ICMP协议。ICMP协议ICMP的全称是InternetControlMessageProtocol,即互联网控制消息协议。网络本身是不可靠的。在数据包的传输过程中,可能会发生很多突发事件,导致数据传输失败。网络层的IP协议是无连接协议,不会处理网络层故障。因此,我们需要其他协议能够在数据包传输失败时回传故障信息,以便处理相关问题。问题。就像电视剧里看到的古代战争一样,战争的时候需要侦察兵来传达战况,从而更好的掌控战局。ICMP报文充当网络世界中的“侦察兵”。ICMP消息封装在IP数据包中。因为在传输指令的时候,肯定需要源地址和目标地址。它的格式很简单,如下图所示:ICMP报文有很多种,不同的类型有不同的编码。最常用的类型是主动请求,其代码为8,以及主动响应,其代码为0。从大的角度来看,它可以分为查询消息类型和错误消息类型。查询消息类型?我们经常在电视剧中听到这样的话:加油,前面的战况如何?侦察员回来了吗?如有情况,立即报告。类似于这种主动查看敌情的统帅,对应的是ICMP查询报文的类型。例如,常见的ping命令是一个查询报文,它是一个主动请求和主动响应的ICMP协议。所以ping命令发送的数据包也是符合ICMP协议格式的,只是后来加上了自己的格式。主动请求ping、网络抓包,称为ICMPECHOREQUEST。同样,对未经请求的请求的回复称为ICMPECHOREPLY。与原来的ICMP相比,多了两个字段,一个是标识符,一个是序号。这不难理解。指挥官派出两队侦察兵。一队在找人,一队在调查战况。必须有一个标记来区分它们。另一方面,派出的侦察兵必须有编号。如果你出10个回来10个,说明前面的战局不错。如果您发出10个并返回2个,则可能有问题。在option数据中,ping也会存储发送请求的时间值,用来计算往返时间,说明路程的长短。错误消息类型错误消息主要用于将发送的错误消息的相关信息返回给源设备,以便源设备判断是否重发失败的数据包比较好。就拿我们的“大帅哥”来说吧。正在大帐里指挥官看着地图思索战事的时候,外面的士兵突然喊道:指挥官,不好了,张将军中了伏击,全军覆没。这是由异常情况发起的,报告发生了不好的事情,对应于ICMP错误消息。错误信息有以下几种常用的类型:3:目标不可达4:源抑制5:重定向11:超时第一种情况是目标不可达。小兵禀报元帅,给张将军的粮草还没送到。元帅肯定会问,为什么不送?这对应于ICMP中的以下代码。网络不可达码:0主机不可达码:1协议不可达:2端口不可达:3需要分片但未设置分片:4本地主机不可达:指挥官,我找到了地方,但没有找到张将军。协议不可达:指挥官,地点和人找到了,密码不对。端口不可达:大帅,地方找到了,人找到了,密码也找对了,但是东西不对。我去送粮草,他们说在等救援人员。需要分片但没有设置分片:大帅,半路山路窄,想改废话,但是你下令说出发前严禁换车,所以没办法交付它。二是源头压制。也就是让源站放慢发送速度(小兵:指挥官,粮草太多吃不下了,你慢慢发吧)。第三种是超时。也就是说网络包的生存时间已经超过,目的地还没有到达(元帅,送粮草的人已经把粮食吃光了,还没到地方就饿死了)。第四种是路由重定向。也就是下次再发到别的路由器上(大帅,上次送粮草的人只要到大王村,也就一公里的路程,却要绕道张家界,多了一个五公里,下次记得去大王村)。错误信息的结构比较复杂。除了前面还是IP,ICMP的前8个字节不变,后面是IP头和错误IP包的IP文本的前8个字节。而且这种斥候特别负责,不仅要将字节送回报告,还要带回一些遗物。侦察兵:元帅,张将军战死。这是他的印章和剑。元帅:张将军是怎么死的(可以查ICMP的前8个字节)?没错,这就是张将军的宝剑(IP包头和文本前8字节)。ping:查询报文类型的使用接下来我们重点关注ping命令的发送和接收过程。假设主机A的IP地址为192.168.1.1,主机B的IP地址为192.168.1.2,两者在同一个子网。那么当您在主机A上运行“ping192.168.1.2”时会发生什么?源主机构造ICMP请求数据包。这个数据包包含几个字段。最重要的有两个,一个是type字段,请求包是8。另一个是sequencenumber,主要用来区分连续ping时发送的多个数据包。每发送一个请求包,序号会自动加1。为了能够计算往返时间RTT,它会在报文的数据部分插入发送时间。IP层构建IP数据包。ICMP协议将数据包连同目的IP交给IP层。IP层会以192.168.1.2为目的地址,本地IP地址为源地址,加上其他控制信息,构造一个IP数据包。添加MAC标头。找到192.168.1.2对应的MAC地址,添加一些控制信息,按照以太网的介质访问规则进行传输。主机B收到数据帧后,会执行以下步骤:检查MAC地址,丢弃或接收数据帧,提取IP数据包。检查数据包的目的MAC地址,并与本地MAC地址进行比较。如果匹配,则接收数据帧,否则丢弃。收到后检查数据帧,从帧中提取IP数据包并处理,交给本机的IP层。IP层检查IP。检查完成后,提取有用的信息,交给ICMP协议处理。构建ICMP回复数据包。响应包的类型字段为0,序号为收到的请求包中的序号。将应答包发送给主机A。如果源主机在指定时间内没有收到ICMP响应包,则表示目的主机不可达。如果收到数据包,则表示目标主机可达。此时,源主机检测到时间延迟。就是用当前时间减去数据包从源主机发出的时间。当然,这只是同一个局域网最简单的情况。如果跨网段,还会涉及到网关转发、路由器转发等。可以看出ping命令使用了ICMP中的ECHOREQUEST和ECHOREPLY类型。其他类型呢?是不是只有在实际遇到错误时才收到?答案是否定的。有一个Traceroute命令,它使用ICMP的规则来故意创建一些可能产生错误的场景。Traceroute:错误信息类型的使用Traceroute命令有两个常用的功能。第一个功能:通过设置一个特殊的TTL,跟踪到目的地时经过的路由器。当TTL设置为1时,表示这个数据包的MP为1,第一个“blocker”(通常是router或者checkpoint)会被杀死,然后返回一个ICMP包。网络错误包,类型为timeout。通过错误包,我们可以得到数据包到达第一个检查点所花费的时间和每个检查点的IP地址(有些主机不会响应ICMP,所以请求会全是*)。你怎么知道UDP是否已经到达目的主机?Traceroute程序会向目的主机发送一个UDP数据包,但它会选择一个不可能的值作为UDP端口号(大于30000)。当数据报到达目的主机时,由于找不到对应的端口号,会返回“portunreachable”的错误信息。这样,我们就知道UDP是否到达了主机。第二个功能:设置数据包不分片,确定路径的MTU发送数据包,设置“不分片”标志。发送的第一个数据包的长度恰好等于出口MTU。如果中间遇到narrowcheckpoint,就会卡住,返回一个ICMP网络错误包,类型为“需要分片,但没有设置分片”。这样,每次收到ICMP“cannotfragment”错误时都会减小数据包大小,从而确定整个路径上的MTU。总结ICMP是网络世界的侦察兵。常用的有两种,用于主动检测的查询包和用于异常报告的错误包。ping命令使用查询数据包,Traceroute命令使用错误数据包。参考:刘超-浅谈网络协议系列课程;

猜你喜欢