速讀原著-TCP/IP(ICMP重定向差錯)

第9章 IP選路

9.5 ICMP重定向差錯

當I P數據報應該被發送到另一個路由器時,收到數據報的路由器就要發送 I C M P重定向差錯報文給I P數據報的發送端。這在概念上是很簡單的,正如圖 9 – 3所示的那樣。只有當主機可以選擇路由器發送分組的情況下,我們才可能看到 I C M P重定向報文(回憶我們在圖 7 – 6中看過的例子)。

  1. 我們假定主機發送一份 I P數據報給R 1。這種選路決策經常發生,因為 R 1是該主機的默認路由。
  2. R1收到數據報並且檢查它的路由表,發現 R 2是發送該數據報的下一站。當它把數據報發送給R 2時,R 1檢測到它正在發送的接口與數據報到達接口是相同的(即主機和兩個路由器所在的L A N)。這樣就給路由器發送重定向報文給原始發送端提供了線索。
  3. R1發送一份I C M P重定向報文給主機,告訴它以後把數據報發送給 R 2而不是R 1。

重定向一般用來讓具有很少選路信息的主機逐漸建立更完善的路由表。主機啟動時路由表中可以只有一個默認表項(在圖 9 – 3所示的例子中,為 R 1或R 2)。一旦默認路由發生差錯,默認路由器將通知它進行重定向,並允許主機對路由表作相應的改動。 I C M P重定向允許T C P / I P主機在進行選路時不需要具備智能特性,而把所有的智能特性放在路由器端。顯然,在我們的例子中,R 1和R2 必須知道有關相連網絡的更多拓撲結構的信息,但是連在 L A N上的所有主機在啟動時只需一個默認路由,通過接收重定向報文來逐步學習。

9.5.1 一個例子

可以在我們的網絡上觀察到 I C M P重定向的操作過程(見封二的圖)。儘管在拓撲圖中只畫出了三台主機(a i x , s o l a r i s和g e m i n i)和兩台路由器(g a t e w a y和n e t b),但是整個網絡有超過1 5 0台主機和1 0台另外的路由器。大多數的主機都把 g a t e w a y指定為默認路由器,因為它提供了I n t e r n e t的入口。

子網1 4 0 . 2 5 2 . 1上的主機是如何訪問作者所在子網(圖中底下的四台主機)的呢?首先,如果在S L I P鏈路的一端只有一台主機,那麼就要使用代理 A R P(4 . 6節)。這意味着位於拓撲圖頂部的子網(1 4 0 . 2 5 2 . 1)中的主機不需要其他特殊條件就可以訪問主機 s u n(1 4 0 . 2 5 2 . 1 . 2 9)。

位於n e t b上的代理A R P軟件處理這些事情。 但是,當網絡位於 S L I P鏈路的另一端時,就要涉及到選路了。一個辦法是讓所有的主機和路由器都知道路由器 n e t b是網絡1 4 0 . 2 5 2 . 1 3的網關。這可以在每個主機的路由表中設置靜態路由,或者在每個主機上運行守護程序來實現。另一個更簡單的辦法(也是實際採用的方法)是利用I C M P重定向報文來實現。

在位於網絡頂部的主機 s o l a r i s上運行p i n g程序到主機b s d i( 1 4 0 . 2 5 2 . 1 3 . 3 5 )。由於子網號不相同,代理 A R P不能使用。假定沒有安裝靜態路由,發送的第一個分組將採用到路由器g a t e w a y的默認路由。下面是我們運行 p i n g程序之前的路由表:

(2 2 4 . 0 . 0 . 0所在的表項是I P廣播地址。我們將在第 1 2章討論)。如果為p i n g程序指定-v選項,可以看到主機接收到的任何 I C M P報文。我們需要指定該選項以觀察發送的重定向報文。

在收到p i n g程序的第一個響應之前,主機先收到一份來自默認路由器 g a t e w a y發來的I C M P重定向報文。如果這時查看路由表,就會發現已經插入了一個到主機 b s d i的新路由(該表項如以下黑體字所示)。

這是我們第一次看到D標誌,表示該路由是被I C M P重定向報文創建的。G標誌說明這是一份到達g a t e w a y (n e t b)的間接路由,H標誌則說明這是一個主機路由(正如我們期望的那樣),而不是一個網絡路由。

由於這是一個被主機重定向報文增加的主機路由,因此它只處理到達主機 b s d i的報文。如果我們接着訪問主機 s v r 4,那麼就要產生另一個 I C M P重定向報文,創建另一個主機路由。類似地,訪問主機 s l i p也創建另一個主機路由。位於子網上的三台主機( b s d i , s v r 4和s l i p)還可以由一個指向路由器 s u n的網絡路由來進行處理。但是 I C M P重定向報文創建的是主機路由,而不是網絡路由,這是因為在本例中,產生 I C M P重定向報文的路由器並不知道位於1 4 0 . 2 5 2 . 1 3網絡上的子網信息。

9.5.2 更多的細節

I C M P重定向報文的格式如圖9 – 4所示。

有四種不同類型的重定向報文,有不同的代碼值,如圖 9 – 5所示。I C M P重定向報文的接收者必須查看三個 I P地址: ( 1 ) 導致重定向的 I P地址(即I C M P重定向報文的數據位於I P數據報的首部); ( 2 )發送重定向報文的路由器的I P地址(包含重定向信息的 I P數據報中的源地址; ( 3 )應該採用的路由器I P地址(在I C M P報文中的4 ~ 7位元組)。

關於I C M P重定向報文有很多規則。首先,重定向報文只能由路由器生成,而不能由主機生成。另外,重定向報文是為主機而不是為路由器使用的。假定路由器和其他一些路由器共同參與某一種選路協議,則該協議就能消除重定向的需要(這意味着在圖 9 – 1中的路由表應該消除或者能被選路守護程序修改,或者能被重定向報文修改,但不能同時被二者修改)。 在4 . 4 B S D系統中,當主機作為路由器使用時,要進行下列檢查。在生成 I C M P重定向報文之前這些條件都要滿足。

  1. 出接口必須等於入接口。
  2. 用於向外傳送數據報的路由不能被 I C M P重定向報文創建或修改過,而且不能是路由器 的默認路由。
  3. 數據報不能用源站選路來轉發。
  4. 內核必須配置成可以發送重定向報文。

內核變量取名為i p _ s e n d r e d i r e c t s或其他類似的名字(參見附錄E)。大多數當前的系統(例如B S D、 SunOS 4.1.x、Solaris 2.x 及AIX 3.2.2)在默認條件下都設置該變量,使系統可以發送重定向報文。其他系統如SVR4則關閉了該項功能。

另外,一台4 . 4 B S D主機收到I C M P重定向報文後,在修改路由表之前要作一些檢查。這是為了防止路由器或主機的誤操作,以及惡意用戶的破壞,導致錯誤地修改系統路由表。

  1. 新的路由器必須直接與網絡相連接。
  2. 重定向報文必須來自當前到目的地所選擇的路由器。
  3. 重定向報文不能讓主機本身作為路由器。
  4. 被修改的路由必須是一個間接路由。

關於重定向最後要指出的是,路由器應該發送的只是對主機的重定向(代碼 1或3,如圖9 – 5所示),而不是對網絡的重定向。子網的存在使得難於準確指明何時應發送對網絡的重定向而不是對主機的重定向。只當路由器發送了錯誤的類型時,一些主機才把收到的對網絡的重定向當作對主機的重定向來處理。