1. 程式人生 > >乙太網幀結構以及CRC校驗

乙太網幀結構以及CRC校驗

MAC幀報文結構

在乙太網鏈路上的資料包稱作以太幀。以太幀起始部分由前導碼和幀開始符組成。後面緊跟著一個乙太網報頭,以MAC地址說明目的地址源地址。幀的中部是該幀負載的包含其他協議報頭的資料包(例如IP協議)。以太幀由一個32位冗餘校驗碼結尾。它用於檢驗資料傳輸是否出現損壞。

幀結構圖:

frame

說一下各個欄位的作用:

  • 前同步碼:第一個欄位是7個位元組的前同步碼,1和0交替,作用是用來使接收端的介面卡在接收MAC幀時能夠迅速調整時鐘頻率,使它和傳送端的頻率相同。
  • 幀開始定界符:第二個欄位是1個位元組的幀開始定界符,前六位1和0交替,最後的兩個連續1表示告訴接收端介面卡:“幀資訊要來了,你準備接收把。
  • MAC 目的地址:第三個欄位是6位元組(MAC地址佔48位,如:FF,FF,FF,FF,FF),傳送方的網絡卡(MAC)地址,用處是當網絡卡接收到一個數據幀時,首先會檢查該幀的目的地址,是否與當前介面卡的實體地址相同,如果相同則會進一步處理,不同則直接丟棄。
  • 源MAC地址:傳送端的MAC地址同樣佔6個位元組
  • 型別:該欄位在網路協議棧分解中及其重要,考慮當PDU(協議資料單元)來到某一層時,它需要將PDU交付給上層,而上層協議眾多,所以在處理資料的時候,必須要一個欄位標識我這個交付給誰。如,該欄位為0x0800時,表示將有效載荷交付給IP協議,為0x0806交付給ARP,0X8035交付給RARP。
  • 資料:資料也叫有效載荷,除過當前層協議需要使用的欄位外,即需要交付給上層的資料,乙太網幀資料長度規定最小為46位元組,最大為1500位元組,如果有不到46位元組時,會用填充位元組填充到最小長度。最大值也叫最大傳輸單元(MTU),我們可以再 Linux輸入 ifconfig 可以看到有一項MTU:1500。
  • 幀檢驗序列FCS(使用CRC校驗法):檢測該幀是否出現差錯。

無效的MAC幀

當出現下列情況之一即為無效的MAC幀:

  1. 幀的長度不是8的倍數。
  2. 檢驗序列檢驗出差錯。
  3. 幀長度資料欄位不在46-1500之間。

CRC校驗步驟

(1)、在傳送端先把陣列按照一定劃分大小劃分為組,假設每組K個位元,要傳輸的資料記位M,傳送方要做的就是在資料M後面新增用於差錯檢測的 n 位冗餘碼,然後構成一個幀傳送出去,也就是說此時傳送的資料在原來基礎上曾家了n位冗餘碼。

(2)、n 位冗餘碼怎麼來的?
首先在原資料M後面新增n個0相當於左移n位,此時資料長度變為原來的每組K個位元加n即(k+n)位。然後用該序列除以在計算之前規定的一個長度為(n+1)位的除數P,根據二進位制的模2 運算

,計算出餘數R。這個餘數R就會作為冗餘碼拼接在原資料後面傳送出去。

模 2 運算:加法不進位,減法和加法一樣,比如:
1111+1010 = 0101;
cal

(3)、接收方把收到的每一個幀都處於同樣的餘數,然後檢查得到的餘數R:
- 若餘數R = 0,則判定這個幀沒有錯,接受。
- 若餘數R != 0,則判定這個幀有差錯。(只能檢測出該幀出現錯誤,無法定位出錯位置)。

注意:該檢測只能保證無位元差錯,而不能保證可靠傳輸。