TCP/IP

中繼器 (Repeater)、集線器 (Hub)、橋接器 (Bridge)、交換器 (Switch) 原理與介紹

理解網路設備的關鍵在於:

釐清這些設備運作的 網路層級,與其 解決的問題

 
我很喜歡《Computer Network 5th by Andrew》的設備分層表 😃,
其綜合 OSI 與 TCP/IP 的參考模型,擁有良好的職責劃分:
 
device-layer
[註]:圖中僅為簡易情況,不包含如 L3,4 交換器…等設備
 
本篇將依此模型,逐層介紹以下常見設備:
中繼器、集線器、橋接器、交換器。
 


 

傳統乙太網路

先別說網路裝置了,你聽過 乙太網路 (Ethernet) 嗎?
 
乙太網路 可說是這 30 年來最廣泛的「有線區/廣域網路」技術!
一般所稱的網路線,即為用於乙太網路之「RJ45接頭+無遮蔽式雙絞線 (UTP)」。

此標準最初訂於 1983 年 IEEE 802.3,歷經了多個附加標準後,
從最初龜速的 10 Mbit/s,發展至今日超神速的 400 Gbit/s 太位元乙太網

是的你沒看錯,就是「G」,相當於一秒鐘能下載 46.57 GiB 檔案!

 
在理解現今的乙太網路技術前,先讓我們追本溯源至30年前吧!
 


 

匯流排拓樸 (Bus Topology)

傳統乙太網路 多採 匯流排拓撲 (Bus Topology)
 
ethernet-bus-topology
 

將一同軸電纜佈於建築物內,並透過 收發器 (transceiver) 將多台主機連結至此主幹網路,
其簡單、便宜的特性,在當時很快就得到廣泛的使用。

 
節點A 欲發送 乙太網路訊框 (封包) 給 節點D
只需在訊框的 目的位址 (destination address) 欄位,填上 節點D 的 MAC 位址
 
然而,因為 共享介質 的關係,傳統乙太網路是以 廣播 (broadcast) 方式進行傳輸,
儘管 節點A 只是想發送訊框給 節點D,線路上的『所有節點』也都將會收到,
除了有安全性的疑慮,這也帶來了許多問題 (稍後提及):
bus-broadcast
 
例如,若 節點C 想攔截經過的封包時,
只需透過以下指令 (Linux) 開啟 混雜模式 (promiscuous mode)
就能監控、甚至修改訊框內容:

ifconfig 介面名稱 promisc

 
本節小重點:

目的位址 僅為「邏輯上」的目的描述,不代表實體上的『傳輸方式』。
根據不同底層技術,單播位址 可能以點對點傳輸、也可能是以廣播傳輸。

 
 
[註]
系統通常會預設關閉 混雜模式,以避免處理原本應被忽略的封包,
你可以透過以下指令關閉混雜模式:

ifconfig 介面名稱 -promisc

 


 

中繼器 (Repeater)

由於「訊號衰減和時序」的問題,每個版本的乙太網路皆有 限制不同纜線之最大長度
為了支援大型的區域網路,這時便會使用「訊號放大器」 — — 中繼器 (Repeater)
 
中繼器 或稱 增益器、轉發器,是一實體層 (Physical layer) 設備,
用於雙向接收、調整、放大訊號,並傳到彼端的纜線上,
藉此改善訊號衰減問題,使纜線總長度得以擴展。
ethernet-repeater
 
另外,中繼器 也廣泛用於電話系統、無線網路…,
例如,你家若 3G/4G 訊號較差,就可能安裝一台 雙頻ICS中繼器:
ICS-repeater
Photo courtesy of 展連.
 
又或者家裡/辦公室隔間多、坪數大,使 Wi-Fi 訊號不良,
最簡單的做法就是裝一台 Wi-Fi 延伸器 (e.g., ASUS RP-N12):
ASUS RP-N12
Photo courtesy of ASUS.
 
 
[註1]:現今許多網路設備皆已內建中繼器功能。
[註2]:坊間以鋁罐自製的『Wi-Fi放大器』,屬於「集波器」而非中繼器 (無訊號放大功能)。
 


 

集線器 (Hub)

儘管 傳統乙太網路 佈線簡單,卻為日後維護帶來許多麻煩,
於是,便發展出實體層設備 — — 集線器 (Hub) 來統整主機,
有些還提供了 中繼器 (repeater) 的功能,稱為 主動式集線器!
 
ethernet-hub
Photo courtesy of Wiki.
 
集線器 是一 中央節點 (central node) 的概念,
新增主機僅需將網路線插到 連接埠 (port) 上,而移除主機也不過是把線移除,
這使得網路擴展、設備維護都容易許多,此種佈線模式稱為 星狀拓樸 (star topology)
star-Ethernet-topology
 
 
然而:

集線器 (Hub) 並沒有你想像的厲害 😂,
它早已絕版了!原因馬上就會提及。

 


 

碰撞網域 (Collision Domain)

還記得前幾節所提及的 匯流排拓樸 嗎?
 
傳統乙太網路是 多台主機共享相同介質,因此是以 廣播 (broadcast) 方式進行傳輸,
儘管 節點A 只是想發送訊框 (封包) 給 節點D,線路上的『所有節點』也都將會收到:

 
此時,若 節點C 也發送訊框,便會因 廣播 (broadcast) 的關係,
而與 節點A 之訊框 發生 碰撞 (collision),下場就是訊號被攪亂而發生錯誤 😢。
 
這就像一群人在「同一房間」同時發言,只會造成一片混亂與憤怒的小蓮,
其中,這個「房間」又被稱為 — 碰撞網域 (Collision Domain)
angry-lian
 
而使用 星狀拓樸 的 集線器 (Hub) 也沒好到哪去,它就像是將電路焊接在內部而已,
因此 集線器上的所有節點,皆位於同一 碰撞網域 (房間)
而 碰撞 (collision) 的發生,則從同軸電纜改到集線器內:
inside-hub
 

基於以上理由,集線器乙太網 被認為是實體上的「偽」星狀拓樸,
邏輯上仍屬於 匯流排拓樸 (bus topology)。

 
[註]:碰撞網域 在乙太網路中又稱為 網段 (Segment),
準確來說則是 Layer 1 (Network) Segment。
 


 

載波感測多重存取/碰撞偵測 (CSMA/CD)

因為存在 碰撞 (collision) 的問題,
我們需要一種方式來協調彼此的溝通,確保不打斷對方談話、不壟斷發言權,
例如,舉手以取得一定時間的發言權、輪流發言…等。
 
在 傳統乙太網路 中,這些『協調』標準皆訂於 資料鏈結層 (data link layer) 的子層,
— — 媒介存取控制 (media access control, MAC) 或稱 媒體存取控制,
其所採取的方法是 1-Persistent 式 載波感測多重存取/碰撞偵測 (CSMA/CD)
[註]:此處 media 是「介質」之意,而非平日的「影音多媒體」。
 
1-Persistent CSMA ,簡單來說就是「先聽再講」:

主機在發送訊框前,先感測媒介是否正被使用 (有人在說話),
若無,則立即傳送;否則,持續感測直到 閒置 (idle) 後再傳送。

 
由於存在「傳導延遲」的關係,載波感測之能力有限,
CSMA 無法免除碰撞發生,只能盡可能降低碰撞率。
因此,傳統乙太網路 還搭配 碰撞偵測 (CD)

持續感測媒介是否發生碰撞,
若偵測到碰撞,就中止傳輸並發送一 48 bit 的壅塞訊號,通知其他節點已發生碰撞,
最後,利用 二元指數倒退演算法 等待一適當的時間進行重傳。

 


 

交換式乙太網路

顯然 CSMA/CD 是治標不治本的方法,
不但速度慢、浪費頻寬使用率,也帶來佈線上的諸多限制。
 
既然發生碰撞是因為「節點們都位於同一『房間』(碰撞網域)」,
為了避免人多嘴雜,一個直覺的解決想法是:

「盡量」讓每個節點自己一個房間!

 
這個想法為乙太網路帶來了卓越的進步!促成了 1995 年的 高速乙太網路 (Fast Ethernet)
也為現代的 太位元乙太網 (Terabit Ethernet) 奠定穩固的基礎。
 


 

橋接器 (Bridge)

在乙太網路的演進中,首先出現的是 橋接器 (bridge)
當時主要用於 連接 多個匯流排拓樸之傳統乙太網路,成為『一個』大型乙太網路,
劃分區段的主要目的在於 切開碰撞網域,進而減少碰撞機率,提升平均頻寬。
 
圖中,共有四個碰撞網域 (一個區域網路):
 
bridge-demo
 
 

那麼何不多加幾個連接埠,將碰撞領域切得更細呢?

 
不久之後,多埠橋接器 (multiport bridge) 便被稱為 交換器 (switch)
也因此 橋接器 (bridge)交換器 (switch) 時常被視為相等的:

Cisco MS225-48 交換器
Cisco MS225-48 交換器

 
 
Andrew Tanenbaum 大師:

交換器 是「現代橋接器」的另一個名稱。其中的差異是行銷手法多於技術因素。

 
常看 IEEE 文件的話就會知道:
規範上的術語主要使用「橋接器」,實際上的裝置則多稱「交換器」。
 


 

交換器 (Switch)

交換器 (switch) 或稱 網路交換器 (以跟電話交換器做出區別),
是位於 資料鏈結層 (data link layer)[註1] 的設備,是交換式乙太網路的核心,
其目的是在 連接埠 之間轉送訊框,欲建置大型區網時,即可藉交換器連結彼此。
 
根據是否提供管理、監控、設置 (configure) 等功能,又分為:
網管型交換器 (managed switch)非網管型交換器 (unmanaged switch)
 
 
5-port-switch
Photo courtesy of D-Link.
 
你可以看到,小型交換器 (非網管型) 長得跟 集線器 (hub) 87% 像,
然而,內部結構卻是完全不同,其所有連接埠都是獨立處理的,邏輯示意圖如下:
inside-switch
 
這樣的目的就是為了:

讓每個 連接埠 (port) 都是獨立的 碰撞網域 (房間)。

 
[註1]:此處是指 Layer 2 Switch。
 
 

消除碰撞

由於交換器中 每個連接埠都是一個獨立碰撞網域
它就像 社區管理員 一樣,根據訊框的 目的位址 查表後送往指定的連接埠。
 
例如 (實際上還包括 VLAN 等欄位,稍後提及):

 
這意味著不再需要 CSMA/CD 機制 (因為不可能發生碰撞),
每一台主機隨時都可以傳送/接收 (全雙工),因此大大地提高了平均頻寬!
 
例如,節點A 傳送訊框給 節點E,由於採用 集線器 => 節點B, C, D, E, F 皆會收到,
若是 節點G 傳送訊框給 節點K,由於採用 交換器 => 只有 節點K 會收到
這不僅大大地提高了傳輸效率,也為安全性帶來許多保障。
hub-vs-switch
 
然而,許多時候 集線器 的「廣播」特性反而 容易 進行 除錯
幸好大多數 網管型交換器 具備 Port Mirroring 功能,以方便監控流量。
 
 

過濾 (filtering)

交換器並非總是連結著電腦主機,也可能是其他交換器、路由器、甚至集線器,
節點A 若欲傳送訊框給 節點D,由於採用 集線器 => 連接埠E 也莫名的收到了一份 😑:
 

 
如前一小節所述,交換器會根據訊框的 目的位址 查表,以送往指定的連接埠,
然而,訊框來源 與 目的位址 位於相同的埠號,這代表 節點A 與 節點D 位於同一區段:
因此交換器不會進行轉發,而是予以忽略、丟棄,此功能稱為 — — 過濾 (filtering)
 
注意:

能做到此點,全因 交換器 是 資料鏈結層 設備 (不同於集線器),
它看得懂訊框,因此毀損的訊框也會被過濾掉!

 
因此,大部分 網管型交換器 也具備了 安全性服務品質存取控制清單 (ACL)
根據 安全性 ACL 查表 (e.g., TCAM),能限制特定的 MAC 位址、連接埠 與 通訊協定…,
或依 服務品質 (QoS) ACL,給予不同訊框優先權,以進行優先轉送。
 
 

學習 (learning)

目前我們都假設交換器能藉由 轉送表 (forwarding table) 得知所有目的位址的埠號,
其實,交換器一開始並不會知道這些資訊!
 
傳統交換器的轉送表是靜態的,需透過手動建立表格來維護位址資訊,
顯然這種做法非常沒有效率,需三不五時進行修改以外,還很容易出錯。
 
mac-addr-table
 
因此,現今交換器大多採動態表格策略 (e.g., CAM):
表格最初是空的,每當有訊框 送進 交換器中,就記錄其 來源位址連接埠
此功能稱為 — — 學習 (learning)
 
當交換器欲轉發訊框時,便查詢表格中是否有該 目的位址 的對映埠號條目,
有的話,就直接轉發至該連接埠;否則,將採取 洪泛演算法 (flooding algorithm)

複製訊框並傳送到「除了來源埠以外」的「所有連接埠」。

[註]:暫不考慮 VLAN (稍後提及)。
 
此種情形稱為 單播洪泛 (unicast flood)

是指 交換器 (switch) 將 單播訊框 視為 廣播訊框 的潛在無意行為。

 
單播洪泛 (unicast flood),顧名思義,本質上還是單播,
若下個接收到洪泛訊框的交換器知道目的位址之埠號,
即可直接進行點對點轉送,這點與 廣播 (broadcast) 截然不同。
 
[註]
網管型交換器 通常還是會提供靜態 MAC 位址設定,
以支援其他網路規劃需求 (e.g., 無法學習到的 MAC 位址),
例如 Cisco 的 mac address-table static 指令。
 


 

廣播網域 (Broadcast Domain)

可千萬別忘了!乙太網路標準主要位於 實體層資料鏈結層
上述所有的「來源/目的位址」皆是 MAC 位址,而非網路層的 IP 位址,
認知此點才能有效釐清網路裝置間的差異!
 

 
MAC 位址,並非只有 單播位址 (unicast address),
另外還有 廣播位址 (broadcast address) 以及 群播位址 (multicast address)。
 
例如,節點A 欲傳送訊框給同一區網的所有裝置時,
僅需在訊框的目的位址欄位,填入 ff:ff:ff:ff:ff:ff (廣播位址),
若節點能透過 廣播 聯繫彼此,則稱它們位於相同的 廣播網域 (Broadcast Domain)
broadcast-domain
(由於位於同一廣播網域,節點B ~ 節點L 皆會收到訊框)
 
[註]
廣播網域 是 交換器 可直接轉送訊框的領域,又稱為 Layer 2 Segment。
 


 

廣播風暴 (Broadcast Storm)

儘管 交換器 (Switch) 能切割碰撞網域 (每個節點一個房間),
若節點們位於相同的 廣播網域 (broadcast domain) (社區),
它們都將被迫處理、丟棄 未知目的單播 (洪泛) 訊框,以及 廣播群播訊框
 
若訊框數量較多,將導致整體區網效能降低,
極端的訊框數量,更可能癱瘓網路,此情形稱為 — 廣播風暴
 
廣播風暴 (broadcast storm) 通常是因交換器之間的的連結 存在迴圈、並聯所造成,
這不一定表示拓樸方式是錯的,相反地,企業在實務上常需要這些備援鏈結,
以預防主交換器故障所造成的損失。
 
broadcast-storm
 
為避免交換器鏈結存在迴圈(loop),導致訊框被無止境的複製、轉送,
Radia Perlman 於 1985 年發明了著名的 生成樹協定 (Spanning Tree Protocol, STP)
隨後,IEEE 則引進了 RSTP (802.1w) 以及 MSTP (802.1s),以改善 STP 的收斂時間 (convergence time)。

事先預防 橋接迴圈 (bridge loop),比在迴圈形成後才去破壞它更加有效。 — David Hucaby

 
這些協定讓我們得以安心的配置備援機制:
它們能事先偵測到迴圈,並停用造成迴圈的備援鏈結 (封鎖埠),
確保僅在設備發生故障或拓樸結構改變時才啟用。
 
然而,若您是使用 非網管型交換器,最好還是乖乖檢查拓樸結構 😂,
無論如何,也要拔掉造成橋接迴圈的那條網路線,否則電腦會當到不要不要的。
 
若您是使用 網管型交換器,且能確保不可能產生迴圈,
也建議直接停用 (R)STP,以避免不必要的網路延遲。
 


 

何謂 區域網路 (Local Area Network)

談了這麼久,到底 區域網路 (LAN) 的定義是什麼呢?
 
就像 大數據 (Big Data)、成長駭客 (Growth Hacking)… 這些 流行術語 (Buzzword)
事實上,無論是 區域網路 (LAN) 或 廣域網路 (WAN) 都沒有一個嚴謹的定義與劃分。
 
區域網路 (LAN) 普遍是以「地理範圍」作為定義,例如一個住宅、辦公室 或 大樓,
顯然地,這種定義毫不嚴謹又模稜 (ㄌㄥˊ) 兩可。
試想,若同一辦公室內的兩個部門,被設置永遠不可能直接通訊,它們還算區網嗎?
 
Enterprise LAN
Photo courtesy of Cisco.
 
 
幸好,Cisco 網路大師 — Wendell Odom 給了 區域網路 一個狹義但具體的定義:

一個 區域網路 (LAN) 是由 相同 廣播網域 內的所有裝置所組成。
A LAN consists of all devices in the same broadcast domain.

 
這使我們得以清楚地描述 交換器 (Switch) 之行為,
並有利於介紹下述的 虛擬區域網路 (Virtual LAN)
系列文也將依此作為「區域網路」一詞之定義。
 


 

虛擬區域網路 (VLAN)

目前為止,我們都只討論「實體」的網路拓樸模式,
然而現實中,企業可能需根據部門劃分、流量管理…來劃分 區域網路 (LAN),
以反映出 企業組織架構 而非建築物內的實體設備配置。
 
若每次皆得因應組織變化調整實體機器佈線,過世的八戒會很傷心的 😢,
幸好,虛擬區域網路 (VLAN) 技術,使我們能對區網中的設備進行邏輯分群,
以協助組織更好地進行網路管理:

Photo courtesy of datacenterknowledge.
 
VLAN 的基本設定很簡單,
不過是依埠號 or MAC 來分配 VLAN ID 而已,其中 1 號 ID 是預設 VLAN,
基於資安考量,通常不分配給一般主機:
VLAN-GUI
[註]:Cisco Switch 可透過 switchport access vlan {vlan-id} 指令。
 
 

切割廣播網域

在前兩節的實體拓樸中,我們看到:「連結至相連交換器的設備,皆位於相同的廣播網域」,
意味著工作站的增加,將使整個區網的廣播訊框增加、效率下降。這可不是什麼好現象 🙁:
broadcast-domain
(圖中,每台主機皆得處理、丟棄 未知目的單播 (洪泛) 訊框,以及 廣播、群播訊框)
 
VLAN 則使交換器擁有了 切割廣播網域 的功能:

一個 VLAN 即是一個廣播網域。

[註]:別忘了區域網路之 定義
 
也就是,同一 VLAN 的成員僅能收到彼此的廣播,不同 VLAN 的成員則否。
(包括上述的單播洪泛也只會洪泛至同一 VLAN 中)
 
此外,由於交換器的任務是轉送 同一區域網路 中的訊框至對映連接埠,
而「不同 VLAN」的成員因為已位於 不同的 (虛擬) 區域網路
它們將 無法透過交換器直接通訊,只能藉由外部設備 或 第三層以上之交換器:
 
VLAN
 
如上圖 VLAN 10 中,節點A 若發送廣播訊框,將只有節點B 與 節點E 會收到,
且節點 A 將無法與其他節點進行直接通訊 (C, D, F~J)。
這種 VLAN 配置便適合用於同一部門 (A,B,E),卻被分派到別間辦公室的邊緣人阿E 😢。
 

VLAN 能有效地控制廣播流量範圍,以增進整體網路效率,
並確保區域網路的安全性、可維護性。

 
切割廣播網域 雖然能一定的隔離、舒緩 廣播風暴,
然而,對於 橋接迴圈 所造成之廣播風暴,只是 治標不治本
 
當然,這都是以 VLAN 部署良好為前提,
若 VLAN 配置不良,使 VLAN 跨越多層級、甚至到達企業的核心交換器,
只會讓廣播流量到處蔓延、消耗頻寬,導致整體效能降低 😨。
 
 

主幹 (Trunking)

傳統交換器欲組織「跨交換器」的 VLAN 是很麻煩的,
欲連接 3 個 VLAN,就得連接 3 條網路線至對映埠號 (圖 a),
幸好現今的 網管型交換器 皆已具備 主幹鏈路 (Trunk Link)

交換器轉送訊框時加上 VLAN 標籤,接收方交換器 解讀並移除標籤 (確保訊框相容性)。
而達到透過單一主幹鏈路,組織多個 VLAN (e.g., 802.1Q)。

 
VLAN-Trunk
 
 
此外,Trunk 對於 交換器 與 路由器 的連結也非常方便!
它允許我們使用一 主幹鏈路,即支援所有 VLAN 流量進出 路由器 (Router),
這種設計又稱為 單臂路由 (router-on-a-stick)
 
router-on-a-stick
 

使用 VLAN Trunk 時,務必小心連接埠之間是否開啟 Trunk 模式,
筆者看過許多錯誤案例,皆是因為不一致的 Trunking 狀態所引起。

 
 

VLAN 交換器

最後綜合上述,示例一常見的 VLAN 交換器轉送邏輯。
當一單播訊框抵達交換器:
 

  • 首先,依訊框正確性、存取控制清單 (ACL)、生成樹協定狀態 進行 過濾 (filtering)
    並決定訊框轉送的優先權、服務等級 (搭配入境佇列)。
  • 接著,得確認 來源 VLAN ID
    若是一般存取介面之 連接埠,就根據 VLAN 設定 查詢 ID,
    否則,若是 Trunk 介面,就根據 VLAN 標籤 獲取 ID。
  • 轉送表 根據 來源位址、連接埠號 (介面)、VLAN ID 進行 學習 (新增/更新)。
  • 根據 目的位址 以及 來源 VLAN ID 查表,以決定轉送介面 (搭配出境佇列),
    若存在,則轉送訊框至該介面;否則:

    將訊框從所有 相同 VLAN 埠未被生成樹協定封鎖埠 洪泛出。

 


 

總結

本篇主要討論同一 區域網路 內的通訊,並以乙太網路的演進闡述設備原理,
然而,大部分應用的開發上,都只涉及到 TCP/IP,而非針對底層的 MAC Address。
 
這正是協定堆疊所帶來的好處 (詳見 依賴倒置原則):

針對介面,而非底層實作。

 
不過,若欲建構穩健的大型網路系統,
唯有了解底層原理,才能知道架構如何實施、效能如何增進。
就曾遇過過開發者,寫個 Socket 卻連 public, private IP 都不會分,
當然,結局就是怎麼樣都連不上 😂。
 
那麼,跨區網的裝置又是如何進行通訊?
交換器 與 路由器的差異? IP 位址, MAC 位址 既生瑜何生亮?…
這些問題將在下篇進行說明 😉。
 
 

作者: 鄭中勝
喜愛音樂,但不知為何總在打程式 ? 期許能重新審視、整理自身所學,幫助有需要的人。

在《中繼器 (Repeater)、集線器 (Hub)、橋接器 (Bridge)、交換器 (Switch) 原理與介紹》中有 10 則留言

發表迴響