開始討論IP選路之前,首先要理解內(nèi)核是如何維護(hù)路由表的。路由表中包含的信息決定了IP層所做的所有決策。在3.3節(jié)中,我們列出了IP搜索路由表的幾個(gè)步驟:1)搜索匹配的主機(jī)地址;2)搜索匹配的網(wǎng)絡(luò)地址;3)搜索默認(rèn)表項(xiàng)(默認(rèn)表項(xiàng)一般在路由表中被指定為一個(gè)網(wǎng)絡(luò)表項(xiàng),其網(wǎng)絡(luò)號為0)。匹配主機(jī)地址步驟始終發(fā)生在匹配網(wǎng)絡(luò)地址步驟之前。IP層進(jìn)行的選路實(shí)際上是一種選路機(jī)制,它搜索路由表并決定向哪個(gè)網(wǎng)絡(luò)接口發(fā)送分組。
這區(qū)別于選路策略,它只是一組決定把哪些路由放入路由表的規(guī)則。IP執(zhí)行選路機(jī)制,而路由守護(hù)程序則一般提供選路策略。
簡單路由表
首先來看一看一些典型的主機(jī)路由表。在主機(jī)svr4上,我們先執(zhí)行帶-r選項(xiàng)的netstat命令列出路由表,然后以-n選項(xiàng)再次執(zhí)行該命令,以數(shù)字格式打印出IP地址(我們這樣做是因?yàn)槁酚杀碇械囊恍┍眄?xiàng)是網(wǎng)絡(luò)地址,而不是主機(jī)地址。如果沒有-n選項(xiàng),netstat命令將搜索文件/etc/networks并列出其中的網(wǎng)絡(luò)名。這樣會與另一種形式的名字—網(wǎng)絡(luò)名加主機(jī)名相混淆)。
第1行說明,如果目的地是140.252.13.65(slip主機(jī)),那么網(wǎng)關(guān)(路由器)將把分組轉(zhuǎn)發(fā)給140.252.13.35(bsdi)。這正是我們所期望的,因?yàn)橹鳈C(jī)slip通過SLIP鏈路與bsdi相連接,而bsdi與該主機(jī)在同一個(gè)以太網(wǎng)上。
對于一個(gè)給定的路由器,可以打印出五種不同的標(biāo)志(flag):U該路由可以使用。G該路由是到一個(gè)網(wǎng)關(guān)(路由器)。如果沒有設(shè)置該標(biāo)志,說明目的地是直接相連的。H該路由是到一個(gè)主機(jī),也就是說,目的地址是一個(gè)完整的主機(jī)地址。如果沒有設(shè)置該標(biāo)志,說明該路由是到一個(gè)網(wǎng)絡(luò),而目的地址是一個(gè)網(wǎng)絡(luò)地址:一個(gè)網(wǎng)絡(luò)號,或者網(wǎng)絡(luò)號與子網(wǎng)號的組合。D該路由是由重定向報(bào)文創(chuàng)建的(9.5節(jié))。M該路由已被重定向報(bào)文修改(9.5節(jié))。標(biāo)志G是非常重要的,因?yàn)橛伤鼌^(qū)分了間接路由和直接路由(對于直接路由來說是不設(shè)置標(biāo)志G的)。其區(qū)別在于,發(fā)往直接路由的分組中不但具有指明目的端的IP地址,還具有其鏈路層地址(見圖3-3)。當(dāng)分組被發(fā)往一個(gè)間接路由時(shí),IP地址指明的是最終的目的地,但是鏈路層地址指明的是網(wǎng)關(guān)(即下一站路由器)。我們在圖3-4已看到這樣的例子。在這個(gè)路由表例子中,有一個(gè)間接路由(設(shè)置了標(biāo)志G),因此采用這一項(xiàng)路由的分組其IP地址是最終的目的地(140.252.13.65),但是其鏈路層地址必須對應(yīng)于路由器140.252.13.35。理解G和H標(biāo)志之間的區(qū)別是很重要的。G標(biāo)志區(qū)分了直接路由和間接路由,如上所述。但是H標(biāo)志表明,目的地址(netstat命令輸出第一行)是一個(gè)完整的主機(jī)地址。沒有設(shè)置H標(biāo)志說明目的地址是一個(gè)網(wǎng)絡(luò)地址(主機(jī)號部分為0)。當(dāng)為某個(gè)目的IP地址搜索路由表時(shí),主機(jī)地址項(xiàng)必須與目的地址完全匹配,而網(wǎng)絡(luò)地址項(xiàng)只需要匹配目的地址的網(wǎng)絡(luò)號和子網(wǎng)號就可以了。另外,大多數(shù)版本的netstat命令首先打印出所有的主機(jī)路由表項(xiàng),然后才是網(wǎng)絡(luò)路由表項(xiàng)。
參考記數(shù)Refcnt(Referencecount)列給出的是正在使用路由的活動進(jìn)程個(gè)數(shù)。面向連接的協(xié)議如TCP在建立連接時(shí)要固定路由。如果在主機(jī)svr4和slip之間建立Telnet連接,可以看到參考記數(shù)值變?yōu)?。建立另一個(gè)Telnet連接時(shí),它的值將增加為2,依此類推。
下一列(“use”)顯示的是通過該路由發(fā)送的分組數(shù)。如果我們是這個(gè)路由的唯一用戶,那么運(yùn)行ping程序發(fā)送5個(gè)分組后,它的值將變?yōu)?。最后一列(interface)是本地接口的名字。輸出的第2行是環(huán)回接口(2.7節(jié)),它的名字始終為lo0。沒有設(shè)置G標(biāo)志,因?yàn)樵撀酚刹皇且粋€(gè)網(wǎng)關(guān)。H標(biāo)志說明目的地址(127.0.0.1)是一個(gè)主機(jī)地址,而不是一個(gè)網(wǎng)絡(luò)地址。由于沒有設(shè)置G標(biāo)志,說明這是一個(gè)直接路由,網(wǎng)關(guān)列給出的是外出IP地址。
輸出的第3行是默認(rèn)路由。每個(gè)主機(jī)都有一個(gè)或多個(gè)默認(rèn)路由。這一項(xiàng)表明,如果在表中沒有找到特定的路由,就把分組發(fā)送到路由器140.252.13.33(sun主機(jī))。這說明當(dāng)前主機(jī)(svr4)利用這一個(gè)路由表項(xiàng)就可以通過Internet經(jīng)路由器sun(及其SLIP鏈路)訪問其他的系統(tǒng)。建立默認(rèn)路由是一個(gè)功能很強(qiáng)的概念。該路由標(biāo)志(UG)表明它是一個(gè)網(wǎng)關(guān),這是我們所期望的。這里,我們有意稱sun為路由器而不是主機(jī),因?yàn)樗划?dāng)作默認(rèn)路由器來使用,它發(fā)揮的是IP轉(zhuǎn)發(fā)功能,而不是主機(jī)功能。
HostRequirementsRFC文檔特別說明,IP層必須支持多個(gè)默認(rèn)路由。但是,許多實(shí)現(xiàn)系統(tǒng)并不支持這一點(diǎn)。當(dāng)存在多個(gè)默認(rèn)路由時(shí),一般的技術(shù)就成為它們周圍的知更鳥了,例如,Solaris2.2就是這樣做的。
輸出中的最后一行是所在的以太網(wǎng)。H標(biāo)志沒有設(shè)置,說明目的地址(140.252.13.32)是一個(gè)網(wǎng)絡(luò)地址,其主機(jī)地址部分設(shè)為0。事實(shí)上,是它的低5位設(shè)為0。由于這是一個(gè)直接路由(G標(biāo)志沒有被設(shè)置),網(wǎng)關(guān)列指出的IP地址是外出地址。
netstat命令輸出的最后一項(xiàng)還隱含了另一個(gè)信息,那就是目的地址(140.252.13.32)的子網(wǎng)掩碼。如果要把該目的地址與140.252.13.33進(jìn)行比較,那么在比較之前首先要把它與目的地址掩碼(0xffffffe0,3.7節(jié))進(jìn)行邏輯與。由于內(nèi)核知道每個(gè)路由表項(xiàng)對應(yīng)的接口,而且每個(gè)接口都有一個(gè)對應(yīng)的子網(wǎng)掩碼,因此每個(gè)路由表項(xiàng)都有一個(gè)隱含的子網(wǎng)掩碼。
主機(jī)路由表的復(fù)雜性取決于主機(jī)所在網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu)。
1)最簡單的(也是最不令人感興趣的)情況是主機(jī)根本沒有與任何網(wǎng)絡(luò)相連。TCP/IP協(xié)議仍然能用于這樣的主機(jī),但是只能與自己本身通信!這種情況下的路由表只包含環(huán)回接口一項(xiàng)。
2)接下來的情況是主機(jī)連在一個(gè)局域網(wǎng)上,只能訪問局域網(wǎng)上的主機(jī)。這時(shí)路由表包含兩項(xiàng):一項(xiàng)是環(huán)回接口,另一項(xiàng)是局域網(wǎng)(如以太網(wǎng))。
3)如果主機(jī)能夠通過單個(gè)路由器訪問其他網(wǎng)絡(luò)(如Internet)時(shí),那么就要進(jìn)行下一步。一般情況下增加一個(gè)默認(rèn)表項(xiàng)指向該路由器。
4)如果要新增其他的特定主機(jī)或網(wǎng)絡(luò)路由,那么就要進(jìn)行最后一步。在我們的例子中,到主機(jī)slip的路由要通過路由器bsdi就是這樣的例子。
我們根據(jù)上述IP操作的步驟使用這個(gè)路由表為主機(jī)svr4上的一些分組例子選擇路由。
1)假定目的地址是主機(jī)sun,140.252.13.33。首先進(jìn)行主機(jī)地址的匹配。路由表中的兩個(gè)主機(jī)地址表項(xiàng)(slip和localhost)均不匹配,接著進(jìn)行網(wǎng)絡(luò)地址匹配。這一次匹配成功,找到表項(xiàng)140.252.13.32(網(wǎng)絡(luò)號和子網(wǎng)號都相同),因此使用emd0接口。這是一個(gè)直接路由,因此鏈路層地址將是目的端的地址。
2)假定目的地址是主機(jī)slip,140.252.13.65。首先在路由表搜索主機(jī)地址,并找到一個(gè)匹配地址。這是一個(gè)間接路由,因此目的端的IP地址仍然是140.252.13.65,但是鏈路層地址必須是網(wǎng)關(guān)140.252.13.65的鏈路層地址,其接口名為emd0。
3)這一次我們通過Internet給主機(jī)aw.com(192.207.117.2)發(fā)送一份數(shù)據(jù)報(bào)。首先在路由表中搜索主機(jī)地址,失敗后進(jìn)行網(wǎng)絡(luò)地址匹配。最后成功地找到默認(rèn)表項(xiàng)。該路由是一個(gè)間接路由,通過網(wǎng)關(guān)140.252.13.33,并使用接口名為emd0。
4)在我們最后一個(gè)例子中,我們給本機(jī)發(fā)送一份數(shù)據(jù)報(bào)。有四種方法可以完成這件事,如用主機(jī)名、主機(jī)IP地址、環(huán)回名或者環(huán)回IP地址:
ftpsvr4ftp140.252.13.34ftplocalhostftp127.0.0.1
在前兩種情況下,對路由表的第2次搜索得到一個(gè)匹配的網(wǎng)絡(luò)地址140.252.13.32,并把IP報(bào)文傳送給以太網(wǎng)驅(qū)動程序。正如圖2-4所示的那樣,IP報(bào)文中的目的地址為本機(jī)IP地址,因此報(bào)文被送給環(huán)回驅(qū)動程序,然后由驅(qū)動程序把報(bào)文放入IP輸出隊(duì)列中。
在后兩種情況下,由于指定了環(huán)回接口的名字或IP地址,第一次搜索就找到匹配的主機(jī)地址,因此報(bào)文直接被送給環(huán)回驅(qū)動程序,然后由驅(qū)動程序把報(bào)文放入IP輸出隊(duì)列中。
上述四種情況報(bào)文都要被送給環(huán)回驅(qū)動程序,但是采用的兩種路由決策是不相同的。
眾信咨詢:互聯(lián)網(wǎng)資質(zhì)代理誠信品牌