資源描述:
《linux網(wǎng)橋淺析》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、什么是橋接?簡(jiǎn)單來(lái)說(shuō),橋接就是把一臺(tái)機(jī)器上的若干個(gè)網(wǎng)絡(luò)接口“連接”起來(lái)。其結(jié)果是,其中一個(gè)網(wǎng)口收到的報(bào)文會(huì)被復(fù)制給其他網(wǎng)口并發(fā)送出去。以使得網(wǎng)口之間的報(bào)文能夠互相轉(zhuǎn)發(fā)。交換機(jī)就是這樣一個(gè)設(shè)備,它有若干個(gè)網(wǎng)口,并且這些網(wǎng)口是橋接起來(lái)的。于是,與交換機(jī)相連的若干主機(jī)就能夠通過(guò)交換機(jī)的報(bào)文轉(zhuǎn)發(fā)而互相通信。如下圖:主機(jī)A發(fā)送的報(bào)文被送到交換機(jī)S1的eth0口,由于eth0與eth1、eth2橋接在一起,故而報(bào)文被復(fù)制到eth1和eth2,并且發(fā)送出去,然后被主機(jī)B和交換機(jī)S2接收到。而S2又會(huì)將報(bào)文轉(zhuǎn)發(fā)給主機(jī)C、D。交換機(jī)在報(bào)文轉(zhuǎn)發(fā)的過(guò)程中并不會(huì)篡改
2、報(bào)文數(shù)據(jù),只是做原樣復(fù)制。然而橋接卻并不是在物理層實(shí)現(xiàn)的,而是在數(shù)據(jù)鏈路層。交換機(jī)能夠理解數(shù)據(jù)鏈路層的報(bào)文,所以實(shí)際上橋接卻又不是單純的報(bào)文轉(zhuǎn)發(fā)。交換機(jī)會(huì)關(guān)心填寫在報(bào)文的數(shù)據(jù)鏈路層頭部中的Mac地址信息(包括源地址和目的地址),以便了解每個(gè)Mac地址所代表的主機(jī)都在什么位置(與本交換機(jī)的哪個(gè)網(wǎng)口相連)。在報(bào)文轉(zhuǎn)發(fā)時(shí),交換機(jī)就只需要向特定的網(wǎng)口轉(zhuǎn)發(fā)即可,從而避免不必要的網(wǎng)絡(luò)交互。這個(gè)就是交換機(jī)的“地址學(xué)習(xí)”。但是如果交換機(jī)遇到一個(gè)自己未學(xué)習(xí)到的地址,就不會(huì)知道這個(gè)報(bào)文應(yīng)該從哪個(gè)網(wǎng)口轉(zhuǎn)發(fā),則只好將報(bào)文轉(zhuǎn)發(fā)給所有網(wǎng)口(接收?qǐng)?bào)文的那個(gè)網(wǎng)口除外)。比如
3、主機(jī)C向主機(jī)A發(fā)送一個(gè)報(bào)文,報(bào)文來(lái)到了交換機(jī)S1的eth2網(wǎng)口上。假設(shè)S1剛剛啟動(dòng),還沒(méi)有學(xué)習(xí)到任何地址,則它會(huì)將報(bào)文轉(zhuǎn)發(fā)給eth0和eth1。同時(shí),S1會(huì)根據(jù)報(bào)文的源Mac地址,記錄下“主機(jī)C是通過(guò)eth2網(wǎng)口接入的”。于是當(dāng)主機(jī)A向C發(fā)送報(bào)文時(shí),S1只需要將報(bào)文轉(zhuǎn)發(fā)到eth2網(wǎng)口即可。而當(dāng)主機(jī)D向C發(fā)送報(bào)文時(shí),假設(shè)交換機(jī)S2將報(bào)文轉(zhuǎn)發(fā)到了S1的eth2網(wǎng)口(實(shí)際上S2也多半會(huì)因?yàn)榈刂穼W(xué)習(xí)而不這么做),則S1會(huì)直接將報(bào)文丟棄而不做轉(zhuǎn)發(fā)(因?yàn)橹鳈C(jī)C就是從eth2接入的)。然而,網(wǎng)絡(luò)拓?fù)洳豢赡苁怯啦桓淖兊?。假設(shè)我們將主機(jī)B和主機(jī)C換個(gè)位置,當(dāng)主
4、機(jī)C發(fā)出報(bào)文時(shí)(不管發(fā)給誰(shuí)),交換機(jī)S1的eth1口收到報(bào)文,于是交換機(jī)S1會(huì)更新其學(xué)習(xí)到的地址,將原來(lái)的“主機(jī)C是通過(guò)eth2網(wǎng)口接入的”改為“主機(jī)C是通過(guò)eth1網(wǎng)口接入的”。但是如果主機(jī)C一直不發(fā)送報(bào)文呢?S1將一直認(rèn)為“主機(jī)C是通過(guò)eth2網(wǎng)口接入的”,于是將其他主機(jī)發(fā)送給C的報(bào)文都從eth2轉(zhuǎn)發(fā)出去,結(jié)果報(bào)文就發(fā)丟了。所以交換機(jī)的地址學(xué)習(xí)需要有超時(shí)策略。對(duì)于交換機(jī)S1來(lái)說(shuō),如果距離最后一次收到主機(jī)C的報(bào)文已經(jīng)過(guò)去一定時(shí)間了(默認(rèn)為5分鐘),則S1需要忘記“主機(jī)C是通過(guò)eth2網(wǎng)口接入的”這件事情。這樣一來(lái),發(fā)往主機(jī)C的報(bào)文又會(huì)被轉(zhuǎn)發(fā)
5、到所有網(wǎng)口上去,而其中從eth1轉(zhuǎn)發(fā)出去的報(bào)文將被主機(jī)C收到。linux的橋接實(shí)現(xiàn)相關(guān)模型linux內(nèi)核支持網(wǎng)口的橋接(目前只支持以太網(wǎng)接口)。但是與單純的交換機(jī)不同,交換機(jī)只是一個(gè)二層設(shè)備,對(duì)于接收到的報(bào)文,要么轉(zhuǎn)發(fā)、要么丟棄。小型的交換機(jī)里面只需要一塊交換芯片即可,并不需要CPU。而運(yùn)行著linux內(nèi)核的機(jī)器本身就是一臺(tái)主機(jī),有可能就是網(wǎng)絡(luò)報(bào)文的目的地。其收到的報(bào)文除了轉(zhuǎn)發(fā)和丟棄,還可能被送到網(wǎng)絡(luò)協(xié)議棧的上層(網(wǎng)絡(luò)層),從而被自己消化。linux內(nèi)核是通過(guò)一個(gè)虛擬的網(wǎng)橋設(shè)備來(lái)實(shí)現(xiàn)橋接的。這個(gè)虛擬設(shè)備可以綁定若干個(gè)以太網(wǎng)接口設(shè)備,從而將它們
6、橋接起來(lái)。如下圖(摘自ULNI):網(wǎng)橋設(shè)備br0綁定了eth0和eth1。對(duì)于網(wǎng)絡(luò)協(xié)議棧的上層來(lái)說(shuō),只看得到br0,因?yàn)闃蚪邮窃跀?shù)據(jù)鏈路層實(shí)現(xiàn)的,上層不需要關(guān)心橋接的細(xì)節(jié)。于是協(xié)議棧上層需要發(fā)送的報(bào)文被送到br0,網(wǎng)橋設(shè)備的處理代碼再來(lái)判斷報(bào)文該被轉(zhuǎn)發(fā)到eth0或是eth1,或者兩者皆是;反過(guò)來(lái),從eth0或從eth1接收到的報(bào)文被提交給網(wǎng)橋的處理代碼,在這里會(huì)判斷報(bào)文該轉(zhuǎn)發(fā)、丟棄、或提交到協(xié)議棧上層。而有時(shí)候eth0、eth1也可能會(huì)作為報(bào)文的源地址或目的地址,直接參與報(bào)文的發(fā)送與接收(從而繞過(guò)網(wǎng)橋)。相關(guān)數(shù)據(jù)結(jié)構(gòu)要使用橋接功能,我們需要在
7、編譯內(nèi)核時(shí)指定相關(guān)的選項(xiàng),并讓內(nèi)核加載橋接模塊。然后通過(guò)“brctladdbr{br_name}”命令新增一個(gè)網(wǎng)橋設(shè)備,最后通過(guò)“brctladdif{eth_if_name}”命令綁定若干網(wǎng)絡(luò)接口。完成這些操作后,內(nèi)核中的數(shù)據(jù)結(jié)構(gòu)關(guān)系如下圖所示(摘自ULNI):其中最左邊的net_device是一個(gè)代表網(wǎng)橋的虛擬設(shè)備結(jié)構(gòu),它關(guān)聯(lián)了一個(gè)net_bridge結(jié)構(gòu),這是網(wǎng)橋設(shè)備所特有的數(shù)據(jù)結(jié)構(gòu)。在net_bridge結(jié)構(gòu)中,port_list成員下掛一個(gè)鏈表,鏈表中的每一個(gè)節(jié)點(diǎn)(net_bridge_port結(jié)構(gòu))關(guān)聯(lián)到一個(gè)真實(shí)的網(wǎng)口設(shè)備的net
8、_device。網(wǎng)口設(shè)備也通過(guò)其br_port指針做反向的關(guān)聯(lián)(那么顯然,一個(gè)網(wǎng)口最多只能同時(shí)被綁定到一個(gè)網(wǎng)橋)。net_bridge結(jié)構(gòu)中還維護(hù)了一個(gè)hash表,