1.現(xiàn)今的Traceroute
現(xiàn)在的traceroute的實(shí)現(xiàn)是這樣的:主機(jī)先發(fā)出一個TTL(TimeToLive,生存時間)為1的數(shù)據(jù)包。接著數(shù)據(jù)包經(jīng)過第一跳之后到達(dá)一個路由器,此時路由器將發(fā)回一個ICMP錯誤消息[1],以說明這個數(shù)據(jù)包不能繼續(xù)向前傳送,因?yàn)槠銽TL已經(jīng)過期了。然后traceroute程序又發(fā)出一個TTL為2的數(shù)據(jù)包,這個數(shù)據(jù)包經(jīng)過兩次跳躍后其TTL過期。這個過程不斷重復(fù),直到數(shù)據(jù)包到達(dá)目的主機(jī)。此過程的目的就是要記錄下所有發(fā)出ICMP超時消息的消息源,據(jù)此就可以確定出數(shù)據(jù)包到達(dá)目的主機(jī)的路徑了。
這個算法的優(yōu)點(diǎn)是所有的路由器都能夠發(fā)出TTL超時消息,因而不需要非凡的代碼以支持此算法。而其缺點(diǎn)在于:發(fā)出的數(shù)據(jù)包的數(shù)目(2n個,其中n是數(shù)據(jù)包跳躍次數(shù))(譯注:可能包含了路由器發(fā)送的超時消息),花費(fèi)在用連續(xù)的數(shù)據(jù)包記錄較近路由的時間,以及路徑在這個檢測過程中可能會發(fā)生改變這個事實(shí)。同時,這個算法并不能跟蹤檢測數(shù)據(jù)包返回時的路徑,而這個路徑很可能與外出路徑不同。
2.將來的Traceroute
這個被提議的traceroute實(shí)現(xiàn)將使用一種不同的算法來達(dá)到相同的目的,即得到到達(dá)目的主機(jī)的路徑。由于新的traceroute實(shí)現(xiàn)采用了一種專用的ICMP消息,所以用戶還可以得到一些以前(使用老的traceroute)得不到的額外信息。
2.1基本算法
這里,我們將定義一種新的ip選項(xiàng)——Traceroute選項(xiàng)。若此選項(xiàng)存在在一個ICMP應(yīng)答(或任何其他)數(shù)據(jù)包中,在下文中稱之為“外出數(shù)據(jù)包”(OutboundPacket),則會使路由器給這個外出數(shù)據(jù)包的源端發(fā)出一個新定義的ICMPTraceroute消息。這樣,通過n+1個數(shù)據(jù)包(而不是2n個),這個外出數(shù)據(jù)包所經(jīng)過的路徑就可以被其發(fā)送端記錄下來。路徑的改變并不影響這個算法的有效性,同時,該算法還答應(yīng)對外出數(shù)據(jù)的應(yīng)答,下文稱之為“返回數(shù)據(jù)包”(ReturnPacket),進(jìn)行跟蹤,只要外出數(shù)據(jù)包的目的主機(jī)在發(fā)送應(yīng)答數(shù)據(jù)時保留原來的IPTraceroute選項(xiàng)就可以了。
這個方法的不足之處在于必須把traceroute功能加到路由器中去。而好處是這種機(jī)制能夠很輕易的加入到新版本的IP協(xié)議中去。
2.2IPTraceroute選項(xiàng)格式
(譯注:為方便對比,我將英文和中文的格式都列了出來,下同)
F(復(fù)制到分片標(biāo)志,copytofragments):
0(不復(fù)制到分片)
C(類別,class):
2(調(diào)試&測量)
數(shù)字(Number):
18(F+C+Number=82)
ID標(biāo)識號(IDNumber):
這是由外出數(shù)據(jù)包發(fā)送者指定的任意一個數(shù)值,其目的在于可以讓程序識別與自身發(fā)出數(shù)據(jù)包對應(yīng)的ICMPTraceroute消息。這個數(shù)值與IP頭部的標(biāo)識號沒有關(guān)系。
源IP地址(OriginatorIPAddress):
發(fā)送外出數(shù)據(jù)包的主機(jī)地址。這是必須的,因?yàn)槁酚善饕鶕?jù)這個地址發(fā)送返回數(shù)據(jù)包。含有源站選路(SourceRoute)選項(xiàng)的外出數(shù)據(jù)包同樣需要這個字段。
外出跳躍計數(shù)(OutboundHopCount,簡稱OHC):
外出數(shù)據(jù)包已經(jīng)通過的路由器數(shù)目。外出數(shù)據(jù)包的目的主機(jī)不增加這個字段的值。
返回跳躍計數(shù)(ReturnHopCount,簡稱RHC):
返回數(shù)據(jù)包已經(jīng)通過的路由器數(shù)目。返回數(shù)據(jù)包的目的主機(jī)不增加這個字段的值。
2.3ICMPTraceroute消息格式
類型(Type):
30
代碼(Code):
0-外出數(shù)據(jù)包轉(zhuǎn)發(fā)成功
1-前面已沒有路由器,數(shù)據(jù)包被拋棄
校驗(yàn)和(Checksum):
對首部中每個16位字進(jìn)行二進(jìn)制反碼求和的結(jié)果。在計算校驗(yàn)和之前,應(yīng)當(dāng)先把此字段填零,然后填入計算結(jié)果。
ID標(biāo)識號(IDNumber):
與引起此消息的數(shù)據(jù)包中的IPTraceroute選項(xiàng)部分的相應(yīng)字段相同。這同樣不與IP首部的ID標(biāo)識號有任何關(guān)系。
外出跳躍計數(shù)(OutboundHopCount):
與引起此消息的數(shù)據(jù)包中的IPTraceroute選項(xiàng)部分的相應(yīng)字段相同。
返回跳躍計數(shù)(ReturnHopCount):
與引起此消息的數(shù)據(jù)包中的IPTraceroute選項(xiàng)部分的相應(yīng)字段相同。
輸出連接速度(OutputLinkSpeed):
發(fā)送“外出/返回數(shù)據(jù)包”所在連接的速度,以“字節(jié)(8位)/秒”計。選擇“字節(jié)/秒”而不是“位/秒”是考慮到如下事實(shí):網(wǎng)絡(luò)速度不久即將突破4.3GB/s,同時有些機(jī)器處理大于32位字段的效率很低。假如這個值不能確定,那么該字段應(yīng)該置為零。
輸出連接MTU(OutputLinkMTU):
發(fā)送“外出/返回數(shù)據(jù)包”所在連接的MTU,以“字節(jié)”計。MTU所針對的只是數(shù)據(jù)包中的數(shù)據(jù)部分,包括IP首部,但不包括鏈路層所加的首部及尾部封裝。假如這個值不能確定,那么該字段應(yīng)該置為零。
3.協(xié)議
帶有IPTraceroute選項(xiàng)的外出數(shù)據(jù)包通常不應(yīng)該使用非凡的服務(wù)類型(TypeOfService,簡稱TOS)或優(yōu)先級(PRecedence),除非想要跟蹤具有非凡服務(wù)類型或優(yōu)先級的數(shù)據(jù)包路徑。
外出數(shù)據(jù)包的TTL值應(yīng)該設(shè)置成“數(shù)字分配”[2]一文中所指定的默認(rèn)值。
3.1跳躍(Hop)計數(shù)
跳躍計數(shù)提供了有關(guān)外出/返回數(shù)據(jù)包到目的主機(jī)所經(jīng)路徑長度的信息。這些計數(shù)也提供了判定ICMPTraceroute消息丟失與否的一種方法。舉個例子來說,假如一個OHC為6的消息緊跟在一個OHC為4的消息后面,那么我們可以得出結(jié)論,那個OHC為5的消息丟失了。這也說明了僅計算Traceroute消息的數(shù)目不能有效判定路徑長度的原因。
外出數(shù)據(jù)包的源端應(yīng)當(dāng)把數(shù)據(jù)包中的OHC設(shè)成0,而把RHC設(shè)成0xFFFF。0xFFFF這個非凡數(shù)值用來表示這是一個外出數(shù)據(jù)包而不是返回數(shù)據(jù)包,返回數(shù)據(jù)包的RHC為0。
另外要注重的很重要的一點(diǎn)是,這個跳躍計數(shù)與與IP的TTL沒有任何關(guān)聯(lián)。跳躍計數(shù)的步增應(yīng)該僅在一個ICMPTraceroute消息發(fā)出時進(jìn)行。
3.2目的主機(jī)操作
若一主機(jī)接收到一個帶有IPTraceroute選項(xiàng)的外出數(shù)據(jù)包,那么在被要求應(yīng)答的時候(如ICMPEcho服務(wù)的請求/應(yīng)答),返回數(shù)據(jù)包也應(yīng)當(dāng)帶有此選項(xiàng)。在返回數(shù)據(jù)包中必須填入如下內(nèi)容:ID標(biāo)識號、OHC和源IP地址。而RHC字段應(yīng)當(dāng)被設(shè)為0。
外出數(shù)據(jù)包的目的主機(jī)不應(yīng)該再增加跳躍計數(shù)或者發(fā)送任何的ICMPTraceroute消息。
3.3路由器操作
當(dāng)路由器轉(zhuǎn)發(fā)一個含有IPTraceroute選項(xiàng)的數(shù)據(jù)包時,它應(yīng)當(dāng)給源IP地址字段所指出的主機(jī)發(fā)送一份ICMPTraceroute消息。假如接收到的數(shù)據(jù)包中的RHC字段為0xFFFF,那么這個數(shù)據(jù)包就是外出數(shù)據(jù)包,因此路由器應(yīng)當(dāng)將OHC字段的值加一;否則路由器應(yīng)將RHC字段加一。而發(fā)回的Traceroute消息應(yīng)該反映出增加后的跳躍計數(shù)。輸出連接速度應(yīng)當(dāng)設(shè)置成發(fā)送“外出/返回數(shù)據(jù)包”所在連接的速度,以“字節(jié)(8位)/秒”計(如一個以太網(wǎng)速度為1,250,000),該字段也可以設(shè)成零以表示速度不能確定。輸出連接MTU應(yīng)當(dāng)設(shè)置成發(fā)送“外出/返回數(shù)據(jù)包”所在連接的MTU,該字段同樣可以為零以表示MTU不能確定。
當(dāng)Traceroute選項(xiàng)存在時,外出/返回數(shù)據(jù)包的轉(zhuǎn)發(fā)過程應(yīng)該像它不存在一樣。也就是說,到達(dá)目的主機(jī)的路徑與是否存在Traceroute選項(xiàng)無關(guān)。
ICMPTraceroute消息應(yīng)該與外出/返回數(shù)據(jù)包具有相同的TOS和優(yōu)先級。TTL值應(yīng)該設(shè)置成“數(shù)字分配”[2]一文中所指定的默認(rèn)值。
ICMPTraceroute消息不應(yīng)該再具有IPTraceroute選項(xiàng)。
假如外出數(shù)據(jù)包不能被轉(zhuǎn)發(fā),那么返回的ICMPTraceroute消息的代碼字段應(yīng)當(dāng)設(shè)為1。但是假如返回數(shù)據(jù)包由于沒有可用的路由器而不能被轉(zhuǎn)發(fā),那么就不需要發(fā)回一個Traceroute消息,因?yàn)檫@個消息就算發(fā)了也將不能被轉(zhuǎn)發(fā)。
4.參考文獻(xiàn)
[1]Postel,J.,"InternetControlMessageProtocol",STD5,RFC792,
USC/InformationSciencesInstitute,September1981.
[2]Reynolds,J.,andJ.Postel,"AssignedNumbers",STD2,RFC1340,
USC/InformationSciencesInstitute,July1992.
5.安全性考慮
安全性方面的相關(guān)內(nèi)容不在本文中討論。
6.作者的地址
GaryScottMalkin
Xylogics,Inc.
53ThirdAvenue
Burlington,MA01803
Phone:(617)272-8140
EMail:gmalkin@Xylogics.COM
新聞熱點(diǎn)
疑難解答
圖片精選