數據平面路由轉發與IP報文
計算機的網絡層可以分爲數據平面和控制平面。數據平面執行的任務是轉發功能,就是將數據從路由器的輸入端口,發送到輸出端口。控制平面執行的功能是路由選擇功能,就是選擇報文從源地址到目的地址經過的路由器的路徑。這裏主要講的路由器如何轉發一個報文(數據平面),然後講一下IP
報文。
文章目錄
1. 路由器的功能
路由器的轉發有兩種,基於目的的轉發和通用轉發,這裏我們用基於目的的轉發,後面講IP
的時候再講通用轉發。下圖展示了路由器的整體狀態:
1.1 輸入端口
在每一個輸入端口裏,都有一個轉發表。輸入端口會通過將報文的目的地址與轉發表相匹配來決定將報文發送到哪個輸出端口。
下面是一個例子看圖:
Prefix | Output port |
---|---|
11001000 00010111 00010 |
0 |
11001000 00010111 00011000 |
1 |
11001000 00010111 00011 |
2 |
Otherwise | 3 |
圖中是一個轉發表,匹配採用的是最大前綴匹配規則。假設我們的IP
地址是11001000 00010111 00011000 10100001
,這個地址同時與第2
項和第3
項匹配上了,但是根據最大前綴匹配規則,我們選擇的是第2
項,將報文發送的1
號輸出端口。
1.2交換結構
交換結構將一個報文從輸入端口發送到輸出端口。經典的有三種方式,總線,內存和縱橫式。
下面是介紹這三種交換方式的各自的特點:
- 總線,一次只能通過一個分組。
- 內存,一次僅能執行一個內存的讀寫。
- 縱橫式,當報文的目的端口不是同一個時,可以並行地發送多個報文。
1.3 輸出端口
到達輸出端口後,輸出端口將報文發送出去。
1.4 排隊現象
1.4.1 輸入排隊
即使交換結構很快,在輸入端口仍然可能發生排隊現象。
考慮下面這種情況,我們採用縱橫式的交換結構,假設現在在輸入隊列的報文如圖1
,同時我們假定當上中下三個隊列中要發送的報文相同時,優先發送上面隊列的報文。
- 第一次發送時:由於上下隊列中的要發送的報文相同,優先發送上面的報文到對應的輸出端口。同時並行的發送中間隊列的報文到對應的輸出端口(對應圖
1
)。 - 第二次發送時:由於上下隊列中的要發送的報文還是相同的,優先發送上面的報文到對應的輸出端口(對應圖
2
)。 - 第三次發送時:現在只有下面的隊列有報文,發送第一個報文。此時下面還剩下一個報文。
於是我們看到,即使沒有與下面隊列左邊那個報文競爭的,但是由於他前面的報文一直沒有發送,所以他也一直被堵塞着。這就導致了他白白等待了三個報文的發送時間,這種現象叫做輸入隊列的線路前部阻塞(HOL)。由於有HOL的存在只要輸入鏈路的分組到達速率達到其容量的58%
,在某些假設前提下,輸入隊列長度就會無限增長。
1.4.2 輸出排隊
當到達報文的速度超過輸入端口發送報文的速度時,輸出隊列就會迅速的被填滿。當輸出隊列滿了的時候,一是採取棄尾,把後面到達的報文全部丟棄,二是刪除前面的分組,給新的分組提供位置。在某些情況下,可以在隊列滿之前,先丟棄一個分組(或在首部添加標誌),這可以向發送方發送一個擁塞信號,來調控阻塞情況。
同時當報文在輸出隊列排隊時,還涉及到了分組調度,即如何排隊。現在有三種排隊方法,先進先出,優先權排隊和循環和加權公平排隊。
- 先進先出,就是先來的報文也先發送出去,這和我們日常排隊買東西一樣。
- 優先權排隊,將隊列分爲優先權高的和低的,只要優先權高的有分組,就先發送他的分組。這就和我們有應急車道差不多。
- 循環和加權公平排隊,循環排隊就是把報文分成幾類,然後循環的一類一類的發送報文,如果其中一類在輪到他是在他的隊列中沒有報文,那就直接跳過。加權公平排隊把報文分成幾類,並且第類的權重爲,加權公平排隊保證第類接受到的服務等於。當加權公平排隊的都相同時,加權公平排隊和循環排隊的作用就一模一樣了。
2. 報文
2.1 報文格式
的報文格式如下:
的關鍵字段解釋如下:
- 版本字段:根據他來識別數據報的版本,即或。
- 首部長度:應爲在中有可選項,所以用首部長度來指明數據報的首部長度,一般爲20字節。
- 服務類型:將不同類型的數據報區分出來。將實時的通信(視頻會議)和非實時的通信(郵件)區別出來,有利於提高效率。
- 數據報長度:這裏指的是整個數據報長度,以字節爲單位,包括的首部。
- 標識,標誌和片偏移:這三個字段用於報文的分片。當數據報的長度大於鏈路層的最大傳輸單元(MTU)時,就需要將數據報分片,然後在目的地址的主機組裝在一起。其中同一個數據報的標識是相同的。爲了讓目的主機知道他已經收到了最後一片報文,標誌字段在前面的報文置
1
,最後一個報文置0
。片偏移,是爲了讓目的主機能按順序組裝報文。 - 壽命:這個字段決定報文能過被路由器轉發幾次。每次轉發,減
1
,當減到0
時,路由器丟棄這個數據報。 - 上層協議:用來指示將數據報,交付給上層的那個協議。在維基百科上可以查看具體的關係。其中的是
6
,是17
。 - 首部檢驗和:首部檢驗和用於幫助路由器檢測數據報首部中的比特錯誤。
- **源和目的地址 **:存放地址。
- 可選字段:可選字段允許被擴展,不過很少用,在數據報中已經刪除了這個字段。
- 數據:存放來自運輸層的報文。
2.2 IP編址
2.2.1 哪些設備具有地址
我們要搞明白編址,首先就要搞清楚什麼設備具有地址,那什麼設備有地址呢?
我們的主機和物理鏈路之間的邊界叫作接口,其中每個接口都具有一個地址。所以理論上講有幾個接口就有幾個地址。
2.2.2 地址和子網掩碼
地址是由32
位的二進制數字組成,一共有個(大約40
億個)。我們一般表示地址的方式是點分十進制記法,就是地址中每八個二進制位用十進制表示,中間用點號隔開,他的格式是a.b.c.d
。例如123.23.23.23
。其中255.255.255.255
是**廣播地址**,當我們用255.255.255.255
作爲目的地址時,報文會轉發到網絡中的所有主機中。
我們的 地址並不能隨意的選擇,他的一部分由子網掩碼規定。子網掩碼是什麼呢?
我們先介紹子網掩碼的記法,子網掩碼的記法和地址相似,xxx.xxx.xxx.xxx/xxx
。舉個例子,123.12.12.0/24
,位於這個子網裏面的地址具有這樣的形式123.12.12.xxx
,前面的24
位是固定的,後面的8
位是可以左右選擇的。如下圖,左邊的三個主機和一個路由器構成一個子網,而子網裏面的地址具有相同的子網掩碼。
這三個子網的子網掩碼分別是:223.1.1.0/24
,223.1.2.0/24
和223.1.3.0/24
。
2.3 一臺主機如何獲得一個地址
一個主機要想獲得一個地址,他必須加入一個組織,然後組織分配給他地址。舉個例子,現在你家裏打算安裝網線上網,首先我們會選擇一個運營商(移動,聯通或電信),假設你選擇了移動,那麼你也就加入了他這個組織,他會給你分配一個地址。那麼他的地址塊又是從哪來來的呢。
2.3.1 獲得一塊地址
像移動等他們要獲得一塊地址,也許要一個機構來分配。有一個全球組織叫,他管理地址空間並向和其他組織分配地址塊。
2.3.2 獲得主機的地址:DHCP
現在一個組織有一塊地址了,那麼他是如何把這塊地址分配給他的成員的呢?
配置單個主機的地址,可以由系統管理員配置,但是現在更爲流行的方法是使用**動態主機配置協議(DHCP)**自動配置。DHCP協議也是一個客戶-服務器協議,理論上每個子網有一個DHCP服務器。如何子網中沒有DHCP服務器,則需要一個DHCP中繼代理(通常是路由器)。DHCP允許主機自動獲取(被分配)一個地址。除了主機地址分配以外,DHCP還允許一臺主機獲得他的子網掩碼,他的第一跳路由器地址(常被稱爲默認網關)和他的DNS服務器地址。
現在一個學生到達圖書館,考慮圖書館的DHCP服務器如何給學生的主機分配一個IP地址。DHCP協議通過下面的四個步驟實現的:
- DHCP服務器發現:使用DHCP發現報文找到與客戶主機交互的DHCP服務器。客戶在UDP分組中想67端口發送該發現報文。因爲開始時客戶沒有地址,所以客戶使用的源地址是
0.0.0.0
。同時客戶也不知道DHCP服務器的地址,所以客戶的目的地址是廣播地址255.255.255.255
,使用廣播地址可以把發現報文發送到與客戶主機相連子網的所有主機中。 - DHCP服務器提供:DHCP接受到發現報文後,用DHCP提供報文向客戶做出響應。因爲DHCP服務器不知道客戶的地址,所以他使用的目的地址也是廣播地址
255.255.255.255
。DHCP服務器提供的報文包含收到的發現報文的事務ID,向客戶推薦的地址,網絡掩碼和**地址租用期**,就是地址有效的使用時間(通常爲幾個小時或幾天)。 - DHCP請求:客戶根據DHCP服務器提供報文,從一個或多個DHCP服務器中選擇一個,並向服務器發送DHCP請求報文進行響應。源地址和目的地址同發現報文。
- DHCP ACK:服務器用DHCP ACK報文迴應客戶的DHCP請求報文。
通過以上的步驟,客戶就可以在租用期內使用DHCP提供的地址。
2.4 網絡地址轉換(NAT)
隨着網絡的發展,越來越多的設備接入互聯網。在公司和家庭中,如果開始已經分配好了地址,但是現在公司又來了幾個人,或者在家裏你又買了一臺電腦,於是需要該你分配地址,如果子網變大了,就需要給你分配你塊較大的地址。但是如果這塊原來是連續分配的,現在沒有了,怎麼辦?
這時我們就需要網絡地址轉換(NAT)。
NAT使得在家庭網絡的內部是一個子網掩碼爲10.0.0/24
的子網。這些地址只能用於家庭網絡的內部,叫做專用網絡或具有專用地址的地域。在外部看來,NAT是一個具有單一地址的單一設備。
NAT通過在他的內部保持一個NAT轉換表將內部不同設備的**地址和端口號轉化爲可用與外部的和端口號。每當內部的某一設備通過NAT向外部發送一個報文時,NAT在NAT轉換表中記錄該設備的源和端口號**,然後當響應報文發送後來時,NAT在通過NAT轉換錶轉化將報文轉化爲內部子網的格式(修改目的和端口號)。如下圖:
2.5 通用轉發和SDN
前面我們將的路由器的轉發都是基於目的地址的轉發,我們接下來了講的是通用轉發。他們之間的主要區別是,基於目的的轉發,只能根據目的地址轉發。而通用轉發可以匹配更多的報文首部,實現對報文的轉發,丟棄和修改字段等功能。在這裏路由器和其他的設備,在這裏叫做分組交換機。
在分組交換機中,裏面配置的表項叫做流表每個表項包括:
- 首部字段值:和基於目的地址的轉發相似,這裏的首部字段是很多首部字段的集合。通過匹配首部字段,進而執行響應的動作。
- 計數器集合(當流表項與分組匹配是更新計數器):這裏的計數器可以包括已經與該表項匹配的分組數量,以及自從該表項上次更新以來的時間。
- 當分組匹配流表項時所採取的動作集合:這些動作可能是轉發分組,丟棄分組,複製分組並轉發到多個輸出端口,以及重寫首部字段。
可以匹配的字段有如下的12個值:
參考文獻
- 計算機網絡:自頂向下方法
以上就是數據平面的基本內容,其中沒有涉及的就是報文。因爲本人的能力有限,所以如果有什麼不對的希望大家可以在評論區裏批評指正。
最後如果大家覺得好可以點個贊,謝謝大家!!!