數據鏈路層


一、定義

借助於物理層,為網絡層提供服務。

定義一個合適的傳輸差錯率。

對傳輸的數據流進行管理,以免快速的發送淹沒了慢速的接收端。

傳輸單元是幀。

二、功能

任務:把網絡層的數據組合成幀,加上一定的校驗,交給物理層用比特流傳輸到目的計算機。

為網絡層提供了一條可靠的數據鏈路。

相連:物理介質 的連接。當采用多路復用技術時,也可以是信道的連接,特征是傳輸的數據是順序的。

物理鏈路:無源的點到點的物理連接,中間沒有交換節點。沒有可靠性保證。

數據鏈路:包括一條物理連接和配置在兩端的硬件和相關的數據鏈路層協議。

三、數據鏈路層服務的區分規則

通過有無連接、有無確認來區分。

1. 無確認無連接

接收到數據幀后,不發確認。

數據傳輸前,不建立鏈接。

應用場景:傳輸距離短,可靠信道。例如:局域網。

無確認並非不可靠,其可靠性由上層負責。

2. 有確認無連接

不建立連接。接收到數據幀后,必須發出確認。

應用場景:信號傳播延時大(建立連接耗時),線路狀態不一定很可靠(確認)。例如:無線通信。

3. 有確認有連接

最可靠的方式。

使用前先建立連接。每幀傳輸必須得到確認。最后要釋放連接。

例如:電話。實時應用,需要面向連接來保證實時。

四、可靠傳輸

解決三個問題:將傳輸的信息組合成幀;校驗和重發;流量控制。

五、數據幀

保證能識別一個完整的幀,保證一旦出現傳輸差錯導致的前一個幀丟失后,也能識別后一個幀——再同步功能。

1. 字符計數法

每幀的第一個字節記錄該幀的長度,即1個計數字節+(n-1)個數據字節。

缺點:一旦幀長度計數出錯,就無法再同步。

2. 帶字符填充的首尾界符法

用特殊的字符作為幀頭和幀尾界符。

面向字符的幀格式,傳輸的數據都是字符(ASCII, EBCDIC字符)。幀中不允許出現幀界符標志。

在面向字符的串行通信中常使用這種格式。

優點:接收方一旦丟失了一個FLAG,只要繼續向下搜索下一個FLAG,就可重新確定幀邊界。——再同步能力。

面向字符的幀格式不適宜傳輸數據中包含二進制數的幀,因為這樣的幀可能出現與FLAG相同的字符。(一般FLAG用ASCII字符7EH定義)

解決辦法:字符插入方法,對於二進制數中偶然出現的FLAG,在它前面插入一個ESC(ASCII字符1BH)。——字符填充法。

如果要傳輸1B,則再添加1個1B(去掉1個還有1個)。類似於C語言中的轉義符。

 

3. 帶位填充的首尾界符法

在實際應用中,傳輸的都是二進制比特串,所以更經常使用位填充的首尾界符法。位插入法,也稱透明傳輸。

面向二進制位的同步串型通信中,常使用位填充,如HDLC

以特殊的位模式01111110為幀標志。

如果由於 干擾,一個幀標志沒有正確接收,就繼續掃描接收串,一旦掃描到01111110,新的一幀就開始了。

當幀中出現連續的5個1時,插入1個0.

接收時檢查連續的5個1后面的位,如果是0就刪除,如果是1就結束。

4. 物理層編碼違例法

曼徹斯特編碼中,連續高電平或低電平,可用作幀界符。因為高-高電平和低-低電平對沒有在數據中使用,就稱這兩種為編碼違例,可以用作幀界符。在令牌環網中使用編碼違例格式。

六、差錯控制

避免幀錯誤:校驗

避免幀丟失:超時和重發

避免幀重復:序號。

1. 確認

接收方收到幀后,如果校驗出有問題,接收方可以扔掉,或發送否定性確認。

如果幀正確,就發送肯定性確認。

必須先檢測,后發送確認。

2. 差錯檢測和校正

傳輸出錯的情況:超時,數據中一位或幾位因噪聲干擾出錯。

通常接收方應能檢錯,甚至 糾錯。

糾錯碼是除m個數據位外,增加r個冗余位作為糾錯位,傳輸總長度為m+r=n。

常用的糾錯碼是漢明碼。

【檢錯碼:校驗和】

算法簡單,實現容易,但檢錯強度較弱。如一個位從0變1,另一位從1變0,則分辨不出。

看成二進制整數序列,划分為固定長度(8位,16位,32位等),計算各分段的和,將校驗和與數據一起發送。

在接收端重新計算校驗和,比較,如果相同則認為正確。

【塊校驗碼BCC】

常用,強度較弱。同校驗和,偶數位出錯不能檢測到。

將所有字符的ASCII碼作異或操作。

【循環冗余校驗CRC】

把一個K位的幀看成一個K-1次的多項式m(x )

設定一個生成多項式g(x ),r階。k>r。

R(x ) = x^r M(x ) / G(x )

將CRC碼接在幀后一起發送。

接收方只要計算CRC,所得余數為0,就正確。

(例子)1101011011

M(x ) = x^9 + x^8 + x^6 + x^4 + x^3 + x + 1

G(x ) = x^4 +x + 1 = 10011

T(x ) = x^4 *M(x ) = 1101 0110 11 0000

CRC = T(x ) / G(x ) = 1110

最后發送的碼為: 1101 0110 11 1110

接收方只需要取前面9位,后4位視為CRC, 用原數據減去CRC,一定可以被G(X )整除。(因為CRC就是余數)

3. 重復幀

幀編號。

如果編號已接收過,則認為是重復幀。

重發機制導致了發送方多次發送同一幀,可能產生重復幀。

【幀的格式】

幀類型TYPE

幀序號SEQ_NO

確認號ACK_NO

信息INFO

前三個是幀頭內容,接收方會去掉幀頭幀尾,取出信息。

七、流量控制

發送方與接收方的速率匹配。

通常接收方的緩沖區達到一定量時,應及時通知發送方,暫停發送,等候通知。——流量控制機制

 

基本數據鏈路協議

1. 無限制的單工協議

理想簡化:主機A,B的信道是理想信道,信息傳輸不會出錯,沒有差錯控制。接收方的接收能力無限,不需要流量控制。

只需要簡單的幀封裝,和上下層的交互。

發送方的數據鏈路層接口不斷詢問網絡層是否有消息,while(true){…}

如果網絡層有信息傳輸,就把信息傳遞給數據鏈路層。數據鏈路層負責封裝幀,然后把幀交給物理層。

接收方等待物理層的事件發生,從物理層取一個幀,解封裝,交給網絡層。

2. 單工的停-等協議

考慮接收方的處理能力有限,CPU、緩沖區。這就得增加流量控制。

發送方發送一個幀以后,必須停下來,等待接收方處理完后發送回來的確認幀,再發送下一幀。——流量控制。

3. 噪聲信道單工協議

發送方發完一幀后,啟動定時器,等待確認消息。超時后啟動差錯控制機制,重發該幀。

問題:效率低。無論是由於接收方收到一個錯幀而不發ACK,還是由於幀標志錯而導致幀丟失,甚至接收方發送的ACK丟失,發送方的定時器都會超時,而需要一定長的時間才能確認是真的需要重發。

另一個問題是接收方會收到重復幀。

幀序號字段:只需要1個比特,0和1。發送方要記錄下一個准備發送的順序號,接收方要記錄下一個期待接收的順序號。

由於是單工噪聲信道,發送和接收過程將嚴格交替。

應答號字段:僅需要一個比特,接收方期待接收的下一個幀序號。

如果發送方收到的應答號和下一個幀序號相同,則表明發送成功。就停止計時器,從物理層取下一個幀。

如果接收方收到的幀序號和等待的序號相同,就解封裝,交給網絡層。否則,可能是個重復幀,就不處理。但仍然會向發送方回應確認。

兩個問題:

單工通信,不能雙向傳輸,效率低。

如發送方的定時器設定的初值較小,可能出現系統死鎖。(實際正確接收的包,被認為丟棄)

4. 雙向傳輸

用四條信道,兩條數據,兩條應答。信道利用率很低。

用兩條信道,一條A到B,一條B到A。接收方采用捎帶確認。數據幀和確認幀采用不同的幀格式。

接收到幀后,首先檢查格式,如果是數據幀,就給網絡層;如果是應答幀,就准備發送下一幀。

捎帶確認的方式就是節省了應答幀。不單獨發一個確認幀,而是把確認消息附加在數據幀里,可以等待到下一次發送數據時才確認。

5. 滑動窗口協議

收發使用兩條信道。

發送窗口、接收窗口

假設發送窗口是5, 接收窗口是3,則發送方可連續發送5個幀,超過5個就停止、等待接收方處理,接收方一次可接收3個,確認一個之后發送方再發送一個。這樣,一次發送一批幀是可能的。

兩者窗口數相加 是8, 則幀序號可以用3個比特表示。0~7號。

【雙向的一位滑動窗口協議】

發送窗口1, 接收窗口1, 則幀序只需要1比特。信道利用率太低。

雙向意味着發送方同時也是接收方。既有等待接收的序號,也有等待發送的序號。

發送方發送下一個數據幀之前,必須收到接收方的捎帶確認。

凡是接收到一個正確的幀,即使是重復幀,也要發送確認。

每一方發送出去后,就啟動計時器。如果是幀的到達,則先判斷幀序號是否是等待的幀,如果是則交給網絡層,等待的幀序號加1。然后判斷應答號是否是上一幀的序號,如果是,說明發送成功,停止計時器,發送下一幀。如果應答號不正確,說明前一個幀沒有正確接收,就重發上一幀。

【后退n幀的滑動窗口協議】管道化協議,是一個實用的點對點可靠傳輸的協議,適合出錯較少的情況

發送窗口大於1, 接收窗口為1。總窗口大小是不定的,幀序號的比特數不定。

假設發送窗口為7,則需要3個比特。

每次接收方只等待1個幀序號,其他幀扔掉。如果有一個幀出錯了沒收到,后面的幀就都收不到。這樣,后面N幀全部要重發。——后退N幀。

在發送窗口未滿時,允許網絡層請求發送。enable_network_layer()。

frame_expected,等待接收的幀號。只有0和1即可。

next_frame_to_send,要發送的下一幀的序號。

ack_expected,滑動窗口期待應答的幀號。

nbuffered,已發送的幀數。

等待事件:

事件1:網絡層有消息,

事件2:有幀到達

事件3:幀錯誤

事件4:超時。

如果已發送的幀數小於最大窗口,允許網絡層請求,否則關閉網絡層請求接口。

事件1的處理:裝配一個數據幀,發送;發送緩沖區數+1, 幀序+1, 啟動計時器;准備發送下一幀。

事件2的處理:如果幀是等待接收的幀,就給網絡層,等待幀號+1.  如果是一個ACK,如果在已發送的幀序區間,則釋放對應的緩沖區,定時器復位,准備接收下一個ACK。如果不在已發送的幀序范圍,就說明該幀發送失敗,該幀和它后面的幀全部都要重發。——后退N幀。

【選擇性重發滑動窗口協議】

一旦幀出錯了,不是全部重發,只是重發出錯的幀。沒有出錯的幀,就不重發。可以提高信道效率。但帶來的麻煩是,不能隨便扔掉不符合的幀,接收方要保存這些收到的幀。因此,接收窗口不能為1,接收窗口和發送窗口都大於1.

例如發送窗口7, 接收窗口7, 則接收方可以保存7個幀。

假設接收完1號幀后,2號幀丟了,接收方仍然可以接收3,4,5,6,7,8號幀,不過應答時ACK都是2,並且收到3號幀時,發送一個否定性確認NAK,確認號為2,表示期待接收2。當發送方定時器超時后,它就發現2號幀發送失敗了,重發2號幀,接收方收到2號幀以后,應答時ACK=8,表示這8個幀都收到了。

有一個差錯時僅重發一幀,而不是全部重發。

接收方定義了一個輔助計時器,到目前為止多長時間沒有發送過確認了,超時時專門發送一個確認幀,以免發送方的定時器超時導致的重發。

定義了一個否定性確認的幀格式。接收方收到一個有問題幀時,發送一個否定性確認NAK。

初始時:

enable_network_layer()

ack_expected=0,

next_frame_to_send=0,

frame_expected=0,

too_far=NR_BUFS,

nbuffered=0,

初始化arrived[]為false。

數據幀的處理包括作為接收方和作為發送方。作為接收方:看幀序是否和等待的幀號相同,如果是,就接收處理,交給網絡層。如果不是,如果在接收的窗口之內,就得緩存起來,把arrived[]對應位置1,表示收到。另外,這說明等待的幀丟失了,需要發一個NAK幀告訴發送方丟失了,設置對應標志記錄已發送過NAK。

如果接收的是一個NAK,則重發對應幀。

如果接收的是一個ACK,則轉動窗口。

詳細過程另外總結。

 

【注意】發送窗口+接收窗口<=2^n,發送窗口>=接收窗口。

 

八、


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM