一、定義
借助於物理層,為網絡層提供服務。
定義一個合適的傳輸差錯率。
對傳輸的數據流進行管理,以免快速的發送淹沒了慢速的接收端。
傳輸單元是幀。
二、功能
任務:把網絡層的數據組合成幀,加上一定的校驗,交給物理層用比特流傳輸到目的計算機。
為網絡層提供了一條可靠的數據鏈路。
相連:物理介質 的連接。當采用多路復用技術時,也可以是信道的連接,特征是傳輸的數據是順序的。
物理鏈路:無源的點到點的物理連接,中間沒有交換節點。沒有可靠性保證。
數據鏈路:包括一條物理連接和配置在兩端的硬件和相關的數據鏈路層協議。
三、數據鏈路層服務的區分規則
通過有無連接、有無確認來區分。
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,發送窗口>=接收窗口。
八、