1. 程式人生 > >這一次,徹底拿下計算機網路鏈路層!

這一次,徹底拿下計算機網路鏈路層!

![](https://z3.ax1x.com/2021/03/21/656v3d.png) 下面我們把關注點放在資料鏈路層,如果沒有資料鏈路層,計算機網路也就不復存在;這就好比大樓沒有了地基,人沒有了腿;所以,資料鏈路層的知識也固然重要,不少小夥伴只把關注點放在 TCP 和 IP 這兩個協議上,這是一種狹隘的思想,需要及時糾正,計算機網路可不只有 TCP 和 IP。下面 cxuan 就和你聊聊計算機中的資料鏈路層。 ## 資料鏈路層 資料鏈路層,按照 OSI 七層模型來劃分的話,就屬於物理層的上層 ![](https://z3.ax1x.com/2021/03/21/656xgA.png) 資料鏈路層是一種協議層,它有很多協議。資料鏈路層**用於跨物理層在網段節點之間傳輸資料**,通常指乙太網、無線區域網等通訊手段。資料鏈路層提供了在網路的兩個實體之間傳輸資料的功能,並且提供了`差錯檢測`用於糾正物理層中發生的錯誤。 ### 關鍵概念 在資料鏈路層中,鏈路層地址有很多中不同的稱謂:LAN 地址、實體地址或者 MAC 地址,因為 MAC 地址是最流行的術語,所以我們一般稱呼鏈路層地址指的就是 MAC 地址。 下面我們就來認識一下資料鏈路層的幾個關鍵概念 #### 打包成幀 `打包成幀(framing)`: 在每個網路層資料報在傳輸之前,幾乎所有的鏈路層協議都會將資料報用鏈路層封裝起來。資料鏈路層從網路層獲取資料後將其封裝成為 `幀`,如果幀太大的話,資料鏈路層會將大幀拆分為一個個的小幀,小幀能夠使傳輸控制和錯誤檢測更加高效。 >幀就是 0 1 序列的封裝。 一個幀由 **Header、Payload Field、Trailer** 組成,網路層資料報就封裝在 `Payload Field` 欄位中。根據不同的物理介質,每個幀的結構也不同。幀的組成如下 ![](https://z3.ax1x.com/2021/03/21/656j9H.png) 幀中主要涉及的內容如下 * `幀頭(Frame header)`:它包含幀的源地址和目的地址。 * `有效載荷(Payload Field)`:它包含要傳遞的資料和資訊。 * `尾部標記(Trailer)`:它包含錯誤檢測和錯誤糾正位。 * `標記(Flag)`:它標記了幀的開始和結束。 Flag 位位於幀的開頭和結尾,兩個連續的標誌指示幀的結束和開始 ![](https://z3.ax1x.com/2021/03/21/656O4e.png) 幀的型別主要有兩種,固定大小的幀和可變大小的幀。 * `固定大小的幀(Fixed-sized Framing)`:表示幀的大小是固定的,幀的長度充當幀的邊界,因此它不需要額外的邊界位來標識幀的開始和結束。 * `可變大小的幀(Sized Framing)`:表示每個真的大小是不固定的,因此保留了其他機制來標記一幀的結束和下一幀的開始。它通常用於區域網,在可變大小的幀中定義幀定界符的兩種方法是 * `長度欄位(Length Field)`: 使用長度欄位來確定幀的大小。它用於乙太網(IEEE 802.3) * `結束定界符(End Delimiter)`: 經常用於令牌環 #### 鏈路接入 鏈路接入主要指的是 MAC 協議,`MAC(Medium Access Control)` 協議規定了幀在鏈路上的傳輸規則。我們知道,資料鏈路層是 OSI 標準模型的第二層,資料鏈路層向下還能夠細分,主要分為 `The logical link control (LLC)` 層和`The medium access control (MAC) ` 層。 ![](https://z3.ax1x.com/2021/03/21/656LND.png) LLC 層又叫做`邏輯控制鏈路`層,它主要用於資料傳輸,它充當網路層和資料鏈路層中的`媒體訪問控制(MAC)`子層之間的介面。LLC 層的主要功能如下 * LLC 的主要功能是傳送時在 MAC 層上多路複用協議,並在接收時同樣地多路分解協議。 * LLC 提供跳到跳的流和差錯控制,像是路由器和路由器之間這種相鄰節點的資料傳輸稱為 `一跳`。 * 它允許通過計算機網路進行多點通訊。 MAC 層負責傳輸介質的流控制和多路複用,它的主要功能如下 * MAC 層為 LLC 和 OSI 網路的上層提供了物理層的抽象。 * MAC 層負責封裝幀,以便通過物理介質進行傳輸。 * MAC 層負責解析源和目標地址。 * MAC 層還負責在衝突的情況下執行衝突解決並啟動重傳。 * MAC 層負責生成幀校驗序列,從而有助於防止傳輸錯誤。 在 MAC 層中,有一個非常關鍵的概念就是 `MAC 地址`。MAC 地址主要用於識別資料鏈路中互聯的節點,如下圖所示 ![](https://z3.ax1x.com/2021/03/21/656qAO.png) MAC 地址長 48 bit,在使用`網絡卡(NIC)` 的情況下,MAC 地址一般都會燒入 ROM 中。因此,任何一個網絡卡的 MAC 地址都是唯一的。MAC 地址的結構如下 ![](https://z3.ax1x.com/2021/03/21/656HHK.png) MAC 地址中的 3 - 24 位表示廠商識別碼,每個 NIC 廠商都有特定唯一的識別數字。25 - 48 位是廠商內部為識別每個網絡卡而用。因此,可以保證全世界不會有相同 MAC 地址的網絡卡。 >MAC 地址也有例外情況,即 MAC 地址也會有重複的時候,比如你可以手動更改 MAC 地址。但是問題不大,只要兩個 MAC 地址是屬於不同的資料鏈路層就不會出現問題。 #### 可靠交付 網路層提供的可靠交付更多指的是端系統到端系統的交付,而資料鏈路層提供的可靠交付更多指的是**單端鏈路節點到節點地傳送**。當鏈路層協議提供可靠交付時,它能保證無差錯地經鏈路層移動每個網路層資料報。鏈路層提供可靠交付的方法和 TCP 類似,也是使用 `確認` 和 `重傳` 取得的。 鏈路層的可靠交付通常用於出錯率很高的鏈路,例如無線鏈路,它的目的是在本地糾正出錯的幀,而不是通過運輸層或應用層協議強制進行端到端的資料傳輸。對於出錯率較低的鏈路,比如光纖、同軸電纜和雙絞線來說,鏈路層的交付開銷是沒有必要的,由於這個原因,這些鏈路通常不提供可靠的交付 ![](https://z3.ax1x.com/2021/03/21/6567B6.png) #### 差錯檢測和糾正 鏈路層資料以幀的形式傳送,在傳送的過程中,接收方節點的鏈路層硬體可能會由於訊號干擾或者電磁噪音等原因錯誤的把 1 識別為 0 ,0 識別為 1。這種情況下沒有必要轉發一個有差錯的資料報,所以許多鏈路層協議提供一種機制來檢測這樣的位元差錯。通過讓方節點在幀中包括差錯檢測位元,讓接收節點進行差錯檢查,以此來完成這項工作。 運輸層和網路層通過因特網校驗和來實現差錯檢測,鏈路層的差錯檢測通常更復雜,並且用硬體實現。差錯糾正類似於差錯檢測,區別在於接收方不僅能檢測幀中出現的位元差錯,而且能夠準確的確定幀中出現差錯的位置。 差錯檢測和糾正的技術主要有 * 奇偶校驗:它主要用來差錯檢測和糾正 * 校驗和:這是一種用於運輸層檢驗的方法 * 迴圈冗餘校驗:它更多應用於介面卡中的鏈路層 ### 地址對映 因為存在網路層地址(IP 地址)和 資料鏈路層地址(MAC 地址),所以需要在它們之間進行轉換和對映,這就是**地址解析協議**所做的工作,更多關於地址解析協議的理解,請查閱 [深入理解 ARP 協議](https://mp.weixin.qq.com/s?__biz=MzI0ODk2NDIyMQ==&mid=2247487804&idx=1&sn=f001a24a308053b3723dfb12d36045ee&chksm=e999e42edeee6d383fbb411792e22e4028bb8c2441255786f50cf848443af7b1bd5e382078dc&token=692920236&lang=zh_CN#rd) ### 資料鏈路層的作用 資料鏈路層中的協議定義了網際網路絡的兩個裝置之間傳輸資料的規範。資料鏈路層需要以`通訊介質` 作為傳輸載體,通訊媒介包含**雙絞銅線、光纖、電波等紅外裝置**。在資料分發裝置上有 **交換機、網橋、中繼器** 等中轉資料。鏈路層中的任何裝置又被稱為`節點(node)`,而沿著通訊路徑相鄰節點之間的通訊通道被稱為 `鏈路(link)`。實際上,在鏈路層上傳輸資料的過程中,鏈路層和物理層都在發揮作用。因為在計算機中,資訊是以 0 1 這種二進位制的形式進行傳輸,而實際的鏈路通訊卻是以電壓的高低、光的閃滅以及電波的頻譜來進行的,所以物理層的作用就是**把二進位制轉換成為鏈路傳輸所需要的資訊**來進行傳輸。資料鏈路層傳輸也不只是單個的 0 1 序列,它們通常是以 `幀`為單位進行的。 >現在我們知道了資料鏈路層大概是幹啥的,那麼只有理論不行,你還得有硬通貨,也就是硬體,一切的理論都離不開硬體的支撐。 硬體就可以簡單理解為`通訊介質`,在通訊介質上會有不同種類的資訊傳遞方式,不過總的來說可以概括為兩種:一種是`共享介質型網路`,一種是`非共享介質型網路`,下面我們就要聊一聊這兩種通訊型別。 ## 通訊型別分類 ### 共享介質型網路 共享介質型網路故名思義就是**多個裝置共同使用同一個通訊介質的網路**。共享介質型網路的型別主要有`乙太網(Ethernet)`和 `光纖分散式資料介面(Fiber Distributed Data Interface,FDDI)`。 共享說的是,多個裝置會使用同一個載波通道進行傳送和接收,這是一種半雙工的設計。 >什麼是半雙工? > >半雙工指的是資料可以在一個通道上的兩個方向上相互傳輸,但是不能同時傳輸,舉個簡單的例子,就是你能給我發訊息,我也能給你發訊息,但是不能你給我發訊息的同時我也在給你發訊息。 既然多個裝置會共同使用一個通道,那麼就可能存在多個數據傳輸到同一個介質上導致的資料爭用問題,為此,共享介質型網路有兩種介質訪問控制方式:**爭用和令牌傳遞**。 #### 爭用 爭用是發生在共享介質,`載波監聽多路訪問(CSMA)` 上的資料訪問方式。在這種訪問方式下,網路中各個介質會採用`先到先得`的方式佔用載波通道傳送資料。如果多個介質同時傳送幀,就勢必會產生衝突,繼而導致通訊效能的下降和網路擁堵。下面是爭用的處理方式 ![](https://z3.ax1x.com/2021/03/21/656Ij1.png) 如上圖所示,假如 A 想要給 C 傳送資料,那麼介質 A 會在確認周圍沒有其他介質要給 C 傳送資料後,也就是經過一段時間後,A 會把資料馬上傳送給 C。 ![](https://z3.ax1x.com/2021/03/21/6565cR.png) 每個介質在接受到 A 傳送的資料後,會從 A 報文中解析出來 MAC 地址判斷是否是傳送給自己的資料包,如果不是的話就是丟棄這條資料。 ![](https://z3.ax1x.com/2021/03/21/656439.png) 上面這種方式會使用在一部分乙太網中,但是另外一部分乙太網卻使用了 CSMA 的改良方式 - CSMA/CD 。CSMA/CD 會要求每個介質提前檢查一下鏈路上是否有可能產生衝突的現象,一旦發生衝突,那麼儘可能早地釋放通道。它的具體工作原理大致如下: * 監聽載波通道上是否會有資料流動,如果沒有的話,那麼任何介質都可以傳送資料。 * 介質會檢查是否發生衝突,一旦發生衝突就會丟棄資料,同時立即釋放載波通道。 * 放棄資料後,會經過一段時間重新爭用介質。 下面是 CSMA/CD 的改良版 ![](https://z3.ax1x.com/2021/03/21/656h9J.png) 上圖這個過程是 `CSMA(Carrier Sense Multiple Access)`,首先介質會監控載波通道上是否有資料存在,如果沒有再發送,如果有,等一段時間再發送。 下面是 `CD(Collision Detection)` 的示意圖 ![](https://z3.ax1x.com/2021/03/21/656Wh4.png) * 在傳送資料 -> 傳送完成後,如果電壓一直處於規定範圍內,就會認為資料已經正常傳送。 * 傳送途中,如果電壓超過了一定範圍,就會認為是資料衝突。 * 發生衝突時會先發送一個阻塞報文,繼而放棄資料,在延遲一段時間後再次傳送 #### 令牌環 第二種共享介質型網路的傳輸方式就是`令牌環`了,令牌環顧名思義就是有一個令牌一樣的東西,以環為一圈進行令牌傳輸,那麼令牌是啥呢?你想啊,我們最終的目的不就是為了傳輸資料嗎?那麼這個令牌,它可不可以作為資料呢? 其實,在這種傳輸方式中,令牌環是作為一種`特殊報文`來傳輸的,它是控制傳輸的一種方式,在資料傳輸的過程中同時會將令牌進行傳遞,只有獲得令牌的介質才能夠傳輸資料。這種方式有兩個優點,即 * 持有令牌的介質才能夠傳輸資料,這樣能夠保證不會有報文衝突情況。 * 每個介質都有平等獲取令牌的機會,這樣保證了即使網路擁堵也不會導致效能下降。 但是這種令牌環的傳遞方式也是有缺點的,因為只有持有令牌的介質才能傳送資料,所以即使在網路不太擁堵的情況下,其利用率也達不到 100%。 下面是令牌的傳遞示意圖 ![](https://z3.ax1x.com/2021/03/21/656RNF.png) 最一開始,令牌位於介質 A 處,此時介質 A 擁有資料傳輸的能力,然後介質 A 把令牌傳遞給介質 B。 ![](https://z3.ax1x.com/2021/03/21/6562AU.png) 此時 B 持有令牌,所以介質 B 具有傳送資料的能力。 ![](https://z3.ax1x.com/2021/03/21/656c7T.png) 這個資料最終會由 D 接收,然後 D 就會設定一個已接收資料的標誌位,然後資料會繼續向下傳送。 ![](https://z3.ax1x.com/2021/03/21/6566BV.png) 令牌環是一項很成功的技術,尤其是在公司環境中使用,但後來被更高版本的乙太網所取代。 在瞭解完共享網路之後,我們來探討一波非共享網路 ### 非共享介質型網路 如果說共享介質型網路是共享介質的話,那麼非共享介質型網路就是不共享介質,那麼如何通訊呢?在這種方式下,網路中的每個介質會直接連上`交換機`,由交換機來轉發資料幀。傳送端和接收端不會共享通訊介質,共享通訊介質的意思就是介質之間直接通訊。這種網路傳輸方式一般採用的是全雙工通訊。 非共享介質型網路比較適合應用於搭建`虛擬區域網(VLAN)`,但是這種通訊方式有一個及其致命的弱點:一旦交換機發生故障,那麼與交換機相連的所有計算機都無法通訊。 下面是非共享介質型網路的通訊示意圖 ![](https://z3.ax1x.com/2021/03/21/656yn0.png) 如圖所示,主機 A 傳送了一個目標地址為 B,源地址為 A 的交換機,由交換機負責將資料轉發給介質 B,如下圖所示 ![](https://z3.ax1x.com/2021/03/21/656rXq.png) 非共享型網路是一種全雙工通訊的方式,每個介質在傳送資料的同時也能夠接受來自交換機傳遞過來的資料。 ### 交換集線器 交換集線器是一種共享型網路通訊介質,它是使用同軸電纜作為傳輸介質,通常用於乙太網中,交換集線器也叫做`乙太網交換機`。 ![](https://z3.ax1x.com/2021/03/21/656Dcn.png) 乙太網交換機中的各個埠會根據介質的 `MAC地址`來轉發資料,那麼轉發資料肯定得有所依靠啊,這時可以參考的表就叫做`轉發表(Forwarding Table)`,轉發表中記錄著每個介質的 MAC 地址。轉發表當然不需要我們手動維護,交換機會自動維護轉發表。交換機會`自學`每個資料包的經過介質的 MAC 地址,如下圖所示 ![](https://z3.ax1x.com/2021/03/21/656dhQ.png) 由於不知道主機 B 的 MAC 地址,所以主機 A 傳送的資料會經過交換機廣播給乙太網內的其他主機,主機 B 接收到資料後,會給主機 A 回送訊息。 ![](https://z3.ax1x.com/2021/03/21/656B1s.png) 在主機 B 給主機 A 回送訊息後,交換機就知道主機 A 和主機 B 的 MAC 地址了,從此以後雙方通訊會在各自相連的埠之間進行。 由於 MAC 地址沒有層次性,轉發表中的記錄個數與所有網路裝置的`數量`有關,當裝置增加時,轉發表的記錄也會越來越多,檢索時間會逐漸增加。所以如果需要連線多個終端時,需要將網路分成多個數據鏈路,採用類似 IP 地址一樣對地址進行分層管理。 在網路通訊的過程中,由於網路鏈路的冗餘或者路由線路冗餘可能會造成`閉環`,也就是我們所稱的`環路`。環路會導致資料報文在網路中不斷重複複製,最終導致網路裝置負載過重,無法正常執行。影響的範圍可能會擴散至整個區域網,導致整個局域網裡的計算機無法正常使用網路。 ![](https://z3.ax1x.com/2021/03/21/656Tnx.png) >那麼如何檢測網路中出現的環路呢? ### 環路檢測方法 目前有兩種檢測環路的方式,一種是`生成樹`,一種是`源路由法`。 生成樹:生成樹指的是每個網橋必須在 1 - 10 秒內相互交換生成樹協議單元包,以此來判斷哪些介面使用,從而消除環路,一旦發生故障後就會立刻切換線路,利用沒有被使用的埠進行傳輸。 源路由法:源路由法通常是用來解決令牌環路。這種方式可以判斷髮送資料的源地址是通過哪個網橋實現傳輸的,並將幀寫入 RIF,網橋會根據這個 RIF 資訊傳送給目標地址,即使網橋中出現了環路,資料幀也不存在被反覆轉發的可能。 ### 虛擬區域網 VLAN 網路通訊過程中經常會遇到網路負載過高,通訊效能下降的情況,往往遇到這種情況,就需要分散網路負載,變換部署網路裝置的位置等。在虛擬區域網出現之前,往往需要管理員手動變更網路的拓撲結構,比如變更主機網段,進行硬體線路改造等,但是使用了虛擬區域網,就可以不用再做如此複雜的操作了,只需要修改**網路結構**即可。 >那麼虛擬區域網究竟是什麼呢? ![](https://z3.ax1x.com/2021/03/21/6560pj.png) 如上圖所示,交換機按照埠區分了多個網段,從而區分了廣播資料的傳播範圍,提高網路安全性。然而異構的兩個網段之間,需要利用具有路由功能的交換機才能實現通訊。 由於交換機埠有兩種 VLAN 屬性,一個是 VLANID,一個是 VLANTAG,分別對應 VLAN 對資料包設定 VLAN 標籤和允許通過的 VLANTAG(標籤)資料包,不同 VLANID 埠,可以通過相互允許 VLANTAG,構建 VLAN。 ## 乙太網 乙太網提了這麼多次,那麼乙太網到底是什麼? 資料鏈路層有很多分類,包括**乙太網、無線通訊、PPP、ATM、POS、FDDI、Token Ring、HDMI 等**,其中最著名的通訊鏈路就是乙太網了。 乙太網最開始的時候,一般使用的是以同軸電纜為傳輸介質的共享介質型連線方式,這也是乙太網的第一種方式,叫做`經典乙太網`。而現在,隨著互聯裝置的處理能力和傳輸速度的提高,現在都採用終端和交換機之間連線方式,這也是第二種方式,叫做`交換式乙太網`。乙太網使用的是 `CSMA/CD` 的匯流排技術,我們前面也介紹過了。 ### 以太幀格式 在乙太網鏈路上的資料包被稱為`以太幀`,以太幀開頭有一個叫做`前導碼(Preamble)` 的部分,它是由 0、1 數字交替組合而成。前導碼的末尾最後是一個叫做 `SFD(Start Frame Delimiter)` 的域,值為 11。前導碼與 SFD 共同佔用 8 個位元組。 ![](https://z3.ax1x.com/2021/03/21/656UAS.png) >乙太網最後 2 bit 稱為 SDF,而 IEEE802.3 中將最後 8 bit 稱為 SDF。 > >IEEE802.3 是電氣和電子工程師協會 (IEEE)標準的集合制定的標準。 這是以太幀的前導碼部分,下面是以太幀的本體部分 ![](https://z3.ax1x.com/2021/03/21/656atg.png) 以太幀體格式也有兩種,一種是以太幀格式,一種是 IEEE802.3 標準以太幀格式。 在以太幀格式中,以太幀的本體的前端是乙太網的首部,總共佔用 14 位元組,分別是 6 位元組的目標 MAC 地址、6 位元組的源 MAC 地址和 2 位元組的上層協議型別,後面是資料部分,佔用 46 - 1500 位元組,最後是 `FCS(Frame Check Sequence,幀檢驗序列)` 4 個位元組。FCS 用於檢查幀是否有所損壞,因為在通訊過程中由於噪聲干擾,可能會導致資料出現亂碼位。 IEEE802.3 以太幀的格式有區別,一般以太幀中的型別欄位卻在 IEEE802.3 表示幀長度,此外新增加了 LLC 和 SNAP 欄位。 >資料鏈路層在細化的話可以分為兩層,介質訪問控制層和邏輯鏈路控制層 > >介質訪問會根據乙太網等不同鏈路特有的首部資訊進行控制,邏輯鏈路層則根據乙太網等不同鏈路共有的幀頭資訊進行控制。 LLC 和 SNAP 就是邏輯鏈路控制的首部資訊,那麼現在你應該明白怎麼回事兒了吧。 **我自己肝了六本 PDF,微信搜尋「程式設計師cxuan」關注公眾號後,在後臺回覆 cxuan ,領取全部 PDF,這些 PDF 如下** [六本 PDF 連結](https://s3.ax1x.com/2020/11/30/DgOK6f.png) ![](https://img2020.cnblogs.com/blog/1515111/202011/1515111-20201130090550310-1032998206.png) ![](https://img2020.cnblogs.com/blog/1515111/202103/1515111-20210330095116003-15074016