ping程序為我們提供了查看IP記錄路由(RR)選項的機會。大多數不同版本的ping程序都提供-R選項,以提供記錄路由的功能。它使得ping程序在發送出去的I P數據報中設置IPRR選項(該IP數據報包含ICMP回顯請求報文)。這樣,每個處理該數據報的路由器都把它的IP地址放入選項字段中。當數據報到達目的端時,IP地址清單應該復制到ICMP回顯應答中,這樣返回途中所經過的路由器地址也被加入清單中。當ping程序收到回顯應答時,它就打印出這份IP地址清單。
這個過程聽起來簡單,但存在一些缺陷。源端主機生成RR選項,中間路由器對RR選項的處理,以及把ICMP回顯請求中的RR清單復制到ICMP回顯應答中,所有這些都是選項功能。
幸運的是,現在的大多數系統都支持這些選項功能,只是有一些系統不把ICMP請求中的IP清單復制到ICMP應答中。
但是,最大的問題是IP首部中只有有限的空間來存放IP地址。我們從圖3-1可以看到,IP首部中的首部長度字段只有4 bit,因此整個IP首部最長只能包括1 5個32 bit長的字(即60個字節)。由于IP首部固定長度為20字節,RR選項用去3個字節(下面我們再討論),這樣只剩下37個字節(60-20-3)來存放I P地址清單,也就是說只能存放9個IP地址。對于早期的ARPANET來說,9個IP地址似乎是很多了,但是現在看來是非常有限的(在第8章中,我們將用Traceroute工具來確定數據報的路由)。除了這些缺點,記錄路由選項工作得很好,為詳細查看如何處理I P選項提供了一個機會。
IP數據報中的R R選項的一般格式如圖7-3所示。

code是一個字節,指明IP選項的類型。對于RR選項來說,它的值為7。len是RR選項總字節長度,在這種情況下為39(盡管可以為RR選項設置比最大長度小的長度,但是ping程序總是提供39字節的選項字段,最多可以記錄9個IP地址。由于IP首部中留給選項的空間有限,它一般情況都設置成最大長度)。
ptr稱作指針字段。它是一個基于1的指針,指向存放下一個IP地址的位置。它的最小值為4,指向存放第一個IP地址的位置。隨著每個IP地址存入清單, ptr的值分別為8,12,16,最大到36。當記錄下9個IP地址后,ptr的值為40,表示清單已滿。
當路由器(根據定義應該是多穴的)在清單中記錄IP地址時,它應該記錄哪個地址呢?
是入口地址還是出口地址?為此, RFC 791 [Postel 1981a]指定路由器記錄出口I P地址。我們在后面將看到,當原始主機(運行ping程序的主機)收到帶有R R選項的ICMP回顯應答時,它也要把它的入口IP地址放入清單中。
- 第1章 概述
- 1.1 引言
- 1.2 分層
- 1.3 TCP/IP的分層
- 1.4 互聯網的地址
- 1.5 域名系統
- 1.6 封裝
- 1.7 分用
- 1.8 客戶-服務器模型
- 1.9 端口號
- 1.10 標準化過程
- 1.11 RFC
- 1.12 標準的簡單服務
- 1.13 互聯網
- 1.14 實現
- 1.15 應用編程接口
- 1.16 測試網絡
- 1.17 小結
- 第2章 鏈路層
- 2.1 引言
- 2.2 以太網和IEEE 802封裝
- 2.3 尾部封裝
- 2.4 SLIP:串行線路IP
- 2.5 壓縮的SLIP
- 2.6 PPP:點對點協議
- 2.7 環回接口
- 2.8 最大傳輸單元MTU
- 2.9 路徑MTU
- 2.10 串行線路吞吐量計算
- 2.11 小結
- 第3章 IP:網際協議
- 3.1 引言
- 3.2 IP首部
- 3.3 IP路由選擇
- 3.4 子網尋址
- 3.5 子網掩碼
- 3.6 特殊情況的IP地址
- 3.7 一個子網的例子
- 3.8 ifconfig命令
- 3.9 netstat命令
- 3.10 IP的未來
- 3.11 小結
- 第4章 ARP:地址解析協議
- 4.1 引言
- 4.2 一個例子
- 4.3 ARP高速緩存
- 4.4 ARP的分組格式
- 4.5 ARP舉例
- 4.5.1 一般的例子
- 4.5.2 對不存在主機的ARP請求
- 4.5.3 ARP高速緩存超時設置
- 4.6 ARP代理
- 4.7 免費ARP
- 4.8 arp命令
- 4.9 小結
- 第5章 RARP:逆地址解析協議
- 5.1 引言
- 5.2 RARP的分組格式
- 5.3 RARP舉例
- 5.4 RARP服務器的設計
- 5.4.1 作為用戶進程的RARP服務器
- 5.4.2 每個網絡有多個RARP服務器
- 5.5 小結
- 第6章 ICMP:Internet控制報文協議
- 6.1 引言
- 6.2 ICMP報文的類型
- 6.3 ICMP地址掩碼請求與應答
- 6.4 ICMP時間戳請求與應答
- 6.4.1 舉例
- 6.4.2 另一種方法
- 6.5 ICMP端口不可達差錯
- 6.6 ICMP報文的4.4BSD處理
- 6.7 小結
- 第7章 Ping程序
- 7.1 引言
- 7.2 Ping程序
- 7.2.1 LAN輸出
- 7.2.2 WAN輸出
- 7.2.3 線路SLIP鏈接
- 7.2.4 撥號SLIP鏈路
- 7.3 IP記錄路由選項
- 7.3.1 通常的例子
- 7.3.2 異常的輸出
- 7.4 IP時間戳選項
- 7.5 小結
- 第8章 Traceroute程序
- 8.1 引言
- 8.2 Traceroute程序的操作
- 8.3 局域網輸出
- 8.4 廣域網輸出
- 8.5 IP源站選路選項
- 8.5.1 寬松的源站選路的traceroute程序示例
- 8.5.2 嚴格的源站選路的traceroute程序示例
- 8.5.3 寬松的源站選路traceroute程序的往返路由
- 8.6 小結
- 第9章 IP選路
- 9.1 引言
- 9.2 選路的原理
- 9.2.1 簡單路由表
- 9.2.2 初始化路由表
- 9.2.3 較復雜的路由表
- 9.2.4 沒有到達目的地的路由
- 9.3 ICMP主機與網絡不可達差錯
- 9.4 轉發或不轉發
- 9.5 ICMP重定向差錯
- 9.5.1 一個例子
- 9.5.2 更多的細節
- 9.6 ICMP路由器發現報文
- 9.6.1 路由器操作
- 9.6.2 主機操作
- 9.6.3 實現
- 9.7 小結