ping命令
当我们在使用ping命令测试网络是否连通的时候,输出的最后一项一般都是TTL=XX这样的形式,那么TTL到底代表什么呢?TTL是IP协议包中的一个值,它告诉网络路由器包在网络中的时间是否太长而应被丢弃。有很多原因使包在一定时间内不能被传递到目的地。例如,不正确的路由表可能导致包的无限循环。所以需要在包中设置这样一个值,包在每经过一个节点,将这个值减1,反复这样操作,最终可能造成两个结果:包在这个值还为正数的时候到达了目的地,或者是在经过一定数量的节点后,这个值减为了0。前者代表完成了一次正常的传输,后者代表包可能选择了一条非常长的路径甚至是进入了环路,这显然不是我们期望的,所以在这个值为0的时候,网络设备将不会再传递这个包而是直接将他抛弃,并发送一个通知给包的源地址,说这个包已传输失败。每个操作系统可能会有不同的TTL初值,如果想查看这个初值,比较简单的办法也是使用ping命令:
ping 127.0.0.1
就是ping自己的回环地址,这样的话这个ping的数据包直接就返回了,所以TTL的值不会减小,所以也就得到了TTL的初值。
tracert命令
tracert命令作为一个路由跟踪、诊断实用程序,在DOS和Unix系统下都有此命令,它通过发送Internet控制消息协议(ICMP)回显请求和回显答复消息,产生关于经过每个路由器的命令行报告输出,从而跟踪路径。该程序是网管必备的TCP/IP工具之一,经常被用于测试网络的连通性,确定故障位置。这个命令会输出数据包中间经过的路由器地址。当数据报从你的计算机经过多个网关传送到目的地时,Tracert命令可以用来跟踪数据报使用的路由(路径)。该实用程序跟踪的路径是源计算机到目的地的一条路径,不能保证或认为数据报总遵循这个路径。
该诊断实用程序将包含不同生存时间(TTL)值的Internet控制消息协议(ICMP)回显数据包发送到目标,以决定到达目标采用的路由。要在转发数据包上的TTL之前至少递减1,必需路径上的每个路由器,所以TTL是有效的跃点计数。数据包上的TTL到达0时,路由器应该将“ICMP已超时”的消息发送回源系统。Tracert先发送TTL为1的回显数据包,并在随后的每次发送过程将TTL递增1,直到目标响应或TTL达到最大值,从而确定路由。路由通过检查中级路由器发送回的“ICMP已超时”的消息来确定路由。不过,有些路由器悄悄地下传包含过期TTL值的数据包,而tracert看不到。
然而我自己在家做测试的时候分别使用命令:
ping www.baidu.com
返回的TTL=54,而我的电脑的TTL起始值为64,也就是说中间经过了64-54=10次转发。
使用tracert www.baidu.com
返回的只有一个路由器表的地址,这个非常奇怪......,这也就是说明tracert命令发送TTL=1的第一个数据包就到达了目的地!也就是说明我的路由器反悔了一个ICMP-ECHO而并非返回的是ICMP已超时,所以我的PC就以为数据包已经到达了目的地址。最终导致这个结果的原因是我使用的是TP-Link的路由器,而这款路由器是不支持tracert命令的,这款路由器本身不对tracert数据包进行解析,所以,中间的跳数都看不到。