二層轉發流程 (linux網絡子系統學習 第六節 )

做爲網絡設備,二層轉發是最基本的功能。要想繼續學習linux 內核協議棧,必須明白二層轉發的流程。這篇文章舉例講一講二層轉發的流程。



二層轉發是根據報文的目的MAC直接進行轉發,轉發過程中不用對報文的頭部做任何的修改。


三層轉發則是根據報文的ip 地址來進行轉發,並且要對報文的二層頭部進行相應的修改。




進行二層轉發的設備一般叫做網橋(bridge)。橋可以是一個單獨的一臺網橋設備,也可以是運行在設備內的軟件實例,即虛擬橋,又叫軟橋。這裏我們的橋指的是軟橋。



橋接是指報文經過橋後直接根據橋內維護的轉發信息表把報文原封不動的轉發出去,因爲報文經過橋轉發後報文不被修改,所以橋設備在整個鏈路上是透明的。


每個橋內都會維護一張轉發信息表,轉發表項包含如下信息:


MAC:設備的MAC地址

port:該設備連接在交換機的哪個端口。


所以橋收到報文後根據目的MAC查到表項就知道報文的出端口,直接轉發出去即可。




下面就以同一網段內兩臺PC之間 ping 報文的通信流程來講一下二層轉發中報文的處理流程:



214256953.jpg


如上圖所示:



交換機上運行一個軟橋的實例,eth0 eth1 兩個物理口加入到軟橋中。這時eth0 和 eth1 接口上都不需要配置ip 地址,並且被配置爲混雜模式。


PC1 PC2通過交換機組成一個局域網。我們以PC1 ping PC2 爲例來說明二層轉發時報文的處理。



交換機一起動時,橋內部維護的轉發信息表(FDB表)是空的。



1、PC1 ping PC2,PC1需要封裝一個ICMP requset 報文。三層報文頭信息爲



dip:192.168.2.3


sip:192.168.2.2



封裝完三層報文頭後,開始封裝二層報文頭,這裏是以太網的二層頭。封裝二層頭時需要知道目的ip 對應的MAC地址。PC1 發現目的IP 和自己的IP在同一網段,PC機即知道目的主機和自己在同一個局域網裏。PC1發送arp 請求來請求PC2MAC地址。



2、arp request 是個廣播報文,到達交換機時,進入軟橋進行處理。首先橋會進行MAC地址的學習,取得報文的源MAC,在橋維護的轉發表(FDB表)中查找,發現沒有該MAC的記錄信息,然後把該MAC及該MAC對應的端口添加到轉發表中。交換機的橋維護的轉發表中現在有如下表項:



0001.0002.000a   eth0


3、經過2步地址學習後,軟橋發現該報文是廣播報文,會在整個橋內進行廣播,即從橋內每個端口往外發送一份,但該報文的入端口除外。



4、報文經過橋廣播,也從eth1 口轉發出來,被PC2收到。PC2發現是請求自己的MAC地址,PC2首先會進行arp學習。根據arp 請求報文中源MAC 和源IP ,PC2arp 表項添加到自己的arp 表中。現在PC2arp 表中有如下表項:


192.168.2.2  0001.0002.000a



5、PC2封裝arp 迴應報文發送出去


6PC2arp 迴應報文通過eth1 口進入交換機的軟橋中進行處理。軟橋首先進行地址學習,這時在交換機的橋維護的轉發表中添加如下表項:



0001.0002.000b   eth1



7、然後根據arp 迴應報文的目的MAC在轉發表中查找,找到最初學習的轉發表項


0001.0002.000a   eth0


根據該表項知道該報文應該從eth0 口上轉發出去,橋進行轉發。




8PC1 收到從交換機轉發出來的arp 迴應報文,首先進行arp 學習,現在PC1arp 表中有如下表項:


192.168.2.3  0001.0002.000b




9、這時PC1可以封裝ping 請求報文的二層頭了。



Dmac: 0001.0002.000b


Smac: 0001.0002.000a


Dip :192.168.2.3


Sip: 192.168.2.2


發送給交換機



10、交換機根據轉發表中的信息把報文從eth1口發送出來。



11、PC2收到ping 的請求報文後,發現時請求自己的,自己封裝ping 的迴應報文,發送給交換機。



12、交換機根據轉發表中的信息從eth0口發送出來。PC1收到迴應,ping過程結束。




總結:

如上所述,橋會自己進行MAC學習,來維護一張轉發信息表。收到報文後用報文的目的MAC來進行查找,找到相應出端口直接把報文從出端口轉發出去。如果是廣播報文,就會在整個橋內進行廣播,從橋中每個端口發送一份出去(報文源端口除外)。如果查找轉發信息表後沒找到相應的表項,就在橋內進行泛洪,即從橋中每個端口發送一份出去(報文源端口除外)。這樣使連接在每個端口的設備都能收到一份報文,如果相應設備發現是到本節設備的報文,就進行處理。其他設備發現不是到本機的報文,就直接丟棄了。


一般連接在端口上的設備都會發送一些報文出來,所以只要設備有報文發送出來,橋就能學習到轉發信息。所以橋內的轉發信息表會很快的建立起來。出現泛洪的報文不會太多。



二層轉發的一些概念:



未知單播:報文進入橋裏,在FDB表中沒有查到該報文的目的MAC,這時橋就不知道把該報文從哪個具體的端口轉發出去。這樣的報文就稱作未知單播。




未知單播的處理:未知單播在橋內採用泛洪的轉發處理,即把該未知單播報文從橋裏的每個端口發送一份出去,但不往該報文的源端口發送。如果橋裏劃分了vlan,就從vlan內進行泛洪。




混雜模式:端口的一種狀態,端口可以接收目的MAC不是該端口MAC的報文。一般端口默認是隻接收目的MAC是該端口MAC的報文,但要進行轉發,端口是要求接收目的MAC不是該端口的MAC,這時就要把端口模式設置爲混雜模式。




二層口:二層口是指只具有二層轉發功能的端口。從開發者角度來說,二層口和三層口在內核中都對應了一個net_device,但二層口是沒有配置ip地址並且端口設置爲混雜模式,並且加入網橋的端口。



VLAN的二層轉發:


上面我們沒提到VLAN ,VLAN在整個二層轉發來說是很重要的。上面沒配置VLAN時,整個橋是一個廣播域。如果橋裏面有多個端口,這樣每個廣播報文都會從橋裏每個端口轉發一份出去,造成網絡帶寬資源的浪費,同時也造成了連接在端口設備的負擔。在組網上也不利於網絡的管理。這樣就產生了VLAN的技術。




一般設備都使用按端口來進行VLAN的劃分。我們可以在一個橋裏劃分多個VLAN,每個VLAN 裏添加多個端口。



這樣一個VLAN 是一個廣播域,同VLAN 內的端口通過二層轉發是可以互通的,不同VLAN 內的端口通過二層轉發是不通的。不同VLAN內的轉發只能通過三層轉發來進行互通。









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章