既然ping命令中有IP记录选项,为什么还要开发一个新的记录路由程序?
1. 并不是所有的路由器都支持记录路由选项。而traceroute程序不需要中间路由器具备任何特殊的或可选的功能。
2. 记录路由一般是单向的。即只记录数据发送过程中的出口,但是ping命令中不止是记录发送数据的出口,而且还记录了应答数据发送回来的出口,即每个数据流向的入口和出口都被记录了下来,这样记录的IP地址会翻番。
3. IP首部中留给选项的空间有限,最多只能存放9个IP地址。
Traceroute程序是利用了IP数据报首部的TTL字段,每经过一个路由器,会将这个字段减1,若该字段变为0,则抛弃这个IP数据报并向源主机发送一个ICMP超时信息。Traceroute程序给目的主机发送一个拥有错误端口号UDP数据报,若目的主机收到这个UPD数据报,不是返回ICMP超时信息而是ICMP端口不可达。所以traceroute程序一次发送TTL长度为1,2,3.。。。的IP数据报,直到收到ICMP端口不可达信息。
注:windows下的tracert命令是向目的主机发送ICMP的消息回显数据报。
当前默认网关为
首先,TTL=1时,先发送给默认网关,默认网关减1后,发现这个包不是发给自己的,弃之,但是实际中并没有收到回发的ICMP超时信息(此处也不明白为什么,然后又试了几次,TTL=1时,还是收不到回发的ICMP超时信息):
TTL=2时
172.16.11.22发回了超时信息
ICMP超时报文格式如下图:
当TTL值为0的时候,代码字段为0;主机在组装分片时发生超时,这时将发送一份“组装报文超时”的ICMP报文,代码字段为1.可参看下图阴影部分之前的八个字节,这八个字节与上图中ICMP超时报文的前八个字节是一一对应的。
这里要说明一下,(如ICMP超时报文格式图所示)当发送一份ICMP差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前八个字节。如上图,阴影部分为IP的首部,阴影部分后面的八个字节就是产生差错报文的IP数据报的前八个字节。下图是发送的ICMP报文,对比发现,ICMP前八个字节与上图中最后八个字节对应。
这样做的原因是,接受ICMP差错报文的模块就会把它与某个特定的协议(根据IP数据报首部中的协议字段来判断)和用户进程(根据包含在IP数据报前8个字节中的TCP或者UDP报文首部中的TCP或UDP端口号来判断)。这里比较特殊,ICMP差错报文就是由ICMP报文产生的。
后边的几个TTL长度产生的情况类似。
另外还需要注意三点,前两点与传输过程中的路由选择有关系,第三点关于返回ICMP报文的IP地址
1. 并不能保证现在的路由也是将来选择的路由,甚至两份连续的IP数据报都可能采用不同的路由。如果发生这种情况会被观察到,因为对于同一长度的TTL,会连续发送三次。
2. 不能保证返回的ICMP报文的路由与tracert程序发动的数据报采用同一路由。这表明打印出来的返回时间并不能真正地体现数据报发送和返回的时间差。(如果数据报从信源到路由器的时间为1s,而返回的时间为3s。则打印出来的往返时间就是4s)
3. 返回的ICMP报文中的信源IP地址是数据报到达的路由器接口的IP地址,即TTL被减为0并被抛弃的那个接口的IP地址。