(參考文獻)TCP/IP詳解,卷1:協(xié)議
“ping”這個名字來源于聲吶定位操作。目的是為了測試另外1臺主機是不是可以到達。該程序發(fā)送1份ICMP回顯要求報文給主機,并等待返回ICMP回顯應(yīng)對。
1般來講,如果不能ping到某臺主機那末就不能Telnet或FTP到那臺主機。反過來,如果不能Telnet到某臺主機,那末通常可以用ping程序來肯定問題出在哪里。Ping程序還能測出到這臺主機的來回時間,以表明該主機離我們有“多遠”。
Ping程序
我們稱發(fā)送回顯要求的ping為客戶,而被ping的主機稱為服務(wù)器。大多數(shù)的TCP/IP實現(xiàn)都在內(nèi)核中直接支持ping服務(wù)器。
Ping程序發(fā)送的ICMP回顯要求和回顯應(yīng)對報文以下圖:
Unix在實現(xiàn)Ping程序時,是把ICMP中的標識字段設(shè)置成發(fā)送進程的ID號。這樣即便在同1臺主機上同時運行了多個ping程序,ping程序也能夠辨認出對應(yīng)的來回信息。
序列號從0開始,每發(fā)送1次新的回顯要求就加1。Ping程序打印出返回的每一個分組的序列號,允許我們查看是不是有分組丟失、失序或重復(fù)。IP是1種盡力而為的數(shù)據(jù)報傳輸服務(wù),因此這3個條件都有可能產(chǎn)生。
在局域網(wǎng)運行ping程序1般輸出以下格式:
64 bytes from 192.168.8.1: icmp_req=1 ttl=64 time=1.04 ms 64 bytes from 192.168.8.1: icmp_req=2 ttl=64 time=1.05 ms 64 bytes from 192.168.8.1: icmp_req=3 ttl=64 time=1.06 ms 64 bytes from 192.168.8.1: icmp_req=4 ttl=64 time=1.41 ms 64 bytes from 192.168.8.1: icmp_req=5 ttl=64 time=1.41 ms 64 bytes from 192.168.8.1: icmp_req=6 ttl=64 time=1.20 ms 64 bytes from 192.168.8.1: icmp_req=7 ttl=64 time=1.42 ms 64 bytes from 192.168.8.1: icmp_req=8 ttl=64 time=0.649 ms
當返回ICMP回顯應(yīng)對時,要打印出序列號和TTl,并計算來回時間。Ping程序通過在ICMP報文中寄存發(fā)送要求的時間值來計算來回時間。當應(yīng)對返回時,用當前時間減去寄存在ICMP報文中的時間值,及是來回時間。
IP記錄路由選項
這個進程聽起來很簡單,但存在1些缺點。源端主機生成RR選項,中間路由器對RR選項的處理,和把ICMP回顯要求中的RR清單復(fù)制到ICMP應(yīng)對中,所有這些都是選項功能。榮幸的是,現(xiàn)在大多數(shù)路由器都支持這些選項功能,只有1些系統(tǒng)不把ICMP要求中的IP清單復(fù)制到ICMP應(yīng)對中。
但是,最大的問題是IP首部中只有有限的空間來寄存IP地址。在以上圖中,我們可以看到,IP首部長度字段只有4bit,因此全部IP首部最長只能包括15個32bit長的字(及60個字節(jié))。由于ip首部固定長度為20字節(jié),RR宣明星用去3個字節(jié),這樣只剩下37個字節(jié)來寄存IP地址清單(60⑵0⑶),也就是說只能寄存9個IP地址。
IP數(shù)據(jù)報中的RR選項格式以下:
Traceroute原理Code是1個字節(jié),指明IP選項的類型。對應(yīng)RR選項來講,他的值為7.len是RR選項總字節(jié)長度,在這類情況下為39.(雖然可以為RR選項在、設(shè)置比最大長度小的長度,但是Ping程序總是提供39字節(jié)的選項字段,最多可以記錄9個IP地址,由于IP首部留給選項的空間有限,他1般情況下都設(shè)置成最大長度)
Ptr稱作指針字段。他是1個基于1的指針,他指向寄存下1個IP地址的位置,他的最小值為4,指向寄存第1個IP地址的位置,隨著每一個IP地址存入清單,prt的值分別為8、12最大到36.當記錄下9個IP地址以后,ptr的值為40,表示清單已滿。
Traceroute程序
Traceroute程序可讓我們看到IP數(shù)據(jù)報從以太主機傳到另外1臺主機所經(jīng)過的路由。
Traceroute程序的操作
既然有IP記錄路由選項(RR),為何不使用這個路由選項,而要另外開發(fā)1個新的利用程序呢?主要有3個方面的緣由,首先,之前其實不是所有的路由器都支持記錄路由選項,因此該選項在某些路徑上不能使用。
其次,記錄路由1般是單項的選項。發(fā)送端設(shè)置了該選項,那末接收端不能不從收到的IP首部中提取出所有的信息,然后全部返回給發(fā)送端。大多數(shù)Ping服務(wù)器的實現(xiàn)把接收到的RR清單返回但是這樣使得記錄下來的IP地址翻了1番。
最后1個緣由也是最主要的緣由,IP首部中留給選項的空間有限,不能寄存當前大多數(shù)的路徑。
Traceroute程序原理
Traceroute程序使用ICMP報文和和IP首部中的TTL字段(生存周期)。
每一個處理數(shù)據(jù)報的路由器都要把TTL的值減去1或減去數(shù)據(jù)報在路由器中停留的秒數(shù)。由于大多數(shù)的路由器轉(zhuǎn)發(fā)數(shù)據(jù)報的延時都小于1秒鐘,因此TTL終究成為1個跳站的計數(shù)器,所經(jīng)過的每一個路由器都將其值減1.
TTL字段的目的是避免數(shù)據(jù)報在選路時無停止的在網(wǎng)絡(luò)中活動。例如,當路由器癱瘓或兩個路由器之間的連接丟失時,選路協(xié)議有時回去檢查丟失的路由器并1直進行下去。TTL字段就是在這些尋暖傳遞的數(shù)據(jù)報上加上1個生存上限。
當路由器收到1份IP數(shù)據(jù)報,如果TTL字段是0或1,則路由器不轉(zhuǎn)發(fā)該數(shù)據(jù)報(接收到這類數(shù)據(jù)報的目的主機可以將它交給利用程序,這是由于不需要轉(zhuǎn)發(fā)該數(shù)據(jù)報。但是,在通常情況下系統(tǒng)不應(yīng)當接收TTL字段為0的數(shù)據(jù)報)。通常情況下是,路由器將該數(shù)據(jù)報拋棄,并給信源主機發(fā)送1份ICMP超時信息。Tracerouter程序的關(guān)鍵在于,這份ICMP超時信息包括了該路由器的地址。
那末,Tracerouter就通過發(fā)送1份TTL字段為1的IP數(shù)據(jù)報給目的主機。處理這份數(shù)據(jù)報的第1個路由器將TTL值減去1,拋棄該數(shù)據(jù)報,并回發(fā)1份超時ICMP報文。這樣就得到了該路徑中的第1個路由器的IP地址。然后Tracerouter發(fā)送1份TTL為2的數(shù)據(jù)報,這樣就得到了第2個路由器的IP地址。那末,繼續(xù)這個進程,直到到達目的主機。即便目的主機接收到1份TTL值為1的數(shù)據(jù)報也不會拋棄該數(shù)據(jù)報并產(chǎn)生1份ICMP報文,由于已到達終究目的地。這個時候,Tracerouter程序發(fā)送1份UDP數(shù)據(jù)報給目的主機,但選擇1個不可能的值作為目的端口號(大于30000),使得目的主機的任何1個程序都不可能使用該端口。由于,當該數(shù)據(jù)報到達時,將使目的主機的UDP模塊產(chǎn)生1份“端口不可達”毛病的ICMP報文,這樣Tracerouter程序要做的就是辨別搜到的ICMP報文是是超時還是端口不可達,以判斷甚么時候結(jié)束。
下一篇 MBA寫作串講筆記 1