簡單的概述
數據鏈路層是計算機網絡體系結構中的第二層,它在物理層提供的基本服務基礎上,負責將數據從一個節點可靠地傳輸到相鄰節點。可以將其想象成一個負責在兩個相鄰的網絡設備之間進行數據 “搬運” 和 “整理” 的 “快遞中轉站”。
幾個重要概念:
- 幀:封裝成幀是指數據鏈路層給上層交付的協議數據單元添加幀頭和幀尾使之成為幀。通俗的來說就是:網絡層傳遞給數據鏈路層的數據,會被分割成大小不一的數據“包裹”,這個數據會被插入幀頭和幀尾,構成數據幀。
- 幀頭和幀尾:幀里面包括了目的地址,就是讓目的主機通過幀的這個地址知道這個信息是發送給自己的。此外還包含標志位,比如PPP幀格式中就有標志位來進行幀的定界(兩個幀之間的數據邊界)。
-
**幀定界:**如果幀頭和幀尾的標志位,如何區分邊界呢?比如以太網V2的MAC幀。
-
以太網V2的MAC幀,會在幀中插入8個字節(64比特)的前導碼,前導碼由 7 個字節的前同步碼和 1 個字節的即幀開始定界符,SFD組成,總共 8 個字節。它位于 MAC 幀的最前端,在物理層傳輸時,會先于目的地址、源地址等其他字段被發送出去。作用主要有二:
- 時鐘同步:以太網中數據的傳輸是基于時鐘信號的,發送方按照自己的時鐘節奏發送數據,接收方需要與發送方的時鐘保持同步,才能準確地接收和解析數據。
- 幀起始標識:最后的(SFD)作為幀開始定界符,用于標識 MAC 幀的正式開始。接收方在檢測到 SFD 后,就知道接下來的比特流是一個 MAC 幀的數據部分,從而開始對幀進行解析和處理。
-
-
可靠傳輸:就是能夠實現,發送方發的數據,和接收方接受的數據完全一樣,不能有任何丟失或者錯誤。需要用到差錯檢測、確認與重傳、序號與排序的技術手段。這種傳輸方法的成本會比較高。
- 差錯檢測:發送方在數據中加入一些冗余信息,如校驗和、循環冗余校驗(CRC)碼等。接收方通過對收到的數據進行相應的計算,來檢查數據在傳輸過程中是否發生了錯誤。例如,若計算出的 CRC 碼與收到的 CRC 碼不一致,就知道數據出現了差錯。
- 確認與重傳:接收方收到數據后,會向發送方發送確認信息(ACK),告知發送方數據已正確接收。如果發送方在一定時間內沒有收到接收方的確認信息,或者收到了否定確認信息(NAK),就會認為數據傳輸出現了問題,然后重新發送數據。這種自動重傳請求(ARQ)機制可以有效地解決數據丟失或出錯的問題。
- 序號與排序:為了保證數據的順序性,發送方會給每個數據分組加上一個序號。接收方根據序號對收到的數據進行排序,將亂序的數據調整到正確的順序后再提交給上層應用。
-
透明傳輸:用這種前導碼的形式來區分幀,如果幀里面的數據和這個幀定界一樣的時候,接收數據的時候,就會把這個數據誤認為是幀定界來處理。容易引發誤判。解決方法就是使用透明傳輸,實現方法就是如下方法:
- 字節填充:當數據中出現與幀定界符相同的字節時,為了避免接收方將其誤認為是幀的邊界,發送方會在該字節前面插入一個轉義字節。接收方收到數據后,會自動刪除這個轉義字節,恢復數據的原樣。例如,下面這種情況:(ESC表示轉義字符)
? 但是有的時候,轉義字符就是數據本身怎么搞,因此就在轉義字符前面也加入一個轉義字符。
- 比特填充:在一些數據鏈路層協議中,如 HDLC 協議,采用比特填充的方式來實現透明傳輸。當數據中出現連續的若干個 1(通常是 5 個 1)時,發送方會在其后插入一個 0。接收方收到數據后,會自動刪除這些插入的 0,從而保證數據的透明傳輸。
-
差錯檢測:檢驗碼會被封裝在幀尾,比如圖片中的FCS就是。發送方把數據送到接收方以后,可以根據這個來判斷是否有誤碼(就是本來是0變成1,本來是1變成了0)。
-
奇偶校驗:奇偶校驗法是根據被傳輸數據中 “1” 的個數的奇偶性來進行校驗的。具體來說,在發送數據時,會在數據后面添加一個奇偶校驗位,使得整個數據(包括校驗位)中 “1” 的個數為奇數或偶數。接收方收到數據后,會根據事先約定的奇偶性規則來檢查 “1” 的個數,如果 “1” 的個數不符合約定的奇偶性,則認為數據在傳輸過程中出現了錯誤。
缺點是,無法識別出偶數位的比特誤碼情況。而且只能檢驗,不能糾錯。
-
循環冗余校驗CRC:CRC 的基本原理是將待傳輸的數據比特序列看作是一個多項式的系數,通過特定的生成多項式對這個多項式進行除法運算,得到的余數作為校驗碼附加在數據后面一起傳輸。接收方收到數據后,用同樣的生成多項式對收到的數據進行除法運算,如果余數為零,則認為數據傳輸正確;否則,說明數據在傳輸過程中出現了錯誤。
-
- 確定生成多項式:生成多項式是一個預先選定的二進制多項式,通常用 G ( x ) G(x) G(x) 表示。不同的應用場景會使用不同的生成多項式,例如,在以太網中常用的生成多項式是 G ( x ) = x 32 + x 26 + x 23 + x 22 + x 16 + x 12 + x 11 + x 10 + x 8 + x 7 + x 5 + x 4 + x 2 + x + 1 G(x)=x^{32}+x^{26}+x^{23}+x^{22}+x^{16}+x^{12}+x^{11}+x^{10}+x^8+x^7+x^5+x^4+x^2+x+1 G(x)=x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1。
- 在數據后面添加 n 個零:n 是生成多項式$ G(x)$ 的最高次數。例如,對于上述以太網中的生成多項式, n = 32 n = 32 n=32。假設待傳輸的數據為 D ( x ) D(x) D(x),將 D ( x ) D(x) D(x)左移 n 位,即相當于在數據后面添加 n 個零,得到 D ( x ) × x n D(x) \times x^n D(x)×xn。
- 進行模二除法:用 D ( x ) × x n D(x) \times x^n D(x)×xn 除以生成多項式 G ( x ) G(x) G(x),得到的余數 R ( x ) R(x) R(x) 就是 CRC 校驗碼。這里的除法是模二除法,即采用異或運算進行減法,不考慮借位。
- 附加校驗碼:將得到的 CRC 校驗碼 R ( x ) R(x) R(x) 附加在原始數據 D ( x ) D(x) D(x) 的后面,形成最終要傳輸的數據幀 T ( x ) = D ( x ) × x n + R ( x ) T(x)=D(x) \times x^n + R(x) T(x)=D(x)×xn+R(x)。