1. 程式人生 > >《TCP/IP協議詳解 卷1》--- Ping程式

《TCP/IP協議詳解 卷1》--- Ping程式

Ping程式由Mike Muuss編寫,目的是為了測試另一臺主機是否可達。該程式傳送一份ICMP回顯請求報文給主機,並等待返回ICMP回顯應答。不用經過傳輸層(TCP/UDP)。
一般來說,如果不能Ping到某臺主機,那麼就不能Telnet或者FTP到那臺主機。反過來,如果不能Telnet到某臺主機,那麼通常可以用Ping程式來確定問題出在哪裡。Ping程式還能測出到這臺主機的往返時間,以表明該主機離我們有“多遠”。

Ping程式
傳送回顯請求的ping程式為客戶,而稱被ping的主機為伺服器。大多數的TCP/IP實現都在核心中直接支援Ping伺服器 — 這種伺服器不是一個使用者程序。
這裡寫圖片描述
Unix系統在實現ping程式時是把ICMP報文中的識別符號欄位置成傳送程序的ID號。這樣即使在同一臺主機上同時運行了多個ping程式例項,ping程式也可以識別出返回的資訊。
序列號從0開始,每傳送一次新的回顯請求就加1。ping程式打印出返回的每個分組的序列號,允許我們檢視是否有分組丟失、失序或重複。

WAN輸出
這裡寫圖片描述
當返回ICMP回顯應答時,要打印出序列號和TTL,並計算往返時間( TTL位於IP首部中的生存時間欄位)。

tcpdump輸出
這裡寫圖片描述

IP記錄路由選項
ping程式提供了檢視IP記錄路由(RR)選項的機會。通過-R選項設定,這樣,每個處理該資料報的路由器都把它的
IP地址放入選項欄位中。當資料報到達目的端時, IP地址清單應該複製到 ICMP回顯應答中,這樣返回途中所經過的路由器地址也被加入清單中。當ping程式收到回顯應答時,它就打印出這份IP地址清單。
但IP首部中只有有限的空間來存放IP地址。IP首部中的首部長度欄位只有 4 bit,因此整個IP首部最長只能包括15個32 bit長的字(即60個位元組)。由於IP首部固定長度為 20位元組,RR選項用去3個位元組,這樣只剩下37個位元組( 6 0- 2 0- 3)來存放IP地址清單,也就是說只能存放 9個IP地址。
這裡寫圖片描述


code是一個位元組,指明IP選項的型別。對於RR選項來說,它的值為7。

len是RR選項總位元組長度,在這種情況下為39(儘管可以為RR選項設定比最大長度小的長度,但是ping程式總是提供39位元組的選項欄位,最多可以記錄9個IP地址。由於IP首部中留給選項的空間有限,它一般情況都設定成最大長度)。

ptr稱作指標欄位,指向存放下一個IP地址的位置。最小值為4,指向存放第一個IP地址的位置。隨著每個IP地址存入清單,ptr的值分別為8,12,16,最大到36。當記錄下9個IP地址後,ptr的值為4 0,表示清單已滿。

RFC 791 [Postel 1981a]指定路由器記錄出口IP地址。

在終端1輸入ping -R www.bupt.edu.cn
但沒有看到迴應,不知什麼原因。

在終端2用tcpdump -v 檢視分組交換,也只看到了傳送端的RR。
這裡寫圖片描述

IP時間戳選項
IP時間戳選項與記錄路由選項類似。
這裡寫圖片描述
時間戳選項的程式碼為0x44。
len和ptr與記錄路由選項相同。
接下來的兩個欄位是4 bit的值:OF表示溢位欄位,FL表示標誌欄位。時間戳選項的操作根據標誌欄位來進行。
這裡寫圖片描述
如果路由器由於沒有空間而不能增加時間戳選項,那麼它將增加溢位欄位的值。
時間戳的取值一般為自UTC午夜開始計的毫秒數,與 ICMP時間戳請求和應答相類似。
時間戳在實際使用時有所限制。