3.2 路由器的包轉(zhuǎn)發(fā)操作
路由器的基本知識(shí)

路由器包括轉(zhuǎn)發(fā)模塊和端口模塊兩部分就可以了。其中轉(zhuǎn)發(fā)模塊負(fù)責(zé)判斷包的轉(zhuǎn)發(fā)目的地,端口模塊負(fù)責(zé)包的收發(fā)操作。
路由器轉(zhuǎn)發(fā)模塊和端口模塊的關(guān)系,就相當(dāng)于協(xié)議棧的IP模塊和網(wǎng)卡之間的關(guān)系。因此,大家可以將路由器的轉(zhuǎn)發(fā)模塊想象成IP模塊,將端口模塊想象成網(wǎng)卡。
計(jì)算機(jī)的網(wǎng)卡除了以太網(wǎng)和無(wú)線(xiàn)局域網(wǎng)之外很少見(jiàn)到支持其他通信技術(shù)的品種,而路由器的端口模塊則支持除局域網(wǎng)之外的多種通信技術(shù),如ADSL、FTTH,以及各種寬帶專(zhuān)線(xiàn)等,只要端口模塊安裝了支持這些技術(shù)的硬件即可。
路由器在轉(zhuǎn)發(fā)包時(shí),首先會(huì)通過(guò)端口將發(fā)過(guò)來(lái)的包接收進(jìn)來(lái),這一步的工作過(guò)程取決于端口對(duì)應(yīng)的通信技術(shù)。對(duì)于以太網(wǎng)端口來(lái)說(shuō),就是按照以太網(wǎng)規(guī)范進(jìn)行工作,而無(wú)線(xiàn)局域網(wǎng)端口則按照無(wú)線(xiàn)局域網(wǎng)的規(guī)范工作,總之就是委托端口的硬件將包接收進(jìn)來(lái)。接下來(lái),轉(zhuǎn)發(fā)模塊會(huì)根據(jù)接收到的包的IP頭部中記錄的接收方IP地址,在路由表中進(jìn)行查詢(xún),以此判斷轉(zhuǎn)發(fā)目標(biāo)。然后,轉(zhuǎn)發(fā)模塊將包轉(zhuǎn)移到轉(zhuǎn)發(fā)目標(biāo)對(duì)應(yīng)的端口,端口再按照硬件的規(guī)則將包發(fā)送出去,也就是轉(zhuǎn)發(fā)模塊委托端口模塊將包發(fā)送出去的意思。
以以太網(wǎng)端口為例,路由器的端口具有MAC地址,因此它就能夠成為以太網(wǎng)的發(fā)送方和接收方。端口還具有IP地址,從這個(gè)意義上來(lái)說(shuō),它和計(jì)算機(jī)的網(wǎng)卡是一樣的。當(dāng)轉(zhuǎn)發(fā)包時(shí),首先路由器端口會(huì)接收發(fā)給自己的以太網(wǎng)包,然后查詢(xún)轉(zhuǎn)發(fā)目標(biāo),再由相應(yīng)的端口作為發(fā)送方將以太網(wǎng)包發(fā)送出去。這一點(diǎn)和交換機(jī)是不同的,交換機(jī)只是將進(jìn)來(lái)的包轉(zhuǎn)發(fā)出去而已,它自己并不會(huì)成為發(fā)送方或者接收方。
路由器的各個(gè)端口都具有MAC地址和IP地址。
路由表中的信息
交換機(jī)是通過(guò)MAC頭部中的接收方MAC地址來(lái)判斷轉(zhuǎn)發(fā)目標(biāo)的,而路由器則是根據(jù)IP頭部中的IP地址來(lái)判斷的。由于使用的地址不同,記錄轉(zhuǎn)發(fā)目標(biāo)的表的內(nèi)容也會(huì)不同。
路由表記錄維護(hù)的方式和交換機(jī)也有所不同。交換機(jī)中對(duì)MAC地址表的維護(hù)是包轉(zhuǎn)發(fā)操作中的一個(gè)步驟,而路由器中對(duì)路由表的維護(hù)是與包轉(zhuǎn)發(fā)操作相互獨(dú)立的,也就是說(shuō),在轉(zhuǎn)發(fā)包的過(guò)程中不需要對(duì)路由表的內(nèi)容進(jìn)行維護(hù)。
路由器的端口都具有MAC地址,只接收與自身地址匹配的包,遇到不匹配的包則直接丟棄。


- 最左側(cè)的目標(biāo)地址列記錄的是接收方的信息。這里可能不是很容易理解,實(shí)際上這里的IP地址只包含表示子網(wǎng)的網(wǎng)絡(luò)號(hào)部分的比特值,而表示主機(jī)號(hào)部分的比特值全部為0[插圖]。路由器會(huì)將接收到的網(wǎng)絡(luò)包的接收方IP地址與路由表中的目標(biāo)地址進(jìn)行比較,并找到相應(yīng)的記錄。交換機(jī)在地址表中只匹配完全一致的記錄,而路由器則會(huì)忽略主機(jī)號(hào)部分,只匹配網(wǎng)絡(luò)號(hào)部分。打個(gè)比方,路由器在轉(zhuǎn)發(fā)包的時(shí)候只看接收方地址屬于哪個(gè)區(qū),××區(qū)發(fā)往這一邊,××區(qū)發(fā)往那一邊。
有時(shí)地址本身的子網(wǎng)掩碼和路由表中的子網(wǎng)掩碼是不一致的,這是路由聚合的結(jié)果。路由聚合會(huì)將幾個(gè)子網(wǎng)合并成一個(gè)子網(wǎng),并在路由表中只產(chǎn)生一條記錄。
根據(jù)目標(biāo)地址和子網(wǎng)掩碼匹配到某條記錄后,路由器就會(huì)將網(wǎng)絡(luò)包交給接口列中指定的網(wǎng)絡(luò)接口(即端口),并轉(zhuǎn)發(fā)到網(wǎng)關(guān)列中指定的IP地址。
最后一列是躍點(diǎn)計(jì)數(shù),它表示距離目標(biāo)IP地址的距離是遠(yuǎn)還是近。這個(gè)數(shù)字越小,表示距離目的地越近;數(shù)字越大,表示距離目的地越遠(yuǎn)。
路由表記錄維護(hù)的方式和交換機(jī)也有所不同。交換機(jī)中對(duì)MAC地址表的維護(hù)是包轉(zhuǎn)發(fā)操作中的一個(gè)步驟,而路由器中對(duì)路由表的維護(hù)是與包轉(zhuǎn)發(fā)操作相互獨(dú)立的,也就是說(shuō),在轉(zhuǎn)發(fā)包的過(guò)程中不需要對(duì)路由表的內(nèi)容進(jìn)行維護(hù)。
路由器的包接收操作
首先,信號(hào)到達(dá)網(wǎng)線(xiàn)接口部分,其中的PHY(MAU)模塊和MAC模塊將信號(hào)轉(zhuǎn)換為數(shù)字信息,然后通過(guò)包末尾的FCS進(jìn)行錯(cuò)誤校驗(yàn),如果沒(méi)問(wèn)題則檢查MAC頭部中的接收方MAC地址,看看是不是發(fā)給自己的包,如果是就放到接收緩沖區(qū)中,否則就丟棄這個(gè)包。如果包的接收方MAC地址不是自己,說(shuō)明這個(gè)包是發(fā)給其他設(shè)備的,如果接收這個(gè)包就違反了以太網(wǎng)的規(guī)則。
路由器的端口都具有MAC地址,只接收與自身地址匹配的包,遇到不匹配的包則直接丟棄。
查詢(xún)路由表確定輸出端口
完成包接收操作之后,路由器就會(huì)丟棄包開(kāi)頭的MAC頭部。MAC頭部的作用就是將包送達(dá)路由器,其中的接收方MAC地址就是路由器端口的MAC地址。因此,當(dāng)包到達(dá)路由器之后,MAC頭部的任務(wù)就完成了,于是MAC頭部就會(huì)被丟棄。
通過(guò)路由器轉(zhuǎn)發(fā)的網(wǎng)絡(luò)包,其接收方MAC地址為路由器端口的MAC地址。
接下來(lái),路由器會(huì)根據(jù)MAC頭部后方的IP頭部中的內(nèi)容進(jìn)行包的轉(zhuǎn)發(fā)操作。轉(zhuǎn)發(fā)操作分為幾個(gè)階段,首先是查詢(xún)路由表判斷轉(zhuǎn)發(fā)目標(biāo)。路由器首先尋找網(wǎng)絡(luò)號(hào)比特?cái)?shù)最長(zhǎng)的一條記錄。網(wǎng)絡(luò)號(hào)比特?cái)?shù)越長(zhǎng),說(shuō)明主機(jī)號(hào)比特?cái)?shù)越短,也就意味著該子網(wǎng)內(nèi)可分配的主機(jī)數(shù)量越少,即子網(wǎng)中可能存在的主機(jī)數(shù)量越少,這一規(guī)則的目的是盡量縮小范圍,所以根據(jù)這條記錄判斷的轉(zhuǎn)發(fā)目標(biāo)就會(huì)更加準(zhǔn)確。我們來(lái)看圖3.13中的例子。
第3行192.168.1.0/255.255.255.0表示一個(gè)子網(wǎng),第4行192.168.1.10/255.255.255.255表示一臺(tái)服務(wù)器。相比服務(wù)器所屬的子網(wǎng)來(lái)說(shuō),直接指定服務(wù)器本身的地址時(shí)范圍更小,因此這里應(yīng)該選擇第4行作為轉(zhuǎn)發(fā)目標(biāo)。按照最長(zhǎng)匹配原則篩選后,如果只剩一條候選記錄,則按照這條記錄的內(nèi)容進(jìn)行轉(zhuǎn)發(fā)。
如果在路由表中無(wú)法找到匹配的記錄,路由器會(huì)丟棄這個(gè)包,并通過(guò)ICMP[插圖]消息告知發(fā)送方。ICMP:Internet Control Message Protocol, Internet控制報(bào)文協(xié)議。當(dāng)包傳輸過(guò)程中發(fā)生錯(cuò)誤時(shí),用來(lái)發(fā)送控制消息。
交換機(jī)連接的網(wǎng)絡(luò)最多也就是幾千臺(tái)設(shè)備的規(guī)模,這個(gè)規(guī)模并不大。如果只有幾千臺(tái)設(shè)備,遇到不知道應(yīng)該轉(zhuǎn)發(fā)到哪里的包,交換機(jī)可以將包發(fā)送到所有的端口上,雖然這個(gè)方法很簡(jiǎn)單粗暴,但不會(huì)引發(fā)什么問(wèn)題。然而,路由器工作的網(wǎng)絡(luò)環(huán)境就是互聯(lián)網(wǎng),它的規(guī)模是遠(yuǎn)遠(yuǎn)大于以太網(wǎng)的,全世界所有的設(shè)備都連接在互聯(lián)網(wǎng)上,而且規(guī)模還在持續(xù)擴(kuò)大,未來(lái)的互聯(lián)網(wǎng)里到底會(huì)有多少設(shè)備,我們誰(shuí)都說(shuō)不準(zhǔn)。在如此龐大的網(wǎng)絡(luò)中,如果將不知道應(yīng)該轉(zhuǎn)發(fā)到哪里的包發(fā)送到整個(gè)網(wǎng)絡(luò)上,那就會(huì)產(chǎn)生大量的網(wǎng)絡(luò)包,造成網(wǎng)絡(luò)擁塞。因此,路由器遇到不知道該轉(zhuǎn)發(fā)到哪里的包,就會(huì)直接丟棄。
找不到匹配路由時(shí)選擇默認(rèn)路由
只要在這一條記錄的網(wǎng)關(guān)列中填寫(xiě)接入互聯(lián)網(wǎng)的路由器地址,當(dāng)匹配不到其他路由時(shí),網(wǎng)絡(luò)包就會(huì)被轉(zhuǎn)發(fā)到互聯(lián)網(wǎng)接入路由器。因此這條記錄被稱(chēng)為默認(rèn)路由,這一行配置的網(wǎng)關(guān)地址被稱(chēng)為默認(rèn)網(wǎng)關(guān)。
這樣一來(lái),無(wú)論目標(biāo)地址是表示一個(gè)子網(wǎng)還是表示某臺(tái)設(shè)備,都可以用相同的方法查找出轉(zhuǎn)發(fā)目標(biāo),而且也避免了不知道轉(zhuǎn)發(fā)到哪里的問(wèn)題。
包的有效期
從路由表中查找到轉(zhuǎn)發(fā)目標(biāo)之后,網(wǎng)絡(luò)包就會(huì)被轉(zhuǎn)交給輸出端口,并最終發(fā)送出去,但在此之前,路由器還有一些工作要完成。
第一個(gè)工作是更新IP頭部中的TTL(Time to Live,生存時(shí)間)字段。
這個(gè)機(jī)制是為了防止包在一個(gè)地方陷入死循環(huán)。如果路由表中的轉(zhuǎn)發(fā)目標(biāo)都配置正確,應(yīng)該不會(huì)出現(xiàn)這樣的情況,但如果其中的信息有問(wèn)題,或者由于設(shè)備故障等原因切換到備用路由時(shí)導(dǎo)致暫時(shí)性的路由混亂,就會(huì)出現(xiàn)這樣的情況。
發(fā)送方在發(fā)送包時(shí)會(huì)將TTL設(shè)為64或128,也就是說(shuō)包經(jīng)過(guò)這么多路由器后就會(huì)“壽終正寢”?,F(xiàn)在的互聯(lián)網(wǎng)即便訪問(wèn)一臺(tái)位于地球另一側(cè)的服務(wù)器,最多也只需要經(jīng)過(guò)幾十個(gè)路由器,因此只要包被正確轉(zhuǎn)發(fā),就可以在過(guò)期之前到達(dá)目的地。
通過(guò)分片功能拆分大網(wǎng)絡(luò)包

TCP拆分?jǐn)?shù)據(jù)的操作是在將數(shù)據(jù)裝到包里之前進(jìn)行的,換句話(huà)說(shuō),拆分好的一個(gè)數(shù)據(jù)塊正好裝進(jìn)一個(gè)包里。從IP分片的角度來(lái)看,這樣一個(gè)包其實(shí)是一個(gè)未拆分的整體,也就是說(shuō),分片是對(duì)一個(gè)完整的包再進(jìn)行拆分的過(guò)程。
首先,我們需要知道輸出端口的MTU[插圖],看看這個(gè)包能不能不分片直接發(fā)送。最大包長(zhǎng)度是由端口類(lèi)型決定的,用這個(gè)最大長(zhǎng)度減掉頭部的長(zhǎng)度就是MTU,將MTU與要轉(zhuǎn)發(fā)的包長(zhǎng)度進(jìn)行比較。如果輸出端口的MTU足夠大,那么就可以不分片直接發(fā)送;如果輸出端口的MTU太小,那么就需要將包按照這個(gè)MTU進(jìn)行分片,但在此之前還需要看一下IP頭部中的標(biāo)志字段,確認(rèn)是否可以分片。
在分片中,TCP頭部及其后面的部分都是可分片的數(shù)據(jù),盡管TCP頭部不屬于用戶(hù)數(shù)據(jù),但從IP來(lái)看也是TCP請(qǐng)求傳輸?shù)臄?shù)據(jù)的一部分。數(shù)據(jù)被拆分后,每一份數(shù)據(jù)前面會(huì)加上IP頭部,其大部分內(nèi)容都和原本的IP頭部一模一樣,但其中有部分字段需要更新,這些字段用于記錄分片相關(guān)的信息。
路由器的發(fā)送操作和計(jì)算機(jī)相同
路由器判斷下一個(gè)轉(zhuǎn)發(fā)目標(biāo)的方法如下。
●如果路由表的網(wǎng)關(guān)列內(nèi)容為IP地址,則該地址就是下一個(gè)轉(zhuǎn)發(fā)目標(biāo)。
●如果路由表的網(wǎng)關(guān)列內(nèi)容為空,則IP頭部中的接收方IP地址就是下一個(gè)轉(zhuǎn)發(fā)目標(biāo)。
路由器與交換機(jī)的關(guān)系

給包加上MAC頭部并發(fā)送,從本質(zhì)上說(shuō)是將IP包裝進(jìn)以太網(wǎng)包的數(shù)據(jù)部分中,委托以太網(wǎng)去傳輸這些數(shù)據(jù)。IP協(xié)議本身沒(méi)有傳輸包的功能,因此包的實(shí)際傳輸要委托以太網(wǎng)來(lái)進(jìn)行。路由器是基于IP設(shè)計(jì)的,而交換機(jī)是基于以太網(wǎng)設(shè)計(jì)的,因此IP與以太網(wǎng)的關(guān)系也就是路由器與交換機(jī)的關(guān)系。換句話(huà)說(shuō),路由器將包的傳輸工作委托給交換機(jī)來(lái)進(jìn)行。
IP并不是委托以太網(wǎng)將包傳輸?shù)阶罱K目的地,而是傳輸?shù)较乱粋€(gè)路由器。在創(chuàng)建MAC頭部時(shí),也是從IP的路由表中查找出下一個(gè)路由器的IP地址,并通過(guò)ARP查詢(xún)出MAC地址,然后將MAC地址寫(xiě)入MAC頭部中的,這表示IP對(duì)以太網(wǎng)的委托只是將包傳輸?shù)较乱粋€(gè)路由器就行了。當(dāng)包到達(dá)下一個(gè)路由器后,下一個(gè)路由器又會(huì)重新委托以太網(wǎng)將包傳輸?shù)皆傧乱粋€(gè)路由器。隨著這一過(guò)程反復(fù)執(zhí)行,包就會(huì)最終到達(dá)IP的目的地,也就是通信的對(duì)象。
IP (路由器)負(fù)責(zé)將包發(fā)送給通信對(duì)象這一整體過(guò)程,而其中將包傳輸?shù)较乱粋€(gè)路由器的過(guò)程則是由以太網(wǎng)(交換機(jī))來(lái)負(fù)責(zé)的。
IP本身不負(fù)責(zé)包的傳輸,而是委托各種通信技術(shù)將包傳輸?shù)较乱粋€(gè)路由器,這樣的設(shè)計(jì)是有重要意義的,即可以根據(jù)需要靈活運(yùn)用各種通信技術(shù),這也是IP的最大特點(diǎn)。正是有了這一特點(diǎn),我們才能夠構(gòu)建出互聯(lián)網(wǎng)這一規(guī)模巨大的網(wǎng)絡(luò)。
IP(路由器)負(fù)責(zé)將包送達(dá)通信對(duì)象這一整體過(guò)程,而其中將包傳輸?shù)较乱粋€(gè)路由器的過(guò)程則是由以太網(wǎng)(交換機(jī))來(lái)負(fù)責(zé)的。