瀏覽器輸入一個網(wǎng)址發(fā)生了什么(四) :網(wǎng)絡(luò)包在局域網(wǎng)中傳輸——路由器和交換機(jī)如何轉(zhuǎn)發(fā)包
上一節(jié)我們介紹了網(wǎng)絡(luò)包經(jīng)過協(xié)議棧的IP模塊的封裝后,經(jīng)由網(wǎng)卡發(fā)送出本機(jī)。
《瀏覽器輸入一個網(wǎng)址發(fā)生了什么(三) IP模塊封裝、ARP協(xié)議、IP協(xié)議、ICMP協(xié)議和網(wǎng)卡原理》
接下來我們將介紹數(shù)據(jù)從客戶端主機(jī)傳輸出去后,在局域網(wǎng)內(nèi)經(jīng)歷了什么。
網(wǎng)絡(luò)包從客戶端主機(jī)發(fā)出后,要經(jīng)過集線器、交換機(jī)和路由器最終進(jìn)入到互聯(lián)網(wǎng)。在我們實際生活中,家里的路由器已經(jīng)集成了集線器和交換機(jī)的功能,網(wǎng)絡(luò)包到達(dá)家里的路由器之后就能立刻進(jìn)入互聯(lián)網(wǎng)。
這里為了理解集線器、交換機(jī)和路由器的功能,故而將每個功能獨立出介紹以方便理解。
如下圖所示:
一、電信號到達(dá)集線器
從之前的內(nèi)容我們知道,計算機(jī)網(wǎng)卡會將MAC模塊封裝的數(shù)據(jù)幀轉(zhuǎn)為電信號(0和1組成的高低電平),該電信號會沿著計算機(jī)連接的網(wǎng)線到達(dá)集線器。
集線器包含多個插口(接口),每個插口可能連接著其他集線器,交換機(jī),路由器或者多個計算機(jī)。每個接口背后都裝有網(wǎng)卡中PHY(MUA)功能相同的模塊用于接收和發(fā)送電信號。
集線器上的每一個接口既可發(fā)送也可接收,但每一個接口不能在發(fā)送的同時又接收,或者接收的時候同時發(fā)送,這是因為集線器是基于半雙工的工作模式。
當(dāng)信號通過網(wǎng)線到達(dá)集線器接收接口后面的PHY(MUA)模塊之后,會進(jìn)入中繼電路,中繼電路的基本功能是將輸入的信號廣播到該集線器的所有接口之上,信號就會從這些接口發(fā)向所有連到該集線器的所有設(shè)備。
PS:集線器不會對發(fā)送過來的數(shù)據(jù)進(jìn)行解析和處理,也就是說,當(dāng)集線器接收到電信號之后,不會將電信號還原為數(shù)字信息(也就是不會將電信號還原為數(shù)據(jù)幀和數(shù)據(jù)包),而是將電信號直接轉(zhuǎn)發(fā)。
二、電信號從集線器到達(dá)交換機(jī)
交換機(jī)和集線器一樣也有眾多接口或者說端口,并且每個接口后面也裝著PHY(MUA)模塊用于收發(fā)電信號。與集線器不同的是交換機(jī)內(nèi)部存儲著一張MAC地址與網(wǎng)線端口的對應(yīng)表(MAC地址表)而且交換機(jī)是一個包含數(shù)據(jù)鏈路層的設(shè)備,具有MAC模塊,可以校驗和解析數(shù)據(jù)幀,而集線器則沒有,集線器不會將電信號轉(zhuǎn)為數(shù)據(jù)幀(而是直接轉(zhuǎn)發(fā)電信號),更不用說解析數(shù)據(jù)幀。
當(dāng)電信號被交換機(jī)的某一個端口接收到之后,由PHY(MUA)模塊將電信號還原為數(shù)據(jù)幀,再由MAC模塊校驗數(shù)據(jù)幀內(nèi)的數(shù)據(jù)是否正確(FCS校驗),如果正確則把幀里面的以太網(wǎng)包放到緩沖區(qū)中。
PS:我們可以理解為交換機(jī)的每一個端口都相當(dāng)于一塊網(wǎng)卡,具有MAC模塊并且擁有自己的緩沖區(qū)。實際上并非每個端口都有獨立的PHY(MUA)、MAC和內(nèi)存,而是由一個控制芯片同時控制多個端口。而交換機(jī)中實際上也沒有網(wǎng)卡,因此交換機(jī)也沒有MAC地址。
網(wǎng)卡本身是具有MAC地址的,所以網(wǎng)卡能夠核對接收到的包的接收方MAC地址是否是自己的MAC地址,如果不是則丟棄包。但交換機(jī)由于沒有網(wǎng)卡也沒有MAC地址,因此交換機(jī)會接收所有發(fā)給它的包存到緩沖區(qū)并轉(zhuǎn)發(fā),而不會丟棄(如果發(fā)送方MAC地址對應(yīng)的接口和接收方MAC對應(yīng)的接口相同則會丟棄該包,后面會介紹)。
包放入緩沖區(qū)后,MAC模塊會獲取到以太網(wǎng)包MAC頭部的發(fā)送方MAC地址和接收方MAC地址。
一方面,交換機(jī)會將發(fā)送方MAC地址和交換機(jī)對應(yīng)接收端口的端口號的映射關(guān)系記錄到MAC地址表中,這樣交換機(jī)就知道這個發(fā)送方MAC地址的設(shè)備是連接在哪個端口上的,下次有其他機(jī)器要發(fā)送數(shù)據(jù)給這個MAC地址時,交換機(jī)就知道要將數(shù)據(jù)通過哪個接口發(fā)出。
另一方面,交換機(jī)會查詢接收方MAC地址是否在MAC地址表有記錄的發(fā)送端口,例如查詢到接收方MAC地址為00-02-B3-1C-9C-F9則對應(yīng)下面的MAC地址表中的第三行,交換機(jī)就會把包從端口8發(fā)送出去。
PS:如果交換機(jī)接收到某個包其接收方MAC地址是主機(jī)A的MAC地址,那么交換機(jī)接收這個包的端口不一定是直接連著主機(jī)A,而可能是連接著幫A轉(zhuǎn)發(fā)包的集線器或幫A轉(zhuǎn)發(fā)包的其他交換機(jī)。
從上圖中我們也可以看出,交換機(jī)的端口也是分為接收端口和發(fā)送端口的。00-02-B3-1C-9C-F9這個MAC地址對應(yīng)的端口號為8,那么交換機(jī)針對該MAC地址的發(fā)送端口號和接收端口號都是8,但是發(fā)送端口和輸出端口本身不是同一個端口,而是不同的2個端口,只是它們的端口號都是8。這里涉及到交換機(jī)的交換電路。如下圖所示:
左邊是交換機(jī)的輸入端口,下方是輸出端口,左邊8號端口是交換機(jī)對00-02-B3-1C-9C-F9機(jī)器的接收端口,下方8號端口是交換機(jī)對00-02-B3-1C-9C-F9機(jī)器的發(fā)送端口。
MAC地址表的維護(hù)
像我們剛才所說,當(dāng)收到包時交換機(jī)會把發(fā)送方MAC地址與接收端口的端口號記錄到MAC地址表,并且交換機(jī)每次收到包都會執(zhí)行這個操作。這樣以后當(dāng)收到發(fā)往這個地址的包,交換機(jī)就能將它發(fā)到正確的端口了。
但是地址表中的記錄不能永久有效,會在一段時間不使用之后自動刪除,這是為了避免類似于設(shè)備發(fā)生移動導(dǎo)致地址表中記錄不再正確的情況,例如筆記本電腦從辦公室移動到了會議室,連了不同的網(wǎng)線。
地址表記錄的有效期為幾分鐘,但如果在有效期內(nèi),某條記錄就過時了(發(fā)生了設(shè)備移動的情況),那么交換機(jī)依舊會將包轉(zhuǎn)發(fā)給老的端口,通信就會發(fā)生錯誤。此時只需重啟一下交換機(jī),地址表會被清空并更新正確的信息。
下面我們看一種特殊情況:如果交換機(jī)查詢MAC地址表發(fā)現(xiàn)記錄中接收方MAC地址對應(yīng)的接口和發(fā)送方MAC地址對應(yīng)的發(fā)送接口相同,那么交換機(jī)會如何處理,如下圖所示:
A發(fā)送了一個給B的數(shù)據(jù)包,我們發(fā)現(xiàn)A和B都連接在同一臺集線器上,集線器會把A的包廣播到該集線器所有的端口,其中就包括B。因此B接收到集線器發(fā)給他的包之后,校驗MAC地址發(fā)現(xiàn)是自己的MAC地址,于是B會響應(yīng)回包,經(jīng)過集線器,集線器再通過廣播的方式把回包傳回給A。
但是集線器也連接著左側(cè)的交換機(jī)上,因此集線器同樣會把這個包發(fā)給交換機(jī),交換機(jī)一查MAC地址表會發(fā)現(xiàn)發(fā)送端口和接收端口是同一個端口號,為了避免計算機(jī)B接收重復(fù)的包,因此交換機(jī)會丟棄這個包,而不會把包又轉(zhuǎn)發(fā)回集線器而又由集線器轉(zhuǎn)發(fā)給B。
另一種特殊情況就是MAC地址表中無法找到指定的MAC地址,這是因為該MAC地址的設(shè)備沒有向交換機(jī)發(fā)送過包,或者M(jìn)AC記錄因過了有效期而被刪除。
此時交換機(jī)會將包轉(zhuǎn)發(fā)給除了源端口之外的其他所有端口。可能有人會擔(dān)心這樣發(fā)過多的包會不會造成網(wǎng)絡(luò)擁塞,其實不用擔(dān)心,因為只要目標(biāo)設(shè)備做出響應(yīng)(這里主要指ARP響應(yīng)),交換機(jī)就會根據(jù)回包將其MAC地址記錄到地址表,下次就無需這樣廣播轉(zhuǎn)發(fā)。
另外,如果接收方MAC地址是一個廣播地址那么交換機(jī)也會將包發(fā)送到除了源端口外的其他端口。
交換機(jī)是全雙工的工作模式,這也是交換機(jī)和集線器的區(qū)別。交換機(jī)的發(fā)送和接收端口是相互獨立的,發(fā)送端口只能發(fā)送不能接收,接收端口亦然;但是發(fā)送端口在發(fā)送的時候,接收端口也能接收,這就是全雙工模式的特點。而集線器的單個端口可以接收也可以發(fā)送,但接收和發(fā)送不能同時進(jìn)行,否則就會發(fā)生信號碰撞,所以當(dāng)集線器接收某個包時,它需要將這個包轉(zhuǎn)發(fā)給其他所有端口,導(dǎo)致其他端口這段期間不能接收包。從轉(zhuǎn)發(fā)能力而言,集線器是低于交換機(jī)的。
三、網(wǎng)絡(luò)包經(jīng)路由器并轉(zhuǎn)發(fā)
網(wǎng)絡(luò)包經(jīng)過集線器和交換機(jī)轉(zhuǎn)發(fā)之后達(dá)到路由器,并被轉(zhuǎn)發(fā)到下一個路由器。
當(dāng)然,網(wǎng)絡(luò)包不一定非要先經(jīng)過集線器再到交換機(jī)再到路由器,也可能集線器連接著路由器,包到達(dá)集線器后就能轉(zhuǎn)發(fā)到路由器;也可能是計算機(jī)直接連著路由器,網(wǎng)絡(luò)包從計算機(jī)發(fā)出后直接到達(dá)路由器;在局域網(wǎng)中,路由器與路由器之間也存在著眾多的集線器和交換機(jī),從當(dāng)前路由器到下一跳路由器需要經(jīng)過這兩臺路由器之間的集線器和交換機(jī);也可能路由器內(nèi)部本身就集成了集線器和交換機(jī)的功能,這樣包就可以按上述所說的轉(zhuǎn)發(fā)方式直接被轉(zhuǎn)發(fā)到下一跳路由器。
當(dāng)然本小節(jié)的重點不是集線器和交換機(jī),而是路由器的轉(zhuǎn)發(fā)機(jī)制。和交換機(jī)不同,路由器是基于IP設(shè)計的(具有網(wǎng)絡(luò)層和鏈路層),而交換機(jī)是基于以太網(wǎng)設(shè)計的(只有鏈路層),因此路由器可以解析MAC包和IP包,交換機(jī)則只能解析MAC包;交換機(jī)是通過包中的接收方MAC地址判斷轉(zhuǎn)發(fā)目標(biāo),而路由器則是根據(jù)包中接收方的IP地址判斷轉(zhuǎn)發(fā)目標(biāo)。
1.路由器結(jié)構(gòu)簡化圖
路由器內(nèi)部包含兩部分:轉(zhuǎn)發(fā)模塊和端口模塊。
轉(zhuǎn)發(fā)模塊負(fù)責(zé)根據(jù)包內(nèi)目的地IP判斷包應(yīng)該轉(zhuǎn)發(fā)到哪個下一跳路由器;端口模塊負(fù)責(zé)執(zhí)行包的收發(fā)操作。
2.端口模塊
端口模塊包含PHY(MUA)模塊(可以接收電信號將幀轉(zhuǎn)為數(shù)字信息)、MAC模塊(將幀解析為以太網(wǎng)包)和內(nèi)存緩沖區(qū)(暫存網(wǎng)絡(luò)數(shù)據(jù)),端口模塊對于路由器而言就相當(dāng)于網(wǎng)卡對于計算機(jī)一樣。路由器的每個端口都具有獨立的MAC地址和IP地址。
不同類型的路由器安裝的端口模塊也不同,例如具有ADSL組件的路由器(一般用作為互聯(lián)網(wǎng)中的路由器),具有FTTH組件的路由器(互聯(lián)網(wǎng)中的路由器),支持專線的路由器(公司局域網(wǎng)中的路由器),支持無線局域網(wǎng)或以太網(wǎng)的路由器(局域網(wǎng)中的路由器)。
不同端口模塊的路由器支持不同的通信功能,例如具有ADSL通信功能的路由器在把包轉(zhuǎn)發(fā)之前會為包添加MAC頭部、PPPOE頭部和PPP頭部(用于在互聯(lián)網(wǎng)中傳輸和鑒權(quán))并發(fā)送到互聯(lián)網(wǎng)中;而具有以太網(wǎng)或無線局域網(wǎng)功能的路由器在轉(zhuǎn)發(fā)時只添加MAC頭部,并且只支持包在局域網(wǎng)內(nèi)傳輸和解析。
一般而言,計算機(jī)的網(wǎng)卡支持以太網(wǎng)和無限局域網(wǎng)的通信技術(shù),而路由器的端口模塊除了支持以太網(wǎng)和無線局域網(wǎng)還支持如ADSL,F(xiàn)TTH以及各種寬帶專線的通信,只需要端口模塊安裝了支持這些技術(shù)的硬件即可。
一個路由器可以有多個端口和多種類型的端口(意味著這個路由器既支持包在局域網(wǎng)中轉(zhuǎn)發(fā)也支持在互聯(lián)網(wǎng)中轉(zhuǎn)發(fā)),每個端口都可能連接著一根網(wǎng)線(如果端口類型是無線的則不用連網(wǎng)線),端口類型不同,連的網(wǎng)線種類也不同。
3.轉(zhuǎn)發(fā)模塊
路由器的轉(zhuǎn)發(fā)模塊中有一個重要的表叫做路由表,如下所示:
路由器中的路由表內(nèi)容,以及匹配規(guī)則和之前介紹的計算機(jī)內(nèi)的路由表一樣。
其中,第一列“目標(biāo)地址”記錄的是接收方的信息,但它不是具體某臺設(shè)備的IP,而是只有IP的網(wǎng)絡(luò)號部分的IP段,表示主機(jī)號部分的比特值都為0。
第二列表示目標(biāo)地址的子網(wǎng)掩碼,用于路由器判斷所需比對的網(wǎng)絡(luò)號的比特數(shù)。
路由器在比對路由表和接收方IP時,只會比對 接收方IP的網(wǎng)絡(luò)號而忽略主機(jī)號。
4.路由聚合
路由表第一列和第二列中記錄的可能不是目標(biāo)地址IP的真正子網(wǎng),這是路由聚合的結(jié)果。所謂的路由聚合就是將多個子網(wǎng)合并為一個子網(wǎng),并在路由表中生成一條記錄,這樣就能減少路由表中的記錄數(shù)。
例如有3個子網(wǎng):10.10.1.0/24、10.10.2.0/24和10.10.3.0/24。路由器B需要轉(zhuǎn)發(fā)接收方IP為10.10.2.100的包,但實際上路由器B的路由表 中并沒有上面的3個子網(wǎng)的記錄,而是將上面3個子網(wǎng)合并成一個10.10.0.0/16的子網(wǎng)記錄起來(這里記錄的是聚合后的地址),并將下一跳指向路由器A。如下所示:
目標(biāo)地址 | 子網(wǎng)掩碼 | 網(wǎng)關(guān) | 接口 | 躍點數(shù) |
10.10.0.0 | 255.255.0.0 | 路由器A的IP | 路由器B某接口的IP | 1 |
此時在路由器B中就只需匹配目標(biāo)地址10.10.2.100的前16個位,即10.10。匹配正確后B會將這個包轉(zhuǎn)發(fā)給路由器A。
路由器A的路由表則記了上面3個子網(wǎng)的記錄,根據(jù)10.10.2.100匹配到10.10.2.0/24這個子網(wǎng)和下一跳的IP地址,如下所示:
目標(biāo)地址 | 子網(wǎng)掩碼 | 網(wǎng)關(guān) | 接口 | 躍點數(shù) |
10.10.1.0 | 255.255.255.0 | ... | 路由器A的5號端口的IP | 1 |
10.10.2.0 | 255.255.255.0 | ... | 路由器A的2號端口的IP | 1 |
10.10.3.0 | 255.255.255.0 | ... | 路由器A的8號端口的IP | 1 |
路由聚合是將多個子網(wǎng)聚合為一個子網(wǎng),路由表記錄聚合后的子網(wǎng)地址。相反的,路由器也可能將一個子網(wǎng)細(xì)分并注冊到路由表形成多條記錄。甚至也可以將某臺具體計算機(jī)的地址寫入路由,此時第二列的子網(wǎng)掩碼為255.255.255.255,表示匹配路由表時需要匹配所有32個比特的值。
至于網(wǎng)關(guān)、接口和躍點數(shù)在上面介紹計算機(jī)的路由表已經(jīng)介紹過,這里不再贅述。第4列接口在計算機(jī)中代表某一塊網(wǎng)卡,在路由器中代表路由器眾多端口中的某一個端口。
PS:路由表的維護(hù)方式與交換機(jī)不同,交換機(jī)對MAC地址表的維護(hù)是通過記錄發(fā)送方的以太網(wǎng)包MAC地址以及交換機(jī)接收端口的端口號、記錄接收方的響應(yīng)以太網(wǎng)包的MAC頭部和交換機(jī)接收該包的接收端口實現(xiàn)的。路由表的維護(hù)則通過人手動維護(hù)以及根據(jù)路由協(xié)議通過路由器之間的信息交換由路由器自行維護(hù)。
那么回到正題,當(dāng)包到達(dá)路由器時路由器是怎么處理的,這會根據(jù)路由器的端口不同而異(如以太網(wǎng)端口,無線局域網(wǎng)端口,ADSL等),這里只介紹路由器以太網(wǎng)端口是如何接收和轉(zhuǎn)發(fā)包的。
首先信號到達(dá)網(wǎng)線接口部分,由PHY(MUA)模塊和MAC模塊將電信號轉(zhuǎn)為數(shù)字信息,檢驗幀尾部FCS,查看接收方的MAC地址是不是發(fā)送給自己的,放入接收緩沖區(qū);如果不是發(fā)給自己的包則丟棄(交換機(jī)不具有MAC地址,只負(fù)責(zé)轉(zhuǎn)發(fā),因此交換機(jī)不會因為校驗MAC地址不是自己的MAC地址而丟棄以太網(wǎng)包,而是根據(jù)MAC地址表轉(zhuǎn)發(fā))。
校驗完MAC地址之后,MAC頭部的任務(wù)就完成了然后被丟棄(MAC頭部的任務(wù)就是將包送到指定MAC地址的路由器上,因此其實上一章中我們介紹通過ARP協(xié)議向局域網(wǎng)中廣播以獲取接收方的MAC地址實際上是獲取路由器的MAC地址而不是遠(yuǎn)端目標(biāo)主機(jī)的MAC地址)。然后路由器會根據(jù)IP包頭部的接收方IP地址匹配路由表的記錄,從而找到下一跳路由器的IP(即路由表中的網(wǎng)關(guān)列)和輸出端口(路由表的接口列,即通過本路由器的哪個端口發(fā)出這個包)。需要注意,如果匹配到的記錄的網(wǎng)關(guān)列為具體IP地址,則該地址就是下一個轉(zhuǎn)發(fā)目標(biāo),如果網(wǎng)關(guān)列為空,則IP頭部的接收方IP地址就是下一個轉(zhuǎn)發(fā)目標(biāo)。
如果無法在路由表中匹配到對應(yīng)記錄,路由器會丟棄這個包,并通過ICMP消息告知發(fā)送方。
在發(fā)出這個包前,路由器需要重新封裝MAC頭部,因為之前的MAC頭部已經(jīng)被丟棄。此時MAC頭部填入的發(fā)送方MAC地址不是源發(fā)送端的MAC地址,而是本路由器的某發(fā)送端口的MAC地址(路由器有多個端口,每一個端口都有一個MAC地址)。接收方的MAC地址則根據(jù)下一個轉(zhuǎn)發(fā)目標(biāo)的IP(可能是下一跳路由器的IP,也可能是目標(biāo)主機(jī)的IP)通過ARP查詢的方式獲取,當(dāng)然路由器中也有ARP緩存,因此會先在ARP緩存中查詢。
網(wǎng)絡(luò)包封裝完畢后,會在端口模塊將數(shù)字信息轉(zhuǎn)為電信號發(fā)送出去,這個過程和在計算機(jī)的發(fā)送包過程一樣。如果輸出端口是以太網(wǎng)類型,則網(wǎng)絡(luò)包會通過交換機(jī)到達(dá)下一個路由器并經(jīng)過路由器的層層轉(zhuǎn)發(fā),網(wǎng)絡(luò)包到達(dá)最終目的地(當(dāng)然這里省略了包如何從局域網(wǎng)進(jìn)入互聯(lián)網(wǎng)的過程介紹,我們會在下一章再介紹)。
需要注意的是,如果路由器通過以太網(wǎng)類型的端口發(fā)出包則此時以太網(wǎng)包的頭部只有MAC頭部,如果是通過ADSL類型的端口(將包發(fā)送到網(wǎng)絡(luò)服務(wù)運營商和互聯(lián)網(wǎng))發(fā)出則以太網(wǎng)包會包含MAC、PPPoE和PPP頭部。
5.默認(rèn)路由
對于局域網(wǎng)中的路由器而言,可能小的局域網(wǎng)中的路由器和計算機(jī)數(shù)量不多,因此所有轉(zhuǎn)發(fā)目標(biāo)都能夠?qū)懙铰酚杀?。但如果是互?lián)網(wǎng)中的路由器,由于互聯(lián)網(wǎng)中的設(shè)備數(shù)量太多,無法將所有目標(biāo)IP的網(wǎng)絡(luò)號都記錄到路由表中。因此路由表會在最后一行配置默認(rèn)路由的記錄,這一行的目標(biāo)地址列和子網(wǎng)掩碼列為0.0.0.0,子網(wǎng)掩碼為0.0.0.0表示需要匹配網(wǎng)絡(luò)包接收方IP的比特數(shù)為0,即無需匹配。而這一條記錄的網(wǎng)關(guān)列即為默認(rèn)網(wǎng)關(guān),一般會填寫為接入互聯(lián)網(wǎng)的路由器地址。
換句話說,如果包內(nèi)的接收方IP無法匹配到路由表中的其他所有記錄,且路由表中有0.0.0.0這條默認(rèn)網(wǎng)關(guān)記錄,那么接收方IP就會匹配到這條記錄并轉(zhuǎn)發(fā)到默認(rèn)網(wǎng)關(guān)。
當(dāng)然,如果路由器中沒有設(shè)置默認(rèn)網(wǎng)關(guān),那么當(dāng)匹配路由表中所有記錄失敗時,路由器會發(fā)送ICMP消息給發(fā)送方。
6.包的有效期
在路由器轉(zhuǎn)發(fā)包之前,其轉(zhuǎn)發(fā)模塊會更新IP頭部的TTL字段。該字段表示有效期,每經(jīng)過一個路由器的轉(zhuǎn)發(fā)這個值就會減1,當(dāng)這個值變?yōu)?時就表示超過了有效期,這個包就會被丟棄。
這個機(jī)制是為了防止包在轉(zhuǎn)發(fā)的過程中陷入死循環(huán),如果路由表中的配置正確是不會出現(xiàn)這種情況的,但如果信息有問題或者設(shè)備故障等原因切換備用路由器導(dǎo)致暫時性的路由混亂就會出現(xiàn)這種情況。
TTL一般會設(shè)置為64或128。
7.通過分片功能拆分大網(wǎng)絡(luò)包
路由器的端口類型不只以太網(wǎng)一種,也可以支持其他局域網(wǎng)或?qū)>€通信技術(shù)。不同端口類型的線路能傳輸?shù)淖畲蟀L度(MTU)也不同,像在以太網(wǎng)中,以太網(wǎng)包的MTU(包括以太網(wǎng)頭部)為1500。
當(dāng)路由器的輸入端口和輸出端口是不同的端口類型(像局域網(wǎng)內(nèi)的路由器輸入端口和輸出端口可能都是以太網(wǎng)類型的端口和線路,但接入互聯(lián)網(wǎng)的路由器的輸入端口為以太網(wǎng)類型端口,輸出端口是ADSL類型的端口),且輸出端口能傳輸?shù)腗TU小于輸入端口時,一旦傳入的包的大小超過了輸出端口的MTU,就會導(dǎo)致包無法發(fā)送。如下所示
有時候即使輸入和輸出端口的MTU一樣,但可能由于包經(jīng)過重新封裝添加了額外的頭部數(shù)據(jù)導(dǎo)致包的長度超過輸出端口的MTU。例如ADSL和FTTH等端口類型在發(fā)出包之前需要在IP頭部前添加PPP頭部和PPPoE頭部再添加MAC頭部。
為了避免包超過輸出端口MTU而無法發(fā)送包的情況出現(xiàn),路由器中的IP模塊提供了分片功能,首先它會看看這個要發(fā)送出去的包能否直接發(fā)送出去,將輸出端口的MTU與包的長度(數(shù)據(jù)幀的包長度,不包括幀的報頭和FCS)比較,如果輸出端口的MTU小于包的長度則會對這個包分片,拆分之前會看一下IP頭部的標(biāo)志字段是否允許分片;如果標(biāo)志字段表示不能分片,則路由器會丟棄該包并發(fā)送ICMP消息給發(fā)送方。
分片如下圖所示:
圖中(a)的藍(lán)色部分就是被拆分的內(nèi)容
每個分片都會添加相同的MAC頭部和IP頭部(如果是在以太網(wǎng)中傳輸則為這兩個頭部,如果是通過ADSL則還需要PPP和PPPoE頭部)。
需要注意的是,這里對IP包的分片和之前在協(xié)議棧中介紹的TCP模塊對HTTP消息的分片不同。TCP模塊對HTTP消息的分片是在數(shù)據(jù)被裝進(jìn)包里之前進(jìn)行的,而且每個分片都包含一個TCP頭部。而路由器則是直接對IP包進(jìn)行分片,每個分片都有一個IP頭部,但是所有分片只有一個TCP頭部。TCP分片也是因為要發(fā)送的數(shù)據(jù)可能大于MTU因而分片。
假如有客戶端有1M的http消息要發(fā)送,則這1M的內(nèi)容會在TCP模塊中被分為幾百多個分片包(IP包),但經(jīng)過路由器的時候,每個IP包還可能再被路由器的IP模塊分片為兩個小包。
8.路由器與交換機(jī)以及路由器之間的關(guān)系
簡單的來說,路由器負(fù)責(zé)通過將包不斷傳遞給下一跳路由器最終把包送達(dá)通信對象這一整個過程(由網(wǎng)絡(luò)層如IP模塊負(fù)責(zé))。而包從一個路由器到達(dá)下一個路由器則是由交換機(jī)負(fù)責(zé)廣播獲取MAC地址實現(xiàn)(由鏈路層如以太網(wǎng)線路等負(fù)責(zé))。
網(wǎng)絡(luò)中除了以太網(wǎng)之外,還有無線局域網(wǎng)、ADSL和FTTH等等眾多類型的網(wǎng)絡(luò),如果當(dāng)前路由器和下一跳路由器是通過以太網(wǎng)連接的,則當(dāng)前路由器的IP模塊會委托以太網(wǎng)將包傳遞給下一個路由器;如果當(dāng)前路由器和下一跳路由器是通過ADSL連接,則會委托ADSL線路傳遞。IP本身不負(fù)責(zé)包的傳輸,而是委托鏈路層的各種通信技術(shù)(以太網(wǎng)、ADSL、FTTH、無線局域網(wǎng)等)把包傳給下一個路由器。
當(dāng)然,現(xiàn)在基本上很多的路由器都內(nèi)置了交換機(jī)功能,因此路由器本身就具有廣播,以及進(jìn)行ARP查詢MAC地址的功能。
四、路由器的附加功能
上面我們介紹了路由器的基本功能,即根據(jù)網(wǎng)絡(luò)包頭部接收方IP來查詢路由表,獲取下一跳地址,并以接力的方式將包傳送到目標(biāo)地址的計算機(jī)上。
除了這個基本功能之外,路由器還有一些附加功能,這里介紹比較重要的兩個功能:地址轉(zhuǎn)換和過濾。
1.地址轉(zhuǎn)換
我們知道一臺設(shè)備只有一個唯一的IP地址,如果網(wǎng)絡(luò)中出現(xiàn)有重復(fù)IP地址的設(shè)備就會無法正常傳輸網(wǎng)絡(luò)包??墒请S著互聯(lián)網(wǎng)設(shè)備數(shù)量增長,IP地址會被很快分配完。為了解決這個問題,我們?nèi)菰S相互獨立的不同內(nèi)網(wǎng)之間的機(jī)器出現(xiàn)IP重復(fù)而同一內(nèi)網(wǎng)的機(jī)器的IP不重復(fù)的情況,只要不同內(nèi)網(wǎng)之間的設(shè)備不直接進(jìn)行通信就行。為此我們提出了私有地址和公有地址的概念。
公有地址中沒分配的一部分拿出來規(guī)定只能在內(nèi)網(wǎng)使用的地址叫做私有地址,而互聯(lián)網(wǎng)中分配的固定地址叫做公有地址。
私有地址的范圍如下:
- 10.0.0.0 ~ 10.255.255.255
- 172.16.0.0 ~ 172.31.255.255
- 192.168.0.0 ~ 192.168.255.255
不同內(nèi)網(wǎng)的兩臺機(jī)器即使出現(xiàn)上面范圍內(nèi)的IP地址重復(fù)也沒有關(guān)系。
下面我們以公司內(nèi)網(wǎng)為例。一般而言,公司內(nèi)網(wǎng)中的設(shè)備會分為兩部分,一部分是對互聯(lián)網(wǎng)開放的服務(wù)器,一部分是公司內(nèi)部設(shè)備。對互聯(lián)網(wǎng)開放的設(shè)備分配公有地址,對公司內(nèi)部設(shè)備分配私有地址,被分配私有地址的設(shè)備只能夠與內(nèi)網(wǎng)的設(shè)備直接通信而不能和互聯(lián)網(wǎng)直接收發(fā)網(wǎng)絡(luò)包。
如果內(nèi)網(wǎng)中的設(shè)備想和互聯(lián)網(wǎng)中的設(shè)備通信就需要一種特別的機(jī)制,這個機(jī)制就是地址轉(zhuǎn)換。
地址轉(zhuǎn)換的原理就是依靠路由器在轉(zhuǎn)發(fā)網(wǎng)絡(luò)包時對IP包頭部的IP地址和端口進(jìn)行改寫。
當(dāng)內(nèi)網(wǎng)的設(shè)備要把網(wǎng)絡(luò)包發(fā)送到遠(yuǎn)程的目標(biāo)機(jī)器,在網(wǎng)絡(luò)包經(jīng)過路由器的時候,路由器會將IP包頭部的發(fā)送方IP地址(私有地址)換為路由器接收端口的地址(該路由器的端口地址是一個公有地址),并且將包 TCP頭部的端口號也改寫為路由器分配的一個空閑端口號。
改寫前的私有地址和端口號,改寫后的公有地址和端口號會對應(yīng)的記錄到路由器的一張表中。
這個被替換后的公有地址其實是地址轉(zhuǎn)換設(shè)備的IP,即路由器的IP。所以實際上真正的發(fā)送者不是內(nèi)網(wǎng)的計算機(jī),而是該路由器。
服務(wù)端的回包的接收方IP會寫之前發(fā)送方的公有地址,即198.18.8.31,這個公網(wǎng)IP是路由器的IP。當(dāng)包到達(dá)公司網(wǎng)關(guān)路由器時,路由器會根據(jù)回包的接收方IP和端口查上面的映射表找到對應(yīng)的內(nèi)網(wǎng)設(shè)備并轉(zhuǎn)發(fā)給該設(shè)備(上圖的表格中只有一個公有IP,但真實情況其實還可能有多個公有地址,因為路由器有多個端口)。
在公有地址只有一個的情況下,可以用不同的端口號來區(qū)別內(nèi)網(wǎng)的不同終端。這樣就不至于服務(wù)端的回包無法找到準(zhǔn)確的內(nèi)網(wǎng)設(shè)備。
這個公有地址和私有地址的映射表的某條記錄會在某內(nèi)網(wǎng)計算機(jī)A與外網(wǎng)服務(wù)器B建立連接時(A發(fā)送連接請求的TCP包到達(dá)路由器時)生成,之后該內(nèi)網(wǎng)計算機(jī)A與外網(wǎng)設(shè)備B的通信都會使用這條轉(zhuǎn)換記錄,直到A與B通信完畢,斷開連接,A關(guān)閉用于與B通信的套接字后,(此時這個私有地址的端口號就失效)這條記錄才會被刪除。
我們發(fā)現(xiàn)路由器做地址轉(zhuǎn)換的時候還改寫了端口號,這樣做是為了在地址轉(zhuǎn)換時讓公有地址的一個端口號對應(yīng)一個私有IP地址,提高公有地址的利用率。如果不改寫端口號,就意味著每轉(zhuǎn)換一個私有地址都需要一個新的公有地址。假如這個公司的局域網(wǎng)只被分配了10個公有地址,但是公司有1000臺設(shè)備(1000個私有地址),就意味著只有10臺內(nèi)部設(shè)備能夠同時和互聯(lián)網(wǎng)通信。
上面我們介紹了內(nèi)網(wǎng)設(shè)備作為客戶端,互聯(lián)網(wǎng)中的遠(yuǎn)程設(shè)備作為服務(wù)端情況下的路由器地址轉(zhuǎn)換。下面我們再說說公司內(nèi)網(wǎng)設(shè)備作為服務(wù)端,從互聯(lián)網(wǎng)訪問公司內(nèi)網(wǎng)設(shè)備時路由器的地址轉(zhuǎn)換。
其實基本原理還是通過復(fù)用一個(或多個)公有地址的多個端口號來對應(yīng)多個私有地址建立映射進(jìn)行轉(zhuǎn)換,唯一的不同在于內(nèi)網(wǎng)設(shè)備作為客戶端請求的情況下,這個地址轉(zhuǎn)換表的記錄是在設(shè)備發(fā)出請求并經(jīng)過路由器時才生成的(即動態(tài)生成);而內(nèi)網(wǎng)設(shè)備作為服務(wù)端供互聯(lián)網(wǎng)請求的情況下,路由器中的地址轉(zhuǎn)換表記錄需要提前手動添加,而且只要內(nèi)網(wǎng)設(shè)備不停止提供服務(wù),里面的記錄就不會刪除。如圖:
這樣一來,互聯(lián)網(wǎng)中的某個用戶訪問198.18.8.31:8080其實訪問的就是公司內(nèi)網(wǎng)中的 10.10.1.1這臺機(jī)器的80端口所提供的服務(wù)。
2.路由器的包過濾功能
包過濾就是對包轉(zhuǎn)發(fā)時根據(jù)MAC頭部、IP頭部和TCP頭部按時限設(shè)定好的規(guī)則決定轉(zhuǎn)發(fā)這個包還是丟棄這個包。我們常說的防火墻設(shè)備和軟件就是利用這一機(jī)制。
這一原理雖然簡單,但是想要靈活控制不容易,例如如何防止來自互聯(lián)網(wǎng)的包經(jīng)過路由器進(jìn)入內(nèi)網(wǎng),但是又允許內(nèi)網(wǎng)發(fā)出的包能通過路由器轉(zhuǎn)發(fā)給互聯(lián)網(wǎng)。
很多朋友會想,如果希望內(nèi)網(wǎng)能訪問互聯(lián)網(wǎng)而不讓互聯(lián)網(wǎng)訪問內(nèi)網(wǎng),只需允許路由器轉(zhuǎn)發(fā)由內(nèi)網(wǎng)發(fā)向互聯(lián)網(wǎng)的包,而禁止轉(zhuǎn)發(fā)由互聯(lián)網(wǎng)發(fā)到內(nèi)網(wǎng)的包就行。
可是網(wǎng)絡(luò)包是雙向傳輸?shù)?,例如TCP應(yīng)答機(jī)制中,內(nèi)網(wǎng)設(shè)備發(fā)送了帶有序號的網(wǎng)絡(luò)包,服務(wù)端就會回一個ACK包。此時這個ACK包就被攔截導(dǎo)致內(nèi)網(wǎng)向客戶端發(fā)起的請求無法正常響應(yīng)(應(yīng)該說客戶端的請求包都無法正常傳輸完,客戶端主機(jī)會一直等服務(wù)端的應(yīng)答包)。
這部分內(nèi)容將會在探索服務(wù)器時介紹。