【計算機網絡高分筆記】第三章:數據鏈路層

【計算機網絡高分筆記】第三章:數據鏈路層

標籤(空格分隔):【計算機網絡】

 

 

第三章:數據鏈路層

 

第三章:數據鏈路層
3.1 數據鏈路層的功能
3.2 組幀
3.3 差錯控制
3.3.1 檢錯編碼
3.3.2 糾錯編碼


3.4 流量控制與可靠傳輸機制
3.4.1 流量控制
3.4.2 可靠傳輸機制
3.4.3 滑動窗口機制
3.4.4 停止-等待協議
3.4.5 後退N幀(GBN)協議
3.4.6 選擇重傳(SR)協議
3.4.7 發送緩存和接受緩存


我的微信公衆號

 

 

 


大綱要求:

數據鏈路層功能
組幀
差錯控制 
檢錯編碼 
糾錯編碼
流量控制與可靠傳輸 
流量控制、可靠傳輸與滑動窗口機制
停止-等待協議
後退 N 幀(GBN)協議
選擇重傳(SR)協議
介質訪問控制 
信道劃分介質訪問控制:頻分多路複用、時分多路複用、波分多路複用、碼分多路複用的概念和基本原理。
隨機訪問介質訪問控制:ALOHA 協議、CSMA 協議、CSMA/CD 協議、CSMA/CA 協議
輪詢訪問介質訪問控制:令牌傳遞協議
局域網 
局域網的基本概念與體系結構
以太網與 IEEE 802.3
IEEE 802.11
令牌環網的基本原理
廣域網 
廣域網的基本概念
PPP
HDLC協議
數據鏈路層設備 
網橋的概念和基本原理
局域網交換機及其工作原理
考點和要點分析

核心考點: 
流量控制與可靠傳輸機制、CSMA/CD原理,特別是爭用期和截斷二進制指數退避算法
網橋的概念和基本原理
組幀機制和差錯控制機制,特別是循環冗餘碼和海明碼
基礎要點: 
數據鏈路層的概念和功能
幀的概念,瞭解幀的 4 種組幀方法,掌握其中帶位填充的首尾標誌法
幀的概念,瞭解幀的 4種組幀方法,掌握其中帶位填充額首尾標誌法
差錯控制的基本概念和方法
流量控制的基本概念和可靠傳輸機制
4 種信道劃分介質訪問控制的基本概念
3 種可靠傳輸協議以及 HDLC 協議和 PPP
數據鏈路層各層設備的基本工作原理和其他各層設備的區別

 


3.1 數據鏈路層的功能


數據鏈路層 在物理層所提供的服務的基礎上 向網絡層提供服務,即將原始的、有差錯的物理線路改進成爲邏輯上無差錯的數據鏈路,從而向網絡層提供高質量的服務。它一般包括 3 種基本服務:無確定的無連接服務、有確定的有連接服務、有確定的無連接服務(不存在無確定的有連接服務)。 
具體而言,數據鏈路層的主要功能如下: 
鏈路管理:負責數據鏈路的建立、維持和釋放,主要用於面向連接服務。
幀同步:接收方確定收到的比特流中一幀的開始位置和結束位置。
差錯控制:用於使接收方確定收到的數據就是由發送方發送的數據。
透明傳輸:不論數據是什麼樣的比特組合,都應當能夠在鏈路上進行傳輸。

 

  問,什麼是幀定界? 
  答:當兩個主機之間互相傳送消息時,網絡層的分組必須將封裝成幀,並以幀的格式進行傳送。將一段數據的前後分別添加首部和尾部,就夠成了幀。首部和尾部中含有很多控制信息,這些信息的重要作用之一就是確定幀的界限,這就是幀定界。 
  例如,在 HDLC 協議中,幀格式使用標誌 F(01111110) 來標識幀的開始和結束。

 

 

  標誌
  地址
  控制
  信息
  幀校驗序列
  標誌

 

  F 01111110
  A  8位
  C  8位
  Info N位(可變)
  FCS 16位
  F011111110

 


上表中 地址到幀校驗序列之間爲 透明傳輸區間。


  常見問題 1 :舊版《計算機網絡》教材認爲數據鏈路層的任務是在兩個相鄰節點之間線路上無差錯地傳送以幀(frame)爲單位地數據。數據鏈路層可以把一條有可能出差錯地實際鏈路,轉變成讓網絡層向下看起來好像是一條不出錯地鏈路。但是《計算機網絡》第五版中對數據鏈路層地提法改變:數據鏈路層地傳輸不能讓網絡層向下看起來好像是一條不出差錯的鏈路。那種說法正確? 
  答:首先,在舊版本地計算機網絡教材中對數據鏈路層的闡述都是基於 OSI 體系結構的,OSI 體系結構的數據鏈路層採用的是面向連接的 HDLC 協議,它提供可靠傳輸服務。因此舊版本中的提法對於 OSI 體系結構是正確的。也就誰說,以前確實是數據鏈路層向網絡層提供了一條不出差錯的鏈路。 
  而第五版之後,教材更加突出了 TCP/IP 體系結構,現在互聯網的數據鏈路層協議使用最多的是 PPP 和 CSMA/CD 協議。這兩種協議都不使用序號和確定機制,因此也就不能讓網絡層向下看起來好像是一條不出差錯的鏈路。 
  新版教材中的提法更符合當前計算機網絡的現狀。當接受度按通過差錯檢錯後發現幀在傳輸過程中出現差錯之後,或者默默丟棄不做任何處理(當使用 PPP 或 CSMA/CD 協議時),或者使用重傳機制要求發送方重傳(使用 HDLC 協議時)。在以上兩類協議中,前者佔大多數,後者極少使用。如果需要可靠傳輸,那麼就由高層的 TCP 負責重傳。但是數據鏈路層並不知道這是重傳的幀,所以還是默認可靠傳輸由 傳輸層 的 TCP 負責,而不是數據鏈路層。
  
  問題 2:當數據鏈路層使用 PPP 或者 CSMA/CD 協議時,既然不能保證可靠傳輸,爲什麼對所傳輸的幀進行差錯檢驗的?這不是多此一舉嗎? 
  答:並不是多此一舉,當數據鏈路層使用 PPP 或者 CSMA/CD 協議時,在數據鏈路層的接收端對所傳輸的幀進行差錯檢驗是爲了不將已經發現錯誤的幀瘦下來。如果或在接受端不進行差錯檢驗,那麼接收端上交給主機的幀就有可能包括在傳輸過程中除了差錯的幀,而這樣的幀對於接收端主機而言沒有用途的。換而言之,接受度按進行差錯檢驗的目的是爲了保證“上交主機的幀都是沒有傳輸差錯的,因爲有差錯的幀都已經被丟棄了(丟棄不重傳,所以不可靠)”。更嚴格來說,“我們以很接近 1 的概率認爲,凡是上交主機的幀都是沒有傳輸差錯的)
  
  問題 3:數據鏈路層有流量控制嗎? 
  答:這個問題不能一概而論,而需要看討論的前提。在 OSI 體系結構中,數據鏈路層肯定有流量控制。而在 TCP/IP 體系結構中,數據鏈路層的流量控制被轉移到傳輸層,因此沒有必要再數據鏈路層設置流量控制。

 


3.2 組幀


  問:爲什麼組幀時及要求加首部,也要加尾部?而報文切割成分組只加首部? 
  答:因爲在網絡中是以幀爲最小單位進行傳輸的,所以接收端要正確地收到幀,必須要清楚該幀再一串比特流中是從哪裏開始再哪裏結束(因爲接收端接收到的時一串比特流,沒有首部和尾部不能正確的區分幀)。而分組(也稱爲 IP數據報)僅僅是包含在幀的數據部分,所以不需要加尾部來定界。

 

爲什麼要組幀?直接傳送比特流不就可以了?還免去了幀同步、幀定界、透明傳輸等問題。但是反過來思考,萬一傳送的比特流出錯了怎麼辦?那就得重新傳輸全部的比特流,組幀的優點就在於,如果傳輸出現了錯誤,只需要重新發送錯誤的幀即可,這相對於增加幀同步、幀定界、透明傳輸問題是值得的。組幀不能隨意組合,需要讓接收方看懂才行,這就需要依據一定的規則將網絡層遞交下來的分組組裝成幀。
四種組幀方法:字符計數法、字節填充的首尾界符法、比特填充的首尾標誌法、物理編碼違例法。

字節計數法:用一個特殊的字符來表示一幀的開始,然年後用一個計數字段來表明幀包含的字節數。當目的主機接收到該幀時,根據此字段提供的字節數,便可以知道該幀接受位和下一幀的開始位。如下圖 
 
從上圖中可以看出,計數字段提供的字節數包含自身所佔的一個字節。 
缺點:如果計數字段在傳輸過程中出錯,接收方就無法判斷所傳輸幀的結束位,當然也無法知道下一幀的開始位,這樣就無法幀同步。由於此原因,字符計數法很少被使用。
字符填充的首尾界符法: 
首先討論首尾界符法,由 C 語言知識我們直到 ASCII 碼是 7 位編碼,可以組成 128 個不同的ASCII碼,但是可以打印的字符(可以從鍵盤上輸入的字符)只有 95 個,那麼當傳送的幀是文本文件(都是由鍵盤輸入的)時,就可以在剩下的 33 個控制字符裏選定 2 個字符作爲每一幀的開始和結束,我們選定 SOH 和 EOT 分別作爲幀開始符和幀結束符,這樣接收端只需要判斷這兩個控制字符出現的位置就可以準確地分割成幀,如下圖。 
 
注意: 字符 SOH 代表 Start of Header(首部開始),而 EOT 表示 End of Transmission(傳輸結束)。 SOH 和 EOT 都是 ASCII 中的控制字符,SOH 的十六進制編碼是 01, 而 EOT 的十六進制編碼是 04。不要與一位 SOH 是 ‘S”O”H’ 三個字符,同樣也不要誤以爲 EOT 是 ‘E”O”T’三個字符。 
缺點:首尾界符法對於幀數據文件是文本文件完全沒有問題。但是還有一種情況,假如幀傳輸的數據不是文本文件,即真傳輸的數據可能包含種植字符,就不能僅僅使用控制字符來進行幀定界了,否則會導致錯誤的定界,而僅僅把一部分幀收下,例如 
在這種情況下,採用首尾界符法便會僅僅收下前小半段數據。
如此看來,首尾界符法是不嚴謹的,因此出現了字符填充的首尾界符法,其方法是,當數據中出現字符 “EOF” 或者 “SOH” 時,就將它們轉換成另外一個字符,而這個字符是不會被錯誤解釋的。但是所有字符都可能在數據中出現,於是就將數據中出現的字符 
“SOH” 轉換成 “ESC” 和 ‘x’ 兩個字符; 
“EOF” 轉換成 “ESC” 和 ‘y’ 兩個字符; 
而當數據中出現控制字符 “ESC” 時,就將其轉化爲 “ESC” 和 ‘z’ 兩個字符。 
這種轉換方法能夠在接收端將收到的數據正確地還原爲源來的數據,其中 “ESC” 是轉義符,它的十六進制編碼爲 1B.如下圖: 
 
在接收端只需要按照上述規則進行相反的轉化,便可以還原原來的數據。 


  問:爲什麼在謝希仁的教材中和上述轉換方法不一樣? 
  答:教材上是將 EOT 轉換成 ESC EOT 等。其實解決透明傳輸的方法由很多種,只要合理即可,即與接收方約定一種方式,可以在創新的情況下不一定非要與教材一致。

比特填充的首尾標誌法:比特填充的首尾標誌法是使用 01111110 作爲幀的開始和結束的標誌,這樣看來似乎幀定界的問題便解決了,單位體隨着而來,如果幀的數據部分含有 01111110 怎麼辦?透明傳輸依然是一個問題。

解決方法如下:在 01111110 中擁有 6 個連續的 ‘1’,只要數據幀檢測到有 5 個連續的 ‘1’,便馬上再其後面插入 ‘0’,而在接收方對該過程實施逆操作,即每次收到 5 個連續的 ‘1’,自動刪除後面緊緊跟隨的 ‘0’,以恢復數據。這樣的方法又稱爲零比特填充法。
我們來模擬這這個過程: 
原始數據: 0110101111110010111111011 數據中兩次出現了 01111110. 
零比特填充後的數據:01101011111 0 1001011111 0 1011,其中加粗部分表示填充的 0. 
接收方收到數據後,遇到 5 個連續的 ‘1’ 刪除後面的 ‘0’ ,便可以得到原始數據。
物理編碼違例法:物理編碼違例法是利用物理介質上編碼的違法標誌來區分幀的開始與結束,例如,在曼徹斯特編碼中,碼元 1 編碼成高-低電平,碼元 0 編碼成低-高電平,而高-高和低-低點公平在編碼中是無效的,可以用來作爲幀的起視標誌和結束標誌。
注意:

在使用字節填充的首尾界符法時,並不是所有形式的幀都需要開始符和幀結束符,如 MAC 幀便不需要幀結束符。因爲以太網在傳送幀時,各幀之間還必須要有一定的間隙,所以,接收端只要找到幀開始定界符,其後面的連續到達的比特流就都屬於同一個 MAC 幀,可見,以太網不需要使用幀結束定界符,也不需要使用字節插入來保證透明傳輸。
PPP幀用來及逆行幀定界的字段是 Ox7E. 1B是普通幀透明傳輸的處理,即轉義字符 “ESC” 的十六進制編碼。

 


3.3 差錯控制

 

3.3.1 檢錯編碼


檢錯編碼:通過一定的編碼和解碼,能夠在接收端解碼時檢查出傳輸的錯誤,但不能糾正錯誤。常見的檢錯編碼具有有奇偶校驗碼和循環冗餘校驗碼(CRC).
奇偶校驗碼:在信息碼後面加一位校驗碼,分奇校驗和偶校驗。 
奇校驗:添加以爲校驗碼之後,保持整個碼字裏面的 1 的個數是奇數。接收端收到數據之後就校驗數據裏面 1 的個數,如果檢查到奇數個 1 ,那麼認爲傳輸過程中沒有出錯,如果檢查到偶數個 1 ,則說明傳輸過程中數據發生了改變,要求重發。
偶校驗:添加一位校驗碼之後,保持整個碼字裏面的 1 的個數是偶數。接收端收到數據之後就校驗數據裏面 1 的個數,如果檢查到偶數個 1 ,那麼認爲傳輸過程中沒有出錯,如果檢查到奇數個 1 ,則說明傳輸過程中數據發生了改變,要求重發。 
當數據中有一位發生變化時,奇偶校驗碼能夠檢測出來,但是不知道是哪一位發生了錯誤。如果數據中有兩位數據發生了編碼,那麼奇偶校驗碼檢測不到數據出錯。所以它的檢錯能力是有限的。 

 

  奇偶校驗碼在實際使用中又分爲垂直奇偶校驗、水平奇偶校驗與水平垂直奇偶校驗。上述內容屬於水平奇偶校驗。
  循環冗餘校驗碼(CRC):適當選擇多項式 G(x)G(x) ,在計算機二進制信息 M(X)M(X) 的長度確定時,餘數與 CRC 碼出錯位的對應關係是不變的,可以使用餘數作爲判斷出錯位置的依據而糾正編碼。檢錯方式:將受到的 CRC 碼與 G(x)G(x) 相除,如果餘數爲 0 ,那麼數據正確。如果餘數不爲 0 ,那麼可以判斷出錯的位置。  
  舉個例子:試計算 10110010000/11001. 
  計算技巧:在除法過程中,進行異或運算,無視進位;上商的規則是看餘數的首尾,如果爲 1,則上 1,如果爲 0 ,則上 0;當部分餘數的位數小於除數的位數時,該餘數便是最後的餘數。 
  可以得到 10110010000/11001 餘數爲 1010. 
  CRC碼進行檢錯的重要特徵 
  1. 具有 r 檢測位的多項式嫩能夠檢測出所有小於或者等於 r 的突發錯誤 
  2. 長度大於 r + 1 的錯誤逃脫的概率爲 12r.12r. 
  注意:1. 循環冗餘碼僅能做到無差錯接受。 2. CRC 具有糾錯功能。但是在計算機網絡中一般發現錯誤直接重傳,因此在默認情況下,CRC爲檢錯碼而不是糾錯碼。
  
  


3.3.2 糾錯編碼


糾錯編碼:在接受端不僅能夠檢查出錯誤,而且還能夠就成檢查出來的錯誤。常見的糾錯碼是海明碼。
海明碼:又稱爲漢明碼,他是在信息字段中插入若干位數據,用於監督碼字的哪一位數據發生了變化,具有一位糾錯能力。假設信息位有 k 位,整個碼字的長度就是 k + r 位,每一位的數據只有兩種狀態,因此有 r 位數據就有 2r2r 種狀態。如果每一種狀態就代表一個碼元發生了錯誤,有 k + r個碼元,就要有 k + r 種狀態來表示,另外還要有一種狀態來表示數據正確的情況,所以 2r−1≥k+r2r−1≥k+r 纔可以檢查出一種錯誤。 
海明碼求解步驟:

確定校驗碼的位數 r .2r≥k+r+12r≥k+r+1.
確定校驗碼的位置。第 i 個校驗碼處於位置 PiPi 處,PiPi 對應的位置爲 2i−12i−1 ,   i=0,1,2....   i=0,1,2.....
確定數據的位置。
求出校驗位的值。

例:D = 101101 的海明碼。 
首先確定 r ,易得 r = 4。

 


  M1M1
  M2M2
  M3M3
  M4M4
  M5M5
  M6M6
  M7M7
  M8M8
  M9M9
  M10M10

 

  P1P1
  P2P2
  1
  P3P3
  0
  1
  1
  P4P4
  0
  1

 


如何求取 PiPi 的值? 
首先把 D 所在位置的 MiMi 的二進制寫出來:

 


  M3M3
  3
  0011

 

  M5M5
  5
  0101


  M6M6
  6
  0110


  M7M7
  7
  0111


  M9M9
  9
  1001


  M10M10
  10
  1010

 


假設出錯位是 e1,e2,e3,e4e1,e2,e3,e4, 可以知道: 
e1=M1⊕M3⊕M5⊕M7⊕M9e1=M1⊕M3⊕M5⊕M7⊕M9 
e2=M2⊕M3⊕M6⊕M7⊕M10e2=M2⊕M3⊕M6⊕M7⊕M10 
e3=M4⊕M5⊕M6⊕M7e3=M4⊕M5⊕M6⊕M7 
e4=M8⊕M5⊕M9⊕M10e4=M8⊕M5⊕M9⊕M10 
把數據帶入可以得到 
當海明碼沒有錯誤信息時,e1,e2,e3,e4e1,e2,e3,e4 必須都等於 0,因此等式右側的值也全部爲 0,由於異或符號的特性,PiPi 等於 MiMi 位置上 ii 的二進制數上爲 1的位置上的對應的 D 相應位置上求異或。 
可以得到 P1=P2=P3=0,P4=1P1=P2=P3=0,P4=1

海明碼的校驗: 
直接寫出錯位 e1,e2,...,eme1,e2,...,em 與 M1,M2,...,MNM1,M2,...,MN 之間對應關係,計算出e1,e2,...,eme1,e2,...,em 的值。
寫出 em,em−1,...,e1em,em−1,...,e1 對應的十進制的值,這個值便是出錯的位數,取反便可以得到正確的編碼。
補充: 
1.海明碼如果要檢測出 d 位錯誤,需要一個海明距爲 d + 1 的編碼方案;如果要糾正 d 位錯誤,需要一個海明距爲 2d + 1 的編碼方案。 
理解:首先,什麼是碼距?碼距指的是兩個bima’zi碼字的不一樣的程度,就是把碼距對其之後,有幾位不同,碼距便是多少。碼距又稱爲海明距。例如,碼字 110 和 111 的碼距便是 1. 什麼是海明距爲 1 的編碼方案?一個編碼方案一般對應許多碼字,而定義許多碼字的海明距只需要看最小的即可。例如,某個編碼方案中有碼字 110、001、111,儘管 110 和 001 的碼距爲 3,但是110 與 111 的碼距爲 1.我們取 1 即可。

海明碼得糾錯能力恆不大於檢錯能力。
爲什麼誤碼率與信噪比有關? 
因爲信噪比越高,失真自然會越小,到達接受端之後得波形得變化就會很小,誤碼率自然變低。

公式 L−1=D+C,D≥CL−1=D+C,D≥C 
其中 L 爲編碼方案,D 爲檢錯位數,C 爲糾錯位數。 
如果要糾正 d 位錯誤,意味着至少檢測出 d 位錯誤,代入即可以得到 L - 1 = d + d ,即 L = 2d + 1;瞳孔裏,如果要求檢測出 d 位錯誤(默認糾錯爲 0 ,即 C = 0),代入得 L = d + 1.

 


3.4 流量控制與可靠傳輸機制

 

3.4.1 流量控制

申明:流量控制與可靠傳輸機制其實是屬於傳輸層的功能。 
- 流量控制就是要控制發送方發送數據的速率,使得接收方來得及接受。一個基本的方法就是由接收方來控制發送方的數據流。 
- 常見的兩種方式:停止-等待流量控制和滑動窗口流量控制。 
1. 停止-等待流量控制:這是流量控制中最簡單的形式。停止-等待流量控制的工作原理就是發送方發出一幀,然後等待應答信號到達之後再發送下一幀;接收方每收到一幀之後,返回一個應答信號,表示可以接受下一幀,如果接收方沒有收到應答信號,則發送方必須一直等待。 
2. 滑動窗口流量控制,在停止-等待流量控制中每次只允許發送一幀,然後就陷入等待接收方確定信息的過程中,傳輸效率很低。而滑動窗口流量控制允許一次發送多個幀。 
滑動窗口流量控制的工作原理是在任意時刻,發送方都維持了一組連續的允許發送的幀的序號,稱爲發送窗口同時,接收方也維持了一組連續的允許接受的幀的序號,稱爲接收窗口。發送窗口和接收窗口的序號的上下界不一定要一樣,甚至大小也可以不同。發送方窗口內的序列號代表了那些已經發送但是還沒有被確定的幀,或者那些可以被髮送的幀。發送端沒收到一個幀的確定,發哦是那個窗口就向前滑動一個幀的位置。當發送窗口尺寸達到最大尺寸時,發送方就會強行關閉網絡層,直到有一個空閒的緩衝區出來。當接受度按只有當收到的數據幀的發送序號落入接收窗口內才允許將該數據幀收下,並將窗口向前移動一個位置。如果接收到的數據幀落在窗口之外(就是說收到的幀號在接收窗口中找不到相應的該幀號),則一律丟棄。 
用一個例子來說明: 
 

 


3.4.2 可靠傳輸機制


可靠傳輸機制與無差錯接受的區別 
在數據鏈路層如果僅僅使用循環冗餘碼檢驗差錯檢測技術,只能做到對幀的無差錯接受,即 “凡是接收端數據鏈路層接受的幀,都能以非常接近 1 的概率認爲這些幀在傳輸過程中沒有產生差錯”。 
注意:現在並沒有要求數據鏈路層向網絡層提供“可靠傳輸”的服務。所謂“可靠傳輸”,就是數據鏈路層的發送端發送什麼,接收端就接受什麼。傳輸差錯可以分爲兩大類,一類就是比特差錯(可以通過CRC來檢錯),另一類傳輸差錯更復雜,這就是收到的幀並沒有出現比特差錯,但是出現了 幀丟失(例如發送 1,2,3,收到 1,3)、幀重複(例如發送 1,2,3 ,收到 1,2,2,3)、幀失序(例如發送 1,2,3,收到1,3,2)。這三種情況都屬於出現傳輸差錯,但都不是這些幀裏有比特差錯。 
幀丟失比較容易理解,但是幀重複、幀失序的情況比較複雜。 
總而言之“無比特差錯”和“無傳輸差錯”並不是同樣的概念,在數據鏈路層使用 CRC 檢驗只能實現無比特差錯的傳呼是,但這並不是可靠傳輸。 
也許會有人提出:既然會丟失那就是讓接收端不管收到還是沒收到都給回覆,即確認。如果沒有接收到回覆就再發一次,直到對方確認。對於幀失序只要給發的幀的編號,等到所有幀均接收到再排序。以上說的都是對的,但爲什麼不採用以上方法?原因有二:1. 以前在數據鏈路層使用這種方式是因爲以前的通信質量太差了,所以確定和重傳機制會起到很好的效果,但是如今的通信質量已經大大提高,由通信鏈路質量不好引起的差錯的概率大大降低,再使用這種機制的代價太大,不合算。2. 即時數據鏈路層能夠實現無差錯的傳輸,端到端的傳輸也可能出現差錯,這樣得不償失,還不如把數據鏈路層做的簡單一點,可靠的傳輸由上層協議來完成。爲了更清楚數據鏈路層的可靠傳輸移到高層的原因,我們可以先看一下網絡層的一個知識。

互聯網使用的 IP 是無連接的,因此其傳輸時不可靠的。這樣容易使得人們感到互聯網很不可靠,那麼爲什麼當初不把互聯網的傳輸設計成爲可靠的? 
答:這個問題很重要。打個比方:郵局寄送的平信很像無連接的 IP 數據報。每封平信都可能走不同的傳送路徑,因此平信也不保證不丟失。當發現收信人沒有收到寄出的平信時,找郵局索賠時沒有用的,郵局會答覆:平信不保證不丟失,如果擔心丟失,請您寄掛號信。但是大家並不會將所有信件都是用掛號信的方式基礎,這是因爲丟失平信的概率不大,況且掛號信的成本較高。總之,儘管寄平信可能會丟失,但是絕大多數信是平信,因爲平信方便,實惠。 
在我們生活中,傳統的電信網的最主要的用途之一就是進行電話通信,普通的電話機很簡單,只有電話功能,電信公司就不得不把電信網設計的非常好,進而保證用戶通話時質量。但是電信公司卻付出了很大的代價,例如使用昂貴的程控交換機和網管系統。 
當時,在數據傳輸的過程中,對於哪部分應該負責數據傳輸的可靠性,工程師們有兩個意見 :其一,主張像電信網絡一樣由網絡負責數據傳輸的可靠性;其二,主張用戶的主機負責數據傳輸的可靠性。第二種思路更容易實現,因爲具有智能的主機使得計算機網絡和電信網絡有兩個重要的區別。 
即時傳送數據的因特網有一些缺陷,例如導致比特差錯或者分組丟失,但是具有智能的終端主機仍然有辦法實現可靠的數據傳輸,例如能夠及時的發現錯誤並通知發送方重新發送剛纔出錯的數據。
即時網絡可以實現 100% 的無差錯傳輸,端到端的數據傳輸仍然有可能出現差錯。 
例如,假設主機 A 像 主機 B 傳送一個文件。文件通過一個文件系統存儲在主機 A 的硬盤中,主機 B 也有一個文件系統,用來接收和存儲從主機 A 發送過來的文件。應用層使用的應用程序現在就是文件傳送程序,這個程序一部分在主機 A 運行,另外一部分在主機 B 運行。 
現在討論文件傳送的大致步驟:1. 主機 A 的文件傳送程序調用文件系統將文件從硬盤中獨處,然後文件系統將文件傳遞給文件傳送程序。2. 主機 A 請求數據通信系統將文件 B 傳送給主機 B,這裏包括使用一些通信協議和數據文件劃分爲適當大小的分組。3. 通信網絡將這些文件逐個傳送給主機 B。 4. 在主機 B中,數據通信協議將收到的文件傳遞給文件傳送應用程序在主機 B 與運行的那部分。5. 在主機 B中,文件傳送程序請求主機 B的文件系統將受到的數據寫入主機 B的硬盤中。 
以上步驟中,存在一些使得數據受到損傷的因素。例如:1. 雖然文件源來是正確地寫在主機 A 的硬盤上,但是在讀出後文件就出現了差錯(例如在磁盤存儲系統中的硬件出現了故障)。2. 文件系統、文件傳送程序或者數據通信系統的軟件在對文件中的數據進行緩存或者複製的過程中都有可能出現故障。 3. 主機 A 或者主機 B 的硬件處理器胡總和存儲器在主機 A 或者 B 進行數據緩存或複製的過程也有可能出現故障。4. 通信系統在傳輸分組時有可能產生檢測不出來的比特差錯,甚至丟失某些分組。5. 主機 A 或者 B 都有可能在進行數據處理的過程中突然崩潰。 
以上可以看出,即時一個簡單的文件傳送任務,即時通信網絡可以 100% 無差錯傳輸,並不能保證文件從主機 A 硬盤到主機 B 硬盤的傳送也是可靠的。也就是說,花費很多的財力將網絡做的非常可靠,對於計算機網絡的數據傳輸而言是得不償失的。那麼既然終端設備內具有隻能,就應該把網絡設計的簡單一些,從而讓具有隻能的終端設備來完成:“傳輸變得可靠”的任務。 
因此,計算機網絡的設計者採用了一種策略,便是“端到端的可靠傳輸”,這便是在傳輸層使用面向連接的 TCP,它可以保證端到端的可靠傳輸。只要主機 B 的 TCP 發現傳輸數據有差錯,就告訴主機 A 將出現差錯的那部分數據重傳,直到這部分數據正確傳送到主機 B爲止。而 TCP 發現不了數據錯誤的概率是非常小的。
採用以上的建網策略,即可一將使網絡部份價格便宜和靈活可靠,又可以保證端到端的可靠性傳輸,可以想象,將互聯網的範圍稍稍擴大,即擴大到主機中的傳輸層。由於傳輸層使用了 TCP,使得端到端的數據傳輸變得可可靠,因此這樣擴大了範圍的因特網就成了可靠地網絡。“互聯網提供的提供的數據傳輸是不可靠的”或“互聯網提供的數據傳輸是可靠的”這兩種說法都可以在文獻中找到,但是關鍵在於如何界定互聯網的範圍。如果說互聯網提供的數據傳輸不可靠,那麼這裏的互聯網指的時不包括主機在內的網絡(僅有物理層、數據鏈路層和網絡層);如果說互聯網提供的數據傳輸是可靠的,那麼這裏的互聯網包含主機的傳輸層。

 


3.4.3 滑動窗口機制


只有在接受窗口向前滑動時(與此同時也發送了確定),發送窗口才有可能向前滑動。
可靠傳輸機制包括 停止-等待協議、後退 N 幀協議和選擇重傳協議。從滑動牀闊的層次上看,這三種協議知識在發送窗口和接收窗口的大小上有所區別。 
停止-等待協議:發送窗口大小 = 1,接收窗口大小 = 1.
後退 N 幀協議:發送窗口大小 > 1,接收窗口大小 = 1.
選擇重傳協議:發送窗口大小 > 1,接收窗口大小 > 1.
當接受窗口大小等於 1 時,一定可以保證幀按照順序接受。

 

  補充:爲什麼不管發送窗口多大,只要當接受窗口大小等於 1 時,一定可以保證幀按照順序接受? 
  答:因爲接受窗口爲 1,所以裏面有一個唯一的幀序號,不管發送窗口一次性可以發送多少字節的數據,接收窗口只選擇接收窗口裏的幀序號接受,只有等到該幀,接受窗口才會向後移動,所以按照這樣的順序接受的幀一定是有序的。

 


3.4.4 停止-等待協議


怎麼去實現可靠傳輸? 
可靠傳輸指的是發送方發送什麼,接收方就受到什麼,一般而言,使用確定(發送確認)和超時重傳兩種機制來共同完成。確認幀是一個沒有數據部分的控制幀,只是用來告訴發送方的某一幀已經收到了。有時候,爲了提高傳輸效率,將確認捎帶在一個回覆幀中,稱爲捎帶確認。 
超時重傳是指發送方在發送一個數據楨時設置一個超市計時器,如果在規定的時間限制之內沒有收到該幀的確認,那麼就重新發送該數據幀。導致發送方沒有收到確認得的原因有以下兩種:1. 當接收方檢測到出錯幀時,接收方直接丟棄該幀,而不返回確認。2. 該幀在傳輸過程中丟失。 
使用確認和超時重傳兩種機制實現可靠傳輸的策略又稱爲自動請求重發(ARQ)


  稍待確認與累計確認有什麼區別? 
  答: 
  捎帶確認:每兩個發送數據的站都是通過全雙工連接的,每個站既維持發送窗口也維持接收窗口,但是在課本中,爲了講解清楚,僅僅是單方向發送,所以在同一時間某站可能即使發送數據又發送確認,這樣就可以將確認放到數據裏面一起發過去,這就是捎帶確認; 
  累計確認:還有一種情況是接收方沒收到 K 個幀就發送一個 ACK 告知發送方已經正確接受前 (K-1) 個幀並期待第 K 個幀,有人可能會問那發送方在發送第一個幀設計的計時器早就超時了,沒錯,這種可能性相當大,所以與超市的就要單獨發 ACK ,以免發送方一直放鬆,這就是累計確認。

停止-等待協議 
從名稱上可以看出,停止-等待協議是基於停止-等待流量控制技術的。從滑動窗口的角度來看就是其發送窗口大小等於 1,接收窗口大小也是 1. 
基本思想:發送方傳輸一個幀之後,必須等待對方的確認才能發送下一幀。如果在規定的實踐之內沒有收到確認,則發送方超時,並重傳原始幀。 
有人會問,停止-等待流量控從v行程序制技術(這裏是停止-等待流量控制技術而不是停止-等待協議)爲什麼要一直在等待?爲什麼不設置一個規定時間?我們來看協議的指定。首先協議需要建立在一定的技術(停止-等待流量控制技術)之上,然後在此技術上需要考慮一切可能突發的不利狀況(可以理解:協議 = 技術 + 考慮不利因素,即 停止-等待協議 = 停止-等待流量控制技術 + 不利因素),設定規定時重傳就是爲了解決這些不利因素。如果不設定時間就會造成死鎖,這樣就無法推進,在這裏可以聯想操作系統的死鎖,如果沒有外力參與打破死鎖,就會一直等待下去,而這個外力就是重傳計時器。 
停止-等待協議會出現的差錯主要有以下兩大類: 
幀一般被分爲數據幀和確認幀。 
第一類錯誤就是數據幀被損壞或者丟失,那麼接收方在進行差錯校驗時,會被檢測出來。處理數據幀被損壞的情況時,使用計時器可以解決。這樣發送方再發送一個幀之後,如果數據能夠被正確的接收到,那麼就接收方就發送一個確認幀,沒有問題;如果接收方接收到的是一個被損壞的數據幀,則直接丟棄,此時發送方處於等待狀態,直到計時器超市,發送方就會重新發送這個數據幀,如此重複,直到這一個數據幀無錯誤地到達接收方爲止。
第二類錯誤就是確認幀被破壞或者丟失。一旦確認幀被破壞或者丟失,造成的後果就是發送方會不斷地重新發送該幀,從而導致接收方不斷地重複接受該幀。如何解決?顯然,對於接收方而言,需要有能力區分某一幀是新幀還是重複幀。解決方法很簡單,讓發送方再每一個待發地幀地頭部加一個編號,而接收方對每一個到達的幀地編號進行識別,判斷是新幀還是需要拋棄的重複幀。 


  疑問:確認幀需要序號嗎?考慮以下條件:假設 a 發送 1 號幀給 b,b收到,但是 b 發送給 a 的確認幀在網路中堵塞了,於是當 a 端的計時器超時後看,a 又重新發送了 1 號幀,此時,b 又收到了一個 1 號幀。就在此時,b 發送的第一個確認幀到達 a,於是 a 發送 2 號幀,但是 b 沒有收到,但此時 b 的第二個確認幀到達了 a 端,如果確認幀沒有編號,因此 a 認爲 b 收到了 2 號幀,這難道不是發生了錯誤嗎? 
  解析:這個問題的本身在於技術演變,題目的分析也沒有錯誤,很好的說明了需要對確認幀進行編號才能夠正常工作。但是由於目前的數據鏈路層協議是用於點對點的鏈路上,而在條件固定的鏈路上,數據的往返時延一般比較穩定,不會出現忽大忽小地大幅度起伏變化。而在這種情況下,如果選擇合適大小地超時重傳時間,那麼對於確認幀沒有序號的停止-等待協議也是可以工作的。 
  因此,在討論停止-等待協議的原理時,有時也省略了確認幀中的序號。從嚴格意義上講,既然協議應當保證在任何不利情況下都能正常工作,那麼完整的停止-等待協議的確認幀就應當存在序號。

 

 

3.4.5 後退N幀(GBN)協議


後退 N 幀協議基於滑動窗口流量控制技術。如果採用 n 個比特對幀進行編號,其發送窗口尺寸 WTWT 必須滿足 1<WT≤2n−11<WT≤2n−1 ,接受窗口尺寸爲 1.如果發送牀闊尺寸大於 2n−12n−1,會造成接收方無法分辨新、舊數據幀的問題。由於接受窗口尺寸爲 1,因此接收方只能按序來接受數據幀。
基本原理:發送方發送完一個數據幀之後,不是停下來等待確認幀,而是可以連續再發送若干個數據幀。如果這時候收到了接收方的數據幀,那麼還可以接着發送數據幀。如果某一個幀出錯了,接收方只能簡單地丟棄該幀及其所有的後續真。發送方超時後需要重新發出該出錯幀及其後續的所有幀。由於檢查了等待時間,後退 N 幀協議使得整個通信的吞吐量得到了提高。但接收方一發現錯誤幀,就不再接收後續的幀,造成一定量的浪費,據此改進,得到了選擇重傳協議。 

 

  補充:爲什麼後退 N 幀協議的發送窗口尺寸 WTWT 必須滿足 1<WT≤2n−11<WT≤2n−1 ? 
  答:假設發送的窗口的大小爲 2n2n,發送方發送了 0 號幀,接收窗口發送 ACK1(0 號幀已經收到,希望接受 1 號幀,但是 ACK1丟失),接着發送方發送了 1 號幀,接收窗口發送 ACK2( 1 號幀已經收到,希望接受 2 號幀,但是 ACK2 丟失),依次推類,知道發送方發送了第 2n−12n−1 號幀,,接收方發送 ACK 2n2n(丟失),此時不能再發送數據了,因爲已經發送了 2n2n 個幀,但是一個確認都沒有收到,所以過一段時間 0 號幀的計時器會到達預定的時間進行重發,此時發過去接受方認爲是新一輪 0 號幀還是舊一輪重傳的呢?接收方並不知道,所以很有可能接收方就把新一輪的 0 號幀當作舊一輪的幀接受了,但實際上這個 0號幀是重傳的,所以出現了錯誤,即發送窗口的大小不能是 2n2n . 
  現在假設發送窗口的大小爲 2n−12n−1,情況和上面一樣,發送方發送 0 ~ 2n−22n−2 號幀,接收方發送的確認幀都丟失了,如果沒有丟失就應該繼續傳送 2n−12n−1號幀,但是丟失了,發送方應該發送 0 號幀,由於這種情況接收方可以判斷出來(下一這幀只要不是第 2n−12n−1 號幀就重傳),因此不會發送錯誤。如果接收方窗口尺寸小於 2n−12n−1,那麼就更不會發生錯誤了。 
  綜上所述,後退 N 幀協議的最大發送窗口是 2n−12n−1.
  
  


3.4.6 選擇重傳(SR)協議


選擇重傳協議也是基於滑動窗口流量控制技術的。它的接受窗口尺寸和發送窗口尺寸都大於 1,以便能夠一次性接受多個幀。如果採用 n 個比特對幀機型編號,爲了避免接受端向前移動窗口後,新接收窗口與舊接收窗口產生重疊,發送窗口的最大尺寸應該不超過序列號範圍的一般:WT≤2n−1WT≤2n−1.當發送窗口取最大值時,WR=WT=2n−1WR=WT=2n−1(大部分情況都是發送窗口等於接收窗口並且都等於 2n−12n−1,因爲在這種情況下可以達到最大效率),此時,如果 WTWT 取大於 2n−12n−1 的值,可能造成新、舊接收窗口重疊。
基本思想:如果某一幀出錯,其後續幀先存入接收方的緩衝區中,同時要求發送方重新傳輸出錯幀,就和原先存在緩衝區的其餘幀一起按照正確的順序送到主機。選擇重傳協議避免了重複傳輸那些本來已經正確到達接收方的數據幀,進一步提高了信道利用率,代價是增加了緩衝空間。 

 

  補充:爲什麼選擇重傳協議的最大發送窗口大小是 2n−12n−1? 
  答:現在先假設選擇重傳協議的最大發送窗口是 W,那麼可以一次性發送 0 ~ W - 1 號幀,並且接收方都已經收到了(就是說,這 W 個確認幀都已經發了),但是這 W 個確認幀全部在傳輸過程中丟失了,此時接收窗口的位置已經移動到 W ~ 2W - 1. 如果發送方再發一輪,這 W 個幀應該落在W ~ 2W - 1上,但是此時的 W 幀是重傳的,所以如要正確,就必須滿足 2W - 1 是在最大序號 2n−12n−1之內,也就是說 2W−1≤2n−12W−1≤2n−1,即 W≤2n−1W≤2n−1. 
  由於選擇重傳協議的最大發送窗口是 2n−12n−1 還是比較難以理解的。舉個例子,假設 n=3n=3 ,則 2n−1=4 2n−1=4.如果發送窗口和接收窗口爲 5. 假設 t1t1 時刻發送方發送序號爲 0~4 的幀 ,t2t2 時刻接收方收到序號爲 0~4 的幀,但是確認幀在傳輸過程中丟失了。於是,發送方在 t3t3時刻重新發送幀0,當t4t4時刻接收方收到幀 0時候,由於幀0 在其接受範圍之內, 0 被錯誤的當作下一個新幀接受,導致協議錯誤。因此 W≤2n−1W≤2n−1. 
   
  另外一個疑問點:如果不按需接受,交給主機時不是全部亂套了? 
  答:如果沒有按序,正確的接受幀先存入接收方的緩衝區中,同時要求發送方重傳出錯幀,一旦接收到重傳幀之後,就和原先存在緩衝區的其餘幀按照正確的順序發送到主機。所以說選擇重選協議避免了重複傳輸那些本來已經正確到達接收方的數據幀,進一步提高了信道的利用率,但是代價是增加了緩衝空間。
  
  


3.4.7 發送緩存和接受緩存


發送窗口與發送緩存的區別: 

接收窗口與接受緩存的區別: 

從上圖中可以看到,在接收窗口中,按序到達的且沒有被交付給主機的幀被放到接受緩存(接收窗口外的那一部分的接受緩存,一下所述的接受緩存都是指這裏)裏(因爲已經發送過確認幀了,僅僅是等待主機的應用程序來取),而不是接收窗口裏面。那些不是按序到達的數據且沒有錯誤的幀一定是要放在接受窗口裏面,因爲這些幀不能直接給主機,而是放在接受緩存的幀是要給主機的,等到缺少的幀到達之後,在一起放到接受緩存中,這一點注意區分。
發送窗口的大小不一定等於接受窗口的大小(但是在通常情況下是等於的)。
當計算機的兩個進程(同一個機器中或者兩臺不同的機器中)進行通信時,如果發送進程將數據直接發送給接受進程,那麼接受與發送兩個動作是非常難協調的。因爲計算機的動作十分快,如果在某一時刻接受進程開始執行接受的動作,但是發送進程的發送動作稍微晚一點或者早一點,這都會導致接受失敗(在收發雙方事先沒有及逆行同步的情況下,發送時刻不可能精確的吻合)。
綜上所述,在計算機進程之間的通信中,廣泛使用緩存。緩存就是izai計算機的存儲器中設置一個臨時存放數據的空間。發送進程將想要發送的數據先寫入緩存,然後接受進程在合適的時機獨處這些數據。緩存很好的解決發送速率和接受速率不一致的矛盾,還可以很方便地進行串並轉換,即比特流串行寫入並行讀出,或並行寫出串行讀出。緩存也可以稱作緩衝或者緩衝區。

 

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