絡(luò)是怎樣連接的》第三章精讀:物理層信號(hào)、交換機(jī)轉(zhuǎn)發(fā)與路由選路)
1. 從網(wǎng)線插上就能上網(wǎng)說起第三章到底在講什么很多人翻《網(wǎng)絡(luò)是怎樣連接的》這本書前兩章看得挺順到了第三章突然卡住——不是因?yàn)殡y而是因?yàn)檫@一章開始往下鉆了。前兩章講的是從瀏覽器發(fā)出請(qǐng)求、經(jīng)過協(xié)議棧、到達(dá)局域網(wǎng)這一路的宏觀流程讀者還能靠生活經(jīng)驗(yàn)?zāi)X補(bǔ)第三章則一頭扎進(jìn)了信號(hào)在網(wǎng)線、光纖、無線電波里到底是怎么跑的以及交換機(jī)、路由器這些設(shè)備內(nèi)部到底在干什么。抽象層級(jí)一下子降到了電氣特性和硬件轉(zhuǎn)發(fā)邏輯很多人就在這里掉隊(duì)了。我最初讀這一章時(shí)也有同樣的感受明明知道數(shù)據(jù)從A傳到B但書里開始講電壓、光脈沖、雙絞線為什么要擰、MAC地址表怎么學(xué)習(xí)腦子里的模型就開始打架。后來我換了個(gè)思路——把第三章當(dāng)成拆快遞來看前面幾章講的是快遞單怎么填、怎么送到分揀中心第三章講的是包裹在傳送帶上怎么被識(shí)別、怎么被分流、怎么被裝車。這個(gè)類比一建立整章的脈絡(luò)就清楚了。第三章的核心其實(shí)就三件事第一信號(hào)如何在物理介質(zhì)上表示0和1第二局域網(wǎng)內(nèi)的交換機(jī)如何根據(jù)MAC地址把幀送到正確的端口第三路由器如何在不同網(wǎng)絡(luò)之間做轉(zhuǎn)發(fā)決策。這三件事層層遞進(jìn)從電信號(hào)到二層轉(zhuǎn)發(fā)再到三層轉(zhuǎn)發(fā)構(gòu)成了數(shù)據(jù)真正動(dòng)起來的完整鏈條。關(guān)鍵詞可以概括為物理層信號(hào)編碼、雙絞線與光纖、MAC地址與交換機(jī)轉(zhuǎn)發(fā)、路由表與最長(zhǎng)前綴匹配、ARP解析。這篇筆記適合兩類人一類是正在讀這本書、卡在第三章需要一份人話版梳理的讀者另一類是已經(jīng)工作、但發(fā)現(xiàn)自己對(duì)數(shù)據(jù)包到底怎么從網(wǎng)卡出去始終只有模糊印象的開發(fā)者。我會(huì)把書里的核心邏輯拆開補(bǔ)上書中一筆帶過但實(shí)際很關(guān)鍵的細(xì)節(jié)再分享幾個(gè)我踩過的理解坑。讀完之后你至少能對(duì)著一個(gè)抓包結(jié)果說清楚這個(gè)幀從網(wǎng)卡到交換機(jī)再到路由器每一步發(fā)生了什么。2. 信號(hào)是怎么變成0和1的物理層的編碼邏輯2.1 雙絞線為什么要擰差分信號(hào)與抗干擾書里提到網(wǎng)線是雙絞線很多人記住了擰在一起這個(gè)結(jié)論卻沒搞懂為什么。這里的關(guān)鍵是差分信號(hào)傳輸。一根網(wǎng)線里真正傳一路數(shù)據(jù)用的是兩根線它們傳輸?shù)氖菢O性相反的同一個(gè)信號(hào)。接收端不看某根線對(duì)地的絕對(duì)電壓而是看兩根線之間的電壓差。這么做的直接好處是抗共模干擾外界電磁噪聲會(huì)同時(shí)耦合到兩根線上兩根線的電壓一起升高或降低差值不變接收端照樣能正確判讀。那擰又是為了什么兩根線如果平行走它們受到的干擾不完全相同差值就會(huì)被破壞。把兩根線按固定節(jié)距絞合能讓它們交替地靠近和遠(yuǎn)離干擾源從而讓干擾在兩線上盡可能均等。節(jié)距每絞一圈的長(zhǎng)度是經(jīng)過計(jì)算的不同線對(duì)的節(jié)距還不一樣目的是減少線對(duì)之間的串?dāng)_。這就是為什么你拆開一根網(wǎng)線會(huì)發(fā)現(xiàn)四對(duì)線的絞合密度肉眼可見地不同——這不是工藝隨意而是設(shè)計(jì)。提示這也是為什么網(wǎng)線不能隨便壓折、不能和強(qiáng)電走同一線槽。絞合結(jié)構(gòu)一旦被破壞差分抗干擾能力下降表現(xiàn)為丟包、速率協(xié)商降級(jí)而不是直接斷網(wǎng)排查起來很隱蔽。2.2 從電壓到比特編碼方式?jīng)Q定了怎么讀信號(hào)在線上是連續(xù)變化的電壓要表示離散的0和1就需要編碼規(guī)則。書里介紹了曼徹斯特編碼這類方案核心思想是用電壓的跳變來表示比特而不是用絕對(duì)電平高低。比如規(guī)定從高到低跳變代表0從低到高跳變代表1。這樣做的好處是接收端可以從信號(hào)本身提取時(shí)鐘——每個(gè)比特周期中間必有一次跳變接收方據(jù)此同步不需要額外時(shí)鐘線。這里有個(gè)容易被忽略的點(diǎn)編碼效率。曼徹斯特編碼每個(gè)比特都需要一次跳變占用的帶寬是數(shù)據(jù)率的兩倍效率只有50%。所以高速以太網(wǎng)后來改用更高效的編碼方案如4B/5B、8B/10B以及更高速率下的多電平編碼用多個(gè)電平或更復(fù)雜的映射在同樣帶寬下傳更多數(shù)據(jù)。書里沒有展開這些細(xì)節(jié)但理解編碼是在帶寬和同步能力之間做權(quán)衡這個(gè)思路比記住具體編碼名字重要得多。我在實(shí)際排查一次鏈路問題時(shí)遇到過相關(guān)現(xiàn)象某段鏈路速率協(xié)商不到預(yù)期值換線后恢復(fù)。后來分析線材質(zhì)量導(dǎo)致高頻成分衰減嚴(yán)重高編碼效率的方案對(duì)信號(hào)質(zhì)量要求更高協(xié)商機(jī)制自動(dòng)降級(jí)到更保守的編碼和速率。這說明物理層的編碼選擇和線材質(zhì)量是綁定的不是軟件層面能繞過去的。2.3 光纖與無線換了介質(zhì)邏輯沒變書里對(duì)光纖和無線也做了介紹。光纖用光脈沖的有無表示比特全反射把光約束在纖芯里傳播。相比銅纜光纖不受電磁干擾、衰減低、帶寬大但代價(jià)是彎折半徑有要求、接續(xù)需要專用設(shè)備。無線則把比特調(diào)制到射頻載波上通過調(diào)制方式幅度、頻率、相位或其組合承載信息挑戰(zhàn)在于共享介質(zhì)、干擾和衰減。我想強(qiáng)調(diào)的是不管介質(zhì)怎么換用某種物理量的變化表示比特并讓接收端能可靠判讀這個(gè)本質(zhì)不變。理解了銅纜的差分和編碼再看光纖和無線只是物理量和干擾來源變了分析框架可以直接遷移。這也是我建議讀這一章時(shí)不要死記每種介質(zhì)參數(shù)、而要抓住表示—同步—抗擾這條主線的原因。3. 交換機(jī)內(nèi)部MAC地址表是怎么學(xué)出來的3.1 幀進(jìn)入交換機(jī)的那一刻發(fā)生了什么數(shù)據(jù)幀從網(wǎng)卡發(fā)出進(jìn)入交換機(jī)的某個(gè)端口。交換機(jī)做的第一件事不是查表轉(zhuǎn)發(fā)而是學(xué)習(xí)它讀取這個(gè)幀的源MAC地址把它和從哪個(gè)端口進(jìn)來的綁定寫進(jìn)MAC地址表。這個(gè)動(dòng)作叫源地址學(xué)習(xí)是交換機(jī)自愈能力的來源——不需要人工配置網(wǎng)絡(luò)自己就能建立轉(zhuǎn)發(fā)表。學(xué)完之后才查目的MAC地址。如果表里有對(duì)應(yīng)條目就從記錄的端口轉(zhuǎn)發(fā)出去這叫單播轉(zhuǎn)發(fā)如果表里沒有交換機(jī)不會(huì)丟棄而是從除入端口外的所有端口泛洪出去這叫泛洪。目的端收到后會(huì)回應(yīng)回應(yīng)幀的源地址又會(huì)被學(xué)習(xí)于是表項(xiàng)逐步補(bǔ)全。這個(gè)先泛洪、后學(xué)習(xí)、再單播的機(jī)制是理解二層網(wǎng)絡(luò)行為的關(guān)鍵。注意泛洪是有代價(jià)的。表項(xiàng)沒建立起來之前廣播域內(nèi)會(huì)有額外流量如果網(wǎng)絡(luò)里存在環(huán)路泛洪會(huì)引發(fā)廣播風(fēng)暴。這也是為什么二層網(wǎng)絡(luò)要跑生成樹協(xié)議——不是可有可無的配置而是防止泛洪失控的安全閥。3.2 MAC地址表的老化為什么條目會(huì)消失MAC地址表不是永久保存的每個(gè)條目都有老化時(shí)間常見默認(rèn)值是幾分鐘量級(jí)。如果一段時(shí)間內(nèi)沒有再從某個(gè)端口收到該源地址的幀條目就會(huì)被刪除。這個(gè)設(shè)計(jì)很務(wù)實(shí)設(shè)備可能換端口、可能下線表項(xiàng)必須能自動(dòng)清理否則表會(huì)越撐越大且充滿過期信息。老化機(jī)制帶來一個(gè)實(shí)際現(xiàn)象設(shè)備靜默一段時(shí)間后第一幀往往要經(jīng)過泛洪才能到達(dá)因?yàn)楸眄?xiàng)已經(jīng)老化掉了。這在抓包時(shí)表現(xiàn)為偶爾出現(xiàn)泛洪幀很多人誤以為是故障其實(shí)是正常的老化—重學(xué)習(xí)過程。我在排查一次間歇性延遲問題時(shí)最后定位到的就是某設(shè)備休眠喚醒后表項(xiàng)已老化首包泛洪帶來的額外處理時(shí)延屬于預(yù)期行為而非缺陷。3.3 交換機(jī)為什么不做IP層的事二層與三層的分工書里反復(fù)強(qiáng)調(diào)交換機(jī)工作在二層看的是MAC地址不關(guān)心IP。這個(gè)分工的意義在于職責(zé)單一、轉(zhuǎn)發(fā)快。交換機(jī)只需要維護(hù)MAC表、做硬件級(jí)別的查表轉(zhuǎn)發(fā)不需要理解IP地址、不需要跑路由協(xié)議。這種傻快的特性正是局域網(wǎng)高效的原因。但這也帶來邊界交換機(jī)無法隔離廣播域。廣播幀會(huì)在整個(gè)二層網(wǎng)絡(luò)內(nèi)泛洪網(wǎng)絡(luò)越大廣播開銷越大。要隔離廣播域就得上路由器或三層交換機(jī)用IP子網(wǎng)把大網(wǎng)絡(luò)切小。理解這條邊界你就明白為什么企業(yè)網(wǎng)絡(luò)里接入層用交換機(jī)、核心層做路由是常見架構(gòu)——不是隨便分的而是二層和三層的職責(zé)天然不同。4. 路由器怎么選路路由表與最長(zhǎng)前綴匹配4.1 路由表不是一張地圖而是一組規(guī)則很多人把路由表想象成一張完整的地圖其實(shí)它更像一組匹配規(guī)則。每條路由表項(xiàng)包含目的網(wǎng)絡(luò)/前綴長(zhǎng)度和下一跳/出接口。路由器收到一個(gè)IP包拿目的IP去和表項(xiàng)逐一比對(duì)選出匹配的那條。問題來了如果多條表項(xiàng)都能匹配怎么辦答案是最長(zhǎng)前綴匹配——前綴越長(zhǎng)網(wǎng)絡(luò)越具體優(yōu)先級(jí)越高。舉個(gè)例子路由表里有10.0.0.0/8和10.1.0.0/16兩條一個(gè)目的地址10.1.2.3兩條都能匹配但/16比/8更具體所以選/16那條。這個(gè)規(guī)則的意義在于支持路由聚合與例外并存可以用一條大前綴概括一片網(wǎng)絡(luò)再用更具體的前綴為其中某個(gè)子網(wǎng)指定特殊路徑兩者不沖突。4.2 默認(rèn)路由兜底的那條其他都走這里路由表里通常有一條0.0.0.0/0叫默認(rèn)路由。它的前綴長(zhǎng)度是0能匹配任何地址但因?yàn)槭亲疃糖熬Y只有在沒有更具體匹配時(shí)才會(huì)被選中。它的作用就是兜底本地不知道往哪送的包統(tǒng)統(tǒng)交給默認(rèn)網(wǎng)關(guān)。家用路由器里那條默認(rèn)網(wǎng)關(guān)配置本質(zhì)上就是在主機(jī)路由表里加了一條默認(rèn)路由。這里有個(gè)實(shí)操中常見的困惑為什么我明明配了某條明細(xì)路由流量還是走了默認(rèn)網(wǎng)關(guān)大概率是明細(xì)路由的前綴寫錯(cuò)了或者掩碼長(zhǎng)度不對(duì)導(dǎo)致它沒有比默認(rèn)路由更具體。排查時(shí)直接看路由表里目標(biāo)地址命中的是哪條比猜要快得多。4.3 ARPIP地址到MAC地址的翻譯路由器決定下一跳之后還得把包封裝成幀發(fā)出去而幀需要目的MAC地址。這就輪到ARP出場(chǎng)在本地網(wǎng)段內(nèi)廣播誰是這個(gè)IP對(duì)應(yīng)主機(jī)回應(yīng)自己的MAC。結(jié)果會(huì)緩存進(jìn)ARP表后續(xù)直接查。ARP的關(guān)鍵點(diǎn)在于它只在本地網(wǎng)段內(nèi)工作??缇W(wǎng)段通信時(shí)主機(jī)ARP解析的是網(wǎng)關(guān)的MAC而不是最終目的主機(jī)的MAC包到了網(wǎng)關(guān)網(wǎng)關(guān)再在自己的網(wǎng)段內(nèi)做下一跳的ARP。這個(gè)逐跳解析的機(jī)制是理解跨網(wǎng)段轉(zhuǎn)發(fā)的基礎(chǔ)。很多人誤以為源主機(jī)能直接知道遠(yuǎn)端主機(jī)的MAC這是典型誤解。提示ARP緩存也有老化。緩存失效后重新解析會(huì)帶來短暫延遲表現(xiàn)為隔一段時(shí)間第一次訪問某地址稍慢。如果頻繁出現(xiàn)要檢查是否有ARP欺騙或表項(xiàng)異常刷新而不是簡(jiǎn)單歸咎于網(wǎng)絡(luò)慢。5. 把第三章串起來一個(gè)包從網(wǎng)卡到路由器的完整旅程5.1 逐層封裝與逐跳轉(zhuǎn)發(fā)的對(duì)照現(xiàn)在把前面幾塊拼起來。應(yīng)用數(shù)據(jù)下來經(jīng)過傳輸層、網(wǎng)絡(luò)層封裝成IP包到了鏈路層要封裝成幀幀頭填的是下一跳的MAC同網(wǎng)段就是目的主機(jī)跨網(wǎng)段就是網(wǎng)關(guān)。幀變成比特流經(jīng)編碼變成電信號(hào)或光信號(hào)從網(wǎng)卡出去到達(dá)交換機(jī)。交換機(jī)學(xué)源MAC、查目的MAC轉(zhuǎn)發(fā)到對(duì)應(yīng)端口。幀到達(dá)路由器路由器拆幀、看IP目的地址、查路由表、做最長(zhǎng)前綴匹配、決定下一跳再重新封裝成新幀新幀的源MAC是路由器出口、目的MAC是下一跳繼續(xù)轉(zhuǎn)發(fā)。這個(gè)過程中有兩個(gè)重新封裝的節(jié)點(diǎn)特別值得注意每經(jīng)過一個(gè)路由器幀的MAC頭都會(huì)被換掉但I(xiàn)P頭基本不變除非NAT等特殊處理。這就是為什么說MAC地址是逐跳有效的IP地址是端到端有效的。抓住這句話二層和三層的分工就徹底清楚了。5.2 用抓包驗(yàn)證眼見為實(shí)光看文字容易飄我建議你實(shí)際抓一次包對(duì)照。在主機(jī)上抓一個(gè)訪問外網(wǎng)的包你會(huì)看到發(fā)出的幀目的MAC是網(wǎng)關(guān)的如果能在網(wǎng)關(guān)側(cè)抓包會(huì)看到幀的MAC已經(jīng)換了一輪但I(xiàn)P源和目的沒變。再配合看交換機(jī)的MAC表和路由器的路由表整條鏈路就活了。我自己的習(xí)慣是遇到包到底走沒走對(duì)路的問題先抓包看幀的MAC對(duì)不對(duì)再看IP的目的地址和路由表匹配最后看ARP表里下一跳的MAC是否有效。這三步基本能覆蓋大部分轉(zhuǎn)發(fā)異常。這個(gè)排查順序不是書里寫的是我在實(shí)際處理中總結(jié)出來的比盲目看日志高效。5.3 常見誤解清單讀這一章時(shí)我整理了幾個(gè)高頻誤解列出來供對(duì)照常見誤解實(shí)際情況源主機(jī)直接知道遠(yuǎn)端主機(jī)的MAC跨網(wǎng)段時(shí)只知道網(wǎng)關(guān)MAC逐跳解析交換機(jī)認(rèn)識(shí)IP地址二層交換機(jī)只看MAC不處理IP路由表是完整地圖是一組匹配規(guī)則靠最長(zhǎng)前綴匹配選路MAC表永久有效有老化時(shí)間靜默后會(huì)重新學(xué)習(xí)泛洪是故障表項(xiàng)未建立時(shí)的正常機(jī)制環(huán)路下才危險(xiǎn)把這些誤解糾正過來第三章的很多別扭感就消失了。我個(gè)人體會(huì)是這一章難不在于概念多而在于它要求你在抽象流程和物理現(xiàn)實(shí)之間來回切換而大多數(shù)人習(xí)慣只待在其中一層。多抓幾次包、多對(duì)著表看幾遍切換就順了。