一篇文章幫你搞清楚數據鏈路層在網絡中的作用

計算機網絡是很重要的一部分知識,之前也認爲很難,因爲要分那麼多層(五層或七層),而且每一層還有自己的功能和協議,一大堆的東西很不好學;但是後來發現了一個很好的學習方法,就是先熟悉每一層的作用,然後再順着思考他爲了實現這個功能要怎麼辦?要使用哪些協議?這樣不僅能幫助很好的理解,也能很高效的去學習。

首先,瞭解過計算機網絡的同學都知道,計算機網絡的每一層都是基於下層提供的服務爲上層提供服務的,所以數據鏈路層是在物理層提供的服務上向網絡層提供服務的;因此數據鏈路層的作用是將源自網絡層來的數據可靠地傳輸到相鄰節點的目標機網絡層,簡單的說就是把上層(網絡層)給我數據傳輸給目標計算機的網絡層。那麼,爲了達到這一目的,數據鏈路層應該具備一系列的功能:如何將數據組合成數據塊;如何控制幀在物理信道上的傳輸,包括如何處理傳輸差錯,如何調節發送速率以使之與接收方相匹配;在兩個網路實體之間提供數據鏈路通路的建立、維持和釋放管理。其具體表現爲一下這些方面。

封裝成幀

組合成數據塊?我們都知道數據鏈路層的傳輸單位是,那麼解決的辦法就是將網絡層傳來的數據封裝成幀
封裝成幀就是在一段數據的前後分別添加首部和尾部,讓其構成一個幀。接收端在收到物理層上交的比特流後,就可以根據幀首部和尾部的標記找到幀;如圖所示:
幀的格式
從圖中我們可以看出來,幀的數據部分越是大於幀首部和幀尾部傳輸的效率就會越高;因此, 爲了提高幀的傳輸效率,通常會使使幀的數據部分長度儘量大於首部和尾部的長度,但是幀數據的部分也不是無限大的,肯定要有一個最大值來對其進行限制,那就是MTU(最大傳輸單元),決定了幀數據部分長度上限
當數據是由可打印的ASCII碼組成的文本文件時,幀定界可以使用特殊的幀定界符。通常,幀首部和幀尾部也會有特定的控制字符,控制字符**SOH(start of header,二進制是00000001)放在一幀的最前面,表示幀的首部開始。另一個控制字符EOT(end of transmission,二進制是00000100)**表示幀的結束。
採用幀傳輸方式的好處是,在發現有數據傳送錯誤時,只需將有差錯的幀再次傳送,而不需要將全部數據的比特流進行重傳,這就在傳送效率上將大大提高

透明傳輸

透明傳輸也是數據鏈路層的一個重點,但是什麼是透明傳輸?又該怎麼理解呢?這個定義看似簡單,如果不明白的話就會疑惑爲什麼是透明?是怎樣透明的?透明傳輸表示無論什麼樣的比特組合的數據,都能按照原樣沒有差錯的通過這個數據鏈路層,就是無論所傳的數據是什麼樣的比特組合,都可以進行傳送;並不是說傳送數據的是“透明的”,就好像現在現在的快遞一樣,快遞小哥負責給你派送包裹,但是他並不管你的包裹裏面是什麼東西(前提必須是合法的呀)。
那麼問題來了,這樣難道就不會出現問題嗎?當然是會的。通常會出現這兩個問題:

  1. 由於幀的開始和結束的標記是使用專門指明的控制字符,如果所傳的數據中存在一個和幀定界字符比特編碼一樣的,那麼讀取的時候就會出現錯誤;
  2. 當傳送的幀使用文本文件組成的幀時(文本文件中的字符都是從鍵盤上輸入的),其數據部分顯然不會出現像SOH或EOT這樣的幀定界控制字符。

既然透明傳輸會出現問題,那我們就一定要有防範的措施,那就是在組幀的時候進行一些處理,避免這些情況,具體方法有四種。

字符計數法

幀首部使用一個計數字段( 第一個字節,八位 )來標明幀內字符數
字符計數法
使用這種方法一定要確保計數字段的準確性,否則將造成嚴重的後果

字符填充法

當傳送的幀是由非ASCI碼的文本文件組成時( 二進制代碼的程序或圖像等 )。就要採用 字符填充 方法實現透明傳輸;如果所傳的數據中有與幀定界符一樣時,就在前面填充ESC,這種方式和 Java 裏面的的轉義字符很相似,具體實現過程如下;
字符填充法

零比特填充法

在發送端,掃描整個信息字段,只要連續5個1,就立即填入1個0;在接收端收到一個幀時,先找到標誌字段確定邊界,再用硬件對比特流進行掃描。發現連續5個1時,就把後面的0刪除。
零比特填充法

違規編碼法

由於字節計數法中Count字段的脆弱性(其值若有差錯將導致災難性後果)及字符填充實現上的複雜性和不兼容性,目前較普遍使用的幀同步法是比特填充和違規編碼法。
違規編碼法

差錯控制

前面我們說了將數據封裝成幀和透明傳輸,但是傳輸的時候還是會不可避免的產生一些問題,所以接下來就要進行差錯控制。既然要進行差錯控制,我們就要先知道會出錯的情況:傳輸過程中可能會產生比特差錯(1 可能會變成 0 而 0 也可能變成 1),幀(包括髮送幀和響應幀)出錯或者幀(包括髮送幀和響應幀)丟失。具體的檢錯措施有以下幾種。

循環冗餘檢驗CRC

CRC運算實際上就是在長爲 k 的數據後面添加供差錯檢測用的 n 位冗餘碼,然後構成 k+n 位的幀發送出去。在瞭解 CRC 之前要先知道幾個概念:

  • 模2運算:實際上是按位異或運算,即相同爲0,相異爲1,也就是不考慮進位、借位的二進制加減運算。如:1111+1010 = 0101 ;
  • FCS:就是冗餘碼,幀檢驗序列(Frame Check Sequence) ;
  • 生成多項式:其實就是除數,比如10011表示成多項式爲 X4+0X3+0X2+X1+X0X^4 + 0*X^3 + 0*X^2 + X^1 + X^0,則其階 r = 4;

計算過程
現假定待傳輸數據 M=101001(k=6),生成多項式爲 1101,計算其最終應該發送的數據:

  • 計算應該加多少個0,1101=X3+X2+X01101=X^3+X^2+X^0,所以r=3r=3
  • 用添加完 0 的數 M=101001000 除以除數(多項式),得到商Q(不關心)和餘數 R=001,則 R 就是冗餘碼FCS;
  • 最後加上 FCS 後發送的幀是101001001 ;在這裏插入圖片描述
    在接收端把接收到的數據 M = 101001001 以幀爲單位進行CRC檢驗:把收到的每一個幀都除以相同的除數p,然後檢查得到的餘數R,如果數據沒有出錯所得到的餘數R一定等於0,就接收數據;如果R!=0R!=0,說明幀有差錯,直接丟棄。

海明碼(漢明碼)

  • 編碼(以1010110爲例):
    1. 確定校驗碼的位數x
    設數據有n位,校驗碼有x位。則校驗碼一共有2x2^x種取值方式。其中需要一種取值方式表示數據正確,剩下2x12^x -1種取值方式表示有一位數據出錯。因爲編碼後的二進制串有n+x位,因此x應該滿足2x1n+x2^x-1 ≥n+x,使不等式成立的x的最小值就是校驗碼的位數。在本例中,n=7,解得x=4。
    2. 確定校驗碼的位置
    校驗碼在二進制串中的位置爲2的整數冪。剩下的位置爲數據。如圖所示。
位置 1 2 3 4 5 6 7 8 9 10 11
內容 x1 x2 1 x3 0 1 0 x4 1 1 0

3. 求出校驗位的值
以求x2的值爲例。爲了直觀,將表格中的位置用二進制表示。

位置 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011
內容 x1 x2 1 x3 0 1 0 x4 1 1 0

爲了求出x2,要使所有位置的第二位是1的數據(即形如1 的位置的數據)的異或值爲0。即x2^ 1^ 1^ 0^ 1^0 = 0。因此x2 = 1。
同理可得x1 = 0, x3 = 1, x4 = 0。

位置 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011
內容 0 1 1 1 0 1 0 0 1 1 0

因此1010110的海明碼爲01110100110。

  • 校驗:
    假設位置爲1011的數據由0變成了1,校驗過程爲:
    將所有位置形如1,1,1,1***1, **1*, *1**, 1***的數據分別異或。
    1***1: 0^ 1^ 0^ 0^ 1^ 1 = 1
    1**1*: 1^ 1^ 1^ 0^ 1^ 1 = 1
    1*1**: 1^ 0^ 1^ 0 = 0
    11***: 0^ 1^ 1^ 1 = 1
    以上四組中,如果一組異或值爲1,說明該組中有數據出錯了。111***1 **1* 1***的異或都爲1,說明出錯數據的位置爲1011。

流量控制

上面我們已經解決了數據傳輸前和接收到數據後驗證的工作,接下來就要對數據傳輸的過程進行控制;主要是對傳輸過程進行流量控制,就好像我們的公路一樣,路已經建好了,如果不制定交通規則(靠右行駛、紅綠燈),那麼即使再好的路、再好的車一天你也不可能走的很遠,因爲大家都按照自己的想法來行駛,所以都被堵在了路上。具體流量控制的方法有下面這幾種。

停止等待協議

停止-等待協議(發送窗口=1,接收窗口=1):每發送完一個幀就停止發送,等待對方的確認,在收到確認之後再發送下一個幀;接收方每接收一幀 , 都要反饋一個應答信號 ,表示可接收下一幀,如果接收方不反饋應答信號,則發送方必須一直等待。每次只允許發送一幀 ,然後就陷入等待接收方確認信息的過程中 ,因而傳輸效率很低 。具體的幾種情況如圖所示

  • 無差錯的情況
  • 在這裏插入圖片描述
  • 數據幀丟失或檢測到幀出錯‘’在這裏插入圖片描述
  • ACK丟失(確認幀丟失)
  • 在這裏插入圖片描述
  • ACK遲到
  • 在這裏插入圖片描述

滑動窗口協議

1、**後退N幀協議(GBN):**發送窗口>1,接收窗口=1;若採用n個比特對幀編號,那麼發送窗口的尺寸WT應該滿足:1≤WT≤2n-1,因爲發送窗口過大,就會使得接收方窗口無法區別新幀和舊幀。發送方要做的三件事:

  • 上層的調用:上層要發送數據時,發送方先檢查發送窗口是否已滿,如果未滿,則產生一個幀並將其發送;如果窗口已滿,發送方只需將數據返回給上層,暗示上層窗口已滿。上層等一會再發送(實際實現中, 發送方可以緩存這些數據,窗口不滿時再發送幀);
  • 收到了一個ACK:GBN協議中,對 n 號幀的確認採用累積確認的方式,標明接收方已經收到n號幀和它之前的全部幀;
  • 超時事件:協議的名字爲後退N幀/回退N幀,來源於出現丟失和時延過長幀時發送方的行爲。就像在停等協議中一樣,定時器將再次用於恢復數據幀或確認幀的丟失。如果出現超時,發送方重傳所有已發送但未被確認的幀;

接收方要做的事情:

  • 如果正確收到n號幀,並且按序,那麼接收方爲n幀發送一個ACK,並將該幀中的數據部分交付給上層;
  • 其餘情況都丟棄幀,併爲最近按序接收的幀重新發送ACK。接收方無需緩存任何失序幀,只需要維護一個信息: expectedseqnum (下一個按序接收的幀序號);

2、**選擇重傳協議(SR):**發送窗口>1,接收窗口>1; 若採用n比特對幀編號,爲了保證接收方向向前移動窗口後,新窗口序號與舊窗口序號沒有重疊部分,需要滿足條件:接受窗口+發送窗<=2^ n;由此我們可以推得:發送(或接收)窗口大小 <= 2^(n-1)。發送方必須做的三件事:

  • 上層的調用:從上層收到數據後,SR發送方檢查下一個可用於該幀的序號,如果序號位於發送窗口內,則發送數據幀;否則就像GBN一樣,要麼將數據緩存,要麼返回給上層之後再傳輸;
  • 收到一個ACK:如果收到ACK,加入該幀序號在窗口內,則SR發送方將那個被確認的幀標記爲已接收。如果是該幀序號是窗口的下界(最左邊第一個窗口對應的序號),則窗口向前移動到具有最小序號的未確認幀處。如果窗口移動了並且有序號在窗口內的未發送幀,則發送這些幀。
  • 超時事件:每個幀都有自己的計時器,一個超時事件發生後只重傳一個幀

接收方要做的事情:

  • 來者不拒(窗口內的幀):SR接收方將確認一個正確接收的幀而不管其是否按序。失序的幀將被緩存,並返回給發送方一個該幀的確認幀(收誰確認誰),直到所有幀(即序號更小的幀)皆被收到爲止,這時纔可以將一批幀按序交付給上層,然後向前移動滑動窗口;如果收到了窗口序號外(小於窗口下界)的幀,就返回一個ACK;其他情況則忽略該幀。

可靠傳輸

我們都知道數據鏈路層進行的傳輸也是可靠傳輸,那麼他是如何實現可靠傳輸的呢?
數據鏈路層的可靠傳輸通常使用確認和超時重傳兩種機制來完成 。確認是一種無數據的控制幀,這種控制幀使得接收方可以讓發送方知道哪些內容被正確接收。有些情況下爲了提高傳輸效率,將確認捎帶在一個回覆幀中,稱爲捎帶確認 。超時重傳是指發送方在發送某一個數據幀以後就開啓一個計時器 ,在一定時間內如果沒有得到發送的數據幀的確認幀 ,那麼就重新發送該數據幀,直到發送成功爲止 。

傳輸數據使用的鏈路

前面我們已經討論了很多東西,但是關於數據傳輸的鏈路我們還是不太清楚,是點對點的?還是廣播的?當然是點對點和廣播的都有,不同的鏈路所使用的的協議肯定是不一樣的,我們再來學習一下這兩種方式以及所使用的的協議吧。

使用點對點信道(PPP協議)

首先,我們要先了解PPP協議,ppp協議不需要糾錯,不需要設置序號,不需要進行流量控制,不支持多點線路(既一個主站輪流和鏈路上的多個從站進行通信),只支持點對點的鏈路通信,只支持全雙工鏈路。PPP協議是由三部分組成的:

  1. 一個將IP數據報封裝到串行鏈路的方法。PPP既支持異步鏈路,也支持面向比特的同步鏈路;
  2. 一個用來建立、配置和測試數據鏈路連接的鏈路控制協議LCP;
  3. 一套網絡控制協議NCP;

然後,我們要來認識一下PPP協議下的幀格式
在這裏插入圖片描述

  • 標誌字段F:0x7E(01111110):表示一個幀的開始或者結束。標誌字段就是PPP幀的定界符。
  • 地址字段A:0xFF(11111111)
  • 控制字段C:0x03(00000011)
  • 協議字段:爲0x0021時,PPP協議幀就是IP數據報;爲0xC021時,信息字段就是PPP鏈路控制協議LCP的數據;爲0x8021時表示網絡層的控制信息。
  • FCS:使用CRC幀檢驗的冗餘碼。

使用廣播信道(CSDA/CD協議)

CSDA/CD協議的主要內容有三方面,載波監聽、多點接入和碰撞檢測;下面就分別進行解釋:

  • 載波監聽:不管在發送前還是在發送中,每個站都必須不停的檢測信道。如果檢測到已經有其他站在發送,則自己就暫時不需發送數據,必須要等到信道邊爲空閒時才能發送數據。在發送中檢測信道,是爲了及時發現有沒有其他站在發送和本站發送的碰撞。
  • 多點接入:總線型網,許多計算機以多點接入的方式連接在一根總線上。
  • 碰撞檢測:邊發送邊監聽,即適配器邊發送數據邊檢測信道上的信號電壓的變化情況,以便判斷自己在發送數據時其他站是否也在發送數據。

這些均爲個人總結,只是採用這種方式去理解數據鏈路層的功能,還有很多別的重要的知識點沒有提及,如果有興趣歡迎相互交流;也歡迎提出問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章