通常IP路由是動態的,即每個路由器都要判斷數據報下面該轉發到哪個路由器。應用程序對此不進行控制,而且通常也并不關心路由。它采用類似Traceroute程序的工具來發現實際的路由。
源站選路(source routing)的思想是由發送者指定路由。它可以采用以下兩種形式:
? 嚴格的源路由選擇。發送端指明IP數據報所必須采用的確切路由。如果一個路由器發現源路由所指定的下一個路由器不在其直接連接的網絡上,那么它就返回一個“源站路由失敗”的ICMP差錯報文。
? 寬松的源站選路。發送端指明了一個數據報經過的IP地址清單,但是數據報在清單上指明的任意兩個地址之間可以通過其他路由器。
Traceroute程序提供了一個查看源站選路的方法,我們可以在選項中指明源站路由,然后檢查其運行情況。
一些公開的Traceroute程序源代碼包中包含指明寬松的源站選路的補丁。但是在標準版中通常并不包含此項。這些補丁的解釋是“ Van Jacobson的原始Traceroute程序(1988年春)支持該特性,但后來因為有人提出會使網關崩潰而將此功能去除。”對于本章中所給出的例子,作者將這些補丁安裝上去,并將它們設置成允許寬松的源站選路和嚴格的源站選路。
圖8-6給出了源站路由選項的格式。

這個格式與我們在圖7-3中所示的記錄路由選項格式基本一致。不同之處是,對于源站選路,我們必須在發送IP數據報前填充IP地址清單;而對于記錄路由選項,我們需要為IP地址清單分配并清空一些空間,并讓路由器填充該清單中的各項。同時,對于源站選路,只要為所需要的IP地址數分配空間并進行初始化,通常其數量小于9。而對于記錄路由選項來說,必須盡可能地分配空間,以達到9個地址。
對于寬松的源站選路來說,code字段的值是0x83;而對于嚴格的源站選路,其值為0x89。
len和ptr字段與7.3節中所描述的一樣。
源站路由選項的實際稱呼為“源站及記錄路由”(對于寬松的源站選路和嚴格的源站選路,分別用LSRR和SSRR表示),這是因為在數據報沿路由發送過程中,對IP地址清單進行了更新。
下面是其運行過程:
? 發送主機從應用程序接收源站路由清單,將第1個表項去掉(它是數據報的最終目的地址),將剩余的項移到1個項中(如圖8-6所示),并將原來的目的地址作為清單的最后一項。指針仍然指向清單的第1項(即,指針的值為4)。
? 每個處理數據報的路由器檢查其是否為數據報的最終地址。如果不是,則正常轉發數據報(在這種情況下,必須指明寬松源站選路,否則就不能接收到該數據報)。
? 如果該路由器是最終目的,且指針不大于路徑的長度,那么(1)由p t r所指定的清單中的下一個地址就是數據報的最終目的地址;(2)由外出接口(outgoing interface)相對應的IP地址取代剛才使用的源地址;(3)指針加4。
可以用下面這個例子很好地解釋上述過程。在圖8-7中,我們假設主機S上的發送應用程序發送一份數據報給D,指定源路由為R1,R2和R3。

在上圖中,#表示指針字段,其值分別是4、8、12和16。長度字段恒為1 5(三個IP地址加上三個字節首部)。可以看出,每一跳IP數據報中的目的地址都發生改變。
當一個應用程序接收到由信源指定路由的數據時,在發送應答時,應該讀出接收到的路由值,并提供反向路由。Host Requirements RFC指明,TCP客戶必須能指明源站選路,同時, TCP服務器必須能夠接收源站選路,并且對于該TCP連接的所有報文段都能采用反向路由。如果TCP服務器下面接收到一個不同的源站選路,那么新的源站路由將取代舊的源站路由。
- 第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 小結