這樣就能夠通過(guò)構(gòu)造數(shù)據(jù)包,來(lái)間接檢查到 達(dá)一個(gè)主機(jī)時(shí)經(jīng)過(guò)了哪些路由。一開(kāi)始發(fā)送一個(gè)TTL為1的包,這樣到達(dá)第一個(gè)路由器的時(shí)候就已經(jīng)超時(shí)了,第一個(gè)路由器就發(fā)通知說(shuō)包超時(shí),這樣就能夠記錄下 所經(jīng)過(guò)的第一個(gè)路由器的IP。然后TTL加1,安全通過(guò)第一個(gè)路由器,而第二個(gè)路由器的的處理與第一個(gè)同樣,丟包,發(fā)通知說(shuō)包超時(shí)了,這樣記錄下第二個(gè)路 由器IP,由此能夠一直進(jìn)行下去,直到這個(gè)數(shù)據(jù)包到達(dá)目標(biāo)主機(jī),由此打印出全部經(jīng)過(guò)的路由器。
在通信中,IP層僅僅負(fù)責(zé)數(shù)據(jù)的路由與傳 輸,并不處理數(shù)據(jù)包的內(nèi)容。比如ICMP,或TCP,UDP,這些協(xié)議是依賴IP層的傳輸功能來(lái)傳送數(shù)據(jù)的。在通信兩方的主機(jī)中,收到這些協(xié)議的數(shù)據(jù)包 后,一般在通信的相應(yīng)主機(jī)上,會(huì)有程序來(lái)處理這些數(shù)據(jù)。而直接的IP數(shù)據(jù)報(bào)是沒(méi)實(shí)用處的(win2000的驅(qū)動(dòng)層能夠直接使用IP報(bào)而不須要加上其它協(xié) 議,可是通常是不會(huì)這樣用的)。因此traceroute程序發(fā)送一個(gè)UDP包來(lái)試探。對(duì)路由器來(lái)說(shuō),UDP數(shù)據(jù)報(bào)僅僅是IP數(shù)據(jù)報(bào)的一種,它并不關(guān)心 UDP數(shù)據(jù)報(bào)的詳細(xì)內(nèi)容。直到這個(gè)包到達(dá)目的端的主機(jī)會(huì),目的主機(jī)的內(nèi)核會(huì)解析UDP數(shù)據(jù)報(bào),并查找數(shù)據(jù)報(bào)中要求port是否已經(jīng)有進(jìn)程在使用。假設(shè)找到,則 通知進(jìn)程有數(shù)據(jù)到達(dá)。而假設(shè)找不到,則發(fā)送一個(gè)"目的port不可達(dá)"的ICMP錯(cuò)誤數(shù)據(jù)回到源主機(jī)。
這樣就能夠全然確定下來(lái)。 trcertroute建立一個(gè)UDP數(shù)據(jù)包,不斷改動(dòng)TTL值并發(fā)送出去,假設(shè)收到"超時(shí)錯(cuò)",表示剛剛到達(dá)的是路由器,而假設(shè)收到的是"port不可達(dá)"錯(cuò)誤,表示剛剛到達(dá)的就是目的主機(jī)。這樣路由跟蹤完畢,程序結(jié)束。
有幾個(gè)細(xì)節(jié) :
1.局域網(wǎng)的路由是相對(duì)穩(wěn)定的,因此用traceroute打印出來(lái)的響應(yīng)時(shí)間相差不大。而假設(shè)用來(lái)跟蹤廣域網(wǎng)的路由,因?yàn)閺V域網(wǎng)的路由信息是動(dòng)態(tài)變化的,并且并不能確定是發(fā)送路徑耗時(shí)還是返回路徑耗時(shí)較多,因此時(shí)間與路由信息僅僅能做為參考。
2.TTL 的選擇。假設(shè)把TTL設(shè)得足夠大,是不是一定能夠打印出全部路由,比方一個(gè)數(shù)據(jù)包經(jīng)過(guò)300個(gè)路由器才到達(dá)目的端。當(dāng)然在現(xiàn)有網(wǎng)絡(luò)環(huán)境下不太可能出現(xiàn)要經(jīng) 過(guò)這么多路由的情況。而TTL信息在IP數(shù)據(jù)報(bào)中僅僅有一個(gè)字節(jié),也就是最多能設(shè)定到255(256以后又又一次從0開(kāi)始)。設(shè)定這個(gè)信息的目的,就是防止一 些僵而不化的數(shù)據(jù)報(bào)在網(wǎng)絡(luò)漫上無(wú)目的的游蕩而不消失。數(shù)據(jù)報(bào)每經(jīng)過(guò)一個(gè)路由器,路由器就把TTL減1(或在該路由器被處理前經(jīng)過(guò)的秒數(shù)),總有一個(gè)時(shí)候會(huì) 被減到1,然后路由器會(huì)把它丟棄。
3.traceroute的是以收到"port不可達(dá)"為標(biāo)志來(lái)結(jié)束的。前提是發(fā)出的UDP數(shù)據(jù)報(bào)中要求 的port在目的主機(jī)上沒(méi)有進(jìn)程在使用。而假設(shè)目的主機(jī)上正好有進(jìn)程在使用這個(gè)port,接收這個(gè)包并按正常方式處理,這樣traceroute就收不到"port不 可達(dá)"的錯(cuò)誤了。為了避免出現(xiàn)這樣的情況,UDP數(shù)據(jù)報(bào)的port非常高(書(shū)中的實(shí)現(xiàn)是初始值33435,以后每發(fā)送一次再加1,port號(hào)最大能夠到65535)。 普通程序一般不會(huì)使用這些高port。問(wèn)題是假如真的存在這樣的情況時(shí),traceroute會(huì)怎么處理?而好像Solaris系統(tǒng)可能會(huì)使用高port,這時(shí)又怎 么樣。
4. 在發(fā)送過(guò)程中,要經(jīng)過(guò)很多的路由,到達(dá)目的主機(jī)前,可能還要經(jīng)過(guò)網(wǎng)關(guān),防火墻,以及其它比如IDS的過(guò)濾,發(fā)送包能不能到達(dá)目的主機(jī)還是個(gè)問(wèn)題。而即使到 達(dá)了,發(fā)送的ICMP信息能不能返回也是個(gè)問(wèn)題。由于沿途經(jīng)過(guò)的關(guān)卡太多,遇上黑洞路由器,不轉(zhuǎn)發(fā)這些信息的話,那就一點(diǎn)辦法也沒(méi)有了。
書(shū)中還提到原來(lái)的traceroute里有一個(gè)選項(xiàng),能夠指定數(shù)據(jù)包經(jīng)過(guò)的路由器。假設(shè)是寬路由,則僅僅要經(jīng)過(guò)指定的路由就可以。而假設(shè)是嚴(yán)路由,則必須按 指定的順序經(jīng)過(guò)指定的路由器。由于這個(gè)選項(xiàng)可能導(dǎo)致某個(gè)固定的路由處理信息太多,在發(fā)布的源代碼里已經(jīng)取消了。可是能夠找到補(bǔ)丁,還是能夠用起來(lái)的。從比較 的結(jié)果看,似乎指定路由器反而不如讓路由器採(cǎi)用默認(rèn)路由處理得快。而對(duì)于嚴(yán)路由來(lái)說(shuō),要成功就要更難一些,由于并不一定你指定的路由器正好有條目到接下來(lái) 的路由器。
?
?
除了回顯請(qǐng)求外,還能夠利用icmp來(lái)實(shí)現(xiàn)時(shí)間請(qǐng)求。在icmp的數(shù)據(jù)包中能夠包括發(fā)送時(shí)間,目的主機(jī)收到后再附上自身當(dāng)時(shí)時(shí)間才發(fā)回。這樣能夠做一個(gè)時(shí)間校驗(yàn),并能夠推斷源與目的之間的通訊速度。因?yàn)樵敿?xì)的內(nèi)容部分比較煩,類型太多,一下子記不住各個(gè)類型的意思。
一般用ping的時(shí)候僅僅是用了它的最簡(jiǎn)單的功能:檢查主機(jī)能不能連到。事實(shí)上使用它所提供的其它選項(xiàng),能夠?qū)崿F(xiàn)很多細(xì)節(jié)上的控制,比如數(shù)據(jù)包長(zhǎng)度,TTL,路由記錄,寬/嚴(yán)路由經(jīng)過(guò)路由等。
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
