Media Access Control(MAC) Frame 解析
前言
千里之行,始於足下。 因爲個人從事網絡協議開發,一直想深入的學習一下協議族,從這篇開始,我將開始記錄分享我學習到的網絡協議相關的知識
簡介
引用百度百科的描述:
數據鏈路層是OSI參考模型中的第二層,介乎於物理層和網絡層之間。數據鏈路層在物理層提供的服務的基礎上向網絡層提供服務,其最基本的服務是將源自網絡層來的數據可靠地傳輸到相鄰節點的目標機網絡層
由於 Ethernet 的歷史原因,這一層需要兼容各種不同的物理層,因此具體的協議也比較多。 但是好在他們的幀格式是統一的,這篇文章我們將就本人機器上看到的幀來學習一下。
Frame 格式
我們先用一張圖來描述一下 MAC 層幀的格式:
由圖可以看出,每個 MAC 幀是由以下幾個部分構成的:
- Preamble
- SFD(Start Frame Delimiter)
- Destionation Address: 這個幀的目標機器的地址
- Soruce Address: 這個幀的源機器的地址
- Length/Type:用來表示此字段之後用戶數據的長度。這裏的用戶數據就是上圖中 LENGTH/TYPE 字段之後的數據。 其中包含可以包含 padding, FCS(Frame Check Sequence), 和 Extension.
- FCS(Frame Check Sequence)包含一個循環冗餘檢驗值用來檢測數據的網絡鏈路中可能發生的數據錯誤
- Extension:只有在 100M 半雙工情況下才會使用
接下來,我們詳細描述一下各個字段所代表的意義
Preamble
它的長度爲 7 byte. 是用來讓PLS電路達到其穩態同步與接收包的定時(這裏附上官方英文描述: that is used to allow the PLS circuitry to reach its steady-state
synchronization with the received packet’s timing)
Start Frame Delimiter (SFD)
它的長度爲 1 byte,且是一個固定值 10101011。它緊隨 Preamble 字段,它之後的字節就是 MAC Frame 的內容了.
Address
緊跟 SFD 字段的就是該 MAC Frame 的源地址和目標地址.
它的格式如下:
- Address 是一個長度爲 48 bit 小段編碼的 MAC 地址.
- 第一個 bit (小端編碼):
(1) 對於源地址,該位被保留,設置爲 0
(2) 對於目標地址,該位代表代表地址類型. 可能的值有如下兩種:
1> 該位爲 0, 代表他是一個 individual address. 目標地址是一個特定的網絡設備
2> 該位爲 1,代表他是一個 group address.這裏又細分爲兩類:Multicast-Group Address:目標地址代表一個特定的邏輯網絡設備的集合. Broadcast Address: 目標地址代表所有當前連接到當前 LAN 的網絡設備. - 第二個 bit (小段編碼):1 代表該地址是一個本地配置的地址,0 代表是全局配置的地址. 對於廣播地址,該位總是被設置爲 1
LENGTH/TYPE
該字段的長度爲 2 byte,它的具體意義取決於它的實際值.
- 如果該字段的值小於或等於 0x05DC, 那麼該字段的意義是: 表示該字段之後緊隨其後的 MAC 用戶數據的字節長度。也就是第一張圖中 MAC CLINET DATA 字段佔用的數據長度.
- 如果該字段的值大於或等於 0x0600, 那麼該字段的意義是:Ethertype of the MAC client protocol, 個人理解,這種情況下,該字段代表的是當前
MAC Client Data
該字段用來承載實際上要在網絡中發送的數據(當然不是我們 socket 中發送的數據, socket 中發送的數據需要經過tcp,ip 層的包裝之後才能放在 該字段中發送)
它有最大長度的限制. MAC 幀一共有三種,他們分別對應的最大長度如下所示:
Frame type | Max data size |
---|---|
Basic Frame | 1500 |
Q-tagged Frame | 1504 |
Envelop Frame | 1982 |
規範中指出,Ethernet 至少支持上述三種幀類型中的一種
Pad
爲了 CSMA/CD 協議能正常工作,協議對幀的最小值也進行的限制.
如果需要 pad, 那麼它應該被添加在 MAC Client Data 和 FCS 字段之間.
Pad 的長度計算方法爲 max (0, minFrameSize – (clientDatasize + 2 *addressSize + 48)) bit. 這裏的 48 bit 的來歷是: 2 字節的 Length/Type 字段和 4 字節的 FCS 字段.
FCS
該字段包含一個長度爲 4 byte 的循環冗餘檢驗碼, 關於該算法這裏不再贅述.
Extension
略
實踐
在簡單的描述了 MAC 幀格式之後,我們來嘗試着分析一個本人機器上 Wireshark 抓包的結構.
該數據包對應的字節數據爲: dc a3 33 c4 1e 5a d0 ab d5 23 a5 0a 08 00
這裏我們逐一分析一下:
- Wireshark 沒有抓到 Start Frame Delimiter 和 Preamble 字段的數據,只有 SFD 字段之後的數據被解析出來.
- 每個 MAC Address 長度爲 48 bit,也就是 6 個字節,下來我們先解析一下地址
- dc a3 33 c4 1e 5a 便是 Destination Address 字段的數據,0xdc 小段編碼的第一位爲 0,那麼該地址類型是 Individual Address. 第二位爲 0,那麼該地址是一個全局配置的 MAC 地址.
- dc a3 33 c4 1e 5a 對應的 MAC 地址是 dc:a3:dd:c4:1e:5a
- d0 ab d5 23 a5 0a 便是 Source Address。 這裏與 Destination Address 的前兩個 bit 相同,不再解析. MAC 地址值爲 d0🆎d5:23:a5:0a. 因爲這個 wireshak 包是我的機器給遠程服務器發送 TCP 數據的包,因此這個 MAC 地址便是我本機的 MAC 地址. 使用 ipconfig /all 確認一下
果然一致 - 08 00 對應於 Length/Type 字段。 因爲該值大於 0600, 那麼該字段代表上層協議的類型. RFC894 規定 IP 協議的下層 MAC 協議中的 Type 字段應該設置爲 08 00。 也就意味着我們這個 MAC 幀中的 MAC Client Data 包含一個 IP 包.
- 這裏因爲我們還不想涉及到 IP 協議的知識,暫且略過 MAC Client Data 字段的分析
- 對於後續的 Pad, FCS, Extension 字段貌似無法在 Wireshark 包中看到,這裏也只能暫且作罷. 如果有讀者知道如何查看這幾個字段的數據,還請告知,感謝
END!