大家好,又见面了,我是你们的朋友全栈君。
Ping和Traceroute原理
两者都是ICMP来完成的,ICMP的主要功能是确认IP包是否成功送达⽬标地址、报告发送过程中IP包被废弃的原因和改善⽹络设置等。ICMP是基于ip协议的,ICMP报文直接封装在ip数据报中来传输。
Ping
当执行ping命令的时候,源主机首先会构造一个ICMP回送请求数据包,其中包含两个字段:类型,指明该ICMP的类型(此时为8);序号,主要用于区分连续ping的时候发出的多个ICMP数据包,每发出一个Ping消息,序号就会自动加1。此外,为了能够计算RTT,还会在ICMP数据包中附加上当前时间。然后将该ICMP数据包封装在ip数据报中发送给目的主机。
当目的主机接收到该ip数据报后,从ip首部中提取出协议类型字段,从而判断出是一个ICMP类型的报文。此时目的主机会构造一个ICMP回送应答数据报,类型为0,序号为接收到的ICMP回送请求数据包中的序号。然后封装到ip数据报中发送给源主机。
在规定的时间内,如果源主机没有收到ICMP的应答包,则说明目标主机不可达;如果收到了应答数据包,则目标主机可达,并且用当前时间减去数据包最初从源主机上发送出去的时刻就是ICMP数据包的时间延迟(RTT)。
Traceroute
Ping命令利用的是ICMP的查询报文类型,而Traceroute利用的是ICMP的差错报文类型。
作用一:追踪去往⽬的主机时沿途经过的路由器
原理:利用一个数据包每被一个路由器转发就会将TTL减1,如果TTL减为0,路由器就会抛弃该数据包,然后向源主机发送一个ICMP差错报文。
具体来说,源主机循环发送UDP数据包,并且将它们对应的ip数据报中的TTL字段从1开始递增,比如说TTL为2的字段在经过两个路由器转发后TTL变为0,此时该路由器会发送一个类型为超时的ICMP差错报文给源主机,其中包含了该路由器的ip地址。故通过这种方式源主机可以得到去往目的主机路径上的所有路由器。
何时结束循环,即如何判断一个UDP报文段到达了目的主机?可以将UDP报文的目的端口设置为一个不可能的端口号,这时目的主机收到UDP报文段后就会向源主机发送一个ICMP差错报文,类型为端口不可达。所以当源主机收到端口不可达类型的ICMP差错报文时就可以知道到达了目的主机,可以结束循环了。
作用二:确定到目的主机路径上的最小MTU
原理:源主机设置ip数据报首部的分⽚禁⽌标志位设置为1,则路径上的路由器不会对ip分片,故如果数据包的长度大于MTU,则会将该数据包丢弃,然后向源主机发送一个ICMP差错报文,类型为需要进⾏分⽚但设置了不分⽚位,并且在该报文中附带了该链路的MTU。源主机每次收到ICMP报文后将减小数据包的大小,再次去探测路径上的最小MTU,从而得到可以通过该路径把数据包发送给目的主机的MTU。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162539.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...