《TCP/IP詳解 卷一:協議》讀書筆記--IP選路
9.1、引言
9.2、選路的原理
9.2.1、簡單路由器
svr4 % netstat -rn
Routing tables
Destination Gateway Flags Refcnt Use Interface
140.252.13.65 140.252.13.35 UGH 0 0 emd0
127.0.0.1 127.0.0.1 UH 1 0 lo0
default 140.252.13.33 UG 0 0 emd0
140.252.13.32 140.252.13.34 U 4 25043 emd0
對於一個給定的路由器,可以打印出五種不同的標誌(flag):
U 該路由開始使用
G 該路由是到一個閘道器(路由器)。如果沒有設定該標誌,說明目的地址是直接相連的。
H 該路由是到一個主機,也就是說,目的地址是一個完整的主機地址。如果沒有設定該標誌,說明該路由是到一個網路,而目的地址是一個網路地址:一個網路號,或者網路地址與子網號的組合。
D 該路由是由重定向報文建立的。
M 該路由已被重定向報文修改。
參考記數Refcnt列給出的是正在使用路由的活動程序個數。
Use顯示的是通過該路由傳送的分組數。
Interface是本地介面的名字。
第1行說明,如果目的地是140.252.13.65,那麼閘道器(路由器)將把分組轉發給140.252.13.35。
輸出的第2行是環回介面,它的名字始終為lo0。沒有設定G標誌,因為該路由不是一個閘道器。H標誌說明目的地址(127.0.0.1)是一個主機地址,而不是一個網路地址。由於沒有設定G標誌,說明這是一個位元組路由,閘道器列出的是外出介面的IP地址。
輸出的第3行是預設路由。每個主機都有一個或多個預設路由。這一項表明,如果在表中沒有找到特定的路由,就把分組傳送到路由器140.252.13.33。
輸出中的最後一行是所在的乙太網。H標誌沒有設定,說明目的地址(140.252.13.32)是一個網路地址,其主機地址部分設為0。
對於一個到直接相連的網路的網路路由項,路由表的掩碼預設使用介面的子網掩碼。
1)假定目的地址是主機sun,140.252.13.33。首先進行主機地址的匹配。路由器中的兩個主機地址表項(slip和localhost)均不匹配,接著進行網路地址匹配。這一次匹配成功,找到表項140.252.13.32(網路號和子網號都相同),因此使用emd0介面。這是一個直接路由,因此鏈路層地址將是目的端的地址。
2)假定目的地址是主機slip,140.252.13.65。首先在路由表搜尋主機地址,並找到一個匹配地址。這是一個間接路由,因此目的端的IP地址仍然是140.252.13.65,但是鏈路層地址必須是閘道器140.252.13.65的鏈路層地址,其介面名為emd0。
3)這一次我們通過Internet給主機aw.com(192.207.117.2)傳送一份資料報。首先在路由表中搜索主機地址,失敗後進行網路地址匹配。最後成功地找到預設路由表項。該路由是一個間接路由,通過閘道器140.252.13.33,並使用介面名為emd0.
4)我們給本機發送一份資料報。有四種方法可以完成這件事,如用主機名,主機IP地址,環回名,或者環回地址
ftp svr4
ftp 140.252.13.34
ftp localhost
ftp 127.0.0.1
在前兩種情況下,對路由表的第2次搜尋得到一個匹配的網路地址140.252.13.32,並把IP報文傳送給乙太網驅動程式。IP報文中目的地址為本機IP地址,因此報文被送給環回驅動程式,然後由驅動程式把報文放入IP輸出佇列中。
在後兩種情況下,由於制定了環回介面的名字或IP地址,第一次搜尋就找到匹配的主機地址,因此報文直接被送給環回驅動程式,然後由驅動程式把報文放入IP輸出佇列。
9.2.2、初始化路由表
沒當初始化一個介面時(通常是用ifconfig命令設定介面地址),就為介面自動建立一個直接路由。對於點對點鏈路和環回介面來說,路由是達到主機。對於廣播介面來說,如乙太網,路由是達到網路。
到達不直接相連的主機或網路的路由必須以某種方式新增到路由表中。一個常用的方法是在系統引導時顯式地在初始化檔案中執行route命令。
9.2.4、沒有到達目的地的路由
如果資料報是由本地主機產生的,那麼就給傳送該資料的應用程式返回一個差錯,或者是“主機不可達差錯”或者是“網路不可達差錯”。
如果是被轉發的資料報,那麼就給原始傳送端傳送一份ICMP主機不可達的差錯報文。
9.5、ICMP重定向差錯
當IP資料報應該被髮送到另一個路由器時,收到資料報的路由器就要傳送ICMP重定向差錯報文給IP資料報的傳送端。
1)我們假定主機發送一份IP資料報給R1。這種選路決策經常發生,因為R1是該主機的預設路由。
2)R1收到資料報標籤檢查它的路由表,發現R2是傳送該資料報的下一站。當它吧資料報傳送給R2時,R1檢測到它正在傳送的介面與資料報到達介面是相同的(即主機和兩個路由器所在的LAN)。這樣就給路由器傳送重定向報文給原始傳送端提供了線索。
3)R1傳送一份ICMP重定向報文給主機,告訴它以後把資料報傳送給R2而不是R1。
9.5.2、更多細節
ICMP重定向報文的接受者必須檢視三個IP地址:
(1)導致重定向的IP地址(在作為ICMP重定向報文資料部分返回的IP首部中);
(2)傳送重定向報文的路由器的IP地址(包含重定向資訊的IP資料報中的源地址)
(3)應該採用的路由器IP地址(在ICMP報文中的4~7位元組)
其他規則:
首先,重定向報文只能由路由器生成,而不能由主機生成。
另外,重定向報文時為主機而不是為路由器使用的。假定路由器和其他一些路由器共同參與某一種選路協議,則該協議就能取消重定向的需求。
9.6、ICMP路由器發現報文
一般認為,主機在引導以後要廣播或多播發送一份路由器請求報文。一臺或更多臺路由器響應一份路由器通告報文。另外,路由器定期地廣播或多播傳送它們的路由器通知報文,允許每個正在監聽的主機相應地更新它們的路由表。
RFC確定了這兩種ICMP報文的格式。
路由器在一份報文中可以通知多個地址。地址數指的是報文中所含的地址數。地址項大小指的是每個路由器地址32bit字的數目,始終為2.生存期是指通告地址的有效時間。
接下來是一對或多對IP地址和優先順序。優先順序是一個有符號的32bit整數,指出該IP地址作為預設路由器地址的優先等級,這是與子網上的其他路由器想比較而言的。值越大說明優先順序越高。優先順序為0x80000000說明對應的地址不能作為預設路由器地址使用,儘管它也包含在通告報文中。優先順序預設值一般為0。
9.6.1、路由器操作
當路由器啟動時,它定期在所有廣播或多播傳送介面上傳送通告報文。這些報文不是定期傳送的,而是隨機傳送的,以減少與子網上其他路由器發生衝突的概率。一份給定的通告報文預設生命週期是30分鐘。
使用生命週期的另一個時機是當路由器上的某個介面被關閉時。在這種情況下,路由器可以在該介面上傳送最後一份通告報文,並將生命週期值設為0。
9.6.2、主機操作
主機在引導期間一般傳送三份路由器請求報文,每三秒鐘傳送一次。一旦接收到一個有效的通告報文,就停止傳送請求報文。
主機也監聽來自相鄰路由器的請求報文。這些通告報文可以改變主機的預設路由器。另外,如果沒有接收到來自當前預設路由器的通告報文,那麼預設路由器會超時。
只要有一般的預設路由器,該路由器就會每個10分鐘傳送通告報文,報文的生命週期是30分鐘。這說明主機的預設表項是不會超時的,即使錯過了一份或兩份通告報文。