1. 程式人生 > >【小菜學網路】乙太網幀結構

【小菜學網路】乙太網幀結構

上一小節,我們通過一個虛構的協議,初步認識了資料鏈路層的工作原理。資料鏈路層主要解決由若干主機組成的本地網路的通訊問題,**定址** 和 **複用分用** 思想在其中發揮著關鍵作用。 資料鏈路層有一個非常重要的協議—— **乙太網協議** 。接下來,我們一起來揭開它的神祕面紗! 使用乙太網協議進行通訊的主機間,必須通過某種介質直接相連。通訊介質可以是真實的物理裝置,如網線、網絡卡等;也可以是通過虛擬化技術實現的虛擬裝置。 ![](https://cdn.fasionchan.com/p/c63b3ba2aa5bfe2d5f850bf8d66f8d04eb97abbc.png) # 乙太網幀 在乙太網中,資料通訊的基本單位是 **乙太網幀** ( _frame_ ),由 **頭部** ( _header_ )、**資料** ( _data_ )以及 **校驗和** ( _checksum_ )三部分構成: ![](https://cdn.fasionchan.com/p/e8209e82c82e391c860bd5ef35678232cc38b083.png) > 請注意,這圖中的單位為位元組,而不是位元了。 ## 頭部 乙太網幀頭部包含 _3_ 個欄位,依次是: - **目的地址** ,長度是 _6_ 位元組,用於標記資料由哪臺機器接收; - **源地址** ,長度也是 _6_ 位元組,用於標記資料由哪臺機器傳送; - **型別** ,長度是 _2_ 位元組,用於標記資料該如何處理, `0x0800` 表示該幀資料是一個 _IP_ 包(後續章節介紹)。 除了欄位長度有所拓展之外,乙太網幀跟我們虛構出來的協議如出一轍。對了,我們注意到一點小差異——在乙太網幀中, **目的地址** 放在最前面。 這其中有什麼特殊考慮嗎? 確實是有的。接收方收到一個乙太網幀後,最先處理 **目的地址** 欄位。如果發現該幀不是發給自己的,後面的欄位以及資料就不需要處理了。基礎網路協議影響方方面面,設計時處理效率也是一個非常重要的考量。 ## 資料 **資料** 可以是任何需要傳送的資訊,長度可變, _46_ 至 _1500_ 位元組均可。 上層協議報文,例如 _IP_ 包,可以作為資料封裝在乙太網幀中,在資料鏈路層中傳輸。因此,資料還有另一個更形象的稱謂,即 **負荷** ( _payload_ )。請自行腦補資料 **搭載** 在乙太網幀這個交通工具上旅行的畫面。 ## 校驗和 由於物理訊號可能受到環境的干擾,網路裝置傳輸的位元流可能會出錯。一個乙太網幀從一臺主機傳輸到另一臺主機的過程中,也可能因各種因素而出錯。那麼當主機收到乙太網幀時,如何確定它是完好無損的呢? 答案是: **校驗和** 。我們可以用諸如 **迴圈冗餘校驗** ( _CRC_ )演算法,為乙太網幀計算校驗和。如果乙太網幀在傳輸的過程出錯,校驗和將發生改變。 注意到,乙太網幀最後面有一個 _4_ 位元組欄位,用於儲存校驗和。傳送者負責為每個乙太網幀計算校驗和,並將計算結果填寫在校驗和欄位中;接收者接到乙太網幀後,重新計算校驗和並與校驗和欄位進行對比;如果兩個校驗和不一致,說明該幀在傳輸時出錯了。 【小菜學網路】系列文章首發於公眾號【小菜學程式設計】,敬請關注: ![](https://cdn.fasionchan.com/coding-fan-wechat-soso.png?x-oss-process=image/resize,w_359)