只要有網(wǎng)絡(luò)的地方,你很難不看到路由器的身影,各種低、中、高端的,種類繁多,所具備的功能和內(nèi)部實(shí)現(xiàn)不完全一樣。
要知道,路由器不斷的在吞吐通信數(shù)據(jù),就像魚吐泡泡一樣,通信數(shù)據(jù)像是路由器的“食物”。
那么,路由器“吃”進(jìn)去的數(shù)據(jù),上哪去了呢?
“魚兒”吃進(jìn)去的“食物”,有的會被吸收了,進(jìn)入血液,最終轉(zhuǎn)換成能量或變?yōu)樯眢w的一部分;沒被吸收的經(jīng)過腸道排泄到體外。
“魚兒”吞進(jìn)去的大部分是水,這些水基本都吐出來了,并沒有被吸收。
同樣的,進(jìn)入路由器的數(shù)據(jù),大部分從一個接口進(jìn)去,從另一個接口出來,它們只是“過路”的業(yè)務(wù)報文,也有人稱之為“過路”報文。
有一小部分?jǐn)?shù)據(jù)被“吸收”了,被上送CPU處理,或者因?yàn)楦鞣N原因中途被丟棄。
今天,就和你分享一篇關(guān)于報文在路由器中的處理全過程,幫助你更好的了解路由器內(nèi)部的原理。
01
在路由器中
報文度過了怎樣的一生?
這張圖,是路由器收到的業(yè)務(wù)報文和協(xié)議報文在轉(zhuǎn)發(fā)層面的處理流程。
這張圖,是路由器CPU發(fā)送的協(xié)議報文的在轉(zhuǎn)發(fā)層面的處理流程。
是不是覺得上圖太復(fù)雜、概念太多,看不懂?
上述圖片只是給一個總的概念,以便下面更好的理解。
下面我們先從“交換”談起:
數(shù)據(jù)。是通過接口板接收和發(fā)送,通信線纜都要插接到接口板的接口上。
那么,把某一個接口來的數(shù)據(jù)包送到另一個接口發(fā)出去,這兩個接口需要連起來。
但實(shí)際上,數(shù)據(jù)包可能從任意接口進(jìn)來,從任意接口出去,都這么點(diǎn)到點(diǎn)連接的話,則需要N*(N-1)/2根線互聯(lián),太多了。
為了解決這種大量連接的問題,接口板和接口板之間需要通過交換網(wǎng)(Switch Fabric)板銜接起來,接口板只要通過若干連線跟交換網(wǎng)板連接,就能完成任意接口的互通。
交換網(wǎng)屬于“三無”部件,即與設(shè)備配置無關(guān)、與協(xié)議無關(guān)、與數(shù)據(jù)包類型無關(guān)。交換網(wǎng)專注于在入接口和出接口之間建立連接,完成數(shù)據(jù)的交換。
01?上行和下行
以交換網(wǎng)為中心,可將報文在路由器的行程一分為二,前半程稱為“上行”,下半程稱為“下行”。
02?尋址轉(zhuǎn)發(fā)
可能有人會問,報文從一個接口進(jìn)來,經(jīng)過“交換”,從另一個接口出去,這個交換機(jī)也會做啊,何必用路由器?
是的,交換機(jī)也有交換功能。但是,在互聯(lián)網(wǎng)中,從一個節(jié)點(diǎn)到另一個節(jié)點(diǎn),有許許多多的路徑。
路由器可以選擇通暢的最短的路徑,從而提高通信速度,減輕網(wǎng)絡(luò)負(fù)荷,節(jié)約網(wǎng)絡(luò)資源,這是交換機(jī)所不具備的能力。
為數(shù)據(jù)包選擇一條合適的(通常指最短的)傳輸路徑,然后從對應(yīng)的接口發(fā)送,這個過程就稱為“尋址轉(zhuǎn)發(fā)”。
路由器所在的網(wǎng)絡(luò)幾乎都是遵循TCP/IP體系的,路由器是工作在該體系的第三層,即網(wǎng)絡(luò)層。
所以,剛才提到的“尋址”的”址“是指根據(jù)數(shù)據(jù)包的網(wǎng)絡(luò)層地址——IP地址。為了尋址,路由器需要一張“地圖”,以目的IP地址為索引的“地圖”,也就是路由表。每個路由器中都有一張路由表。
03?路由表長什么樣?
這張圖是一張實(shí)際的地鐵出口地圖。
實(shí)際的路由表跟上圖有些相似。
路由表的索引是目的IP地址/掩碼,每個表項(xiàng)中都有對應(yīng)的下一跳IP地址和出接口信息,如下圖。
有了這張表,路由器接在收到數(shù)據(jù)包時就能做到心中有數(shù)了。
比如,收到一個目的地址為10.0.0.1的報文,路由器就可以查表得知需要將該報文發(fā)送到GE1/0/0這個接口。
04?這個路由表怎么得來的?
一種辦法是手工制作,對路由器進(jìn)行手工設(shè)置固定的路由。但是這種路由不能對網(wǎng)絡(luò)的改變作出反映,如果網(wǎng)絡(luò)拓?fù)渥兓耍枰斯とバ薷脑O(shè)置。
還有一種辦法,就是運(yùn)行動態(tài)路由協(xié)議,讓路由器之間相互傳遞路由信息,利用收集到的路由信息進(jìn)行計算,生成路由表,這樣就可以讓路由表實(shí)時跟進(jìn)網(wǎng)絡(luò)拓?fù)涞淖兓?/p>
在實(shí)際應(yīng)用中,這兩個辦法都用上了,當(dāng)動態(tài)路由與靜態(tài)路由發(fā)生沖突時,以靜態(tài)路由為準(zhǔn)。
當(dāng)然,路由表還有一類路由,不是人工配置的,也不是路由協(xié)議的學(xué)習(xí),而是由鏈路層協(xié)議發(fā)現(xiàn)的,稱為直連路由。
05?路由表放在哪?
有了路由表,接下來要考慮的是,路由表放哪合適呢?
前面說過,數(shù)據(jù)包是從某個接口進(jìn)來,經(jīng)過交換網(wǎng),再從另一個接口出去。
那路由表能不能放交換網(wǎng)?答案肯定不行,因?yàn)榻粨Q網(wǎng)要完成整個設(shè)備所有報文的交換,為了讓交換網(wǎng)完成高速交換,不成為瓶頸,不能再讓交換網(wǎng)去運(yùn)行路由協(xié)議、維護(hù)路由表、做尋址轉(zhuǎn)發(fā)。
那路由表能不能放下行接口板?
答案也是不行,交換網(wǎng)做交換的時候,就需要知道要送往哪塊目的單板,所以尋址轉(zhuǎn)發(fā)需要在上行完成。然而,如果把路由表放上行接口板,由于報文可能從任意接口板進(jìn)來,那么所有的接口板都需要放一個路由表。其實(shí),還有更好的辦法,就是將路由表放在一個公共的地方,比如主控板上,由主控板的CPU運(yùn)行路由協(xié)議,計算路由,生成和維護(hù)路由表。
06?轉(zhuǎn)發(fā)表與路由表
如果路由器采用的是“硬轉(zhuǎn)發(fā)”,業(yè)務(wù)報文不經(jīng)過主控板CPU處理,不能直接用主控板上的路由表,接口板上也需要有供尋址轉(zhuǎn)發(fā)的信息。
所以,主控板CPU生成路由表之后,還要將相關(guān)信息下發(fā)給各個接口板。
這些相關(guān)的信息就是轉(zhuǎn)發(fā)信息,存放在各個接口板的轉(zhuǎn)發(fā)信息表FIB(Forwarding Information Base)中。
各個接口板上的轉(zhuǎn)發(fā)信息都是相同的,因?yàn)樗鼈兙哂邢嗤膩碓矗紒碜灾骺匕濉?/p>
實(shí)際上,現(xiàn)代高性能路由器在架構(gòu)上都是轉(zhuǎn)發(fā)和控制分離:
把轉(zhuǎn)發(fā)層面和控制層面分配在不同的組件,控制層面運(yùn)行路由協(xié)議,維護(hù)路由表,并下發(fā)轉(zhuǎn)發(fā)表FIB到轉(zhuǎn)發(fā)層面,由轉(zhuǎn)發(fā)層面負(fù)責(zé)數(shù)據(jù)包轉(zhuǎn)發(fā)。
這樣做的最基本的好處就是不會相互影響。
如果流量很高導(dǎo)致轉(zhuǎn)發(fā)層面高負(fù)荷,但是其不會影響控制層面進(jìn)行正常的路由學(xué)習(xí);相反的,如果控制層面對路由信息的處理比較繁忙,也不會影響轉(zhuǎn)發(fā)層面進(jìn)行其高速的數(shù)據(jù)包轉(zhuǎn)發(fā)。
細(xì)心的讀者會發(fā)現(xiàn),路由表和轉(zhuǎn)發(fā)表看起來差不多,都有目的IP地址/掩碼、下一跳、出接口這三個信息。
實(shí)際上,轉(zhuǎn)發(fā)表是根據(jù)路由表生成的。路由表中可能包含到達(dá)目的地址的多條路由,但是轉(zhuǎn)發(fā)表里面只取其中的最優(yōu)路由。
而且,路由表的下一跳是原始的下一跳,不一定是直接可達(dá)的,F(xiàn)IB是用于指導(dǎo)轉(zhuǎn)發(fā)的,它的下一跳必須是直接可達(dá)。根據(jù)“原始下一跳”找到“直接下一跳”的過程就稱為“路由迭代”。
路由器上電啟動之后,就會運(yùn)行路由協(xié)議學(xué)習(xí)網(wǎng)絡(luò)拓?fù)洌陕酚杀恚绻涌诎遄猿晒Γ骺匕寰涂梢愿鶕?jù)路由表生成轉(zhuǎn)發(fā)表項(xiàng)并下發(fā)給接口板,這樣路由器就可以根據(jù)轉(zhuǎn)發(fā)表轉(zhuǎn)發(fā)數(shù)據(jù)包了。
執(zhí)行數(shù)據(jù)包轉(zhuǎn)發(fā)的部件是位于接口板上的一個被稱為包轉(zhuǎn)發(fā)引擎PFE(Packet Forwarding Engine)部件,通常是NP或ASIC芯片。
07?找不到路怎么辦?
上述這種在轉(zhuǎn)發(fā)報文前,提前準(zhǔn)備好轉(zhuǎn)發(fā)表,待收到報文時再查表轉(zhuǎn)發(fā)的方式稱為“預(yù)路由”,“先鋪路,后通車”。現(xiàn)在路由器都采用這種方式進(jìn)行IP單播轉(zhuǎn)發(fā)。
在這種方式中,查表轉(zhuǎn)發(fā)時,如果沒有匹配上(如果有默認(rèn)路由,最終會匹配上默認(rèn)路由,默認(rèn)路由不存在“不匹配”的情況),意味著這臺路由器沒有到這個目的地址的路由(或者還沒有學(xué)習(xí)到這個路由),也就是找不到路,迷路了。
數(shù)據(jù)包迷路了怎么辦,原路返回?
想象下,如果迷路了就被原路返回給源端,那源端重發(fā)的還是同樣的目的地址,那這個報文還是會在同一個地方迷路,再原路返回,死循環(huán)了。
所以,數(shù)據(jù)包迷路了只能被丟棄。出于可維護(hù)方面的考慮,包轉(zhuǎn)發(fā)引擎PFE會記錄丟棄原因和統(tǒng)計丟棄的報文數(shù)。
08?預(yù)路由與流觸發(fā)
剛才說到路由器都采用“先鋪路,后通車”的預(yù)路由方式。相對的,“先通車,后鋪路”的方式,被稱為“流觸發(fā)”。
流觸發(fā)方式中,設(shè)備收到報文,查轉(zhuǎn)發(fā)表,如果轉(zhuǎn)發(fā)表中不存在對應(yīng)的表項(xiàng),就根據(jù)這個報文生成一個轉(zhuǎn)發(fā)表項(xiàng)。
這樣,該用戶流的下一個報文就可以命中轉(zhuǎn)發(fā)表進(jìn)行轉(zhuǎn)發(fā)了。
目前,路由器和交換機(jī)在進(jìn)行二層轉(zhuǎn)發(fā)時所使用的MAC表,就是采用MAC地址學(xué)習(xí)方式,類似于“流觸發(fā)”方式。
從安全性角度上,流觸發(fā)顯然容易造成流量攻擊,為攻擊者提供了一個合理合法的攻擊路徑。
攻擊者可以使用各種未知目的報文對系統(tǒng)進(jìn)行遍歷掃描攻擊,形成對路由器的流量攻擊。
所以,在高端路由器上,除了有MAC學(xué)習(xí)方式機(jī)制外,為了預(yù)防流量攻擊,還提供了限制MAC地址學(xué)習(xí)的功能,即限制最多允許學(xué)習(xí)多少個MAC地址,并限制每次學(xué)習(xí)的時間間隔;
而且還允許去使能MAC地址學(xué)習(xí),允許人們像配置靜態(tài)路由一樣去手工配置MAC表項(xiàng)。
編輯:黃飛
?
評論
查看更多