當前位置:
首頁 > 最新 > TCP/IP協議棧之乙太網協議

TCP/IP協議棧之乙太網協議

在數據鏈路層一節,我們虛構了一個網路協議,用於解決多伺服器通訊的主要問題。 接下來,介紹一個真實的數據鏈路層協議——乙太網協議

使用乙太網協議進行通信的實體間,必須通過某種介質直接相連。 通信介質可以是真實的物理設備,如網線、 網卡 等; 也可以是通過虛擬化實現的虛擬設備。

乙太網協議在這類通信中,主要解決定址以及復用/分用兩大問題。


乙太網協議與數據鏈路層中虛構出來的協議幾乎一摸一樣。

在乙太網中,數據通信的基本單位是乙太網幀( )。協議規定乙太網幀的數據格式如下(注意這裡的單位為位元組而不是比特了):

乙太網幀:目的地址、源地址、類型、數據、校驗和

是不是有種似曾相識的感覺!

乙太網幀,分為頭部( )、數據( )以及校驗和( )總共 大部分。

其中,頭部依次是一個 位元組長的目的地址,用於標記數據由哪台機器接收; 一個 位元組長的源地址,用於標記數據由哪台機器發送; 一個 位元組長的類型,用於標記數據包該如何處理, 表示承載的是一個 包(後續介紹)。

除了長度有所拓展之外,跟我們虛構出來的協議並無二致。 對了,有一點差異——真實的協議中,目的地址放在最前面。 這其中有什麼特殊考慮嗎?

確實是有的。 接收方收到數據最先處理目的地址,如果發現數據不是自己的,後面的欄位以及數據就無需處理了。 基礎網路協議影響方方面面,設計時處理效率也是一個非常重要的考量。

數據可以是任何需要發送的信息,長度可變, 至 個位元組。 數據還有另一個更形象的稱謂,負荷( )。 自己腦補數據搭載交通工具旅行的畫面。

哈哈,跟我們假設的套路一模一樣!


現實世界中,計算機通過網線連接到一起:

乙太網網路

每台通過網線通訊的計算機都需要安裝一個硬體設備——網卡( ), 是 的縮寫。

從物理的層面看,網卡負責將比特流轉換成電信號發送出去; 反過來,也負責將檢測到的電信號轉換成比特流並接收。

從軟體的層面看,發送數據時,內核協議棧負責封裝乙太網幀(填充目的地址源地址類型數據並計算校驗和),並調用網卡驅動發送; 接收數據時,負責驗證目的地址校驗和並取出數據部分,交由上層協議棧處理。

網卡

每塊網卡出廠時,預先分配了一個全球唯一的 MAC地址 ,並燒進硬體。 不管後來網卡身處何處,接入哪個網路, 地址均不變。 當然,某些操作系統也允許修改網卡的 地址。

混雜模式

正常情況下,網卡忽略目的地址與自己不符的數據幀。 如果想要網卡接收所有數據幀,可以開啟混雜模式

設置完成之後,網卡 帶上 標誌,代表混雜模式已經開啟。

混雜模式開啟後,網卡接收到的數據,不管目的地址是否是自己,都會提交驅動程序處理。 這在使用 等工具抓包分析網路數據時特別有用。


地址由 個位元組組成( 位),可以支持 的 次方,也就是 個網路設備(比如網卡)。

全球唯一MAC地址

如圖, 地址 個位元組可以劃分成兩半部分:

位元組長的廠商代碼( ),由國際組織分配給不同的網路設備商;

位元組長的序列號( ),由廠商分配給其生產的網路設備;

以此保證全球唯一性。

冒分十六進位

地址 個位元組如何展示呢? 能不能當做 ASCII 來解讀並顯示?

恐怕不能。 一個位元組總共有 個位,而 ASCII 只定義了其中的 位。 而且, ASCII 也定義了很多控制字元,能顯示的也只有字母、數字以及一些常用符號。 以上述地址為例,只有 這個位元組是可以顯示的,對應著 。

好在,我們可以用多個可讀字元表示一個原始位元組。 我們將一個位元組分成兩部分,高 位以及低 位,每部分可以用一個十六進位字元來表示。

以 這個位元組為例,可以用兩個字元 表示。 這樣一來,整個地址可以用一個 位元組長的字元串表示: 。 為了進一步提高可讀性,可以在中間插入冒號 : 。

這就是冒分十六進位( )。

注意到,冒分十六進位總共需要 個位元組。 如果算上結尾處的 ,那麼將是 個位元組,原來的整整 倍!


實驗網路

如圖,我們用 創建 台虛擬機,依次是 、 以及 。 台虛擬機均安裝 操作系統,這裡我們選擇 。

Virtualbox虛擬機

每台虛擬機均配置兩塊網卡:網卡一用於從宿主 登錄伺服器(虛擬機); 網卡二則連接到同一個乙太網絡 :

網卡配置

注意

這裡混雜模式選擇全部允許,即對應網卡開啟混雜模式

實驗環境搭建完畢,接下來登錄伺服器做實驗!登錄 ,查看網卡信息:

總共有 個網路設備: 是環回設備,從這個設備發送出去的數據幀最終還是送回本機; 是第一塊網卡,用於與宿主機通訊; 是第二塊網卡,連接到我們的實驗乙太網絡 。

其他機器的設備結構也是一樣的,下面列一下每台機器 網卡綁定的地址:

表格-1 enp0s8網卡物理地址

接下來,我們通過乙太網數據幀從 往 發送一個數據。 為了觀察數據,我們先在 以及 上運行 命令,嗅探網路數據包:

接著,使用 命令發送數據幀:

命令 選項指定發送網卡名; 選項是目的 地址,即 伺服器 網卡的地址; 選項指定類型,這裡我們隨便取了一個 ; 選項指定數據,這裡是最經典的

在 上,我們看到了 發送過來的數據包:

注意到,由於數據至少是 位元組,系統自動在 後面填充 位元組。

另外,伺服器 也收到這個數據了:

但是, 檢查數據幀目的地址是 , 而自己網卡地址是 並不匹配, 便知道這個數據不是自己的。

如果關閉 混雜模式 , 伺服器網卡將忽略這個數據。


本節,我們學習了一個真實的數據鏈路層協議——乙太網協議,乙太網協議的通信單位為 乙太網幀 ( )。 一個乙太網幀頭部數據以及檢驗和部分組成,而頭部又由目的地址源地址以及類型個欄位組成。

計算機通過乙太網進行通訊,需要安裝 網卡 ,並用網線連接起來。 每塊網卡出廠前,都預先分配一個 全球唯一 的 MAC地址 並燒進硬體。 地址由 個位元組組成,在乙太網協議中用於 定址 。

一般情況下,網卡忽略目的地址與自己不符的數據幀。 開啟 混雜模式 後,網卡將接收所有數據,不管目的地址是什麼。


新技能Get??


如果你對如何編寫程序發送乙太網數據幀感興趣,那麼可以看看 編程實踐 相關章節。 根據喜歡的編程語言,按需取用:

乙太網編程實踐(C語言)

乙太網編程實踐(Python語言)

訂閱更新,獲取更多學習資料,請關注我們的 微信公眾號 :

小菜學編程

RFC 894


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 小菜學編程 的精彩文章:

TAG:小菜學編程 |