藏在一切底下的區域網路
到這裡你已熟悉那張分層的圖:應用程式把資料往下交,連結層把它包好上線,而某處的路由器再把它送過一個個網路。這一階把鏡頭一路推近到那棟大樓的某一層樓——區域網路,也就是同一間辦公室、同一個家、同一棟建築裡那群能彼此直接遞送資料的機器。而幾乎所有有線的區域網路,底下的技術都是乙太網路。當你插進牆上的網路孔,或當一台 Wi-Fi 無線存取點連回路由器時,那條線講的就是乙太網路。
乙太網路是第二層技術,意思是它只在同一個區域網路上的機器之間搬移資料,而且用的是 MAC 位址而非 IP 位址。每個網路介面出廠時都燒入一個全球唯一的 MAC 位址——六個位元組,通常寫成十二個十六進位數字,像 de:ad:be:ef:00:01。可以把 IP 位址想成那個能把信送到地球上任何一棟正確大樓的郵遞地址,而 MAC 位址則是辦公室門上的名字,負責把信送到這棟樓裡正確的那張桌子。乙太網路只管那扇門;要到達大樓是上一層 IP 的工作。
訊框:一個寫好位址的信封
乙太網路送出的一切都裝在一個單位裡:一個乙太網路訊框,一個丟到區域網路上、寫好位址的信封。網頁請求、檔案片段、影音封包——每一個在離開網路卡前都被包進一個訊框。最巧妙的地方在於,這個信封有固定的部分、固定的順序,所以任何交換器或網路卡都能用硬體全速讀它的前段,完全不必看懂裡面任何一個位元組。
[ preamble ][ dst MAC ][ src MAC ][ type ][ payload ][ CRC ]
8 bytes 6 bytes 6 bytes 2 bytes 46 .. 1500 bytes 4 bytes
0x0800
= IPv4 inside
dst aa:bb:cc:11:22:33 -> where it goes (read first, so a switch decides fast)
src de:ad:be:ef:00:01 -> who sent it (this is what a switch LEARNS from)從左到右走一遍。前導碼是一段重複的位元樣式,讓接收端的時脈鎖定進來的位元,結尾是訊框起始標記。接著是 6 位元組的目的 MAC(它要去哪)與 6 位元組的來源 MAC(誰送的)。2 位元組的型別欄位說明裡面裝什麼——值 0x0800 代表「一個 IPv4 封包」,於是接收端知道要把酬載往上交給網路層。酬載本身是真正的資料,介於 46 到 1500 位元組之間;那個 1500 位元組的天花板就是乙太網路的 MTU,也正是大檔案被切成許多訊框、而非一次送出的原因。最後是 4 位元組的 CRC(一個稱為訊框檢查序列的檢查碼),讓接收端偵測損毀。
從共用一條線到各走私人車道
1970 年代最早的乙太網路與今天截然不同。每台機器都接到同一條長長的同軸電纜上——一條大家共用的多戶電話線。只有一條線時,一次只能一台機器說話,若兩台在同一瞬間開口,訊號就碰撞、雙方都糊掉。乙太網路的解法是一條叫做 CSMA/CD 的禮貌規則:送出前先聽(載波偵測),若傳送途中偵測到碰撞就停止、等一段隨機退讓時間再重試。它能用,但共用纜線的機器愈多,碰撞愈頻繁,每台拿到的真實頻寬就愈少。
現代乙太網路安靜地把整個問題丟掉了。不再共用一條纜線,每台機器都有自己一條點對點連結通往交換器,傳送與接收各有獨立的線對。每個方向都有私人車道,根本沒有東西可碰撞,於是連結以全雙工運作——機器在同一瞬間又送又收,像電話通話兩人同時開口,而非對講機那樣輪流。一條 1 Gbps 的全雙工連結等於同時承載 1 Gbps 上行與 1 Gbps 下行。在這種連結上,CSMA/CD 不只是沒在用,而是根本沒必要:碰撞偵測沒有東西可偵測。
一個五十歲的格式為何勝出
這裡是乙太網路故事中安靜而了不起的部分。五十多年來它的速度從同軸電纜上的 10 Mbps 爬升到 100 Mbps、1 Gbps、10 Gbps,並在雙絞線與光纖上達到 100 Gbps 以上——千倍、甚至更多。然而訊框格式幾乎沒變:還是你上面看到的那個目的 MAC、來源 MAC、型別、酬載與 CRC。正是這份穩定讓它勝出。舊程式與新程式描述資料的方式相同,儘管底下的線路快了上千倍。乙太網路的標準是 IEEE 802.3,它熬過每一個更炫的對手,正因為它無聊地維持相容。
這裡正好該小心三個初學者常混在一起的詞。從 100 Mbps 爬到 1 Gbps 是更多頻寬——更寬的水管、每秒更多位元。那不等同於吞吐量(在扣掉額外負擔、錯誤、途中較慢的跳之後,你實際達到的速率),更絕不是延遲(一個位元抵達要花多久)。較快的乙太網路連結每秒送更多位元,但第一個位元並不會更早抵達——你無法贏過訊號在線路中的光速。更多頻寬「不會」削減延遲,而這個區別在你往上爬時會一再重要。
再一個誠實的提醒。因為乙太網路只在同一個區域網路上的機器之間遞送,它無法跨網際網路路由——那是上一層 IP 的工作。而這一階其餘的內容之所以存在,是因為光有一個赤裸的訊框還不夠。那個學習每個人坐在哪裡的交換器、那些阻止迴圈的規則、那個把一個實體區域網路切成許多個的方法——就是接下來四篇要講的。乙太網路是信封;這一階其餘的部分,是它周圍的那間郵局。
每個區域網路都需要的幫手
兩個小小的協定安靜地讓區域網路變得可用,現在就值得認識它們,因為其他一切都預設它們存在。第一個解決一個明顯的缺口:主機知道它想連到的 IP 位址,但乙太網路依 MAC 遞送、不依 IP。位址解析協定(ARP)就是那個翻譯員。它像是你知道某人的名字、卻需要他的座位號才能把紙條遞給他:主機廣播「誰有 192.168.1.20?告訴我你的 MAC」,唯一擁有那個 IP 的機器以它的 MAC 回答,主機把這個對應快取起來,然後才能組出那個訊框。
- 一台裝置加入區域網路,完全沒有任何設定。它廣播一個 DHCP Discover:「有伺服器在嗎?」
- 一台 DHCP 伺服器以 Offer 回覆:「你可以用 192.168.1.50,遮罩 255.255.255.0、閘道 192.168.1.1、DNS 192.168.1.1。」
- 裝置廣播一個 Request,接受那個提議。
- 伺服器送出 Acknowledgment 確認這份租約,裝置就上線了——全程約一秒。
那四步舞——記成 DORA——就是 DHCP,這個協定在裝置一加入時就自動把位址、子網路遮罩、閘道與 DNS 伺服器交給它,像旅館櫃檯立刻把房卡和樓層平面圖交給你。兩個誠實的提醒呼應了先前的階:這個位址是綁定於位置、暫時的租約,不是你裝置的永久名稱,所以同一台筆電在每個網路都拿到不同的 IP。而 ARP 和 DHCP 都未經驗證——主機會相信任何回覆——所以一個偽造的 ARP 答覆或一台流氓 DHCP 伺服器,可以悄悄劫持受害者的流量。便利、無形、又輕信:這就是你即將拆解的那個區域網路。