Windows系统下用到的tracert命令(UNIX系统为traceroute)显示到达目的主机时经过的所有路由器。tracert命令同样是以ICMP报文为基础完成的,它使用了ICMP回显请求、回显应答和TTL超时报文。
tracert依次发送回显请求报文,在第一个回显请求报文中TTL为1,并在随后的每次发送报文中将TTL递增1,直到目标响应或TTL达到最大值。中间路由器回送TTL超时报文,目标主机回送回显应答报文。
下面通过一个实例来检验一下tracert的工作过程。使用“tracert www.nankai.edu.cn”命令来看一下从南开大学宿舍访问南开大学主页服务器要经过哪些路由器,本机IP地址为192.168.1.102。从tracert命令的执行结果可以看出,要经过5个路由器才能到达服务器。其中列出了这5个路由器的IP地址。
在这个tracert命令执行过程中,通过网络抓包软件在该命令发送后进行抓包分析,捕获的ICMP报文如下所示。可以看到,抓包结果中每一个ICMP回显请求报文与一个ICMPTTL超时报文相对应(TTL实际上是放在IP数据报首部的TTL字段中的)。
对于上面的ICMP报文,需要特别注意的是每个报文的源IP地址和目的IP地址。对于每个ICMP回显请求报文,源IP地址都是本机IP地址192.168.1.102,目的IP地址都是服务器的IP地址202.113.16.33。但是对于ICMPTTL超时报文,第一个TTL超时报文的源IP地址为192.168.1.1,接下来的源IP地址变为10.22.31.1,接着是202.113.18.153。这刚好与上面在Windows窗口中执行tracert命令的结果相一致。(www.daowen.com)
为什么会出现这样的结果呢?这就与之前所说的TTL值有关了。下面是发送的封装有第一个ICMP回显请求报文的IP数据报的具体内容。从中可以看到,第一个发送的ICMP回显请求报文的TTL值为1。
在发送3个同样的ICMP回显请求探测报文后,第二轮发送ICMP回显请求报文时TTL值为2。这就是两轮的ICMPTTL超时报文的源IP地址不同的原因,也是tracert命令能够得到从一台主机传到另一台主机所经过的所有路由器的根本所在。
tracert命令的另一种实现方法是利用ICMPTTL超时报文、ICMP端口不可达报文和端口号>32768的UDP数据报。tracert依次发送UDP数据报,选择一个很大的值作为UDP的端口号,通常主机的任何一个应用程序都不使用这个端口号,如从33434开始每送一个UDP数据报依次递增,直至33434+29,TTL也相应递增。中间路由器送回ICMPTTL超时报文,当目的主机接收到一个自己没有使用的端口号时,就会回送一个“端口不可到达”的ICMP报文,发送方收到该ICMP报文,就知道到达了目的主机。
在实际中,有些路由器未能实现协议的全部功能,有些路由器为了安全封了某些类型的报文,因此,tracert命令对路由的探测未必准确。例如,中间任何一个路由器如果封了IC-MP回显请求报文,tracert就不能工作。如果封了TTL超时报文,则看不到中间的路由器,但能看到目的主机。如果封了ICMP回显应答报文,则中间的路由器全能看到,而目的主机看不到。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。