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