斯坦福 CS144 計算機網絡播客:計算機網絡底層 - 從物理層到鏈路層
當我們享受著絲滑的網頁瀏覽和高清的視頻通話時,我們很少會去思考,那些構成我們數字生活的 0 和 1 是如何跨越數千公里,從服務器的網卡精準地傳遞到我們手機的 Wi-Fi 芯片中的。這一切的魔法,都始于網絡協議棧的最底層——物理層和鏈路層。
在著名的互聯網 “沙漏” 模型中,IP 協議是連接上下層的 “細腰”。而在 IP 之下,是一個多姿多彩的世界,承載著以太網 (Ethernet)、Wi-Fi、DSL 等各種技術。本文將帶你一起,從最基礎的物理信號出發,逐步揭開物理層與鏈路層的神秘面紗。
物理層:將比特流轉化為模擬信號
物理層是網絡通信的基石,它的核心任務是將上層傳來的數字比特流,轉換為能夠在線纜、光纖或空氣中傳播的物理信號。這個過程看似簡單,卻充滿了精妙的設計與權衡。
彈性緩沖區:時鐘不同步的優雅解法
你或許會認為,網絡通信中發送方和接收方的時鐘應該是完全同步的。但現實是,制造出兩個頻率完全一致的時鐘晶振幾乎是不可能的。它們之間總會存在微小的差異,比如百萬分之幾 (parts-per-million, ppm) 的容差。
這意味著,發送方發送比特的速率和接收方接收比特的速率總會有一點點不同。如果發送方略快,接收方的緩沖區最終會 溢出 (Overflow) ;反之,如果接收方略快,緩沖區則會 欠流 (Underflow) 。
為了解決這個問題,物理層引入了 彈性緩沖區 (Elastic Buffer) 。你可以把它想象成一個先進先出的隊列 (FIFO),它巧妙地調和了收發兩端的速率差異。
寫入指針 (由恢復的發送方時鐘驅動)
|
v
[ | | | | | | | | | | ] <-- 緩沖區
^
|
讀取指針 (由接收方本地時鐘驅動)
狀態 1: 發送方稍快, 寫入指針追趕讀取指針
[ | | | |X|X|X|X| | | ]
狀態 2: 接收方稍快, 讀取指針追趕寫入指針
[ | |X|X| | | | | | | ]為了確保這個緩沖區既不溢出也不欠流,網絡協議設計了兩個關鍵機制:
- 最大傳輸單元 (Maximum Transmission Unit, MTU) : 它限制了單個數據包的最大長度。這確保了即使在最壞的情況下(發送方最快、接收方最慢),一個數據包也不會把整個緩沖區撐爆。
- 幀間間隙 (Inter-packet gap, IPG) : 發送方在發送完一個數據包后,必須強制“休息”一小段時間。這段間隙給了接收方足夠的時間來清空緩沖區,使其恢復到一個安全的中間狀態,為下一個數據包的到來做準備。
因此,時鐘的精度越高(容差越小),所需要的彈性緩沖區和幀間間隙就越小。在一個理想化的世界里,如果時鐘完全同步,這兩者都可以為零。
香農極限與調制:信道容量的天花板
一根網線到底能跑多快?這個問題的理論上限由信息論之父克勞德·香農給出了答案。 香農容量 (Shannon Capacity) 定理告訴我們,一個信道在無差錯情況下的最大數據傳輸速率由以下公式決定:
其中:
C是信道容量 (Capacity),單位是比特/秒 (bps)。B是信道的帶寬 (Bandwidth),單位是赫茲 (Hz)。S/N是信噪比 (Signal-to-Noise Ratio),即信號功率與噪聲功率的比值。
這個公式揭示了一個核心真理: 要想提高數據傳輸速率,要么增加帶寬,要么提高信噪比。
那么,我們如何利用信道來傳輸比特呢?答案是 調制 (Modulation) 。調制是將數字比特“翻譯”成模擬信號的過程。常見的調制方式有:
- 幅度移位鍵控 (Amplitude Shift Keying, ASK) :通過改變信號的幅度(振幅)來表示
0和1。 - 頻率移位鍵控 (Frequency Shift Keying, FSK) :通過改變信號的頻率來表示
0和1。 - 相移鍵控 (Phase Shift Keying, PSK) :通過改變信號的相位來表示
0和1。
為了在每個信號單元(稱為 符號 (Symbol) )中承載更多的比特,現代通信系統通常會將幅度和相位結合起來,這就是 正交幅度調制 (Quadrature Amplitude Modulation, QAM) 。
我們可以用 IQ 星座圖 (IQ Constellation) 來直觀地表示這些調制方式。星座圖上的每一個點都代表一個獨特的符號,它由特定的幅度和相位定義。一個符號可以編碼多個比特。例如,QPSK (正交相移鍵控) 有 4 個點,每個符號可以攜帶 2 個比特。
Q (Quadrature)
^
|
10 o | o 00 (QPSK: 4個點, 2 bits/symbol)
|
------+------> I (In-phase)
|
11 o | o 01
|更復雜的 16-QAM 則有 16 個點,每個符號可以攜帶 4 個比特,從而大大提高了數據傳輸速率。但是,點與點之間也變得更加密集,對噪聲的抵抗能力也隨之下降。
物理層的基石:編碼、復用與傳輸延遲
在理解了香農定理為我們描繪的信道容量藍圖后,讓我們深入探討物理層中一些更為具體的技術細節,它們共同構成了數據通信的堅實基礎。
奈氏準則與香農定理:理想與現實
香農定理描述的是一個有噪聲信道的極限速率。而在一個理想的、無噪聲的信道中,數據傳輸速率的上限由 奈奎斯特定理 (Nyquist Theorem) 給出:

W是信道帶寬 (Hz)。N是一個碼元 (Symbol) 可能代表的狀態數。2W是該信道的最大碼元速率,也稱為波特率 (Baud Rate)。
這里的關鍵區別在于:奈氏準則關注的是在無噪聲環境下,帶寬如何限制了 碼元 的傳輸速率;而香農定理則關注在有噪聲環境下,信噪比如何限制了 信息 (比特)的傳輸速率。奈氏準則告訴我們“最多能送多少個包裹”,香農定理則告訴我們“這些包裹里最多能裝多少貨”。
下面解釋一下相關概念。
碼元(symbol) 是物理層在每個“時間槽”里發送的最小調制單元 —— 可以看成一個“信號點”。一個碼元可以表示 1 個比特,也可以表示多個比特,取決于調制方式的“點數”(星座點數)。比特(bit) 是信息單位; 碼元率(symbol rate 或 Baud) 是每秒發送多少個碼元; 比特率(bit rate) = 碼元率 × 每個碼元攜帶的比特數。
舉例說明(一步步算)

“碼元”是物理信號的一個點;碼元攜帶多少比特取決于調制的星座大小()。奈奎斯特給出 在無噪聲 情況下帶寬對碼元/比特率的上限;香農則在 有噪聲 時壓低這個上限(引入 SNR 的限制)。
所以:碼元 = 信號“點”,比特 = 信息量,碼元率×每碼元的比特數 = 比特率。
剖析網絡延遲:發送延遲與傳播延遲
一個數據包從源頭到目的地所經歷的時間,即延遲,主要由兩部分構成:
- 發送延遲 (Transmission Delay) :將數據包的所有比特推向鏈路所需的時間。它等于
數據幀大小 / 數據速率。這就像是讓一列火車完全駛出車站所需的時間。 - 傳播延遲 (Propagation Delay) :第一個比特從發送端到達接收端所需的時間。它等于
傳輸距離 / 信號傳播速度。這就像是火車的車頭從始發站開到終點站的時間。
例如,在一個 100Mbps 的以太網鏈路上發送一個 1500 字節的數據包,線路長度為 100 米(信號速度按 2 \cdot 10^8 m/s 計):
- 發送延遲 =
(1500 * 8) bits / (100 * 10^6) bps= 120 μs - 傳播延遲 =
100 m / (2 * 10^8) m/s= 0.5 μs - 總延遲 ≈ 發送延遲 + 傳播延遲 = 120.5 μs
在這個例子中,發送延遲遠大于傳播延遲,這在高速局域網中非常典型。
多路復用:在一條路上跑多輛車
為了提高信道利用率, 多路復用 (Multiplexing) 技術應運而生。它允許多路獨立的信號共享同一條物理信道。
- 頻分復用 (Frequency Division Multiplexing, FDM) :將信道的總帶寬劃分為多個不重疊的子頻帶,每個子頻帶承載一路信號。收音機電臺就是最經典的例子。
- 時分復用 (Time Division Multiplexing, TDM) :將時間劃分為一個個循環的幀,每幀內再劃分為多個時間片,每個時間片分配給一路信號。T1/E1 數字中繼線就是 TDM 的典型應用。
- 波分復用 (Wavelength Division Multiplexing, WDM) :在光纖通信中使用,本質上是光的頻分復用。它利用不同波長(顏色)的光來承載不同的信號,極大地提升了光纖的傳輸容量。
鏈路層:在共享信道上可靠傳輸
鏈路層位于物理層之上,它利用物理層提供的服務,為網絡層提供在一個“單跳”鏈路上主機到主機的數據傳輸服務。
比特之戰:錯誤與糾錯碼
由于物理世界中噪聲無處不在,接收方在解碼信號時總有可能出錯,導致比特錯誤 (Bit Errors)。信噪比越低,或者星座圖越密集,比特錯誤率 (Bit Error Rate, BER) 就越高。
如果因為一兩個比特的錯誤就重傳整個數據包,效率會非常低下。為此,工程師們發明了 前向糾錯 (Forward Error Correction, FEC) 技術。其核心思想是在原始數據中主動添加一些冗余信息。這樣,即使在傳輸過程中出現了一些錯誤,接收方也能利用這些冗余信息“猜”出并修正錯誤,從而避免了代價高昂的重傳。
一種經典且強大的 FEC 算法是 里德-所羅門碼 (Reed-Solomon, RS codes) 。它的原理可以通俗地理解為:
- 將
K塊原始數據看作一個K-1次多項式的系數。 - 在這個多項式上取
N個不同的點(N > K),并將這N個點的坐標值作為編碼后的數據發送出去。 - 由于
K個點就能唯一確定一個K-1次多項式,接收方只要正確收到了任意K個點,就能反解出原始的多項式,進而恢復全部K塊原始數據。
這意味著,一個 RS(N, K) 編碼可以容忍多達 N-K 個數據塊的丟失(擦除錯誤)。這種強大的糾錯能力使得 FEC 在 Wi-Fi、蜂窩網絡、甚至光盤存儲中都得到了廣泛應用。
我們在前文提到了前向糾錯碼 (FEC) 的強大之處。然而,在許多場景下,我們并不需要糾錯,僅僅檢測出錯誤并請求重傳(這由更高層協議如 TCP 負責)就足夠了,這樣可以節省大量的計算開銷和冗余比特。
循環冗余校驗 (CRC):高效的檢錯利器
循環冗余校驗 (Cyclic Redundancy Check, CRC) 是鏈路層(尤其在以太網和 Wi-Fi 中)最廣泛使用的檢錯技術。它基于多項式除法的原理。
其工作流程如下:
- 發送方和接收方預先約定一個 生成多項式
G(x)(例如x^4 + x + 1對應二進制10011)。 - 發送方要發送
k位的原始數據。它首先在數據后面附加r個0(r是生成多項式最高次冪)。 - 然后,用這個附加了
0的長數據串,對生成多項式對應的二進制數進行“模 2 除法”(即異或運算)。 - 得到的
r位余數,就是 CRC 校驗碼。發送方將其替換掉數據末尾的r個0,然后將整個數據幀(原始數據 + CRC校驗碼)發送出去。 - 接收方收到數據幀后,用整個數據幀對同一個生成多項式進行模 2 除法。如果余數為零,則認為數據傳輸沒有錯誤;否則,就認為數據已損壞。
CRC 檢錯能力非常強,可以有效地檢測出絕大多數的單比特、多比特及突發錯誤。
海明碼:精巧的糾錯碼
與只能檢錯的 CRC 不同, 海明碼 (Hamming Code) 是一種相對簡單但非常精巧的糾錯碼,它能夠糾正單比特錯誤。
海明碼的核心思想是在 m 位的數據中插入 k 個校驗位,形成一個 m+k 位的新碼字。這些校驗位被放置在 2^n(1, 2, 4, 8, ...)的位置上。每一個校驗位的值,都由數據中特定位置上的比特進行異或運算得到。
當接收方收到碼字后,會重新計算這些校驗位。如果計算結果與收到的校驗位不符,這些不符的校驗位的 位置之和 ,就恰好能指出發生錯誤的比特所在的位置!例如,如果第 1 位和第 4 位的校驗出錯了,那么就是第 1+4=5 位的數據發生了翻轉。接收方只需將該位取反,即可完成糾錯。
時鐘恢復:在數據流中尋找節拍
我們之前討論了用彈性緩沖區來處理時鐘的微小頻率差異。但還有一個更基本的問題:接收方如何知道應該在何時對信號進行采樣來讀取比特呢?這就是 時鐘恢復 (Clock Recovery) 要解決的問題。
在現代同步通信(如以太網)中,時鐘信息被巧妙地編碼在數據信號本身之中。接收端的 時鐘恢復單元 (Clock Recovery Unit, CRU) 會持續觀察接收到的信號,并通過信號的 **跳變 (Transition)**(例如從高電平變為低電平)來鎖定發送方的時鐘節拍。
為了確保信號中有足夠多的跳變,鏈路層會采用特定的 線路編碼 (Line Coding) 方案。例如:
- 曼徹斯特編碼 (Manchester Encoding) :在早期的 10Mbps 以太網中使用。它將
1編碼為“高-低”跳變,0編碼為“低-高”跳變。這種方式保證了每個比特中間都有一次跳變,便于時鐘恢復,但代價是占用的帶寬翻了一倍。 - 4B/5B 編碼 :將 4 比特的數據塊映射為一個 5 比特的碼字。這些 5 比特的碼字經過精心挑選,保證了不會出現連續過多的
0或1,從而確保了信號中有足夠的跳變。它的效率(25% 開銷)比曼徹斯特編碼高得多。
媒體訪問控制:誰有權發言?
在許多網絡中,多個設備共享同一個通信介質(如同軸電纜、空氣)。 媒體訪問控制 (Medium Access Control, MAC) 協議就是為了解決“誰可以在何時發送數據”這個問題的規則集合,其目標是避免或解決數據沖突。
有線江湖的規矩:以太網與 CSMA/CD
在早期的以太網中,所有計算機都連接在一根共享的總線上。為了協調通信,以太網采用了 載波偵聽多路訪問/沖突檢測 (Carrier Sense Multiple Access with Collision Detection, CSMA/CD) 協議。
它的工作流程就像一個文明的圓桌會議:
- 載波偵聽 (Carrier Sense) :發言前先聽。設備在發送數據前,會先偵聽信道是否空閑。
- 多路訪問 (Multiple Access) :如果信道空閑,就開始發送數據。
- 沖突檢測 (Collision Detection) :邊說邊聽。設備在發送數據的同時,會持續監聽信道。如果它聽到的信號和自己發送的信號不一致,就意味著發生了沖突(兩個設備同時“發言”)。
- 退避與重試 (Backoff and Retry) :一旦檢測到沖突,立即停止發送,并廣播一個擁塞信號。然后,等待一個隨機的時間(這個隨機時間的上限會隨著沖突次數的增加而指數級增長,即 二進制指數退避 (Binary Exponential Backoff) ),再從第一步重新開始。
值得注意的是,隨著技術的發展,現代以太網幾乎完全由 交換機 (Switch) 構建。交換機為每個端口提供了獨立的沖突域,并支持 全雙工 (Full-duplex) 通信(同時發送和接收),這使得沖突不再發生,CSMA/CD 協議也因此在現代有線網絡中“名存實亡”。
現代交換機如何做到全雙工
交換機把多個設備從一個共享總線變成了許多獨立的、點對點的鏈路;點對點鏈路上可以實現同時收發(全雙工),因此也就沒有“兩個端點同時在同一共享介質上互相干擾”的沖突問題了 —— CSMA/CD 的場景被物理結構消除了。
具體機制(幾條關鍵點)如下。
- 獨立的點對點鏈路
- 早期總線式以太網(同軸)是“共享媒介”,所以兩個主機同時發就會沖突。
- 交換機為每個端口做轉發,主機到交換機是單獨的鏈路(一對一),交換機在兩端分別維護單獨的發送/接收通道,因此 A→Switch 和 B→Switch 互不干擾。
- 物理上分離的收發路徑
- 在很多介質上,發送和接收使用不同的線對或不同的光纖:例如光纖通常一根纖維發、一根收;千兆/萬兆光模塊也有分別的 Tx/Rx。這樣物理上就能同時發送和接收。
- 在雙絞線(例如 100BASE-TX)中,常用獨立的線對完成 TX 和 RX,從而同時雙向傳輸。
- 在同一對線上也能全雙工 —— 回聲消除 + DSP
- 像 1000BASE-T(千兆以太網)使用的是四對線,每對同時承載 Tx 和 Rx 的信號。要實現同時收發,需要把自己發出的信號從接收到的混合信號中“減去”(即 回聲消除 / echo cancellation ),再做數字信號處理分離對端信號。現代 PHY 芯片用混合變壓器(hybrid)+ DSP 完成這件事,使同一對線上也能無沖突地雙向傳輸。
- 交換機的轉發與緩沖
- 交換機在幀到達時做學習(MAC 表),并把幀轉發到目標端口。它通常有高速緩存(buffer),能處理短時突發,避免丟幀。因為鏈路是點對點,幀不會在鏈路上被第三臺主機“碰撞”而混亂。
- 鏈路協商(autonegotiation)
- 以太網鏈路雙方通過自動協商確定是否使用全雙工模式。如果雙方都支持全雙工并協商成功,就關閉 CSMA/CD 的邏輯,啟用全雙工通信模式。
為什么 CSMA/CD 在交換網絡“名存實亡”
- CSMA/CD 的設計是為了 共享媒介上沖突檢測 ,但在點對點全雙工鏈路上——沒有第三方會在同一物理信道上與某一端并發發送,因此不會產生可檢測的沖突。既然沖突不會發生,沖突檢測/退避機制沒有意義,自然也就停止使用(為兼容,標準仍保留歷史定義,但在全雙工下不啟用它)。
- 雖然大多數現代網絡是交換機 + 全雙工,但以太網標準沿用了最小幀長等歷史約束(主要是向后兼容老設備、規范一致)。在全雙工成熟的網中,最小幀長與 CSMA/CD 的實際需求已不重要,但標準字段仍然存在。
深入以太網:幀結構、最小幀長與物理規范
我們已經了解了 CSMA/CD 的工作原理,現在讓我們深入以太網的技術細節,看看它的數據幀是如何構成的,以及它為何對幀的長度有特殊要求。
以太網幀結構
一個標準的以太網 II 型幀(目前最常用的類型)由以下幾個部分組成:
+----------------+----------------+-------------+--------------------+----------+
| 目的MAC地址 | 源MAC地址 | 類型 | 數據 (IP數據包等) | CRC校驗 |
| (6字節) | (6字節) | (2字節) | (46 - 1500字節) | (4字節) |
+----------------+----------------+-------------+--------------------+----------+
<--------------------------- 最小 64 字節,最大 1518 字節 ------------------------>在物理層發送時,幀的前面還會加上 8 字節的 前同步碼 (Preamble) 和 幀起始定界符 (Start Frame Delimiter, SFD) ,用于時鐘同步和標識幀的開始。這些不計入幀長。
- 目的/源 MAC 地址 :全球唯一的 48 位物理地址。
- 類型 :指明上層協議是什么,例如
0x0800代表 IPv4。 - 數據 :承載來自網絡層的數據包。如果數據不足 46 字節,鏈路層會自動填充 (Padding) 到 46 字節。
- CRC 校驗 :4 字節的循環冗余校驗碼,用于檢測幀在傳輸中是否出錯。
最小幀長之謎
為何以太網幀的數據字段最短必須是 46 字節,使得整個幀長(不含前同步碼)至少為 64 字節?這與 CSMA/CD 的沖突檢測機制密切相關。
在一個共享介質網絡中,最壞的情況是:A 剛發完一個幀的最后一個比特,這個幀的第一個比特才剛剛到達網絡最遠端的 B,而 B 恰好在此時也開始發送,引發沖突。沖突信號需要再從 B 傳回 A。A 必須在它發送完整個幀之前檢測到這個沖突,否則它會誤以為發送成功。
因此,必須滿足以下不等式:
幀的發送時間信號在網絡中往返一次的時間
即:
L_min是最小幀長 (bits)。R是數據速率 (bps)。d是網絡的最大跨度 (m)。v是信號傳播速度 (m/s)。
在最初的 10Mbps 以太網標準中,規定了最大跨度為 2500 米,由此計算出最小幀長為 512 比特,即 64 字節。這個標準被后續的快速以太網和千兆以太網所繼承,即使在交換式網絡中 CSMA/CD 已不再必要。
以太網物理層規范的演進
以太網的命名規范通常為 速率 + 信號方式 + 介質/距離。
- 快速以太網 (100Mbps) :最常見的
100BASE-TX標準,使用兩對 5 類非屏蔽雙絞線 (UTP),傳輸距離 100 米。 - 千兆以太網 (1Gbps) :
1000BASE-T標準統治了桌面市場,它巧妙地利用了全部四對 5 類 UTP,在 100 米內實現了全雙工千兆傳輸。此外,還有用于光纖的1000BASE-SX(多模光纖,短距離)和1000BASE-LX(單模/多模光纖,長距離)。 - 萬兆以太網 (10Gbps) 及更高 :
10GBASE-T可以在 6A 類雙絞線上實現萬兆傳輸。而在數據中心和骨干網中,光纖是絕對的主角,如10GBASE-SR/LR/ER等標準,分別對應不同類型光纖和傳輸距離(從幾百米到數十公里)。
無線世界的挑戰:CSMA/CA 與隱藏終端
無線網絡的情況要復雜得多。由于信號在空氣中傳播會衰減,發送方無法像在有線網絡中那樣,有效地“聽”到接收方那里的情況。因此,沖突檢測變得不可行。
Wi-Fi (IEEE 802.11) 采用了另一種策略: 載波偵聽多路訪問/沖突避免 (Carrier Sense Multiple Access with Collision Avoidance, CSMA/CA) 。它的核心思想是“盡量避免沖突,如果失敗則確認”。
- 載波偵聽 :發送前同樣先偵聽信道。
- 沖突避免 :即使信道空閑,也要再等待一個隨機的退避時間后才發送。這是因為可能還有其他設備也正準備發送。
- 鏈路層確認 (Link Layer ACK) :由于無法檢測沖突,發送方依賴于接收方返回的一個簡短的確認幀 (ACK) 來判斷數據是否成功送達。如果沒在規定時間內收到 ACK,就認為數據丟失(可能因為沖突或噪聲),然后進行指數退避和重傳。
然而,CSMA/CA 也面臨著無線環境特有的難題:
- 隱藏終端問題 (Hidden Terminal Problem) :終端 A 和 C 都能與接入點 B 通信,但 A 和 C 之間互相聽不到。如果 A 和 C 同時向 B 發送數據,就會在 B 處發生沖突,而 A 和 C 自身卻毫不知情。
A -----> B <----- C
(A 和 C 互相聽不到)- 暴露終端問題 (Exposed Terminal Problem) :終端 B 正在向 A 發送數據。終端 C 聽到了 B 的發送,盡管 C 想要發送數據給 D 并不會干擾到 B 到 A 的通信,但根據 CSMA 規則,C 還是會保持靜默,從而造成了信道資源的浪費。
為了緩解隱藏終端問題,Wi-Fi 引入了可選的 請求發送/清除發送 (Request-to-Send/Clear-to-Send, RTS/CTS) 機制。發送方可以先發送一個短小的 RTS 幀,接收方回復一個 CTS 幀。所有聽到 CTS 幀的設備(包括隱藏終端)都會在指定時間內保持靜默,從而為后續的數據傳輸“清場”。但這套機制本身也帶來了額外的開銷。
跨越邊界:IP 分片
不同的鏈路層技術可能有不同的 MTU。例如,以太網的 MTU 通常是 1500 字節。當一個大的 IP 數據報需要從一個 MTU 較大的鏈路(如 MTU=9000)轉發到一個 MTU 較小的鏈路(如 MTU=1500)時,路由器就需要對這個數據報進行 分片 (Fragmentation) 。
IP 頭部中有專門的字段來處理分片與重組:
Identification: 一個唯一標識,所有屬于同一個原始數據報的分片都擁有相同的Identification值。Flags: 其中的More Fragments(MF) 位,除了最后一個分片,其他分片的 MF 位都為1。Fragment Offset: 指示當前分片的數據在原始數據報中的位置(以 8 字節為單位)。
一個關鍵的設計是: 分片的重組只在最終的目的地主機進行 。中間的路由器不負責重組,它們只管轉發。
然而,IP 分片是一個應該極力避免的操作。因為它非常“脆弱”——任何一個分片的丟失都會導致整個原始數據包的丟失,而上層協議(如 TCP)必須重傳整個大數據包,這極大地影響了性能。
現代網絡通常使用 路徑 MTU 發現 (Path MTU Discovery, PMTUD) 技術來避免分片。TCP 連接在建立時,會發送一個設置了 Don't Fragment (DF) 位的探測包,通過沿途路由器返回的錯誤信息來發現整條路徑上最小的 MTU,然后據此調整自己的數據包大小。
IP 分片實例解析
為了更清晰地理解 IP 分片,我們來看一個具體的計算例子。
場景 :一臺主機要發送一個總長度為 3820 字節的 IP 數據報(頭部 20 字節,數據 3800 字節)。數據報需要經過一個 MTU 為 1500 字節的鏈路。
分片過程
- 確定每個分片能承載的最大數據量 :MTU 是 1500 字節,IP 頭部占用 20 字節,所以每個分片最多能攜帶
1500 - 20 = 1480字節的數據。為了讓Fragment Offset的計算方便,數據長度通常會調整為 8 的倍數。1480 恰好是 8 的倍數 (1480 / 8 = 185)。 - 分片一
- 數據:承載原始數據的前 1480 字節。
- 總長度:
1480 (數據) + 20 (頭部) = 1500字節。 - MF (More Fragments) 標志:設為
1(后面還有分片)。 - Fragment Offset:
0 / 8 = 0(這是第一個分片)。
- 分片二
- 數據 :承載原始數據的第 1481 到 2960 字節 (共 1480 字節)。
- 總長度 :
1480 (數據) + 20 (頭部) = 1500字節。 - MF 標志 :設為
1(后面還有分片)。 - Fragment Offset :
1480 / 8 = 185(偏移量是前一個分片的數據長度除以 8)。
- 分片三
- 數據 :承載剩余的數據。原始數據共 3800 字節,已發送
1480 + 1480 = 2960字節,還剩3800 - 2960 = 840字節。 - 總長度 :
840 (數據) + 20 (頭部) = 860字節。 - MF 標志 :設為
0(這是最后一個分片)。 - Fragment Offset :
2960 / 8 = 370。
最終,這個 3820 字節的 IP 數據報被分成了三個獨立的小 IP 包在網絡中傳輸,直到最終的目的地主機才會將它們重新組裝起來。
結語:堅實的基石
從處理微秒級時鐘差異的彈性緩沖區,到香農定律指導下的調制編碼;從避免數據沖突的 MAC 協議,到跨越不同鏈路的 IP 分片,物理層和鏈路層共同構建了網絡通信的堅實基石。它們將物理世界中充滿噪聲和不確定性的信號,抽象成了上層協議可以信賴的、看似可靠的點對點鏈路。
正是這些底層的精妙設計,才支撐起了我們今天這個龐大而復雜的互聯網世界。希望這篇博文能幫助你更好地理解這一切背后的智慧與魅力。


























