行動性製造的難題
到現在你已經認識了無線鏈路本身、Wi-Fi 的 MAC、蜂巢式架構,以及從 3G 到 5G 的躍進。那幾篇導讀都悄悄假設了一件真實生活拒絕成全的事:裝置會待著不動。但無線的全部意義,正在於你會走路、開車、搭火車。你一移動,兩個各自獨立的問題就冒出來,而把它們分開看很值得,因為它們住在不同的層、也有完全不同的解法。
第一個問題是局部而物理的:你一移動,通往你目前基地台或存取點的無線鏈路就變弱,附近另一個則變強。得有某個機制在談話進行到一半時,把你切換到比較好的那一個。這個切換叫做 交遞(handover),是鏈路層與接取網路的工作。第二個問題是全域而邏輯的:當你更換服務你的基地台時,你可能整個接到了網路完全不同的一塊,但網際網路其餘部分仍想用它早已知道的那個位址來找到你。讓你在漫遊時仍能被找到,叫做 行動性管理,而網路層的經典答案是 行動 IP。交遞是關於「保持接著空氣」;行動性管理是關於「在網際網路上保持找得到」。
交遞:把你從細胞傳到細胞
想像你在第三篇建起的蜂巢世界:一片蜂窩般的細胞,每個都有一座基地台,全都用線纜接回營運商的核心。當你搭火車越過細胞邊界時,你的手機不斷量測目前細胞、以及它聽得到的那些鄰居的訊號強度。當某個鄰居明顯變強、且持續夠久時——不是只閃一下,那會造成毫無意義的乒乓來回——網路便決定該把你搬走了。關鍵在於:在蜂巢式裡,決定權在網路,它用你的量測回報加上它自己對細胞負載的了解,所以它能把你導向一個有空位的細胞,而不只是最大聲的那一個。
- 你的手機持續量測它所服務細胞、以及它聽得到的鄰居細胞的強度,並把這些數字回報給網路。
- 網路判斷某個目標細胞更好(且有容量),並預先要那個目標為你保留資源。
- 網路向你的手機發出訊號,要它重新調諧到目標細胞;在短短一瞬間,新舊路徑重疊,所以幾乎不丟失任何東西。
- 你的流量經由核心被重新導向新的基地台,舊細胞釋放你的資源,而你的通話或下載不間斷地繼續。
Wi-Fi 的交遞謙卑得多。在一張存取點網中——比方一座校園、或一座只用一個 Wi-Fi SSID 覆蓋眾多 AP 的機場——你的筆電通常自己決定何時漫遊,而經典的 802.11 會讓它先從一個 AP 斷線、再與下一個重新關聯。那個空檔,加上重跑一次認證交握,可能讓流量停頓到足以中斷一通語音通話,這正是為什麼後來才加進了加速漫遊的標準。誠實的總結是:蜂巢式交遞由網路掌控、且被工程化成無縫,因為預期你會以高速公路的速度移動;Wi-Fi 漫遊則是事後栓上去的,遠更容易打嗝。
行動 IP:在你遊蕩時保住同一個位址
現在來到網路層那一半。回想階梯早期一個誠實的要點:一個 IP 位址命名的是網路中的一個「位置」——某條特定鏈路上的一個介面——不是一個人、也不是一台永久的裝置。位址是按網路發放的:你加入一個新網路時,通常會拿到一個新位址(常是透過 DHCP)。對一次全新的下載來說這沒問題,但對一條進行中的連線卻是場災難。你的朋友、你的遊戲伺服器、你的視訊通話,全都對你的舊位址開了一個工作階段。一移動、拿到新位址,那些工作階段現在全都在對著一個你已不在的地方說話。封包便摔在地上。
行動 IP 用一個美妙而簡單的點子解決它:給裝置兩個位址,再加一項信件轉寄服務。第一個是你的 本地位址(home address),永久而穩定,是世界認得你的那個——把它想成你的法定住家門牌。第二個是一個臨時的 轉交位址(care-of address),你在當下所在之處隨手撿起,就像入住一間旅館。你本地網路上的一件基礎設施——本地代理(home agent)——扮演那間知道你轉寄指示的郵局。每當你抵達一個新地方,你就把目前的轉交位址告訴本地代理,從此以後,它把任何寄到你本地位址的東西,往前轉送到你實際所在之處。
Correspondent Home Agent Mobile node
(your friend) (the post office) (you, roaming)
------------ ----------------- ---------------
sends to HOME addr ---> intercepts, then ---> receives at
198.51.100.7 wraps + forwards to care-of addr
care-of 203.0.113.42 203.0.113.42
reply ----------------------------------------------> can go direct
(often straight back to the friend's address)讓這一切隱形的把戲,是 隧道(tunneling):本地代理不改寫你的封包,而是把每一個都包進一個新的、定址到你轉交位址的 IP 封包裡——信封裡的信封,正是基礎那一級的封裝點子。你的裝置拆開外層信封,找到一個仍定址到它本地位址的封包,於是每一條連線都相信自己還住在家裡。不過要講誠實的但書:這種轉送增加了一段繞路(那個「三角」)、需要本地代理那套基礎設施,而經典的行動 IP 作為一個赤裸的通訊協定,在今日的公開網際網路上並未被廣泛使用。實務上,行動通訊業者在自己的核心裡用自家的錨點與隧道解決漫遊,而應用程式也愈來愈倚賴更高層的把戲。行動 IP 最好被當作「這個問題與其解法形狀」的乾淨經典模型來學。
為什麼你一移動,TCP 就跌跤
即使交遞與行動性管理都運作良好,仍有一個更深的不匹配,而它是整級的妙語收尾。經典 TCP 是為穩定的有線而設計的,它帶著一個你在壅塞那一級見過的頑固假設:一個遺失的封包意味著網路壅塞了。在有線上這幾乎總是真的——封包之所以遺失,是因為某個路由器的佇列溢出了。所以 TCP 面對遺失的反射動作,是假設網路滿了,並把它的壅塞視窗狠狠切減,大約砍成一半。那個反射在有線上恰恰正確,在空氣中卻恰恰錯誤。
在無線鏈路上,封包遺失的原因與壅塞毫無關係:無線電干擾、衰落、多重路徑、一瞬間的障礙物、一個隱藏終端在空氣中相撞。鏈路明明有的是空間——只是位元被弄壞了。但 TCP 分不出無線遺失與壅塞遺失;它看見一個缺席的確認,照樣把自己掐住。於是你得到最糟的結果:鏈路好端端、根本沒人壅塞,TCP 卻白白把發送速率減半、爬行起來。這正是 TCP 在無線上表現不佳的核心。交遞把它弄得更糟:一段交遞空檔在 TCP 眼裡像是一陣爆量遺失,所以即便完成了一次乾淨的交遞,仍可能觸發一場不必要的、自找的慢下來。
網路如何反擊?三族誠實的對策。第一,把遺失藏在 TCP 底下:無線鏈路層在本地、迅速地重傳被弄壞的訊框——用強力的 Wi-Fi 或蜂巢式錯誤更正、加上鏈路層 ARQ——讓多數無線電遺失在 TCP 察覺到任何缺口之前就被修好。第二,換掉演算法:像 TCP BBR 這種基於量測的設計,根本不把遺失等同於壅塞,而是以量測到的頻寬與來回時間來判斷路徑,這遠更適合一個善變的無線邊緣。第三,切開路徑:某些系統在基地台終結一條 TCP 連線,並在最後一跳上跑一個為無線調校過的通訊協定,讓有線那半段永遠看不見無線電的遺失。每一招都有幫助;沒有一招是沒有取捨的。
把整級串起來
退一步,看清這條弧線。你學到了為什麼空氣是個敵意的媒介——衰減、干擾、多重路徑、一個漂移不定的位元錯誤率——以及為什麼一具無線電在發送時無法偵測碰撞,這逼得 Wi-Fi 走上以 RTS/CTS 進行碰撞避免,而非有線乙太網路所享有的碰撞偵測。你認識了存取點、以及基礎建設模式對上隨意網路模式的抉擇、短距離用的藍牙,以及由細胞、基地台與核心構成的蜂巢式設計。你看到了 3G 到 5G 究竟改了什麼。這最後一篇補上了讓無線真正困難的那個維度:你不會待著不動。