點擊藍色“程序員cxuan ”關注我喲
加個“星標”,及時接收最新文章
hey guys,大家好啊,這裏是 cxuan 計算機網絡連載系列的文章第 12 篇文章。本篇文章我來跟你計算機網絡中的數據鏈路層相關知識。
下面我們把關注點放在數據鏈路層,如果沒有數據鏈路層,計算機網絡也就不復存在;這就好比大樓沒有了地基,人沒有了腿;所以,數據鏈路層的知識也固然重要,不少小夥伴只把關注點放在 TCP 和 IP 這兩個協議上,這是一種狹隘的思想,需要及時糾正,計算機網絡可不只有 TCP 和 IP。下面 cxuan 就和你聊聊計算機中的數據鏈路層。
數據鏈路層
數據鏈路層,按照 OSI 七層模型來劃分的話,就屬於物理層的上層
數據鏈路層是一種協議層,它有很多協議。數據鏈路層用於跨物理層在網段節點之間傳輸數據,通常指以太網、無線局域網等通信手段。數據鏈路層提供了在網絡的兩個實體之間傳輸數據的功能,並且提供了差錯檢測
用於糾正物理層中發生的錯誤。
關鍵概念
在數據鏈路層中,鏈路層地址有很多種不同的稱謂:LAN 地址、物理地址或者 MAC 地址,因爲 MAC 地址是最流行的術語,所以我們一般稱呼鏈路層地址指的就是 MAC 地址。
下面我們就來認識一下數據鏈路層的幾個關鍵概念
打包成幀
打包成幀(framing)
: 在每個網絡層數據報在傳輸之前,幾乎所有的鏈路層協議都會將數據報用鏈路層封裝起來。數據鏈路層從網絡層獲取數據後將其封裝成爲 幀
,如果幀太大的話,數據鏈路層會將大幀拆分爲一個個的小幀,小幀能夠使傳輸控制和錯誤檢測更加高效。
幀就是 0 1 序列的封裝。
一個幀由 Header、Payload Field、Trailer 組成,網絡層數據報就封裝在 Payload Field
字段中。根據不同的物理介質,每個幀的結構也不同。幀的組成如下
幀中主要涉及的內容如下
幀頭(Frame header)
:它包含幀的源地址和目的地址。有效載荷(Payload Field)
:它包含要傳遞的數據和信息。尾部標記(Trailer)
:它包含錯誤檢測和錯誤糾正位。標記(Flag)
:它標記了幀的開始和結束。
Flag 位位於幀的開頭和結尾,兩個連續的標誌指示幀的結束和開始
幀的類型主要有兩種,固定大小的幀和可變大小的幀。
固定大小的幀(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)
層。
LLC 層又叫做邏輯控制鏈路
層,它主要用於數據傳輸,它充當網絡層和數據鏈路層中的媒體訪問控制(MAC)
子層之間的接口。LLC 層的主要功能如下
LLC 的主要功能是發送時在 MAC 層上多路複用協議,並在接收時同樣地多路分解協議。
LLC 提供跳到跳的流和差錯控制,像是路由器和路由器之間這種相鄰節點的數據傳輸稱爲
一跳
。它允許通過計算機網絡進行多點通信。
MAC 層負責傳輸介質的流控制和多路複用,它的主要功能如下
MAC 層爲 LLC 和 OSI 網絡的上層提供了物理層的抽象。
MAC 層負責封裝幀,以便通過物理介質進行傳輸。
MAC 層負責解析源和目標地址。
MAC 層還負責在衝突的情況下執行衝突解決並啓動重傳。
MAC 層負責生成幀校驗序列,從而有助於防止傳輸錯誤。
在 MAC 層中,有一個非常關鍵的概念就是 MAC 地址
。MAC 地址主要用於識別數據鏈路中互聯的節點,如下圖所示
MAC 地址長 48 bit,在使用網卡(NIC)
的情況下,MAC 地址一般都會燒入 ROM 中。因此,任何一個網卡的 MAC 地址都是唯一的。MAC 地址的結構如下
MAC 地址中的 3 - 24 位表示廠商識別碼,每個 NIC 廠商都有特定唯一的識別數字。25 - 48 位是廠商內部爲識別每個網卡而用。因此,可以保證全世界不會有相同 MAC 地址的網卡。
MAC 地址也有例外情況,即 MAC 地址也會有重複的時候,比如你可以手動更改 MAC 地址。但是問題不大,只要兩個 MAC 地址是屬於不同的數據鏈路層就不會出現問題。
可靠交付
網絡層提供的可靠交付更多指的是端系統到端系統的交付,而數據鏈路層提供的可靠交付更多指的是單端鏈路節點到節點地的傳送。當鏈路層協議提供可靠交付時,它能保證無差錯地經鏈路層移動每個網絡層數據報。鏈路層提供可靠交付的方法和 TCP 類似,也是使用 確認
和 重傳
取得的。
鏈路層的可靠交付通常用於出錯率很高的鏈路,例如無線鏈路,它的目的是在本地糾正出錯的幀,而不是通過運輸層或應用層協議強制進行端到端的數據傳輸。對於出錯率較低的鏈路,比如光纖、同軸電纜和雙絞線來說,鏈路層的交付開銷是沒有必要的,由於這個原因,這些鏈路通常不提供可靠的交付
差錯檢測和糾正
鏈路層數據以幀的形式發送,在發送的過程中,接收方節點的鏈路層硬件可能會由於信號干擾或者電磁噪音等原因錯誤的把 1 識別爲 0 ,0 識別爲 1。這種情況下沒有必要轉發一個有差錯的數據報,所以許多鏈路層協議提供一種機制來檢測這樣的比特差錯。通過讓方節點在幀中包括差錯檢測比特,讓接收節點進行差錯檢查,以此來完成這項工作。
運輸層和網絡層通過因特網校驗和來實現差錯檢測,鏈路層的差錯檢測通常更復雜,並且用硬件實現。差錯糾正類似於差錯檢測,區別在於接收方不僅能檢測幀中出現的比特差錯,而且能夠準確的確定幀中出現差錯的位置。
差錯檢測和糾正的技術主要有
奇偶校驗:它主要用來差錯檢測和糾正
校驗和:這是一種用於運輸層檢驗的方法
循環冗餘校驗:它更多應用於適配器中的鏈路層
地址映射
因爲存在網絡層地址(IP 地址)和 數據鏈路層地址(MAC 地址),所以需要在它們之間進行轉換和映射,這就是地址解析協議所做的工作,更多關於地址解析協議的理解,請查閱
數據鏈路層的作用
數據鏈路層中的協議定義了互聯網絡的兩個設備之間傳輸數據的規範。數據鏈路層需要以通信介質
作爲傳輸載體,通信媒介包含雙絞銅線、光纖、電波等紅外裝置。在數據分發裝置上有 交換機、網橋、中繼器 等中轉數據。鏈路層中的任何設備又被稱爲節點(node)
,而沿着通信路徑相鄰節點之間的通信信道被稱爲 鏈路(link)
。實際上,在鏈路層上傳輸數據的過程中,鏈路層和物理層都在發揮作用。因爲在計算機中,信息是以 0 1 這種二進制的形式進行傳輸,而實際的鏈路通信卻是以電壓的高低、光的閃滅以及電波的頻譜來進行的,所以物理層的作用就是把二進制轉換成爲鏈路傳輸所需要的信息來進行傳輸。數據鏈路層傳輸也不只是單個的 0 1 序列,它們通常是以 幀
爲單位進行的。
現在我們知道了數據鏈路層大概是幹啥的,那麼只有理論不行,你還得有硬通貨,也就是硬件,一切的理論都離不開硬件的支撐。
硬件就可以簡單理解爲通信介質
,在通信介質上會有不同種類的信息傳遞方式,不過總的來說可以概括爲兩種:一種是共享介質型網絡
,一種是非共享介質型網絡
,下面我們就要聊一聊這兩種通信類型。
通信類型分類
共享介質型網絡
共享介質型網絡故名思義就是多個設備共同使用同一個通信介質的網絡。共享介質型網絡的類型主要有以太網(Ethernet)
和 光纖分佈式數據接口(Fiber Distributed Data Interface,FDDI)
。
共享說的是,多個設備會使用同一個載波信道進行發送和接收,這是一種半雙工的設計。
什麼是半雙工?
半雙工指的是數據可以在一個信道上的兩個方向上相互傳輸,但是不能同時傳輸,舉個簡單的例子,就是你能給我發消息,我也能給你發消息,但是不能你給我發消息的同時我也在給你發消息。
既然多個設備會共同使用一個信道,那麼就可能存在多個數據傳輸到同一個介質上導致的數據爭用問題,爲此,共享介質型網絡有兩種介質訪問控制方式:爭用和令牌傳遞。
爭用
爭用是發生在共享介質,載波監聽多路訪問(CSMA)
上的數據訪問方式。在這種訪問方式下,網絡中各個介質會採用先到先得
的方式佔用載波信道發送數據。如果多個介質同時發送幀,就勢必會產生衝突,繼而導致通信性能的下降和網絡擁堵。下面是爭用的處理方式
如上圖所示,假如 A 想要給 C 發送數據,那麼介質 A 會在確認周圍沒有其他介質要給 C 發送數據後,也就是經過一段時間後,A 會把數據馬上發送給 C。
每個介質在接受到 A 發送的數據後,會從 A 報文中解析出來 MAC 地址判斷是否是發送給自己的數據包,如果不是的話就是丟棄這條數據。
上面這種方式會使用在一部分以太網中,但是另外一部分以太網卻使用了 CSMA 的改良方式 - CSMA/CD 。CSMA/CD 會要求每個介質提前檢查一下鏈路上是否有可能產生衝突的現象,一旦發生衝突,那麼儘可能早地釋放信道。它的具體工作原理大致如下:
監聽載波信道上是否會有數據流動,如果沒有的話,那麼任何介質都可以發送數據。
介質會檢查是否發生衝突,一旦發生衝突就會丟棄數據,同時立即釋放載波信道。
放棄數據後,會經過一段時間重新爭用介質。
下面是 CSMA/CD 的改良版
上圖這個過程是 CSMA(Carrier Sense Multiple Access)
,首先介質會監控載波信道上是否有數據存在,如果沒有再發送,如果有,等一段時間再發送。
下面是 CD(Collision Detection)
的示意圖
在發送數據 -> 發送完成後,如果電壓一直處於規定範圍內,就會認爲數據已經正常發送。
發送途中,如果電壓超過了一定範圍,就會認爲是數據衝突。
發生衝突時會先發送一個阻塞報文,繼而放棄數據,在延遲一段時間後再次發送
令牌環
第二種共享介質型網絡的傳輸方式就是令牌環
了,令牌環顧名思義就是有一個令牌一樣的東西,以環爲一圈進行令牌傳輸,那麼令牌是啥呢?你想啊,我們最終的目的不就是爲了傳輸數據嗎?那麼這個令牌,它可不可以作爲數據呢?
其實,在這種傳輸方式中,令牌環是作爲一種特殊報文
來傳輸的,它是控制傳輸的一種方式,在數據傳輸的過程中同時會將令牌進行傳遞,只有獲得令牌的介質才能夠傳輸數據。這種方式有兩個優點,即
持有令牌的介質才能夠傳輸數據,這樣能夠保證不會有報文衝突情況。
每個介質都有平等獲取令牌的機會,這樣保證了即使網絡擁堵也不會導致性能下降。
但是這種令牌環的傳遞方式也是有缺點的,因爲只有持有令牌的介質才能發送數據,所以即使在網絡不太擁堵的情況下,其利用率也達不到 100%。
下面是令牌的傳遞示意圖
最一開始,令牌位於介質 A 處,此時介質 A 擁有數據傳輸的能力,然後介質 A 把令牌傳遞給介質 B。
此時 B 持有令牌,所以介質 B 具有發送數據的能力。
這個數據最終會由 D 接收,然後 D 就會設置一個已接收數據的標誌位,然後數據會繼續向下發送。
令牌環是一項很成功的技術,尤其是在公司環境中使用,但後來被更高版本的以太網所取代。
在瞭解完共享網絡之後,我們來探討一波非共享網絡
非共享介質型網絡
如果說共享介質型網絡是共享介質的話,那麼非共享介質型網絡就是不共享介質,那麼如何通信呢?在這種方式下,網絡中的每個介質會直接連上交換機
,由交換機來轉發數據幀。發送端和接收端不會共享通信介質,共享通信介質的意思就是介質之間直接通信。這種網絡傳輸方式一般採用的是全雙工通信。
非共享介質型網絡比較適合應用於搭建虛擬局域網(VLAN)
,但是這種通信方式有一個及其致命的弱點:一旦交換機發生故障,那麼與交換機相連的所有計算機都無法通信。
下面是非共享介質型網絡的通信示意圖
如圖所示,主機 A 發送了一個目標地址爲 B,源地址爲 A 的交換機,由交換機負責將數據轉發給介質 B,如下圖所示
非共享型網絡是一種全雙工通信的方式,每個介質在發送數據的同時也能夠接受來自交換機傳遞過來的數據。
交換集線器
交換集線器是一種共享型網絡通信介質,它是使用同軸電纜作爲傳輸介質,通常用於以太網中,交換集線器也叫做以太網交換機
。
以太網交換機中的各個端口會根據介質的 MAC地址
來轉發數據,那麼轉發數據肯定得有所依靠啊,這時可以參考的表就叫做轉發表(Forwarding Table)
,轉發表中記錄着每個介質的 MAC 地址。轉發表當然不需要我們手動維護,交換機會自動維護轉發表。交換機會自學
每個數據包的經過介質的 MAC 地址,如下圖所示
由於不知道主機 B 的 MAC 地址,所以主機 A 發送的數據會經過交換機廣播給以太網內的其他主機,主機 B 接收到數據後,會給主機 A 回送消息。
在主機 B 給主機 A 回送消息後,交換機就知道主機 A 和主機 B 的 MAC 地址了,從此以後雙方通信會在各自相連的端口之間進行。
由於 MAC 地址沒有層次性,轉發表中的記錄個數與所有網絡設備的數量
有關,當設備增加時,轉發表的記錄也會越來越多,檢索時間會逐漸增加。所以如果需要連接多個終端時,需要將網絡分成多個數據鏈路,採用類似 IP 地址一樣對地址進行分層管理。
在網絡通信的過程中,由於網絡鏈路的冗餘或者路由線路冗餘可能會造成閉環
,也就是我們所稱的環路
。環路會導致數據報文在網絡中不斷重複複製,最終導致網絡設備負載過重,無法正常運行。影響的範圍可能會擴散至整個局域網,導致整個局域網裏的計算機無法正常使用網絡。
那麼如何檢測網絡中出現的環路呢?
環路檢測方法
目前有兩種檢測環路的方式,一種是生成樹
,一種是源路由法
。
生成樹:生成樹指的是每個網橋必須在 1 - 10 秒內相互交換生成樹協議單元包,以此來判斷哪些接口使用,從而消除環路,一旦發生故障後就會立刻切換線路,利用沒有被使用的端口進行傳輸。
源路由法:源路由法通常是用來解決令牌環路。這種方式可以判斷髮送數據的源地址是通過哪個網橋實現傳輸的,並將幀寫入 RIF,網橋會根據這個 RIF 信息發送給目標地址,即使網橋中出現了環路,數據幀也不存在被反覆轉發的可能。
虛擬局域網 VLAN
網絡通信過程中經常會遇到網絡負載過高,通信性能下降的情況,往往遇到這種情況,就需要分散網絡負載,變換部署網絡設備的位置等。在虛擬局域網出現之前,往往需要管理員手動變更網絡的拓撲結構,比如變更主機網段,進行硬件線路改造等,但是使用了虛擬局域網,就可以不用再做如此複雜的操作了,只需要修改網絡結構即可。
那麼虛擬局域網究竟是什麼呢?
如上圖所示,交換機按照端口區分了多個網段,從而區分了廣播數據的傳播範圍,提高網絡安全性。然而異構的兩個網段之間,需要利用具有路由功能的交換機才能實現通信。
由於交換機端口有兩種 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 個字節。
以太網最後 2 bit 稱爲 SDF,而 IEEE802.3 中將最後 8 bit 稱爲 SDF。
IEEE802.3 是電氣和電子工程師協會 (IEEE)標準的集合制定的標準。
這是以太幀的前導碼部分,下面是以太幀的本體部分
以太幀體格式也有兩種,一種是以太幀格式,一種是 IEEE802.3 標準以太幀格式。
在以太幀格式中,以太幀的本體的前端是以太網的首部,總共佔用 14 字節,分別是 6 字節的目標 MAC 地址、6 字節的源 MAC 地址和 2 字節的上層協議類型,後面是數據部分,佔用 46 - 1500 字節,最後是 FCS(Frame Check Sequence,幀檢驗序列)
4 個字節。FCS 用於檢查幀是否有所損壞,因爲在通信過程中由於噪聲干擾,可能會導致數據出現亂碼位。
IEEE802.3 以太幀的格式有區別,一般以太幀中的類型字段卻在 IEEE802.3 表示幀長度,此外新增加了 LLC 和 SNAP 字段。
數據鏈路層在細化的話可以分爲兩層,介質訪問控制層和邏輯鏈路控制層
介質訪問會根據以太網等不同鏈路特有的首部信息進行控制,邏輯鏈路層則根據以太網等不同鏈路共有的幀頭信息進行控制。
LLC 和 SNAP 就是邏輯鏈路控制的首部信息,那麼現在你應該明白怎麼回事兒了吧。
完
往期推薦
🔗
另外,cxuan 肝了六本 PDF,公號回覆 cxuan ,領取作者全部 PDF 。
本文分享自微信公衆號 - 程序員cxuan(cxuangoodjob)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。