【使用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位字进行二进制反码求和的结果 。在计算校验和之前 , 应当先把此字段填零 , 然后填入计算结果 。
ID标识号(IDNumber):
与引起此消息的数据包中的IPTraceroute选项部分的相应字段相同 。这同样不与IP首部的ID标识号有任何关系 。
外出跳跃计数(OutboundHopCount):
与引起此消息的数据包中的IPTraceroute选项部分的相应字段相同 。
返回跳跃计数(ReturnHopCount):
与引起此消息的数据包中的IPTraceroute选项部分的相应字段相同 。
输出连接速度(OutputLinkSpeed):
发送“外出/返回数据包”所在连接的速度 , 以“字节(8位)/秒”计 。选择“字节/秒”而不是“位/秒”是考虑到如下事实:网络速度不久即将突破4.3GB/s , 同时有些机器处理大于32位字段的效率很低 。假如这个值不能确定 , 那么该字段应该置为零 。
输出连接MTU(OutputLinkMTU):
发送“外出/返回数据包”所在连接的MTU , 以“字节”计 。MTU所针对的只是数据包中的数据部分 , 包括IP首部 , 但不包括链路层所加的首部及尾部封装 。假如这个值不能确定 , 那么该字段应该置为零 。
3.协议
带有IPTraceroute选项的外出数据包通常不应该使用非凡的服务类型(TypeOfService , 简称TOS)或优先级(Precedence) , 除非想要跟踪具有非凡服务类型或优先级的数据包路径 。
外出数据包的TTL值应该设置成“数字分配”[2]一文中所指定的默认值 。
3.1跳跃(Hop)计数
跳跃计数提供了有关外出/返回数据包到目的主机所经路径长度的信息 。这些计数也提供了判定ICMPTraceroute消息丢失与否的一种方法 。举个例子来说 , 假如一个OHC为6的消息紧跟在一个OHC为4的消息后面 , 那么我们可以得出结论 , 那个OHC为5的消息丢失了 。这也说明了仅计算Traceroute消息的数目不能有效判定路径长度的原因 。
外出数据包的源端应当把数据包中的OHC设成0 , 而把RHC设成0xFFFF 。0xFFFF这个非凡数值用来表示这是一个外出数据包而不是返回数据包 , 返回数据包的RHC为0 。
另外要注重的很重要的一点是 , 这个跳跃计数与与IP的TTL没有任何关联 。跳跃计数的步增应该仅在一个ICMPTraceroute消息发出时进行 。
3.2目的主机操作
若一主机接收到一个带有IPTraceroute选项的外出数据包 , 那么在被要求应答的时候(如ICMPEcho服务的请求/应答) , 返回数据包也应当带有此选项 。在返回数据包中必须填入如下内容:ID标识号、OHC和源IP地址 。而RHC字段应当被设为0 。
外出数据包的目的主机不应该再增加跳跃计数或者发送任何的ICMPTraceroute消息 。
3.3路由器操作
当路由器转发一个含有IPTraceroute选项的数据包时 , 它应当给源IP地址字段所指出的主机发送一份ICMPTraceroute消息 。假如接收到的数据包中的RHC字段为0xFFFF , 那么这个数据包就是外出数据包 , 因此路由器应当将OHC字段的值加一;否则路由器应将RHC字段加一 。而发回的Traceroute消息应该反映出增加后的跳跃计数 。输出连接速度应当设置成发送“外出/返回数据包”所在连接的速度 , 以“字节(8位)/秒”计(如一个以太网速度为1,250,000) , 该字段也可以设成零以表示速度不能确定 。输出连接MTU应当设置成发送“外出/返回数据包”所在连接的MTU , 该字段同样可以为零以表示MTU不能确定 。
当Traceroute选项存在时 , 外出/返回数据包的转发过程应该像它不存在一样 。也就是说 , 到达目的主机的路径与是否存在Traceroute选项无关 。
ICMPTraceroute消息应该与外出/返回数据包具有相同的TOS和优先级 。TTL值应该设置成“数字分配”[2]一文中所指定的默认值 。
ICMPTraceroute消息不应该再具有IPTraceroute选项 。
假如外出数据包不能被转发 , 那么返回的ICMPTraceroute消息的代码字段应当设为1 。但是假如返回数据包由于没有可用的路由器而不能被转发 , 那么就不需要发回一个Traceroute消息 , 因为这个消息就算发了也将不能被转发 。
4.参考文献
[1]Postel,J.,"InternetControlMessageProtocol",STD5,RFC792,
USC/InformationSciencesInstitute,September1981.
[2]Reynolds,J.,andJ.Postel,"AssignedNumbers",STD2,RFC1340,
USC/InformationSciencesInstitute,July1992.
5.安全性考虑
安全性方面的相关内容不在本文中讨论 。
6.作者的地址
GaryScottMalkin
Xylogics,Inc.
53ThirdAvenue
Burlington,MA01803
Phone:(617)272-8140
EMail:gmalkin@Xylogics.COM
- 微信的账单怎么快速删除
- 怎么开启陌生电话拦截
- 手环亮度怎么调节
- OPPO A8怎么恢复出厂设置
- 三星S6手机使用广角自拍功能的方法
- 无键盘使用Windows Vista
- 小米note3通话怎么录音?小米note3通话录音功能的使用方法
- 防止数据泄密 教你在Vista中禁止使用USB
- apple pay如何使用?Apple Pay安装使用方法
- i排版图片工具条如何使用 工具条使用方法介绍
