網路為什麼重要:分散式系統的五大需求
網路不是配角,是分散式系統的地基——它爛,系統就沒有一個環節能好
先認識「神經系統」:通訊子系統
回顧一下:分散式系統的元件只能靠傳訊息溝通協調,沒有共享記憶體可以抄近路。那麼,「訊息要怎麼真的送到對方那裡」,就變成一個獨立、龐大、值得單獨開一章講的問題。
負責把訊息真正送出去、送到對方手上的所有硬體與軟體,合起來叫做通訊子系統(communication subsystem)。它就像身體的神經系統——你看不到它,但少了它,其他部位再健康都動不了。
host(主機)是真正在用網路做事的電腦;node(節點)範圍更廣,連路由器這類交換裝置都算進去;subnet(子網)則是一群在同一個實體網路上、互相搆得到的節點。
這一章的重點很直白:網路的好壞,會直接決定整個分散式系統好不好用。所以我們最在意兩個效能指標,也是這個模組要講的第一件事。
直接讀原文:延遲和傳輸率到底怎麼定義
這幾句是課本對兩個效能指標最精確的定義,原文放左邊,白話導讀放右邊。
延遲,指的是「送出」動作執行之後,一直到資料「開始」抵達目的地電腦之前,那段等待的時間。
傳輸率,指的是傳輸一旦開始之後,兩台電腦之間資料移動的速度,通常用每秒多少位元來算。
於是有個公式:訊息傳輸時間 = 延遲 + 訊息長度 / 傳輸率。
分散式系統裡,行程之間傳來傳去的訊息很多都很小,所以延遲對效能的影響,常常跟傳輸率一樣重要,甚至更重要。
寄東西給朋友,你會在意兩件事:多久東西才開始動(延遲,就像寄一個空包裹要多久才到)、東西動起來之後跑多快(傳輸率)。寄一張小卡片,主要時間花在「多久才動」;寄一整箱書,主要時間花在「跑多快」。
同一個公式,大訊息和小訊息卻怕不一樣的東西
套用「訊息傳輸時間 = 延遲 + 長度 / 傳輸率」這個公式,把兩種極端情境拆開看,你會發現同一條公式在不同場景下,主導的那一項完全不同。
訊息長度很小,「長度 / 傳輸率」這一項幾乎可以忽略,傳輸時間幾乎全部由延遲決定。分散式系統裡到處都是這種短訊息(請求、回覆、確認),所以延遲往往比傳輸率更要命。
訊息長度很大,「長度 / 傳輸率」這一項變得很可觀,傳輸率反而成為主導因素。這時候延遲只是開場的一點點時間,真正決定總時間長短的是頻寬夠不夠大。
在輕度負載的區域網路上,傳一個短請求並收到短回覆,含系統開銷大約 0.5 毫秒;呼叫本機記憶體裡的物件卻只要不到 1 微秒——也就是說,存取網路資源比存取本機記憶體慢約一千倍。這就是為什麼好的分散式系統設計,會盡量減少遠端呼叫、把資料快取在近處。
網路不用「零錯誤」,把關交給懂需求的兩端
五大需求裡的第一項是可靠性(reliability)——但這裡有個反直覺的觀念:很多應用本來就能從通訊失敗中自行復原,所以網路不必保證完全無錯。
支撐這個觀念的,是端對端論點(end-to-end argument):錯誤的偵測與修正,常常最適合由「最了解需求」的兩端應用程式軟體來做,而不是硬塞給中間的通訊子系統。
你寄一份重要合約,郵局(網路)會盡力送到,但「對方真的收到正確版本了嗎」這件事,最可靠的做法是你和對方自己打電話確認,而不是要求郵局保證每張紙都完美無缺。實體傳輸媒介本身其實很可靠,錯誤多半發生在收送兩端的軟體——所以網路只要盡力而為就好,真正把關交給應用層。
第二項需求是安全(security)。大多數組織的第一道防線是防火牆(firewall)——它跑在組織網路入口的 gateway 電腦上,收下並過濾所有進出組織的訊息,依安全政策決定放行還是拒絕,在 intranet 與外部 Internet 之間畫出一條保護邊界。但防火牆會擋住很多分散式應用,所以更細緻的端對端安全,得靠加密技術;而讓行動裝置或外部節點能安全接入,就要靠VPN(virtual private network)。
招牌總結:現代網路被要求的五件事
隨著 Internet 商業化、用法爆炸性成長,網路被加上越來越嚴格的要求。這五張卡,一次把它們定格。
延遲和傳輸率共同決定訊息多快送達。情境例子:分散式系統裡飛來飛去的多是小訊息,延遲往往比傳輸率更關鍵;但傳大檔案(如影片)時,傳輸率才是主導。
可擴展性指系統扛得住規模爆炸性成長。情境例子:Internet 主機數量已逼近全球人口規模,可能達數十億節點,當年的定址與繞送機制竟撐住了,但仍需大改才能應付下一波成長。
網路不必保證完全無錯。情境例子:許多應用本來就能自行從通訊失敗中復原,依端對端論點,錯誤偵測與修正交給最懂需求的應用層軟體來做最恰當。
第一道防線是防火牆。情境例子:防火牆在 gateway 上過濾進出組織的訊息,但也會擋住分散式應用,所以還需要加密技術做端對端認證與隱私,行動裝置則靠 VPN 安全接入。
Mobility & QoS
筆電、手機常換位置,但 Internet 的定址繞送是為固定裝置設計的。情境例子:即時多媒體串流需要保證頻寬與有界延遲——這就是服務品質(QoS),一般 Internet 並不保證,所以即時視訊常會卡頓。
要把同一份訊息送給一群接收者時,多點傳送(multicasting)比一個一個分別寄送更省成本,還可能提供逐一寄送所缺乏的容錯特性——就像一次群發,而不是把同一封信影印很多份分開寄。
小試身手
抓住效能公式和五大需求,你就摸到「網路為什麼難搞」的骨架了。來兩題:
知道了網路要滿足哪些需求,接下來看看世界上到底有哪些網路在跑。往下捲。
從口袋到全世界:網路的種類
從口袋裡的藍牙耳機到繞地球一圈的骨幹網路,尺度差了十萬倍,原理卻一脈相承
網路的名字騙了你:它不只是講「多遠」
PAN、LAN、MAN、WAN 這幾個縮寫,乍看只是在講涵蓋範圍——隨身、樓內、城市、全球。但課本特別提醒:這些名字同時也代表不同的傳輸技術與底層協定,不是只有距離不一樣。
換句話說,LAN 跟 WAN 不是同一套硬體接得遠近而已——它們用的線材、交換方式、協定完全是兩個世界。這一站,我們就照著範圍由小到大,把有線的四種網路、對應的無線版本,一路看到能把它們全部揉在一起的 internetwork。
PAN 像你隨身攜帶的東西——手機、耳機、手錶,彼此相連就在你身上方圓幾公尺。LAN 像一棟辦公大樓內部,所有人共用同一條走廊,找人不用繞路。MAN 像一座城市的公共運輸,把市內各區用高頻寬纜線串起來。WAN 則像國際快遞網,包裹(封包)得經過一站站的轉運中心才能跨國送達。範圍越大,要轉的站越多,延遲也越高。
直接讀原文,旁邊就是白話
這是課本介紹網路種類與 internetwork 概念最核心的幾句話。原文放左邊,白話導讀放右邊。
有些網路名字容易讓人誤會——看起來只是在講範圍大小,其實它們同時也在指底層用的傳輸技術與低階協定,兩者是綁在一起的。
我們把「由許多互連的網路組成、整合成單一資料通訊媒介」的東西,叫做 internetwork(網際互連網路)。
Internet 就是最典型的 internetwork:它是由數百萬個區域網路、都會網路、廣域網路組成的。
segment(網段)是服務某個部門或某一樓層的一段纜線。網段內部不需要繞送訊息,因為那段媒介直接把段內所有電腦連在一起。
名字講的是範圍,骨子裡講的是技術。看到 LAN、WAN 這種詞,你腦中要同時浮現「多遠」和「用什麼協定送」——這是這一整章反覆會用到的閱讀習慣。
招牌互動:把四種有線網路,拖到它的「身分卡」上
PAN、LAN、MAN、WAN 各自對應一組範圍/頻寬/延遲的數字。把下面四個標籤,拖到它最符合的描述上。
每經過一個 router 就多一段交換延遲,而且距離拉遠後連光速都成了極限——訊號從歐洲到澳洲約要 0.13 秒,經地球同步衛星更要約 0.20 秒。反過來,網段(segment)內部因為媒介直接相連、不用繞送,才能又快又低延遲。Ethernet 也從 10 Mbps 一路演進到 10 Gbps,穩坐有線 LAN 的霸主地位。
每種有線網路,幾乎都有一個無線分身
把前面四種有線網路的名字前面加個 W,幾乎就是對應的無線版本——範圍概念不變,只是拔掉了線。
對應例子是 Bluetooth。有線 PAN 其實不太重要——沒人想在身上纏一堆線,但無線版因為手機、平板、相機、音樂播放器越來越多,重要性反而持續上升。
對應例子是 WiFi(IEEE 802.11)。把大樓內的「共用走廊」拔掉線,變成靠無線電波覆蓋同一個範圍,原理相通,只是媒介換了。
對應例子是 WiMAX(IEEE 802.16)。把「城市級公共運輸」的概念搬到無線,讓都會範圍的資料也能不靠實體纜線傳送。
對應例子是 3G/4G 行動電話網路。把「跨國快遞網」的概念變成無線,讓手機不管你在哪裡,都還接得上這張全球尺度的網。
想像歐洲各國的鐵路系統,軌距、票券、語言都不一樣——這就是異質網路。要讓旅客拿一張票就能從巴黎搭到羅馬,需要一套共通編號、一套共通規則,還有轉乘中心幫忙接駁。internetwork 做的正是這件事——靠 router 與 gateway 接駁,再加一層軟體負責跨網路的定址與傳輸,效果就像在底層網路之上,覆蓋出一個「虛擬網路」,讓資料感覺自己走在一張完整的網上。
送出去的封包,不保證原封不動、依序、只到一次
設計分散式系統前,要先認清網路可能出的三種「包裹意外」——這是寫穩健程式的起點。
幾乎所有類型的網路,最常見的遺失原因都不是媒介本身壞掉,而是交換節點或目的地處理不及、緩衝區溢位而把封包丟棄。無線網路還會因為外部干擾更頻繁地掉包。
當每個封包各自獨立繞送——主要發生在 WAN——它們可能走了不同路徑,於是先送的反而後到。
通常是寄送方誤以為封包已經遺失而重傳,結果原件和重傳件都送到了目的地,變成兩份。
處理不及/緩衝溢位 → 遺失(所有網路最常見);外部干擾 → 遺失(無線網路特有);各自獨立繞送 → 亂序;誤判遺失而重傳 → 重複。知道資料會走哪種網路,你就能預期它有多快,也能預期它可能怎麼出錯。
小試身手
從口袋裡的耳機到繞地球的骨幹網路,你已經摸清了網路的種類與整合方式。來兩題:
認識了網路的種類,接下來要拆開來看,一個封包在裡面到底怎麼走。往下捲。
封包如何穿越世界:交換、分層與繞送
每一次你按下 Enter,一個訊息被拆成一堆封包,獨自找路穿越半個地球——這就是那段旅程
先把訊息拆碎:為什麼是「封包」,不是整包送出
所有電腦網路的根基,是 1960 年代發展出來的封包交換(packet switching)技術。它讓送往不同目的地的封包共用同一條鏈路——這跟傳統電話用的電路交換完全不同。
傳訊息前,會先把它切成一個個封包(packet):一段受限長度的位元序列,外加足夠的定址資訊(來源與目的地)。為什麼要限制封包長度?一是讓每台電腦都能配置足夠的緩衝區容納最大可能的封包;二是避免一則長訊息霸佔通道,讓其他人苦等通道空出來。
broadcast(廣播)不做任何交換,全部喊給每個人聽,由接收者自己挑出寄給自己的——像里長拿大聲公廣播;circuit switching(電路交換)像打傳統電話,先拉一條專線獨佔到底,沒講話時線路也空著浪費;packet switching像郵政系統,一站站存轉發;frame relay(訊框中繼)則像高速分揀帶,只看行李前幾個字就邊滑邊轉。
通訊是非同步的:訊息會在不定的延遲後抵達,因為封包穿越網路所需的時間會變動——沒有人能保證「這包一定幾毫秒後到」。
直接讀原文:store-and-forward 到底在等什麼
這段原文解釋了為什麼「先存再轉」的網路會有延遲下限,以及 frame relay 怎麼繞開這個限制。原文放左邊,白話導讀放右邊。
存轉發網路不像電路交換那樣「先接通、用完再拆線」,它單純把封包從來源一路轉送到目的地。
每個抵達節點的封包,會先被存進節點的記憶體,再由程式處理、送上下一條線路,轉給離終點更近的下一個節點。
這段轉發延遲跟封包大小、硬體速度、當時流量都有關,但延遲的下限是頻寬決定的——因為整個封包必須先收完,才能往下轉發。
就算是很短的封包,在 Internet 上也常要花到 200 毫秒才抵達。這對電話、視訊會議這類即時應用太慢了,它們需要低於 50 毫秒才能維持高品質對話。
frame relay 的交換節點只看封包前幾個位元就決定怎麼轉,整包不會被完整存下來,而是像一段短短的位元流「穿過」節點。
「先收完整包才能轉發」→ 延遲下限被頻寬鎖死 → 200 毫秒對打電話太慢 → 於是才有 frame relay「看前幾位元就轉」的解法。每一步都是被前一步逼出來的。
要合作,先講好規則:protocol 與分層
protocol(協定)是一組眾所周知、用來讓程式間溝通的規則與格式,重點就兩件事:訊息交換的順序該怎麼走,以及訊息中資料的格式長怎樣。有了共通協定,分散式系統的各個元件就能各自獨立開發、用不同語言寫、跑在不同架構的電腦上,仍能互通。
網路軟體排成一層層的階層(layering)。每一層對上層提供一個服務介面,透過本地程序呼叫和上下層溝通——看起來像是「同層直接對話」,其實資料是一層層往下傳、往上收。最底層是實體層(physical layer),由纜線、光纖、無線等媒介與訊號電路組成。
encapsulation(封裝)是分層的核心動作:你寫了一張卡片(應用層訊息),先裝進一個寫了收件人名字的小信封,再套一個寫了郵遞區號的大信封(加上 port),最後貼上國際運送標籤(加上 IP 位址)。每個信封上的標頭,都告訴接收端「裡面那層該交給誰處理」。
OSI 七層:一張定義協定的藍圖
ISO 制定的 OSI 七層參考模型是定義協定的框架(不是某套具體協定):
依序負責滿足特定應用的通訊需求(如 HTTP、FTP、SMTP)、與機器無關的資料表示與加密(如 TLS)、可靠性與復原(如 SIP)。Internet 常把這三層合併成單一 middleware 層,或乾脆讓各應用自己處理。
處理訊息、把它定址到 port,Internet 的代表是 TCP、UDP。Internet 把 session 與 transport 整合在一起。
依序負責在網路間傳封包與繞送(IP)、在直接相連的節點間傳封包(Ethernet MAC)、用類比訊號傳位元(Ethernet 基頻訊號)。
分層雖然簡化了介面,但有實際的效能成本:N 層協定傳一個訊息,要轉移 N 次控制權、複製 N 份資料(封裝),導致實際傳輸率遠低於網路頻寬。模組化與效能,永遠是要拿東西去換的。
招牌互動:跟著一個封包,走一趟完整旅程
下面是一個封包從來源電腦出發,經過兩個路由器,最後抵達目的電腦的完整過程。按「下一步」,同時留意兩件事:封裝怎麼一路往下疊 header,store-and-forward 怎麼讓每個 router 先收完整包才轉發。
router1、router2 就是沿途的分信站:每一站都要先把整個包裹收下、蓋章、放進分類架(store),才能決定下一站送去哪(forward)。這正是「即使短封包也常要 200 毫秒才到」的原因——每一站都要付出這段收包裹的時間。
送到「對的電腦」還不夠:定址、分段、繞送
資料要送到對的電腦、再送到對的程式,需要兩層定址:network address(網路位址)唯一識別一台主機(如 IP 位址),port(埠)則是主機上由軟體定義的目的點,連到特定程序。合起來,transport address = 網路位址 + port number。像找一棟大樓(IP)還不夠,你還要知道是哪個房間(port)才找得到人。
網路層封包的資料欄位有最大長度,稱 MTU(maximum transfer unit),Ethernet 的 MTU 是 1500 bytes。若訊息超過 MTU,就得分段成多個封包,附上序號以便在目的地重組。
datagram(資料報)像寄明信片——每張都寫上完整地址,一槍打完就不留記錄,每張可能走不同路線、可能亂序到達(IP、Ethernet 都是這種)。virtual circuit(虛擬電路)則像先訂好一條固定路線再開始寄,之後每個封包只帶編號,不必再寫完整地址(ATM 是代表)。這跟 transport 層的連線/無連線是不同層的概念,別搞混。
除了 Ethernet 這種全連接的 LAN,其他網路都需要 routing(繞送)。router 在每個連接點,負責把封包逐跳(hop by hop)轉到目的地。繞送演算法要做兩件事:決定每個封包走哪條路(要快又有效率),以及動態更新對網路的認識(依流量與故障)。
經典的 distance-vector(距離向量)演算法這樣運作:每個 router 維護一張繞送表,每列記著「到某目的地,下一站走哪條 link、成本多少(幾跳)」。router 用 RIP 定期把自己的表摘要送給鄰居,收到鄰居的表時,若有到新目的地的路就加進來,若有更低成本的路就更新,成本記得 +1(因為多走一跳才能到鄰居)。當某 link 故障,就把相關成本設為無限大並廣播出去,最終會收斂到新的最佳路。Internet 中 RIP 每 30 秒傳一次以維持穩定。
鄰居告訴你「我到某處要 2 跳」,但那是從鄰居家出發算的——你自己還得先走一步才能到鄰居家,所以你的成本要在鄰居的數字上再加 1。這一個小加法,就是整張繞送表逐步收斂到正確答案的關鍵。
路會塞車,也有辦法接異質網路、偷渡穿山
網路容量受限於鏈路與交換節點的效能。當負載逼近容量,封包會在節點排隊,佇列越長到最後緩衝區滿,節點就只能丟棄封包——經驗法則是當負載超過約 80% 容量,總吞吐量反而會因丟包而下降。congestion control(壅塞控制)的核心想法:與其讓封包跑到塞爆的節點才被丟掉,不如在更早的節點先攔住。
要把許多異質子網接成一個 internetwork,需要幾種角色不同的裝置:router跨網路轉送封包,像城際轉運中心;hub(集線器)單純把多段 Ethernet 接起來,收到的封包全部轉送到每一段,像老式廣播喇叭;switch(交換器)只把封包送到目的主機所在的網段,減少其他網段的壅塞,像聰明的分信員。
有時兩個相同型別的網路,中間隔著一個「異族」網路。tunnelling(隧道)就是一個軟體層,把封包封裝後讓它穿越這片異質環境——就像山的兩邊是同一條公路,中間隔著一座山,挖一條隧道,車子就能直接開過去,完全不必管山裡的地形。IPv6 遷移就是典型案例:IPv4 大海中有 IPv6「小島」,島之間把 IPv6 封包封裝進 IPv4 封包偷渡過去。
把下面這些詞,拖到它對應的描述上:
小試身手
從封包切割、分層封裝到繞送壅塞,這一路的旅程你都跟上了。來兩題:
封包怎麼走的原理清楚了,接下來看 Internet 上真正在跑的那套協定。往下捲。
TCP/IP 的內幕:IP、TCP、UDP、DNS、NAT
IP、TCP、UDP、DNS、NAT——五個縮寫撐起了整個網際網路,拆開來看其實都很直覺
先認識這個大家族:TCP/IP 協定族
網際網路源自 1970 年代的 ARPANET,核心就是TCP/IP 協定族。三個關鍵角色:IP 負責把封包從一台電腦送到另一台電腦;TCP 在 IP 之上提供可靠、有序的串流;UDP 則是不保證遞送的輕量選項。
TCP/IP 能成功整合各種各不相同的網路,關鍵就一句話:獨立於底層傳輸技術。不管下面跑的是 Ethernet、ATM,還是透過 PPP 接的電話線,IP 都能跑在上面——使用者與程式看到的,永遠是「單一虛擬網路」,底層的雜亂被藏得乾乾淨淨。
TCP/IP 就像一套統一的國際包裹規格——不管底下是卡車、火車還是飛機運送,只要包裹符合這套規格,收件流程完全一樣。你不需要知道貨物半路換過幾次交通工具,IP 已經把這些差異都封裝掉了。
而 IP 提供的服務,書上講得很直白:best-effort(盡力而為)遞送——不保證送達,封包可能遺失、重複、延遲或亂序,但這些狀況只會在底層網路真的出問題、或緩衝區滿了才發生。可靠性這件事,IP 自己不管,留給上層的 TCP 去處理。
直接讀原文:TCP/IP 為什麼能吃遍各種網路
這幾句話正是 TCP/IP 成功的核心理由,也是 IP 那份「不打包票」服務的原始定義。原文放左邊,白話導讀放右邊。
TCP/IP 能成功,關鍵在於協定完全不依賴底層是什麼傳輸技術——這讓網際網路可以由許許多多長得完全不一樣的網路和資料連結拼起來。
使用者和應用程式看到的,永遠只是「一個」支援 TCP 和 UDP 的虛擬網路,底下的雜亂完全被藏起來。
IP 提供的遞送服務被稱為「不可靠」或「盡力而為」,因為它從不保證封包一定送達。
封包可能遺失、重複、延遲,或者送達順序亂掉——但這些狀況只會在底層網路真的壞掉、或目的地的緩衝區滿了時才發生。
IP 故意把自己設計得「簡單又不負責」——不保證送達,只求盡力。可靠性這件麻煩事,交給上層的 TCP 去扛。這種「下層只求快、上層才求穩」的分層哲學,貫穿整個 TCP/IP 的設計。
IPv4 位址像門牌,但門牌快發完了
IPv4 位址是一個 32 位元的數字,寫成四個十進位數字、用點分隔(例如 138.37.88.230)。它分成兩部分,就像門牌:network ID(你在哪個「社區」)和 host ID(社區裡的哪一戶)。
當年設計位址空間時,訂了三個要求:要普遍(universal,任何主機都能寄給任何主機)、要有效運用位址空間、要利於繞送。1978–82 年設計 TCP/IP 規格時,2 的 32 次方——約 40 億個位址——被認為綽綽有餘,畢竟這數字跟當時全球人口差不多。沒想到,早期把位址切成 class A、B、C 的分法(大網路用 A、中網路用 B、其他用 C)後來證明非常沒效率:網管沒辦法預測未來主機數量,遇到不確定時就傾向「多要」——結果位址空間被分得又快又浪費。
大約 1990 年,大家驚覺照當時的配發速度,IP 位址大概 1996 年就會用光。書中提到的三步對策是:開發全新大位址空間的 IPv6、改革配發方式的 CIDR、以及讓未註冊電腦間接上網的 NAT。這三招成功延後了危機。
CIDR:彈性切土地;NAT:一支總機號碼
舊的 class A/B/C 像建商只賣「大豪宅、中別墅、小套房」三種固定房型——需要 300 戶的社區,小套房(class C,最多 255 個)不夠,只好硬買一整棟中別墅(class B),結果一堆空房浪費。CIDR 打破這個限制:可以把多個連續的 class C 位址打包給一個需要 300 戶的子網,也能把一塊 class B 空間細切給多個子網。關鍵是在繞送表裡加一個mask(遮罩),寫法像 138.37.95.232/29——「/29」表示前 29 位元是網路部分,剩下 3 位元、也就是 2³=8 個位址,量身訂做給這個子網。
另一招是 NAT。家裡很多裝置,卻只有一個公開 IP(例如 83.215.152.95)。NAT 讓它們都用私有位址(例如 192.168.1.x),由 router 在出入口做翻譯:內部裝置送封包出去時,router 把來源換成自己的公開 IP,並用一個虛擬 port 編號記住是誰送的;外部回覆回來時,router 依目的 port 查表,還原成正確的內部裝置。
公司對外只有一支電話號碼(公開 IP),總機(router)靠分機號碼(port)把每通來電轉給正確的同事(內部裝置)。缺點也很像總機:外面的人沒辦法直接打進某個分機——內部電腦預設難以當伺服器被外面主動連入,除非手動設定 port 轉發。
招牌互動:TCP 與 UDP,兩種完全不同的寄送哲學
IP 只負責「電腦對電腦」,但程式要的是「程式對程式」。TCP 與 UDP 這兩個傳輸協定,透過 port number(16 位元整數)把訊息送到主機內的特定程序——它們代表兩種截然不同的哲學。
寫上去就丟進郵筒,便宜又快,無建立成本、無確認訊息。不知道對方有沒有收到,也不保證順序。適合「偶爾掉一張也沒差」的情境,例如即時遊戲座標、串流影格。UDP 幾乎就是 IP 傳輸層的複製品,只多了來源/目的 port、長度與一個選用的 checksum。
寄出前要先雙方握手建立連線(connection-oriented)。每一集都編號(sequence number),對方依序收齊才往下看。收到會回確認(acknowledgement),沒收到的會重傳。寄方還會看對方的「收看速度」調整節奏(flow control),不把對方淹沒。
要可靠、有序、不能掉資料——選 TCP,像檔案傳輸、網頁、郵件。要輕量、低延遲、容許偶爾掉包——選 UDP,像即時串流、DNS 查詢、線上遊戲。順帶一提,無線網路常掉包,TCP 的流量控制反而不太適合,這也是某些行動網路協定改用別的傳輸機制的原因之一。
招牌互動:DNS 怎麼把名字翻成號碼
人類記得住 www.amazon.com,記不住一串 IP 數字。DNS 就負責把網域名稱翻成 IP 位址。命名是階層式的(如 essex.ac.uk),反映組織結構,且與實體網路佈局完全無關。每個 domain 至少有兩台 DNS 伺服器,查不到的名稱就遞迴地向相關 domain 的伺服器發問,由右到左一段段解析。按「下一步」看一次查詢怎麼跑:
解析結果會被快取在處理原始請求的伺服器上,之後同網域的查詢就免再問別人。書上講得很直接:DNS 沒有大量使用快取根本行不通,因為「根」名稱伺服器幾乎每次都會被查詢,會形成嚴重的服務瓶頸。
搬家轉信服務,與三層防火牆
行動裝置每換一個地方就用 DHCP 拿新 IP 很簡單,但若要讓別人始終用同一個 IP 找到你(例如你在跑伺服器),就需要 MobileIP。
知道你目前在哪,幫你代收寄到「家用位址」的封包,再透過 tunnelling 封裝轉送出去。
在你新落腳處給你一個臨時的 care-of address,收到 HA 轉來的封包後拆開交給你。
監控並控制所有進出 intranet 的通訊:IP packet filtering 看位址與 port 放行或拒絕;TCP gateway 檢查連線正確性;application-level gateway 當應用程式的 proxy 逐一審核。
常見配置:用 router/filter 做 IP 過濾,再加一台bastion(堡壘主機)跑 TCP 與應用層 gateway;安全要求更高時,會用兩台 router/filter 把 bastion 夾在中間。延伸來看,VPN 則是用 IP 層的加密通道,把防火牆的保護邊界一路延伸到外部使用者或異地 intranet。
MobileIP 就像你搬家了,但希望寄到老家地址的信還是收得到——請「老家管理員」(HA)幫你轉信到新住處(透過 FA)。HA 甚至會把你的新地址告訴寄件者,讓支援 MobileIP 的寄件者之後直接寄過去,省去繞路。
小試身手
IP、TCP、UDP、DNS、NAT——這五個縮寫的關係抓穩了嗎?來兩題檢查一下:
協定的內幕懂了,最後用你我每天在用的三個真實網路技術收尾這一章。往下捲。
真實案例:Ethernet、WiFi 與 Bluetooth
從乙太網路的「先聽再講」到 WiFi 的「先喊再搶」,兩種搶麥克風的規則
一條線,大家搶著講話:Ethernet 的基本規則
Ethernet 1973 年生於 Xerox PARC,是史上第一個高速區域網路。它屬於contention bus(爭用匯流排)——所有主機共用同一條線,管理這條共用媒介的協定叫 MAC(medium access control)。
通訊方式是廣播封包:所有站持續「聽」媒介,比對封包裡的目的地位址與自己的硬體位址,符合才收下,否則忽略。每個網路介面都有一個全球唯一的 MAC 位址(48 位元),由製造商從 IEEE 配發的範圍寫死進硬體——後來 WiFi、Bluetooth 也沿用了這套位址系統。
想像一間會議室沒有主席,大家共用「空氣」這個媒介說話。要避免吵成一團,只能靠三條土規則:先聽再說、邊講邊聽、撞到就隨機冷靜一下再重講。這正是 CSMA/CD 的全部精神。
直接讀原文,旁邊就是白話
這幾句是課本描述 Ethernet 廣播特性與 MAC 位址機制的原話。原文放左邊,白話導讀放右邊。
CSMA/CD 網路的通訊方式,是把資料打包成封包,廣播到傳輸媒介上。所有站都持續「聽」著媒介,等著收屬於自己的封包。
每一站的控制器硬體都會收到每個封包的副本,並拿封包裡的目的地位址跟自己寫死的本地位址比對——不符的就忽略,符合的才往上交給本機。
這套機制讓每張 Ethernet 硬體介面,都能由製造商賦予一個獨一無二的位址,確保任何互連的 Ethernet 網路裡,所有站的位址都不會重複。
這些位址被稱為 MAC 位址,因為它們是給媒介存取控制層使用的。事實上,這樣配發出來的 MAC 位址,後來也被 IEEE 802 家族的其他網路類型採用,包括 802.11(WiFi)與 802.15.1(Bluetooth)。
訊號確實送到每一台機器,但只有位址對上的那台會「收下」,其他人聽到了、比對完,就當沒聽到。這就像會議室裡有人喊某個名字,只有被叫到的人會抬頭應聲。
招牌互動:兩台電腦同時搶著講話,會發生什麼事
下面兩台電腦同時偵測到線路空閒、同時動手發送。按「下一步」,看 CSMA/CD 怎麼發現碰撞、又怎麼各自退讓重試。
Ethernet 封包介於 64–1518 bytes。為什麼要有最小 64 bytes?因為訊號從一端傳到另一端要花時間 τ。若封包太短,某站可能在訊號傳到對面之前就已經傳完了——碰撞根本偵測不到,資料悄悄毀損卻沒人發現。最小長度,是為了保證碰撞一定會被抓到。
爭用有多痛?switch 怎麼幾乎把它消滅
碰撞的「機會窗口」是封包開始傳送後的 2τ。對一公里長的纜線,τ 不到 5 微秒,所以碰撞機率其實很低,通道利用率可以做到 80–95%。但一旦超過 50% 利用率,爭用造成的延遲就會變得明顯——大家都在等空檔插話,會議室越吵越沒效率。
所有主機共用同一段媒介,人多嘴雜。流量一大,碰撞跟著變多,效率被爭用啃掉一大塊。
每台主機獨享一個網段,網段上只會出現寄給它的封包。若流量來自單一來源,幾乎沒有爭用——效率逼近 100%,延遲也穩定。
把大通鋪改成每人一間獨立房間,互不干擾——爭用只可能發生在 switch 內部,而 switch 通常能並行處理多個封包。這正是輕載的交換式 Ethernet 能接近 100% 效率、延遲穩定,甚至被即時/QoS 關鍵應用採用的原因。
換成無線之後,「邊講邊聽」突然不管用了
IEEE 802.11(WiFi) 想把 Ethernet 那套載波偵聽原理直接搬到無線上,卻撞上一個致命前提被打破:訊號強度在空間中並不均勻。這讓碰撞偵測失效,主要有三種狀況:
兩站都想送給同一個基地台,但彼此中間有障礙物、互相聽不到對方——於是貿然同時開口,在接收端撞在一起。
電磁波依平方反比衰減,距離一遠就聽不到對方——載波偵聽跟碰撞偵測雙雙失效。
自己發出的訊號永遠比遠方傳來的訊號強得多,會蓋過遠方訊號,所以即使同時傳送也偵測不到碰撞。
既然「邊講邊聽偵測撞車」在無線行不通,802.11 改用 CSMA/CA(碰撞避免,不是偵測):想送的人先送一則 RTS(request to send),註明要用多久;接收方回 CTS(clear to send),重述這段時長。聽得到寄送方的站、聽得到接收方的站,都會安靜下來——這正好解決了隱藏站與衰減問題。順帶一提:Bluetooth 走的是完全不同的路線——它是低功耗、短距的個人區域網路,專門用來連接你口袋裡的隨身裝置。
RTS/CTS 怎麼運作:先舉手,再開口
生活比喻:吵雜大廳裡,你先舉手大聲說「我要講 30 秒」(RTS),對方回喊「好,你講吧,30 秒」(CTS)——附近的人就先閉嘴,連聽不到你、但聽得到對方回應的人,也會因為聽到 CTS 而安靜下來。這正好解決了隱藏站與衰減問題,因為安靜的範圍是「收送兩端附近」,不只是你自己周圍。
CSMA/CD 是「撞了才知道」——事後偵測,適合訊號強度均勻的有線環境。CSMA/CA 是「先講好、再動手」——事前用 RTS/CTS 預約,適合訊號強度不均的無線環境。同一個 carrier sensing 的精神,換了個做法解決不同的物理限制。
Bluetooth(IEEE 802.15.1)跟 WiFi 定位完全不同:
範圍約 150 公尺、頻寬高(可達 54 Mbps 以上),目的是取代有線 LAN、讓裝置上網,耗能也較高。
範圍約 10–30 公尺、頻寬低(約 0.5–2 Mbps),目的是連接手機、耳機、鍵盤等隨身裝置,低功耗是它的招牌。它通常不直接接上 router,因此無法直接上 Internet——舞台就是裝置與裝置之間的近距連線。
小試身手
從 Ethernet 的「先聽再講」到 WiFi 的「先喊再搶」,兩題驗收一下:
這一章從分散式系統為什麼離不開網路出發,走過區域網路與廣域網路的種類、封包怎麼被切開分層繞送穿越世界,最後用你我裝置裡都在跑的三個真實協定收尾——Ethernet 用「先聽再說、邊講邊聽、撞到就退讓」的 CSMA/CD 管理有線的共用媒介;WiFi 因為訊號強度不均勻打破了這套前提,改用「先預約時槽」的 CSMA/CA;Bluetooth 則走一條完全不同的路,做低功耗短距的個人裝置連線。同一個問題——「一群人共用一條通道,該怎麼決定誰先講話」——在不同物理限制下,長出了不同卻一脈相承的解法。
從網路為什麼重要,到封包如何跨越世界,再到 Ethernet、WiFi、Bluetooth 這三個你天天都在用的真實案例——第三章到這裡告一段落。這些關於「怎麼把訊息送到對方手上」的底層機制,正是後面章節談通訊協定、分散式演算法時,一切能夠成立的地基。準備好,翻到下一章,繼續往上蓋。