計算機網絡原理總結(英文版 第五版) Chapter3

數據鏈路層

 

在本章中,我們將學習網絡模型中的第二層(即數據鏈路層)的設計原則。學習內容涉及兩臺相鄰機器實現可靠有效的完整信息塊(稱爲幀)通信的一些算法

3.1 數據鏈路層的設計問題

 

數據鏈路層要完成一些功能,包括:

(1)向網絡層提供一個定義良好的服務接口

2)處理傳輸錯誤

3)調節數據流,確保慢速的接收方不會被快速的發送方淹沒

爲了實現這些目標,數據鏈路層接受來自網絡層的數據包,並將它們封裝成幀以便傳輸。每個幀包含一個幀頭、一個有效荷載(用於存放數據包)以及一個幀尾,如下圖所示。幀的管理構成了數據鏈路層工作的核心

 

物理層所做的是接受原始比特流並將其傳遞到目的地。

但是如果信道是有噪聲的,則數據鏈路層接收的比特流不能保證是無差錯的。

 

3.1.2 成幀

 

爲了向網絡層提供服務,數據鏈路層必須使用物理層提供給它的服務。物理層所做的只是接受一個原始比特流,並試圖傳給他的目標機器。然而,數據鏈路層接收到的比特流不能保證沒有錯誤。檢測錯誤和糾正錯誤(有必要的話)的工作正是數據鏈路層該做的

 

對數據鏈路層來說,通常的做法是將比特流分解成多個離散幀,爲每一個幀計算一個稱爲校驗和短令牌,並將該校驗和放在幀中一起傳輸。當幀到達目標及其實,要重新計算該幀的校驗和。

 

拆分比特流的實際工作比初看上去的要複雜得多。一個好的設計方案必須使接收方很容易發現一個新幀的開始,同時瞭解所使用的信道帶寬要多少。我們將考察下面4種方法:。

1)字節計數

2)字節填充的標誌字節法

3)比特填充的標誌比特法

4)物理層編碼違禁法

 

 

第一種成幀方式利用頭部中的一個字段來標識該幀中的字符數。當接收方的數據鏈路層看到字符計數值時,它就知道後面跟着多少個字節,因此也就知道了該幀在那裏結束。如下圖所示,其中4幀的大小分別爲5588個字節。

這種算法的問題在於計數值可能因爲一個傳輸錯誤而被弄混。每個幀的第一個字符代表了幀的長度。

 

第二種成幀方法考慮到了出錯之後的重新同步問題,它讓每個幀用一些特殊的字節作爲開始和結束。這些特殊字節通常都相同,稱爲標誌字節(flag byte,作爲幀的起始和結束分界符。兩個連續標誌字節代表了一幀的結束和下一幀的開始。因此,如果接收方丟失了同步,他只需要搜索兩個標誌字節就能找到當前幀的結束和下一幀的開始位置。

但是,當標誌字節出現在數據中時,尤其是當傳輸二進制數據時(比如歌曲、照片),這種情況會嚴重干擾到幀的分界。解決方法是發送方的數據鏈路層在數據中“偶爾”出現的每個標誌字節的前面插入一個特殊的轉義字節(ESC,就可以把作爲幀分界符的標誌字節與數據中出現的標識字節區分開來。而接收方的數據鏈路層在將數據傳遞給網絡層之前必須刪除轉義字節。這種技術就稱爲字節填充(byte stuffing

下圖介紹瞭如何解決轉義字節也出現在數據中的問題(在轉義字節前再加一個轉義字節),使用的字節填充方案是PPP協議(Point-to-Point Protocol):

 

 

第三種方法區分比特流邊界的方法考慮了字節填充的缺點,即只能使用8比特的字節(因爲1字節=8bit)。幀的劃分可以在比特級完成,因而幀可以包含任意大小單元(而不是隻能以8比特爲單元)組成的二進制比特數。這種方法是爲曾經非常流行的HDLC(高級數據鏈路控制)協議而開發的。每個幀的開始和結束由一個特殊的比特模式,01111110或十六進制0x7E標記

每當發送方的數據鏈路層遇到連續的五個1,它就會自動在輸出的比特流中填入一個比特0。當接收器看到5個連續傳入的1位,接着是0位時,它自動去掉0。比特填充確保了轉換的最小密度,這將有利於物理層保持同步。正是由於這個原因,USB(通用串行總線)採用了比特填充技術。


最後一種方法是一條使用物理層的捷徑的方法。當比特編碼成信號時通常會出現一些冗餘比特,以便幫助接收器同步接收。這意味着32個可能的信號中有16個是不會被使用的。我們可以利用這些保留的信號來指示幀的開始和結束。實際上,我們使用“編碼違法”來區分真的邊界。這種方法的優點在於這些用分節符的信號是保留不用的,所以很容易通過它們找到幀的開始和結束,而且不再需要填充數據。

 

3.1.3 差錯控制

解決了如何標識每一幀的起始和結束位置之後,我們需要關注:如何確保所有的幀最終都被傳遞給目標機器的網絡層,並且保持正確的順序對於無確認的無連接服務,不管發出去的幀是否正確抵達目標機器,發送方只要把出境幀留存就可以了但是對於可靠的、面對連接的服務,確保可靠傳遞的方法是向發送方提供一些有關線路另一端狀況的反饋信息。通常情況下,協議要求接收方發回一些特殊的控制幀,在這些控制幀中,對於它所接收到的幀進行肯定的或者否定的確認。如果發送方收到了關於某一幀的肯定確認,那麼它就知道這幀已經安全地到達了。另一方面,否定的確認意味着傳輸過程中出現了錯誤,所以這個幀必須重傳。

如果幀丟失,可以通過啓動一個計時器來解決這個問題。

 

3.2 差錯檢測和糾正

 

網絡設計者已經開發出兩種處理錯誤的基本策略。兩者都將冗餘信息添加到發送的數據中。

前一種策略使用糾錯碼(error-correcting code

錯誤頻繁的信道上,例如無線鏈路。

後一種策略使用檢測碼(error-detecting code

通道是高度可靠的,例如光纖。

 

3.2.1 糾錯碼

我們將考察一下4中不同的糾錯編碼:

1海明碼

2二進制卷積碼

3)裏德所羅門碼

4低密度奇偶校驗碼

上述所有編碼都將冗餘信息加入到待發送的信息中。在塊碼(block code中,r個校驗位是作爲與之相關的m個數據爲的函數計算獲得的。就像在一張大表中找到m位數據對應的r校驗位。在系統碼(systematic code中,直接發送m個數據位,然後發出r個校驗位,而不是在他們發送前對它們進行編碼。在線性碼(line code中,r個校驗位是作爲m個數據位的線性函數被計算出來的。

令數據塊的總長度爲nn=m+r)。我們將此描述爲(nm)碼。一個包含了數據位和校驗位的n位單元稱爲n碼字(code word碼率(code rate或者簡單地說速率,則定義爲碼字中不包含冗餘部分所佔的比例,用m/n表示。

給定兩個被髮送或接收的碼字:

10001001

10110001        XOR(異或,exclusive OR)

00111000         3 bits不同

這兩個碼字中不相同的位的個數成爲海明距離(Hamming distance

它的意義在於如果兩個碼字的海明距離爲d,則需要d1位錯誤才能將一個碼字轉變成另一個碼字。

 

具有距離的代碼的界限:

2D + 1 可以糾正D錯誤(例如,下面的2個錯誤)

D + 1 可以檢測D錯誤(例如,下面的4個錯誤)

爲了糾正D錯誤,你需要一個2D + 1碼的距離,因爲即使D改變,原始碼字仍然比任何其他碼字更接近。

爲了可靠地檢測D錯誤,您需要距離D + 1碼,因爲D位錯誤不能將有效碼字更改爲另一個有效碼字。

4個碼字的示例:10位:

0000000000000001111111111000001111111111

代碼的海明距離爲5,這意味着它可以糾正2個錯誤或者檢測雙倍的錯。如果接收到碼字0000000111並且期望只有單個或者2個錯誤,則接收方知道原始的碼字一定是0000011111.然而,如果發生了三個錯誤,0000000000變成了0000000111,則以上編碼就無法正確的糾正錯誤了。

 

第一種編碼類型:海明碼

事實上這個理論下限可使用海明方法獲得。在海明碼中,碼字的位被連續編號,從最左端的位開始,緊跟在右邊的那位是2,依次從左到右編號。2的冪次方的位(124816等)是校驗位,其餘位(35679等)用來填充m數據位。這種模式如下圖的海明碼所示,其中包括7個數據位和4個校驗位。每一個校驗位強制進行模2加,或對某些位的集合,包括其本身進行偶(或奇)校驗。一位可能被包括在幾個校驗位的計算中。若要查看在數據k位上的校驗碼,必須將k改寫爲2的冪的和。例如,11=1+2+829=1+4+8+16校驗某一位只需要檢查那些覆蓋了該位的校驗位(例如,校驗128位就可以確定11位是否出錯)。在這個例子中我們採用偶校驗計算ASCII字母“A”的校驗和。

 

這種結構給出了海明距離位3的編碼,意味着它可以糾正單個錯誤(海明碼具有一位糾錯能力),針對數據位和校驗位小心編號的原因在解碼的處理過程中表現得十分明顯。當接收到一個碼字,接收機重新計算其校驗碼,包括收到的校驗碼,得到的計算結果我們稱之爲校驗結果。如果校驗位是正確的,對於偶校驗而言,校驗結果應該是0。在這種情況下,碼字才被認爲是有效的。

然而,如果校驗結果不爲全零,則意味着檢測到了一個錯誤。校驗結果的集合形成的錯誤綜合集,可用來查明和糾正錯誤。在上圖中,信道上發生了1位錯誤,因此分別針對k=8421的校驗結果是0101。由此得出的綜合集爲01014+1=5。按照設計方案,這意味着第五位有誤。把不正確的位(這可能是一個校驗位或數據位)取反,並丟棄校驗位就可以得到正確的消息——A

 

(轉)例子:1000001

確定校驗碼的位置

校驗碼在二進制串中的位置爲2的整數冪。剩下的位置爲數據。如圖所示。

位置

1

2

3

4

5

6

7

8

9

10

11

內容

x1

x2

1

x3

0

0

0

x4

0

0

1

 

求出校驗位的值

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

位置

0001

0010

0011

0100

0101

0110

0111

1000

1001

1010

1011

內容

x1

x2

1

x3

0

0

0

x4

0

0

1

爲了求出x2要使所有位置的第二位是1的數據(即形如**1*的位置的數據)的異或值爲0。即x2^1^0^0^0^1 = 0。因此x2 = 0。

同理可得x1 = 1 x3 = 0 x4 =0

位置

0001

0010

0011

0100

0101

0110

0111

1000

1001

1010

1011

內容

1

0

1

0

0

0

0

1

0

0

1

 

因此1000001的海明碼爲10100001001

假設位置爲1011的數據由1變成了0,校驗過程爲:

將所有位置形如***1 **1* *1** 1***的數據分別異或。

***1: 1^1^0^0^0^0 = 0

**1*: 0^1^0^0^0^0 = 1

*1**: 0^0^0^0 = 0

1***: 1^0^0^0 = 1

以上四組中,如果一組異或值爲1,說明該組中有數據出錯了。***1 **1* 1***的異或都爲1,說明出錯數據的位置爲0101

 

第二種編碼類型:卷積碼

卷積碼編碼是我們討論的編碼方法中唯一不屬於塊碼的編碼。在卷積碼(convolutional code中編碼器處理一個輸入爲序列,並生成一個輸出位序列。在塊碼中沒有自然消息大小或編碼邊界。輸出取決於當前的輸入和以前的輸入。也就是說,編碼器有內存。決定當前輸出的以前輸入位數稱爲代碼的約束長度(constraint length卷積碼由它們的碼率(r)和約束長度(k)來標識

下圖爲代碼稱爲NASA(美國航天局)卷積碼,其r=1/2k=7

 

 

在上圖中,左邊每個輸入位產生右邊的兩個輸出位,輸出位是輸入位和內部狀態的XOR。又因爲1個輸入碼產生2個輸出碼,因此碼率位1/2

內部狀態保存在6個內存寄存器中。每當輸入一位寄存器的值就右移一位。例如,如果輸入序列爲111,初始狀態全爲0,則在輸出第一、第二和第三位後從左到右的內部咋黃臺變化成100000110000111000。對應的輸出位分別是111001。這個過程需要7次移位才能完全清空輸入,從而不影響輸出。因此,該卷積碼的約束長度k=7

卷積碼的解碼過程是針對一個輸入位序列,找出最有可能產生觀察到的輸出位序列(包括任何錯誤)。對於較小值的k,一種廣泛使用的算法是由Viterbi開發的。該算法逐個檢查觀察到的序列,記住每一步和輸入序列的每個可能內部狀態,即輸入序列產生觀察序列可能產生的錯誤。最終其中那個具有最少錯誤的輸入序列就是最有可能的消息。

Viterbi算法的擴展適用於不確定因素,因而能提供更強的糾錯功能。這種帶有一位不確定性的工作方法稱爲軟判決解碼(soft-decision decoding。相反,在執行糾錯之前就決定了每個位是01的工作方法稱爲硬判決解碼(hard-decision decoding

 

第三種糾錯碼:裏德所羅門碼(略)

裏德所羅門碼和海明碼一樣,是線性塊碼,往往也是系統碼。但與海明碼不同的是:裏德所羅門碼對m位符號進行操作,而不是針對單個位處理。

 

第四種糾錯碼:低密度奇偶校驗碼(略)

低密度奇偶校驗碼(LDPCLow-Density Parity Check)是線性塊碼,LDPC碼中每個輸出位由一小部分的輸入爲形成。這樣使得編碼可以用一個1密度很低的矩陣來表示,這也是編碼名稱的由來。

LDPC碼比較適用於大塊數據,而且具有出色的糾錯能力,因而性能優於其他很多編碼。

 

3.2.2 檢錯碼

糾錯編碼被廣泛應用與無線鏈路。衆所周知,相比光纖,無線鏈路嘈雜不堪而且容易出錯,如果沒有糾錯碼,將很難從該鏈路中獲得任何信息。然而,光纖或高品質銅線的錯誤率要低得多,因此對於偶爾出現的錯誤採用差錯檢測重傳的處理方式通常更爲有效。

我們將考察三種檢錯碼。這些檢錯碼都是線性的系統塊碼

1)奇偶

2)檢驗和

3)循環冗雜校驗(CRC

我們在這裏僅介紹第一種檢測碼奇偶——把單個奇偶校驗位附加到數據中。奇偶位的選擇原則是使得碼字中比特1的數目是偶數(或奇數)。這樣處理等同於對數據爲進行模2加或異或操作來獲得奇偶位。例如,當以偶校驗方式發送1011010時,在數據末尾添加一位成爲10110100.若採用奇校驗方式發送1011010時,則結果爲10110101。具有單個校驗位的編碼具有碼距2,因爲任何1位錯誤都將使得碼字的奇偶校驗碼出錯。這意味着奇偶校驗碼可以檢測出1位錯誤。

 

3.3 基本數據鏈路層協議

爲了引入協議主題,我們先從3個複雜性逐漸增強的協議開始。

(1)烏托邦式的單工協議

(2)無錯信道上的單工停-等式協議

(3)有錯信道上的單工停-等式協議

首先,我們假設物理層、數據鏈路層和網絡層都是獨立的進程,他們通過來回傳遞消息進行通信。下圖給出了一個通用實現。物理層進程和某些數據鏈路層進程運行在一個稱爲網絡接口卡(NICNetwork Interface Card的專用硬件上;鏈路層進程的其他部分和網絡層進程作爲操作系統的一部分運行在主CPU上,鏈路層進程的軟件通常以設備驅動器的形式存在

 

3.3.1 一個烏托邦式的單工協議

在這個協議中,不需要考慮任何出錯的情況,數據只能單向傳輸。發送方和接受方的網絡層總是處於準備就緒的狀態。數據處理的時間忽略不計。可用的緩存空間無窮大。最強的一個條件是數據鏈路層之間的通信信道永遠不會損壞幀或丟失幀。這個完全不現實的協議我們給它一個暱稱“烏托邦”(Utopia),我們將以此作爲構建後續協議的基本結構。

 

 

3.3.2 無錯信道上的單工停-等式協議

現在我們將處理這樣的問題:發送方以高於接收方能處理到達幀的速度發送幀,導致接收方被淹沒。這種情況實際上是很容易出現的,因此協議是否能夠防止它非常重要。然而,我們仍然假設通信信道不會出錯,並且數據流量還是單工的。

一種解決方法是建立足夠強大的接收器,使其強大到能處理一個接着一個幀組成的連續流(或者把數據鏈路層定義成足夠慢,慢到接收器完全跟得上)。

另一種更一般化的解決方法是讓接收方給發送方提供反饋信息。接收方將數據包傳遞給網絡層之後給發送方返回一個小的啞幀,實際上這一幀的作用是給發送方一個許可,允許它發送下一幀。發送方再發出一幀之後,根據協議要求,它必須等待一段時間知道短啞幀(即確認)到達。這種延緩就是流量控制協議的一個簡單例子。

 

 

3.3.3 有錯信道上的單工停-等式協議

現在我們來考慮比較常規的情形,即通信信道可能會出錯。幀可能被破壞,也可能完全被丟失。然而,我們假設,如果一幀在傳輸過程中被破壞,則接收方硬件在計算校驗和時能被檢驗出來。如果一幀被損壞了之後校驗和還是正確的,那麼這個協議將會失敗。

粗看起來,我們只需要在無錯信道上的單工停-等式協議上增加一個計時器就能應付這個問題。發送方發出一幀,接收方只有在正確接收到數據之後才返回一個確認幀。如果到達接收方的是一個已經被損壞了的幀,則它將被丟棄。經過一段時間後發送方將超時,於是它將再次發送該幀。這個過程將不斷重複,直至該幀最後完好無損地到達接收方。

 

顯然,對於接收方來說,它需要有一種方法能夠區分到達的幀是第一次發來的新幀,還是被重傳的老幀。爲了做到這一點,很顯然的做法是讓發送方在它所發送的每個幀的頭部放上一個序號。然後,接收方可以檢查它所接收到的每個幀的序號,來判斷是新幀還是應該被丟棄的重複幀。

 

 

3.4 滑動窗口協議

在前面的協議中,數據幀只在一個方向上傳輸。而在大多數實際環境中,往往需要在兩個方向上同時傳輸數據。實現全雙工數據傳輸的一種方法是運行前面協議的兩個實例,每個實例使用一條獨立的鏈路進行單工數據傳輸(在不同的方向上)。因此,每條鏈路由一個“前向”信道(用於數據)和一個“逆向”信道(用於確認)組成。兩種情況下的逆向信道帶寬幾乎完全被浪費了。

 

 

一種更好的做法是使用同一條鏈路來傳輸兩個方向上的數據。畢竟,協議2和協議3已經在兩個方向上傳輸幀,而且逆向信道與前向信道具有同樣的容量。在這種模型中,從機器a到機器b的數據幀可以和從機器a到機器b的確認幀混合在一起。接收方只要檢查入境頭部的kind字段,就可以區別出該幀是數據幀還是確認幀

當到達一個數據幀時,接收方並不是立即發送一個單獨的控制幀,而是抑制自己並開始等待,直到網絡層傳遞給它下一個要發送的數據包。然後,確認信息被附加在往外發送的數據幀上(使用數據幀頭的ack字段)。實際上,確認信息搭了下一個出境數據幀的便車,這種技術稱爲稍帶確認(piggy backing

當然,數據鏈路層不能預測未來,所以它必須採用某種自組織方法,比如等待一個固定的毫秒數。如果一個新的數據包很快就到來,那麼確認就可立即被稍帶回去。否則的話,如果在這段時間間隔超時之前沒有新的數據包到來,數據鏈路層必須發送一個單獨的確認幀。

 

接下去的3個協議都是雙向協議,他們同屬於一類稱爲滑動窗口(sliding window的協議。這3個協議在效率、複雜性和緩衝區需求等各個方面有所不同。如同所有的滑動窗口協議一樣,在這3個協議中,任何一個出境幀都包含一個序號,範圍從0到某個最大值。序號的最大值通常是2n-1,這樣序號正好可以填入一個n位的字段中。

所有滑動窗口協議的本質是在任何時刻發送方總是維持着一組序號,分別對應於允許它發送的幀。我們稱這些幀落在發送窗口(sending window內。類似的接收方也存在一個接收窗口(receiving window,對應於一組允許它接受的幀。

 

大小爲1的滑動窗口,序號3

a)初始化;(b)第一幀發出後;(c)第一幀被接收後;(d)第一幀被確認接收後

 

發送方窗口內的序號代表了那些可以被髮送的幀,或者那些已經被髮送但還沒有被確認的幀。任何時候當有新的數據包從網絡層到來時,它被賦予窗口中的下一個最高序號,並且窗口的上邊界前移一格當收到一個確認時,窗口的下邊界也前移一格。按照這種方法發送窗口持續地維持了一系列未被確認的幀。上圖舉了這麼個例子。

 

接收窗口:

序列號==窗口的下邊緣

任何窗外掉落的框架都被丟棄。

 

3.4.1 1位滑動窗口協議

在討論一般情況之前,我們先來考察一個窗口尺寸爲1的滑動窗口協議。由於發送方在發出一幀後,必須等待前一幀的確認到來才能發送下一幀。所以這樣的協議採用了停-等式辦法

用停止和等待方式雙向傳送數據:

捎帶確認ack要求高效率的反向數據幀

處理傳輸錯誤、流量控制、早期定時器

 

每個節點都是發送方和接收方(p4)。

 

爲了顯示協議交換是多麼的細微,我們注意到了雙方同時發送一個初始數據包時出現的一種極爲罕見的情形。這種同步困難程度如下圖所示。如果異常情況在發送自己的幀之前先等待A的第一幀,則會像正常情況一樣,每一幀都會被接受。

然而,如果AB同時發起通信,則他們的第一幀就會交錯,數據鏈路層進入異常狀態。正常狀態下,每一幀到來後都帶給網絡層一個新的數據包,這裏沒有任何重複;在異常狀態下,集市沒有傳輸錯誤,也會有一半的幀是重複的。類似的情形同樣發生在過早超時的情況下,集市有一方明顯地首先開始傳輸也會發生這樣的情形。事實上如果發生多個過早超時,則每一幀都有可能被髮送三次或更多,嚴重浪費了寶貴的帶寬。

同步啓動[]導致正確但較慢的操作相比於正常[]由於重複傳輸

 

3.4.2 回退N協議

到現在爲止,我們一直有這樣的假設,即一個幀到達接收方所需要地傳輸時間加上確認幀回來的傳輸時間可以忽略不計。有時候,這種假設明顯是不正確的。在這些情形下,過長的往返時間對於帶寬的利用效率有嚴重的影響。舉一個例子:考慮一個50kbps地衛星信道,它的往返傳播延遲爲500毫秒。我們想象一下,在該信道上用協議41位滑動窗口協議)來發送長度爲1000位的幀。在t=0時,發送方開始發送第一幀;在t=20ms時,該幀被完全地發送出去;直到t=270ms時該幀才完全到達接收方;在t=520ms時,確認幀纔回到發送方,而且所有這一切還是在最好的情況下發生了。這意味着,發送放在500/520=96%的時間時被阻塞的。換句話說,只有4%的有效帶寬被利用起來了。很明顯,站在效率的角度,長髮送時間、高帶寬和短幀這三者組合在一起就是災難

這裏描述的問題可以看作是這種規則的必然結果,即發送方在發送下一幀之前必須等待前一幀的確認。如果我們放鬆這一限制,則可以獲得更好的帶寬利用率。這個方案的基本思想是允許發送方在阻塞之前發送多達w個幀。通過選擇足夠大的w值,發送方就可以連續發送幀,因爲在發送窗口被填滿之前前面幀的確認就返回了,因而防止發送方進入阻塞。

 

爲了找到一個合適的w,我們需要知道在一幀從發送方傳播到接收方期間信道上能容納多少個幀。這種容量由比特/秒的帶寬乘以單向傳送時間決定,或數據鏈路層有責任以鏈路的帶寬-延遲乘積(bandwidth-delay product序列把數據包傳遞給網絡層。我們可以將這個數量拆分成一幀的比特數,從而用幀的數量來表示。我們將這個數值稱爲BD。因此w應設置爲2BD+1。如果考慮發送方連續發送幀並且在往返時間內收到一個確認,那麼兩倍的帶寬-延時就是發送方可以連續發送的幀的個數;“+1”是因爲必須接受完整個幀之後確認幀纔會發出

在上述例子中,具有50kpbs的帶寬和250ms的單向傳輸時間,帶寬-延遲乘積爲12.5kpbs12.5個長度爲1000位的幀。因此,2BD+126幀。假設發送方還和以前一樣開始發送0號幀,並且每隔20ms發送一個新幀。到t=520時,他已經發送了26幀,這是0號幀的確認時間正好返回。此後,每隔20ms就會到達一個確認,因此必要時發送方總是可以發送幀。從那時起,2526個未確認的幀將始終在旅途中。換言之,發送方的最大窗口尺寸爲26

對於較小尺寸的窗口,鏈路的利用率將小於100%,因此發送方式成會被阻塞住。我們可以將鏈路利用率表示成發送方未被阻塞的時間比例:

鏈路利用率<=w/2BD+1

-等式協議的w=1,如果延遲傳播甚至只有一幀時間,協議效率都將低於50%

保持多個幀同時在傳送的技術是管道化(pipelining的一個例子。在一個不可靠的通信信道上一樣傳送幀會引起一些嚴重的問題。首先,位於某個數據流中間的一個幀被損壞或者丟失,會發生什麼事情呢?在發送方發現問題之前大量的後續幀已經發出,並且即將到達接收方。當損壞的那個幀到達接收方時,顯然它應該被丟棄,但接收方該如何處理所有那些後續到達的幀呢?請記住,接收方的數據鏈路層有責任按正確的順序把數據包傳遞給網絡層。

有兩種基本方法可用來處理管道化傳輸中出現的錯誤。

 

一種辦法稱爲回退Ngo-back-n接收方只需要簡單丟棄所有到達的後續幀,而且針對這些丟棄的幀不返回確認。這種策略對應於接收窗口大小爲1的情形。換句話說,除了數據鏈路層必須要傳遞給網絡層的下一幀以外,他拒絕接受任何幀。如果在計時器超時以前,發送方的窗口已被填滿,則管道將變爲空閒。最終發送方將超時,並且按照順序重傳所有爲被確認的的幀。從那個受損或者丟失的幀開始。如果信道的錯誤率很高,這種方法會浪費大量的寬帶。

正常情況下接收方窗口爲1時錯誤的影響:

 

回退n幀的情形,其中接收方窗口比較大。0號幀和1號幀被正確地接受和確認。然而,2號幀被損壞或丟失。發送方並有意識到出現了問題,它繼續發送後續的幀,知道2號幀的計時器超時。然後,它退回到2號幀,從這裏重新發送2號、3號、4號幀等,一切從頭再來。

 

3.4.3 選擇重傳協議

如果錯誤很少發生,則回退n協議可以供做得很好;但是,如果線路質量很差,那麼重傳的幀要浪費大量的帶寬。另一種通用的處理策略稱爲選擇重傳(selective repeat

使用這種策略,接收方將收到的壞幀丟掉,但接受並緩存壞幀後面所有的好幀。當發送方超時,它只重傳那個最早的未被確認的幀。如果該重傳的幀正確到達接收方時,接收方就可按序將它緩存的所有幀遞交給網絡層。選擇重傳對應的接收方窗口大於1。如果窗口很大,則這種方法對數據鏈路層的內存需求很大。

選擇重傳策略通常跟否定策略結合起來一起使用,即當接收方檢測到錯誤(例如,幀的校驗和錯誤或者序號不正確),它就發送一個否定確認(NAK)。NAK可以觸發該幀的重傳操作,而不需要等到相應的計時器超時,因此協議性能的以提高。

 

上圖中(和上面是同一張圖),0號幀和1號幀被正確接收,並得到確認;2號幀丟失了。當3號幀到達接收方時,那裏的數據鏈路層注意到自己錯過了一幀,所以它針對錯失的2號幀返回一個NAK,但是將第3幀緩存了起來。當4號幀和5號幀到達後,它們也被數據鏈路層緩存起來,而沒有傳遞給網絡層,也可以確認所有這些幀(從2號幀到5號幀)。如果NAK被丟失,則發送方的2號幀計時器最終超時,發送方就會重新發送2號幀(僅僅這一幀),但是,這可能已經過了相當長一段時間。

 

順序接收引發了一些特殊問題,這些問題對於那些按順接受幀的協議是不用考慮的。我們用一個例子就很容易說明麻煩之處。假設我們用3位序號,那麼發送方允許連續發送7個幀,然後開始等待確認。剛開始時,發送方和接收方的窗口如圖所示。現在發送方發出0~6號幀。接收方的窗口允許它接受任何序號落在0~6()之間的幀。這7個幀全部正確地到達了,所以接收方對它們進行確認,並且向前移動它的窗口,允許接收7012345號幀,如圖所示。所有這7個緩衝區都標記爲空。

此時,災難降臨了,閃電擊中了電線杆子,所有的確認都被摧毀。協議應該不管災難是否發生都能正確工作。最終發送方超時,並且重發0號幀。當這幀到達接收方時,接收方檢查它的序號,看是否落在窗口中。不幸的是,如圖所示,0號幀落在新窗口中,所以它被當作新幀接受了。接收方同樣返回(捎帶)6號幀確認,因爲0~6號幀都已經接收到了。

 

發送方很高興地得知所有它發出去的幀都已經正確地到達了,所以它向前移動發送窗口,並立即發送7012345號幀。7號幀將被接收方接收,並且它的數據包直接傳遞給網絡層。緊接着,接收方的數據鏈路層進行檢查,看它是否已經有一個有效的0號幀,它發現確實已經有了(即前面重發的0號幀),然後把內嵌的數據包作爲新的數據包傳遞給網絡層。因此,網絡層得到了一個不正確的數據包。協議失敗!

這個問題的本質在於:當接收方向前移動它的窗口後,新的有效序號範圍與老的序號範圍有重疊。因此,後續的一批幀可能是重複的幀(如果所有的確認都丟失了),也可能是新的幀(如果所有的確認都接收到了)。可憐的接收方根本無法區分這兩種情形。

解決方法:確保接收方向前移動窗口後,新窗口與老窗口的序號沒有重疊。爲了保證沒有重疊,窗口的最大尺寸應該不超過序號空間的一半。

 

 

3.5 數據鏈路協議實例

這裏要考察的是那些出現在Internet兩種常見情形下的數據鏈路協議,這些協議主要用在點到點的線路上。第一種情形是通過廣域網中的SONET光纖鏈路發送數據包。

第二種情形是運行在Internet邊緣的電話網絡本地迴路上的ASDL鏈路。

 

3.5.1 SONET上的數據包

爲了在這些鏈路上承載數據包,需要某種成幀機制,以便將偶爾出現的數據包從傳輸它們的連續比特流中區分出來。運行在IP路由器上的PPP就提供了這種運行機制,如下圖所示:

 

PPP幀格式如下圖所示:


所有的PPP幀都從標準的HLDC標誌字節0x7E01111110)開始。標誌字節若出現在Payload字段,則要用0x7D去填充;然後將緊跟在後面的那個字節與0x20進行XOR操作,如此轉義使得第6位比特反轉(相當於加密)。

緊跟在幀開始處標記字節的後面出現的是Address字段。這個字段總是被設置爲二進制值11111111,表示所有站點都應該接受該幀。使用這個值可以避免如何爲數據鏈路層分配地址這樣的問題。

Address字段後面是Control字段,其默認值是00000011.辭職表示一個無編號幀。

FlagAddress字段都是默認值,可去除。

4個字段是Protocol字段。他它的任務是通告Payload字段中包含了什麼類型的數據包。以0開始的編碼定義爲IP版本4IP版本6以及其他可能用到的網絡層協議,比如IPXAPPLETALK。以1開始的編碼被用於PPP配置協議。

Payload字段是可變長度的,最高可達某個協商的最大值。

Checksum字段,通常佔2個字段,但可以協商使用4個字節的校驗和。

 

在通過SONET線路發送PPP之前,必須建立和配置PPP鏈路。PPP鏈路的啓動、使用和關閉的一系列階段如圖所示:

 

鏈路的初始狀態爲DEAD(),這意味着不存在物理層連接。當物理連接被建立起來鏈路轉移到 ESTABLISH(建立)狀態。此時,PPP對等實體交換一系列的LCP報文進行上面所說的那些PPP選項的協商,這些LCP報文放在PPP幀的 Payload字段。初始發起連接的實體提出自己的選項請求,對等實體可以部分或者全部接受,甚至全部拒絕,同時它也可以提出自己的選項要求。

如果LCP選項協商成功,鏈路狀態進入 AUTHENTICATE(認證)狀態。現在,如果需要,雙方可以互相檢查對方的身份。如果認證成功,則鏈路進入 NETWORK(網絡)狀態,通過發送一系列的NCP包來配置網絡層參數。NCP協議很難一概而論,因爲每個協議特定於實際採用的某個網絡層協議,允許執行鍼對特定於該網絡層協議的配置請求。例如,對於IP協議而言,爲鏈路的兩端分配IP地址是最重要的可能操作。

一旦進入OPEN(打開)狀態,雙方就可以進行數據傳輸。正是在這個狀態下,IP數據包被承載在PPP幀中通過 SONET線路傳輸。當完成數據傳輸後,鏈路進入 TERMINATE(終止)狀態:當物理層連接被捨棄後從這裏回到DEAD狀態。


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