史丹佛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| | | | | | | ]
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
為了確保這個緩衝區既不溢出也不欠流,網路協定設計了兩個關鍵機制:
- 最大傳輸單元(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
|
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
更複雜的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 字节 ------------------------>
- 1.
- 2.
- 3.
- 4.
- 5.
在實體層發送時,幀的前面也會加上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 互相听不到)
- 1.
- 2.
- 暴露終端問題(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
(這是最後一個分片)。 - 片段偏移量 :
2960 / 8 = 370
。
最終,這個3820 位元組的IP 資料封包被分成了三個獨立的小IP 套件在網路中傳輸,直到最終的目的地主機才會將它們重新組裝起來。
結語:堅實的基石
從處理微秒時脈差異的彈性緩衝區,到香農定律指導下的調製編碼;從避免資料衝突的MAC 協議,到跨越不同鏈路的IP 分片,物理層和鏈路層共同建構了網路通訊的堅實基石。它們將物理世界中充滿噪音和不確定性的訊號,抽象化成了上層協定可以信賴的、看似可靠的點對點連結。
正是這些底層的精妙設計,支撐了我們今天這個龐大而複雜的網路世界。希望這篇文章能幫助你更理解這一切背後的智慧與魅力。