首先來看一看一些典型的主機路由表。在主機svr4上,我們先執行帶-r選項的netstat命令列出路由表,然后以-n選項再次執行該命令,以數字格式打印出IP地址(我們這樣做是因為路由表中的一些表項是網絡地址,而不是主機地址。如果沒有-n選項,netstat命令將搜索文件 /etc/networks 并列出其中的網絡名。這樣會與另一種形式的名字—網絡名加主機名相混淆)。

第1行說明,如果目的地是140.252.13.65(slip主機),那么網關(路由器)將把分組轉發給140.252.13.35(bsdi)。這正是我們所期望的,因為主機slip通過SLIP鏈路與bsdi相連接,而bsdi與該主機在同一個以太網上。
對于一個給定的路由器,可以打印出五種不同的標志(flag):
U 該路由可以使用。
G 該路由是到一個網關(路由器)。如果沒有設置該標志,說明目的地是直接相連的。
H 該路由是到一個主機,也就是說,目的地址是一個完整的主機地址。如果沒有設置該標志,說明該路由是到一個網絡,而目的地址是一個網絡地址:一個網絡號,或者網絡號與子網號的組合。
D 該路由是由重定向報文創建的( 9 . 5節)。
M 該路由已被重定向報文修改( 9 . 5節)。
標志G是非常重要的,因為由它區分了間接路由和直接路由(對于直接路由來說是不設置標志G的)。其區別在于,發往直接路由的分組中不但具有指明目的端的IP地址,還具有其鏈路層地址(見圖3-3)。當分組被發往一個間接路由時,IP地址指明的是最終的目的地,但是鏈路層地址指明的是網關(即下一站路由器)。我們在圖3-4已看到這樣的例子。在這個路由表例子中,有一個間接路由(設置了標志G),因此采用這一項路由的分組其IP地址是最終的目的地(140.252.13.65),但是其鏈路層地址必須對應于路由器140.252.13.35。
理解G和H標志之間的區別是很重要的。G標志區分了直接路由和間接路由,如上所述。
但是H標志表明,目的地址(netstat命令輸出第一行)是一個完整的主機地址。沒有設置H標志說明目的地址是一個網絡地址(主機號部分為0)。當為某個目的IP地址搜索路由表時,主機地址項必須與目的地址完全匹配,而網絡地址項只需要匹配目的地址的網絡號和子網號就可以了。另外,大多數版本的netstat命令首先打印出所有的主機路由表項,然后才是網絡路由表項。
參考記數Refcnt(Reference count)列給出的是正在使用路由的活動進程個數。面向連接的協議如TCP在建立連接時要固定路由。如果在主機svr4和slip之間建立Telnet連接,可以看到參考記數值變為1。建立另一個Telnet連接時,它的值將增加為2,依此類推。
下一列(“use”)顯示的是通過該路由發送的分組數。如果我們是這個路由的唯一用戶,那么運行ping程序發送5個分組后,它的值將變為5。最后一列( interface)是本地接口的名字。
輸出的第2行是環回接口(2.7節),它的名字始終為lo0。沒有設置G標志,因為該路由不是一個網關。H標志說明目的地址(127.0.0.1)是一個主機地址,而不是一個網絡地址。由于沒有設置G標志,說明這是一個直接路由,網關列給出的是外出I P地址。
輸出的第3行是默認路由。每個主機都有一個或多個默認路由。這一項表明,如果在表中沒有找到特定的路由,就把分組發送到路由器140.252.13.33(sun主機)。這說明當前主機(svr4)利用這一個路由表項就可以通過Internet經路由器sun(及其SLIP鏈路)訪問其他的系
統。建立默認路由是一個功能很強的概念。該路由標志(UG)表明它是一個網關,這是我們所期望的。
這里,我們有意稱sun為路由器而不是主機,因為它被當作默認路由器來使用,它發揮的是IP轉發功能,而不是主機功能。
Host Requirements RFC文檔特別說明,IP層必須支持多個默認路由。但是,許多實現系統并不支持這一點。當存在多個默認路由時,一般的技術就成為它們周圍的知更鳥了,例如,Solaris 2.2就是這樣做的。
輸出中的最后一行是所在的以太網。H標志沒有設置,說明目的地址(140.252.13.32)是一個網絡地址,其主機地址部分設為0。事實上,是它的低5位設為0(見圖3-11)。由于這是一個直接路由(G標志沒有被設置),網關列指出的IP地址是外出地址。
netstat命令輸出的最后一項還隱含了另一個信息,那就是目的地址(140.252.13.32)的子網掩碼。如果要把該目的地址與140.252.13.33進行比較,那么在比較之前首先要把它與目的地址掩碼(0xffffffe0,3.7節)進行邏輯與。由于內核知道每個路由表項對應的接口,而且每個接口都有一個對應的子網掩碼,因此每個路由表項都有一個隱含的子網掩碼。
主機路由表的復雜性取決于主機所在網絡的拓撲結構。
1) 最簡單的(也是最不令人感興趣的)情況是主機根本沒有與任何網絡相連。TCP/IP協議仍然能用于這樣的主機,但是只能與自己本身通信!這種情況下的路由表只包含環回接口一項。
2) 接下來的情況是主機連在一個局域網上,只能訪問局域網上的主機。這時路由表包含兩項:一項是環回接口,另一項是局域網(如以太網)。
3) 如果主機能夠通過單個路由器訪問其他網絡(如Internet)時,那么就要進行下一步。一般情況下增加一個默認表項指向該路由器。
4) 如果要新增其他的特定主機或網絡路由,那么就要進行最后一步。在我們的例子中,到主機slip的路由要通過路由器bsdi就是這樣的例子。
我們根據上述IP操作的步驟使用這個路由表為主機svr4上的一些分組例子選擇路由。
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) 在我們最后一個例子中,我們給本機發送一份數據報。有四種方法可以完成這件事,如用主機名、主機I P地址、環回名或者環回I P地址:
~~~
ftp svr4
ftp 140.252.13.34
ftp localhost
ftp 127.0.0.1
~~~
在前兩種情況下,對路由表的第2次搜索得到一個匹配的網絡地址140.252.13.32,并把IP報文傳送給以太網驅動程序。正如圖2-4所示的那樣, IP報文中的目的地址為本機IP地址,因此報文被送給環回驅動程序,然后由驅動程序把報文放入IP輸出隊列中。
在后兩種情況下,由于指定了環回接口的名字或IP地址,第一次搜索就找到匹配的主機地址,因此報文直接被送給環回驅動程序,然后由驅動程序把報文放入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 小結