從概念上說, IP路由選擇是簡單的,特別對于主機來說。如果目的主機與源主機直接相連(如點對點鏈路)或都在一個共享網絡上(以太網或令牌環網),那么IP數據報就直接送到目的主機上。否則,主機把數據報發往一默認的路由器上,由路由器來轉發該數據報。大多數的主機都是采用這種簡單機制。
在本節和第9章中,我們將討論更一般的情況,即IP層既可以配置成路由器的功能,也可以配置成主機的功能。當今的大多數多用戶系統,包括幾乎所有的Unix系統,都可以配置成一個路由器。我們可以為它指定主機和路由器都可以使用的簡單路由算法。本質上的區別在于主機從不把數據報從一個接口轉發到另一個接口,而路由器則要轉發數據報。內含路由器功能的主機應該從不轉發數據報,除非它被設置成那樣。在9.4小節中,我們將進一步討論配置的有關問題。
在一般的體制中,IP可以從TCP、UDP、ICMP和IGMP接收數據報(即在本地生成的數據報)并進行發送,或者從一個網絡接口接收數據報(待轉發的數據報)并進行發送。IP層在內存中有一個路由表。當收到一份數據報并進行發送時,它都要對該表搜索一次。當數據報來自某個網絡接口時, IP首先檢查目的IP地址是否為本機的IP地址之一或者IP廣播地址。如果確實是這樣,數據報就被送到由IP首部協議字段所指定的協議模塊進行處理。如果數據報的目的不是這些地址,那么(1)如果IP層被設置為路由器的功能,那么就對數據報進行轉發(也就是說,像下面對待發出的數據報一樣處理);否則(2)數據報被丟棄。
路由表中的每一項都包含下面這些信息:
? 目的I P地址。它既可以是一個完整的主機地址,也可以是一個網絡地址,由該表目中的標志字段來指定(如下所述)。主機地址有一個非0的主機號(見圖1-5),以指定某一特定的主機,而網絡地址中的主機號為0,以指定網絡中的所有主機(如以太網,令牌環網)。
? 下一站(或下一跳)路由器(next-hop router)的IP地址,或者有直接連接的網絡IP地址。下一站路由器是指一個在直接相連網絡上的路由器,通過它可以轉發數據報。下一站路由器不是最終的目的,但是它可以把傳送給它的數據報轉發到最終目的。
? 標志。其中一個標志指明目的IP地址是網絡地址還是主機地址,另一個標志指明下一站路由器是否為真正的下一站路由器,還是一個直接相連的接口(我們將在9.2節中詳細介紹這些標志)。
? 為數據報的傳輸指定一個網絡接口。
IP路由選擇是逐跳地(hop-by-hop)進行的。從這個路由表信息可以看出, IP并不知道到達任何目的的完整路徑(當然,除了那些與主機直接相連的目的)。所有的IP路由選擇只為數據報傳輸提供下一站路由器的I P地址。它假定下一站路由器比發送數據報的主機更接近目的,
而且下一站路由器與該主機是直接相連的。
IP路由選擇主要完成以下這些功能:
1) 搜索路由表,尋找能與目的IP地址完全匹配的表目(網絡號和主機號都要匹配)。如果找到,則把報文發送給該表目指定的下一站路由器或直接連接的網絡接口(取決于標志字段的值)。
2) 搜索路由表,尋找能與目的網絡號相匹配的表目。如果找到,則把報文發送給該表目指定的下一站路由器或直接連接的網絡接口(取決于標志字段的值)。目的網絡上的所有主機都可以通過這個表目來處置。例如,一個以太網上的所有主機都是通過這種表目進行尋徑的。這種搜索網絡的匹配方法必須考慮可能的子網掩碼。關于這一點我們在下一節中進行討論。
3) 搜索路由表,尋找標為“默認(default)”的表目。如果找到,則把報文發送給該表目指定的下一站路由器。
如果上面這些步驟都沒有成功,那么該數據報就不能被傳送。如果不能傳送的數據報來自本機,那么一般會向生成數據報的應用程序返回一個“主機不可達”或“網絡不可達”的錯誤。
完整主機地址匹配在網絡號匹配之前執行。只有當它們都失敗后才選擇默認路由。默認路由,以及下一站路由器發送的ICMP間接報文(如果我們為數據報選擇了錯誤的默認路由),是IP路由選擇機制中功能強大的特性。我們在第9章對它們進行討論。為一個網絡指定一個路由器,而不必為每個主機指定一個路由器,這是IP路由選擇機制的另一個基本特性。這樣做可以極大地縮小路由表的規模,比如Internet上的路由器有只有幾千個表目,而不會是超過100萬個表目。
#### **舉例**
首先考慮一個簡單的例子:我們的主機bsdi有一個IP數據報要發送給主機sun。雙方都在同一個以太網上(參見扉頁前圖)。數據報的傳輸過程如圖3-3所示。

當IP從某個上層收到這份數據報后,它搜索路由表,發現目的IP地址(140.252.13.33)在一個直接相連的網絡上(以太網140.252.13.0)。于是,在表中找到匹配網絡地址(在下一節中,我們將看到,由于以太網的子網掩碼的存在,實際的網絡地址是140.252.13.32,但是這并不影響這里所討論的路由選擇)。
數據報被送到以太網驅動程序,然后作為一個以太網數據幀被送到sun主機上(見圖2-1)。IP數據報中的目的地址是sun的IP地址(140.252.13.33),而在鏈路層首部中的目的地址是48bit的sun主機的以太網接口地址。這個48bit的以太網地址是用ARP協議獲得的,我們將在下一章對此進行描述。

當sun收到數據報后,它發現數據報的目的IP地址并不是本機的任一地址,而sun已被設置成具有路由器的功能,因此它把數據報進行轉發。經過搜索路由表,選用了默認表目。根據sun的默認表目,它把數據報轉發到下一站路由器netb,該路由器的地址是140.252.1.183。
數據報是經過點對點SLIP鏈路被傳送的,采用了圖2-2所示的最小封裝格式。這里,我們沒有給出像以太網鏈路層數據幀那樣的首部,因為在SLIP鏈路中沒有那樣的首部。
當netb收到數據報后,它執行與sun主機相同的步驟:數據報的目的地址不是本機地址,而netb也被設置成具有路由器的功能,于是它也對該數據報進行轉發。采用的也是默認路由表目,把數據報送到下一站路由器gateway(140.252.1.4)。位于以太網140.252.1上的主機netb用ARP獲得對應于140.252.1.4的48bit以太網地址。這個以太網地址就是鏈路層數據幀頭上的目的地址。
路由器gateway也執行與前面兩個路由器相同的步驟。它的默認路由表目所指定的下一站路由器IP地址是140.252.104.2(我們將在圖8-4中證實,使用Traceroute程序時,它就是gateway使用的下一站路由器)。
對于這個例子需要指出一些關鍵點:
1) 該例子中的所有主機和路由器都使用了默認路由。事實上,大多數主機和一些路由器可以用默認路由來處理任何目的,除非它在本地局域網上。
2) 數據報中的目的IP地址始終不發生任何變化(在8.5節中,我們將看到,只有使用源路由選項時,目的IP地址才有可能被修改,但這種情況很少出現)。所有的路由選擇決策都是基于這個目的IP地址。
3) 每個鏈路層可能具有不同的數據幀首部,而且鏈路層的目的地址(如果有的話)始終指的是下一站的鏈路層地址。在例子中,兩個以太網封裝了含有下一站以太網地址的鏈路層首部,但是SLIP鏈路沒有這樣做。以太網地址一般通過ARP獲得。
在第9章,我們在描述了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 小結