使用IP选项实现Traceroute程序

【使用IP选项实现Traceroute程序】1.现今的Traceroute
现在的traceroute的实现是这样的:主机先发出一个TTL(TimeToLive , 生存时间)为1的数据包 。接着数据包经过第一跳之后到达一个路由器 , 此时路由器将发回一个ICMP错误消息[1] , 以说明这个数据包不能继续向前传送 , 因为其TTL已经过期了 。然后traceroute程序又发出一个TTL为2的数据包 , 这个数据包经过两次跳跃后其TTL过期 。这个过程不断重复 , 直到数据包到达目的主机 。此过程的目的就是要记录下所有发出ICMP超时消息的消息源 , 据此就可以确定出数据包到达目的主机的路径了 。
这个算法的优点是所有的路由器都能够发出TTL超时消息 , 因而不需要非凡的代码以支持此算法 。而其缺点在于:发出的数据包的数目(2n个 , 其中n是数据包跳跃次数)(译注:可能包含了路由器发送的超时消息) , 花费在用连续的数据包记录较近路由的时间 , 以及路径在这个检测过程中可能会发生改变这个事实 。同时 , 这个算法并不能跟踪检测数据包返回时的路径 , 而这个路径很可能与外出路径不同 。
2.将来的Traceroute
这个被提议的traceroute实现将使用一种不同的算法来达到相同的目的 , 即得到到达目的主机的路径 。由于新的traceroute实现采用了一种专用的ICMP消息 , 所以用户还可以得到一些以前(使用老的traceroute)得不到的额外信息 。
2.1基本算法
这里 , 我们将定义一种新的IP选项——Traceroute选项 。若此选项存在在一个ICMP应答(或任何其他)数据包中 , 在下文中称之为“外出数据包”(OutboundPacket) , 则会使路由器给这个外出数据包的源端发出一个新定义的ICMPTraceroute消息 。这样 , 通过n 1个数据包(而不是2n个) , 这个外出数据包所经过的路径就可以被其发送端记录下来 。路径的改变并不影响这个算法的有效性 , 同时 , 该算法还答应对外出数据的应答 , 下文称之为“返回数据包”(ReturnPacket) , 进行跟踪 , 只要外出数据包的目的主机在发送应答数据时保留原来的IPTraceroute选项就可以了 。
这个方法的不足之处在于必须把traceroute功能加到路由器中去 。而好处是这种机制能够很轻易的加入到新版本的IP协议中去 。
2.2IPTraceroute选项格式
(译注:为方便对比 , 我将英文和中文的格式都列了出来 , 下同)
F(复制到分片标志 , copytofragments):
0(不复制到分片)
C(类别 , class):
2(调试&测量)
数字(Number):
18(F C Number=82)
ID标识号(IDNumber):
这是由外出数据包发送者指定的任意一个数值 , 其目的在于可以让程序识别与自身发出数据包对应的ICMPTraceroute消息 。这个数值与IP头部的标识号没有关系 。
源IP地址(OriginatorIPAddress):
发送外出数据包的主机地址 。这是必须的 , 因为路由器要根据这个地址发送返回数据包 。含有源站选路(SourceRoute)选项的外出数据包同样需要这个字段 。
外出跳跃计数(OutboundHopCount , 简称OHC):
外出数据包已经通过的路由器数目 。外出数据包的目的主机不增加这个字段的值 。
返回跳跃计数(ReturnHopCount , 简称RHC):
返回数据包已经通过的路由器数目 。返回数据包的目的主机不增加这个字段的值 。
2.3ICMPTraceroute消息格式
类型(Type):
30
代码(Code):
0-外出数据包转发成功
1-前面已没有路由器 , 数据包被抛弃
校验和(Checksum):
对首部中每个16位字进行二进制反码求和的结果 。在计算校验和之前 , 应当先把此字段填零 , 然后填入计算结果 。

推荐阅读