一、橋接的概念
簡單來說,橋接就是把一台機器上的若干個網路介面「連線」起來。其結果是,其中乙個網口收到的報文會被複製給其他網口並傳送出去。以使得網口之間的報文能夠互相**。
交換機就是這樣乙個裝置,它有若干個網口,並且這些網口是橋接起來的。於是,與交換機相連的若干主機就能夠通過交換機的報文**而互相通訊。
如下圖:主機a傳送的報文被送到交換機s1的eth0口,由於eth0與eth1、eth2橋接在一起,故而報文被複製到eth1和eth2,並且傳送出 去,然後被主機b和交換機s2接收到。而s2又會將報文**給主機c、d。
交換機在報文**的過程中並不會篡改報文資料,只是做原樣複製。然而橋接卻並不是在物理層實現的,而是在資料鏈路層。交換機能夠理解資料鏈路層的報文,所以實際上橋接卻又不是單純的報文**。
交換機會關心填寫在報文的資料鏈路層頭部中的mac位址資訊(包括源位址和目的位址),以便了解每個mac位址所代表的主機都在什麼位置(與本交換機的哪 個網口相連)。在報文**時,交換機就只需要向特定的網口**即可,從而避免不必要的網路互動。這個就是交換機的「位址學習」。但是如果交換機遇到乙個自 己未學習到的位址,就不會知道這個報文應該從哪個網口**,則只好將報文**給所有網口(接收報文的那個網口除外)。
比如主機c向主機a傳送乙個報文,報文來到了交換機s1的eth2網口上。假設s1剛剛啟動,還沒有學習到任何位址,則它會將報文**給eth0和 eth1。同時,s1會根據報文的源mac位址,記錄下「主機c是通過eth2網口接入的」。於是當主機a向c傳送報文時,s1只需要將報文**到 eth2網口即可。而當主機d向c傳送報文時,假設交換機s2將報文**到了s1的eth2網口(實際上s2也多半會因為位址學習而不這麼做),則s1會 直接將報文丟棄而不做**(因為主機c就是從eth2接入的)。
然而,網路拓撲不可能是永不改變的。假設我們將主機b和主機c換個位置,當主機c發出報文時(不管發給誰),交換機s1的eth1口收到報文,於是交換機 s1會更新其學習到的位址,將原來的「主機c是通過eth2網口接入的」改為「主機c是通過eth1網口接入的」。
但是如果主機c一直不傳送報文呢?s1將一直認為「主機c是通過eth2網口接入的」,於是將其他主機傳送給c的報文都從eth2**出去,結果報文就發 丟了。所以交換機的位址學習需要有超時策略(fdb的老化)。對於交換機s1來說,如果距離最後一次收到主機c的報文已經過去一定時間了(預設為5分鐘),則s1需要忘記 「主機c是通過eth2網口接入的」這件事情。這樣一來,發往主機c的報文又會被**到所有網口上去,而其中從eth1**出去的報文將被主機c收到。
二、linux的橋接實現
linux核心支援網口的橋接(目前只支援乙太網介面)。但是與單純的交換機不同,交換機只是乙個二層裝置,對於接收到的報文,要麼**、要麼丟棄。小型的交換機裡面只需要一塊交換晶元即可,並不需要cpu。而執行著linux核心的機器本身就是一台主機,有可能就是網路報文的目的地。其收到的報文除了**和丟棄,還可能被送到網路協議棧的上層(網路層),從而被自己消化。
linux核心是通過乙個虛擬的網橋裝置來實現橋接的。這個虛擬裝置可以繫結若干個乙太網介面裝置,從而將它們橋接起來。
網橋裝置br0繫結了eth0和eth1。對於網路協議棧的上層來說,只看得到br0,因為橋接是在資料鏈路層實現的,上層不需要關心橋接的細節。於是協議棧上層需要傳送的報文被送到br0,網橋裝置的處理**再來判斷報文該被**到eth0或是eth1,或者兩者皆是;反過來,從eth0或從eth1接收到的報文被提交給網橋的處理**,在這裡會判斷報文該**、丟棄、或提交到協議棧上層。
而有時候eth0、eth1也可能會作為報文的源位址或目的位址,直接參與報文的傳送與接收(從而繞過網橋)。
三、網橋的功能
概括來說,網橋實現最重要的兩點:
1、mac學習
學習mac位址,起初,網橋是沒有任何位址與埠的對應關係的,它傳送資料,還是得想hub一樣,但是每傳送乙個資料,它都會關心資料報的**mac是從自己的哪個埠來的,由於學習,建立位址-埠的對照表(cam表)。
2、報文**
每傳送乙個資料報,網橋都會提取其目的mac位址,從自己的位址-埠對照表(cam表)中查詢由哪個埠把資料報傳送出去。
四、網橋的配置
在linux裡面使用網橋非常簡單,僅需要做兩件事情就可以配置了。其一是在編譯核心裡把config_bridge或condig_bridge_module編譯選項開啟;其二是安裝brctl工具。第一步是使核心協議棧支援網橋,第二步是安裝使用者空間工具,通過一系列的ioctl呼叫來配置網橋。下面以乙個相對簡單的例項來貫穿全文,以便分析**。
linux機器有4個網絡卡,分別是eth0~eth4,其中eth0用於連線外網,而eth1, eth2, eth3都連線到一台pc機,用於配置網橋。只需要用下面的命令就可以完成網橋的配置
brctl addbr br0 //(建立乙個網橋br0, 同時在linux核心裡面建立虛擬網絡卡br0)其中br0作為乙個網橋,同時也是虛擬的網路裝置,它即可以用作網橋的管理埠,也可作為網橋所連線區域網的閘道器,具體情況視你的需求而定。要使用br0介面時,必需為它分配ip位址。為正常工作,pc1, pc2,pc3和br0的ip位址分配在同乙個網段。brctl addif br0 eth1
brctl addif br0 eth2
brctl addif br0 eth3 // (分別為網橋br0新增介面eth1, eth2和eth3)
over...
1. linux 網路協議棧開發基礎篇(七)—— 網橋br0
網路基礎之網路協議篇
1 c s b s clientserver browserserver server端必須滿足的條件 1 穩定執行 網路 硬體 作業系統 服務端應用軟體 對外一直提供服務 2 服務端必須繫結乙個固定的位址 2 什麼是網際網路 兩大要素 1 底層的物理連線介質,是為通訊鋪好道路的 2 一套統一的通訊...
網路基礎之網路協議篇
我們知道兩個程序如果需要進行通訊最基本的乙個前提能能夠唯一的標示乙個程序,在本地程序通訊中我們可以使用pid來唯一標示乙個程序,但pid只在本地唯一,網路中的兩個程序pid衝突機率很大,這時候我們需要另闢它徑了,我們知道ip層的ip位址可以唯一標示主機,而tcp層協議和埠號可以唯一標示主機的乙個程序...
iOS開發網路篇 HTTP協議
ios開發網路篇 http協議 說明 apache tomcat伺服器必須占用8080埠 一 url 1.基本介紹 url的全稱是uniform resource locator 統一資源定位符 通過1個url,能找到網際網路上唯一的1個資源 url就是資源的位址 位置,網際網路上的每個資源都有乙個...