同樣的外形,三種腦袋
上一篇我們認識了乙太網路與它的訊框——一個小信封,蓋上了來源與目的的 MAC 位址,也就是網路卡在出廠時燒進去的那組 48 位元名字。訊框知道自己要寄給誰,卻無法自己送達;中間總得有個東西,把它從抵達的那條線挪到能觸及目標的那條線。這個東西經歷了三個世代:集線器、橋接器 與 交換器。從外面看它們一模一樣——一個插滿連接埠、可以插網路線的盒子——但每一個裡頭的腦袋天差地別,而這份差別,正是現代區域網路如何變快、變安靜的整個故事。
先從集線器說起,這是最簡單的腦袋——其實根本沒腦袋。集線器是一台多埠中繼器:抵達任一連接埠的每一個位元,都被盲目地立刻複製到其他每一個連接埠,它根本不知道什麼是訊框或位址。它純粹在實體層工作,到處推送電氣訊號。把八台電腦插進一台八埠集線器,它的行為就完全像一條所有八台都夾在上面的長共用線。當電腦 A 送一個訊框給電腦 B,集線器並不是只送給 B;它也對著 C、D、E、F、G、H 一起喊。每個人都聽見每件事,而每個人的網路卡都得檢查目的位址,把不是寄給自己的訊框默默丟掉。
橋接器:一道有聰明門的牆
第一份真正的智慧,隨橋接器而來。經典橋接器只有兩個連接埠,坐在兩段以集線器相連的網段之間,像兩個房間之間的一道門。不同於集線器,它不是在原始電氣層工作;它讀取每一整個訊框,看位址,然後判斷這訊框到底需不需要過門。如果 A 和 B 在同一個房間(同一網段),它們的對話就留在那個房間裡——橋接器把門對它關著,於是另一個房間的人就有發話時間能彼此交談。只有真正要去對側的訊框才被搬過去。剎那間,每個網段都成了自己的碰撞網域,一邊熱鬧的閒聊不再從另一邊偷走發話時間。
橋接器怎麼知道哪些訊框該放行、哪些該攔住?它並沒有預先寫好一張誰住哪裡的地圖——那根本無從維護。它是靠學習,而且是靠觀察來學。這一個小把戲——看每一個抵達訊框的來源位址,並記住它是從哪個連接埠進來的——就是現代交換器一切作為的種子。橋接器其實就是只有兩個連接埠的交換器;當你把這個會學習的腦袋裝上許多連接埠與非常快的硬體,得到的就是交換器。
交換器如何學會每個人坐在哪裡
把交換器想成大樓櫃台的接待員,上班第一天誰都不認得。她唯一的工具是一本空白筆記本——MAC 位址表,也叫轉送表——以及一個鐵打的習慣:每當一個訊框經過她的櫃台,她就讀它的回郵位址(來源 MAC),記下它是從哪扇門(哪個連接埠)進來的。光是這個習慣就叫做 MAC 學習,它完全靠正常流量把筆記本填滿,沒有人需要設定任何東西。這張表只是一串配對:這個 MAC 位址住在這個連接埠後面。
- 一個訊框從某連接埠抵達。交換器讀它的「來源」MAC,記下「這個位址可由這個連接埠抵達」——並刷新一個計時器,好讓某裝置安靜下來或搬走後,過時的條目終究會逾時消失。
- 接著交換器看這個訊框的「目的」MAC,到表裡查它。
- 如果目的在表裡,它就只把訊框從那一個連接埠送出去。這正是重點:一次私下投遞,而不是大喊。
- 如果目的還不認得(或本身就是廣播位址),它就把訊框從除了進來那個以外的每個連接埠淹送出去——這是一次性的後備手段,讓學習趕上之前仍能送達。
- 當回覆送回來,它的來源 MAC 也教會交換器那台裝置坐在哪裡——於是從第二次往來起便能精準投遞,不再淹送。
MAC address table (after a little traffic): MAC address Port AA:AA:...:01 1 (host A) BB:BB:...:02 3 (host B) CC:CC:...:03 5 (host C) Frame A -> B : dest BB..02 is known -> send out PORT 3 only Frame A -> Z : dest unknown -> FLOOD to ports 2,3,4,5,... Frame A -> ff:ff:ff:ff:ff:ff (broadcast) -> FLOOD to all but port 1
為什麼交換器讓區域網路又快又安靜
因為交換器把每個訊框只送到一個連接埠,每個連接埠就成了自己私有的碰撞網域。每個連接埠各插一台電腦,那條連結就不與任何人共享——於是兩台裝置互相弄亂的老煩惱,乾脆消失了。這解鎖了 全雙工 運作:裝置可以在網路線裡兩對分開的線上同時收與發,就像一通雙方都能同時說話的電話,而不是老式 半雙工 對講機那種要輪流、開口前要先聽的規則。一條 1 Gbps 全雙工連結能同時雙向各跑 1 Gbps。半雙工與它那套碰撞偵測的舞步,如今是個歷史的稀奇玩意,多半只在交換器退回去和古董設備對話時才看得到。
這裡有個常絆倒人的誠實限制,而下一篇會狠狠用到它。交換器把一張區域網路切成許多分開的碰撞網域——但它「不會」拆開廣播網域。當一個訊框被定址到廣播位址(全為 1,ff:ff:ff:ff:ff:ff),交換器照設計就把它淹送到每個地方,與它相連的所有交換器也照辦;一個廣播會抵達整張交換網路裡的每一台裝置。這有時正是你要的——這正是一位新成員在任何私下對話開始之前,喊出「誰有這個位址?」的方式——但它意味著一張交換式區域網路對廣播而言,仍是一整片共享的大社區。要拆開廣播網域,得靠路由器或 VLAN,那正是接下來兩篇的主題。
迴圈、主幹,與綁成一束的纜線
交換器讓你能藉由一台台串接來搭建大型網路,但這份自由藏著陷阱。如果兩台交換器之間有兩條路徑——比方有人加了一條備援線——一個被淹送的廣播就可能永遠繞圈:交換器 X 把它淹給交換器 Y,Y 又淹回 X,繞了一圈又一圈,每繞一圈就加倍,直到網路被淹沒。乙太網路訊框上沒有「存活時間」欄位能阻止它,於是 生成樹協定(STP)登場。交換器們彼此通報、議定出一棵單一且無迴圈的活躍連結之樹,並刻意關掉多餘的連結,使任兩點之間恰好只存在一條路徑。如果某條活躍連結故障,STP 會察覺並把一條待命連結重新打開——於是你保有備援線的安全,卻沒有迴圈帶來的災難。
還有兩項交換器的超能力把整幅圖補齊,這裡先預告、之後再展開。第一,單一實體交換器可以切成數個彼此隔離的虛擬區域網路,也就是 VLAN——住在同一個盒子裡的分開廣播網域,於是財務與訪客就算共用硬體,也永遠看不見彼此的廣播。要在交換器之間的單一纜線上承載多個 VLAN,這條連結就成為使用 802.1Q 標籤 的主幹:每個訊框被插入一個小小的 VLAN 標籤,好讓對側交換器知道它屬於哪個 VLAN。第二,當交換器之間一條連結不夠用時,鏈路聚合 把數條實體連結綁成一條邏輯管道——總吞吐量更大,且一條線壞掉時自動切換。下一篇會把迴圈與廣播網域講得更深,再下一篇則整篇都在談 VLAN。
讓加入網路毫不費力的兩個幫手
交換器在 MAC 位址之間搬動訊框,但你電腦上的軟體想的是 IP 位址,不是 MAC。所以在主機 A 能把訊框送給同一張區域網路上的主機 B 之前,它得先回答一個問題:我知道 B 的 IP 位址——那 B 的 MAC 位址是什麼?這正是 位址解析協定(ARP)的工作。A 對整張區域網路廣播一個小小的問題——「誰有 IP 192.168.1.20?告訴我你的 MAC」——交換器把它淹送出去,只有那個 IP 的擁有者用自己的 MAC 回答,而 A 把這組配對快取起來,好讓它一段時間內不必再問。注意這正是為什麼即使在聰明的交換式網路上,廣播仍然重要:第一聲招呼必須是大喊,因為還沒有人知道這位陌生人坐在哪裡。
在那之前還有個雞生蛋的難題:當你插上線或加入 Wi-Fi,你的裝置一開始根本沒有 IP 位址,所以還無法送出一般流量。動態主機設定協定(DHCP)解決了這件事,又一次倚賴廣播。新成員對整張區域網路喊出一個請求;一台 DHCP 伺服器聽見,提供一份租約——一個 IP 位址、子網路遮罩、預設閘道(通往更廣世界的路由器),以及 DNS 伺服器位址——全打包在一起,有期限地租給你。這就是為什麼連上咖啡店網路你什麼都不必打就能用:ARP 與 DHCP,都建立在交換器忠實淹送的廣播之上,悄悄把你的裝置開口交談所需的一切交到它手上。本階最後一篇會一步一步走過完整的加入網路流程。