tracert命令背后的原理分析

1:tracert命令的作用

tracert可以用来跟踪一个分组从源点到终点的路径,以及它在IP 网络中每一跳的延迟。

比如我们从文荟人才公寓来追踪到百度服务器的中间路径。

 可以发现经过了6跳到达百度,因为中间有一个是超时的。第一个中间路由是192.168.1.1,这其实是本机的默认网关。每行的那三个时间是到达每一跳所需的往返时间,这一点是怎么做到的呢?下面就开始分析tracert背后的原理。

2:ICMP报文

IP通信中,经常有数据包到达不了对方的情况。原因是,在通信途中的某处的一个路由器由于不能处理所有的数据包,就将数据包一个一个丢弃了。或者,虽然到达了对方,但是由于搞错了端口号,服务器软件可能不能接受它。这时,在错误发生的现场,为了反应错误而发送的报文就是ICMP 报文。在IP 网络上,由于数据包被丢弃等原因,为了控制将必要的信息传递给发信方。ICMP 协议是为了辅助IP 协议,交换各种各样的控制信息而被制造出来的。

制定万维网规格的IETF 在1981 年将RFC7922作为ICMP 的基本规格整理出来了。那个RFC792 的开头部分里写着“ICMP 是IP 的不可缺少的部分,所有的IP 软件必须实现ICMP协议。也是,ICMP 是为了分担IP 一部分功能而被制定出来的。可以说IP层是几乎没有差错控制的,ICMP的出现从某种程度上来说就是为了弥补这一点。

 可以看出ICMP是封装在ip数据报里面的。其实ICMP有一个重要的功能就是配合各种命令的实现,来协助完成所需功能,下面将要介绍的tracer命令就是一个典型的例子,此外ping命令也是借助了ICMP报文。

3:tracert背后的原理分析

 主机1发送数据包到主机2很明显会经过路由器R1和R2,那么tracert命令怎么测出这条路径以及到达各个节点的的RTT呢?tracert利用了ICMP报文,准确地说是利用了ICMP超时报文以及终点不可达报文。

主机1想要测得自己和路由器R1之间的往返时间,就希望自己和R1之间有一个数据的往返,想要实现这一点,主机1上面的tracert程序使用 udp向终点发送一个ip分组,TTL设置为1,这个程序记录下发送时间。

R1收到这个分组,把TTL减1变成0,于是丢弃它,并且向主机1发送一个ICMP超时报文(因为TTL为0),主机1上面的tracert程序收到这个超时报文,利用封装ICMP的ip分组的源地址找到R1的地址,并且记录下分组的到达时间,和前面发送时间之差就是主机1到路由器R1的RTT,主机1一共重复上面操作三次,这也是为什么上面tracert结果中一行会有三个时间。同理,对R2,主机1也是同样操作,只不过这时TTL设置为2.当分组最后到达主机2的时候,TTL减为0,但是主机2不直接丢弃这个报文,因为已经到达目的地了,他会使用另一种策略,就是设置一个udp不支持的目的端口,这样主机2会丢弃分组并发送ICMP终点不可达报文,主机1收到报文后就记录ip和RTT,这样整个流程就结束了,路径和相应RTT也都能显示出来了。

猜你喜欢

转载自www.cnblogs.com/lambdoor/p/11947226.html