引言
數據鏈路層是計算機網絡協議棧中的第二層,位于物理層之上,負責在相鄰節點之間的可靠數據傳輸。數據鏈路層使用的信道主要有兩種類型:點對點信道和廣播信道。點對點信道是指一對一的通信方式,而廣播信道則是一對多的通信方式。在這一章中,我們將詳細介紹數據鏈路層的基本概念、點對點信道和廣播信道的數據鏈路層協議,以及數據鏈路層的分組交換設備和無線局域網的基本原理。
3.1 使用點對點信道的數據鏈路層
數據鏈路層的基本概念
數據鏈路層在整個網絡協議棧中起著關鍵作用。它主要負責確保數據幀在相鄰節點之間的可靠傳輸。數據鏈路層通過封裝成幀、差錯檢測和可靠傳輸等機制實現這一目標。
3.1.1 數據鏈路層的地位
數據鏈路層在通信中的角色
當兩個主機通過互聯網進行通信時,數據鏈路層在協議棧中扮演著重要角色。如圖3-1所示,數據在主機H和遠程主機H2之間傳輸時,需要經過多個路由器(R1、R2和R3)。這些路由器在轉發數據時,只使用協議棧的前3層:物理層、數據鏈路層和網絡層。
數據流動
數據從主機H傳送到主機H2時,在每個路徑節點上會在協議棧中向上和向下流動多次,如圖3-1中的灰色粗箭頭所示。當我們專門研究數據鏈路層的問題時,可以只關心協議棧中水平方向的數據鏈路層。
然而當我們專門研究數據鏈路層的問題時,在許多情況下我們可以只關心協議棧中水平方向的各數據鏈路層。于是,當主機H向主機H2發送數據時,我們可以想象數據就是在數據鏈路層從左向右水平傳送,如圖3-2中從左到右的灰色粗箭頭所示,即通過以下鏈路:
H1的鏈路層→R1的鏈路層→R2的鏈路層→R3的鏈路層→H2的鏈路層。
3.1.2 數據鏈路和幀
鏈路與數據鏈路的區別
鏈路(Link) 是指從一個節點到相鄰節點的一段物理線路,中間沒有其他交換節點。數據鏈路(Data Link) 則不僅包含物理線路,還包括控制數據傳輸的通信協議和實現這些協議的硬件和軟件。
幀的概念
數據鏈路層的協議數據單元稱為幀(Frame) 。幀由網絡層的數據和數據鏈路層的首部和尾部組成,用于在鏈路上傳輸。
三層模型
如圖3-3所示,點對點信道的數據鏈路層通信可以簡化為三層模型,主要步驟如下:
- 封裝成幀:結點A將網絡層的IP數據報封裝成幀。
- 發送幀:結點A將幀發送給結點B。
- 解封幀:結點B接收幀后,解封裝并上交給網絡層。
點對點信道的數據鏈路層通信的主要步驟如下:
- 結點A的數據鏈路層把網絡層交下來的IP數據報添加首部和尾部封裝成幀。
- 結點A把封裝好的幀發送給結點B的數據鏈路層。
- 若結點B的數據鏈路層收到的幀無差錯,則結點B的數據鏈路層從收到的幀中提取出IP數據報上交給上面的網絡層,否則丟棄這個幀。
數據鏈路層不必考慮物理層實現比特傳輸的細節。我們甚至可以更簡單地設想好像是沿著兩個數據鏈路層之間的水平方向把幀直接發送給對方,如圖3-3(b)所示。
3.1.3 封裝成幀
數據鏈路層以幀為單位傳輸和處理數據
在數據鏈路層,數據是以幀為單位進行傳輸和處理的。每個幀由網絡層的數據(例如IP數據報)以及附加的首部和尾部組成。這個過程被稱為封裝成幀。
封裝成幀的過程
- 接收數據報:首先,網絡層的IP數據報向下傳送到數據鏈路層。
- 添加首部和尾部:數據鏈路層在IP數據報的前面和后面分別添加首部和尾部。這些附加部分包含了控制信息和其他必要的數據,用于確保數據的正確傳輸。
- 形成完整的幀:經過上述步驟,IP數據報被封裝成一個完整的幀。幀的總長度等于數據部分的長度加上首部和尾部的長度。
幀定界的重要性
為了確保數據鏈路層的接收方能夠正確識別每個幀的開始和結束,需要進行幀定界。幀定界的目的是在接收到的比特流中準確定位每個幀。
幀定界的方法
-
時間間隔:一種簡單的方法是在傳輸的幀之間插入時間間隔,就像在英文單詞之間插入空格一樣。例如,以太網采用了這種方法。然而,某些物理層傳輸服務無法保證幀之間的時間間隔。因此,這種方法并不總是適用。
幀1 | 時間間隔 | 幀2
-
幀長度字段:在幀的首部設置一個幀長度字段,用于指示幀的長度。這種方法依賴于幀長度字段的正確傳輸,如果該字段在傳輸過程中出現差錯,可能會導致后續一系列幀無法正確定界。
-
幀定界符:一種更常用的方法是在每個幀的開始和結束處添加特殊的幀定界標志。幀定界符可以是特定的比特序列或字符,用于標記幀的邊界。幀開始標志和幀結束標志可以相同,也可以不同。
| 幀定界符 | 數據部分 | 幀定界符 |
解決透明傳輸問題
為了實現透明傳輸,即確保數據鏈路層對上層協議的數據沒有任何限制,可以使用字節填充或比特填充的方法:
-
字節填充(Byte Stuffing) :在數據中出現的標記字符前插入一個轉義字符(例如“ESC”)。接收方在接收數據時,會刪除這個轉義字符,從而恢復原始數據。
-
比特填充(Bit Stuffing) :在發送數據時,每當發現連續5個“1”時,插入一個“0”。接收方在接收數據時,會刪除這個填充的“0”,從而還原數據。
通過這些方法,數據鏈路層能夠有效地實現幀定界,確保數據的正確傳輸和處理。
3.1.4 差錯檢測
現實的通信鏈路并非理想
在實際的通信鏈路中,比特在傳輸過程中可能會產生差錯:即1可能會變成0,而0也可能變成1。這種現象稱為比特差錯。比特差錯是傳輸差錯中的一種。本小節所指的“差錯”,如無特殊說明,均指比特差錯。
誤碼率(Bit Error Rate,BER)
誤碼率表示在一段時間內,傳輸錯誤的比特數與所傳輸比特總數的比率。例如,誤碼率為1/100,表示平均每傳送100個比特就會出現一個比特的差錯。誤碼率與信噪比有很大的關系。如果設法提高信噪比,就可以使誤碼率減小。然而,實際的通信鏈路無法使誤碼率降到零。因此,為了保證接收到的數據是正確的,計算機網絡在傳輸數據時,必須采用某種差錯檢測措施。
差錯檢測的基本原理
雖然各種差錯檢測技術的具體方法差別很大,但其基本原理是相同的。圖3-9展示了利用差錯檢測碼(Error-Detecting Code,EDC)實現差錯檢測的基本原理。
差錯檢測過程
- 發送方:采用某種差錯檢測算法,用發送的數據D計算出差錯檢測碼EDC(D),并將EDC隨數據一起發送給接收方。
- 接收方:通過同樣的算法計算接收數據D’的差錯檢測碼EDC(D’),如果接收到的EDC與計算出的EDC不同,則可判斷傳輸的數據中出現了差錯,即檢測出了差錯。
需要注意的是,未檢測出差錯并不意味著傳輸的數據中一定沒有出現差錯,但出現差錯的概率非常小。為了提高差錯檢測的檢錯率,可以使用更長的差錯檢測碼和更復雜的算法。當然,這也會增加傳輸的開銷。
幀檢驗序列(Frame Check Sequence,FCS)
在數據鏈路層,為了便于硬件檢測差錯,通常會在幀的尾部設置一個差錯檢驗字段,存放整個幀(包含首部和數據)的差錯檢測碼,這個差錯檢驗字段常稱為幀檢驗序列(FCS) 。因此,要在數據鏈路層進行差錯檢驗,就必須把數據劃分為幀,每一幀都加上差錯檢測碼,一幀接一幀地傳送,然后在接收方逐幀進行差錯檢驗。
循環冗余檢驗(Cyclic Redundancy Check,CRC)
在數據鏈路層通常使用循環冗余檢驗(CRC) 技術進行差錯檢測。CRC編碼的基本原理如圖3-10所示。
CRC編碼過程
- 生成式G:發送方和接收方首先必須協商一個k+1比特的生成式G。算法要求G的最高位和最低位的比特為1。
- 計算冗余碼R:發送方選取一個合適的比特冗余碼R(即檢錯碼),并將它附加到D上,使得得到的d+r比特模式用模2算術恰好能被G整除。
- 差錯檢測:接收方用G去除接收到的d+r比特,如果余數非零則檢測出差錯,否則認為數據正確。
多項式編碼
CRC編碼也稱為多項式編碼,因為該編碼能夠將要發送的比特串看作系數為0和1的一個多項式,對比特串的模2算術被解釋為多項式算術。在上面的例子中,可以用多項式G(X)=X3+X2+1表示生成式G=1101(最高位對應于X3,最低位對應于X?)。多項式G(X)稱為生成多項式。
廣泛使用的生成多項式
目前廣泛使用的生成多項式有:
- CRC-16:X1?+X12+X?+1
- CRC-CCITT:X1?+X12+X?+1
- CRC-32:X32+X2?+X23+X22+X1?+X12+X11+X1?+X?+X?+X?+X?+X2+X+1
CRC的優點
CRC具有非常好的檢錯能力,盡管計算復雜,但非常易于用硬件實現,因此被廣泛應用于現代計算機網絡的數據鏈路層。在數據鏈路層,發送端FCS的生成和接收端的CRC完全由硬件完成,處理速度非常快,對數據傳輸的延誤極小。
CRC的局限性
使用CRC的差錯檢測技術只能檢測出傳輸中的差錯,并不能糾正錯誤。雖然任何差錯檢測技術都無法做到檢測出所有差錯,但通常我們認為:凡是接收端數據鏈路層通過差錯檢測接受的幀,我們都能以非常接近于1的概率認為這些幀在傳輸過程中沒有產生差錯。接收端丟棄的幀雖然曾收到,但最終因為有差錯被丟棄,即沒有被接受。上述原則可以近似地表述為:凡是接收端數據鏈路層接受的幀均無差錯。
深入了解crc的計算過程,請點擊: https://blog.csdn.net/2301_80064376/article/details/139942132
糾錯碼(Error-Correcting Code)
要想糾正傳輸中的差錯,可以使用冗余信息更多的糾錯碼(Error-Correcting Code)進行前向糾錯(Forward Error Correction, FEC) 。通過糾錯碼能檢測數據中出現差錯的具體位置,從而糾正錯誤。由于糾錯碼要發送更多的冗余信息,開銷非常大,在計算機網絡中較少使用。通常采用檢錯重傳方式來糾正傳輸中的差錯,或者僅僅是丟棄檢測到差錯的幀,由上層協議去解決數據丟失的問題。
3.1.5 可靠傳輸
在某些情況下,我們需要數據鏈路層向上面的網絡層提供“可靠傳輸”的服務。可靠傳輸的目標是確保發送端發送的數據能夠被接收端完整無誤地接收。保證數據傳輸的可靠性是計算機網絡中的一個非常重要的任務,也是各層協議均可選擇的一個重要功能。本文討論的可靠傳輸基本原理不僅適用于數據鏈路層,而且可以應用于計算機網絡體系結構的各層協議中。例如,無線局域網和TCP協議都使用了這些原理和方法來實現可靠傳輸。
可靠傳輸的基本模型
可靠傳輸協議為上層的對等實體間提供一條可靠信道,即發送方上層實體通過該信道發送的分組都會正確地到達接收方上層實體,不會出現比特差錯、分組丟失、分組重復,也不會出現分組失序。然而,底層信道卻是不可靠的,分組可能出現差錯、丟失、重復和失序。可靠傳輸協議的目標是在不可靠的信道上實現可靠的數據傳輸服務。為了實現可靠的單向數據傳輸,可靠傳輸協議需要進行雙向通信,因此底層的不可靠信道必須是雙向的。
1. 停止等待協議
基本原理
在計算機網絡中實現可靠傳輸的基本方法是發現錯誤后重傳。首先要解決的問題是如何知道分組在傳輸過程中是否出現了差錯。對于分組中的比特差錯,接收方使用差錯檢測技術識別接收的分組中是否存在比特差錯。為了讓發送方知道是否出現了差錯,接收方必須將是否正確接收分組的信息反饋給發送方。
2.停止協議的特點
-
確認與否認
當正確接收到一個分組時,接收方向發送方發送一個確認分組ACK(Acknowledgment) 。如果接收到的分組存在比特差錯,接收方丟棄該分組并發送一個否認分組NAK(Negative Acknowledgment) 。發送方收到ACK后可以發送下一個分組,而收到NAK則要重傳原來的分組,直到收到ACK為止。由于發送方每發送完一個分組必須停下來等待確認,因此該協議被稱為停止等待協議(Stop-and-Wait, SW) 。
-
超時重傳
如果底層的信道會丟失分組,當數據分組或確認分組丟失時,發送方將會一直等待接收方的確認分組。為了解決這個問題,可以在發送方發送完一個數據分組時,啟動一個超時計時器(Timeout Timer) 。若超時計時器時間到而發送方仍未收到接收方的確認分組,則重傳原來的分組。這種機制被稱為超時重傳。
-
重復分組
當確認分組丟失時,接收方會收到兩個相同的數據分組,即重復分組。為了識別重復分組,每個數據分組都帶有不同的發送序號。接收方連續收到相同序號的數據分組時,表明出現了重復分組,應當丟棄重復分組,并向發送方補發一個確認分組ACK。
-
序號
任何編號系統的序號所占用的比特數是有限的。因此,經過一段時間后,發送序號會重復使用。對于停止等待協議,只需1比特來編號即可,因為每次發送一個新的數據分組,其發送序號與上次發送的分組序號不同即可。
-
自動重傳請求(ARQ)
通過上述確認和超時重傳機制實現的可靠傳輸協議,稱為自動重傳請求(Automatic Repeat reQuest,ARQ) 協議。發送方發送完一個分組后,必須暫時保留已發送的分組副本(用于重傳)。只有在收到相應的確認后才能清除該分組副本。保留副本、重傳、確認和編號都是可靠傳輸協議實體自己的行為,上層實體不會感覺到這些操作。
2. 停止等待協議的算法描述
為了使讀者對停止等待協議有一個完整而準確的理解,下面給出此協議的算法,讀者應弄清算法中的每一個步驟。
在發送方:
-
從主機取一個數據幀。
-
初始化發送狀態變量V(S)=0。
-
將發送狀態變量的數值寫入發送序號N(S) ,將數據幀送交發送緩存。
-
將發送緩存中的數據幀發送出去。
-
設置超時計時器。
-
等待以下三個事件中最先出現的一個:
- 若收到ACK,且確認序號A?=V(S) ,則從主機取一個新的數據幀,更新發送狀態變量,轉到步驟3。
- 若收到ACK,且確認序號A?≠V(S) ,則忽略重復確認,轉到步驟6。
- 若超時計時器時間到,則重傳數據幀,轉到步驟4。
在接收方:
-
初始化接收狀態變量V?=0。
-
等待接收數據幀。
-
當收到一個數據幀時,檢查有無產生傳輸差錯(如用CRC)。
- 若檢查結果正確無誤,則執行后續算法。
- 否則丟棄此數據幀,轉到步驟2。
-
若N(S)=V? ,則執行后續算法,表示收到發送序號正確的數據幀,否則丟棄此數據幀,轉到步驟8。
-
將收到的數據幀中的數據部分送交主機。
-
生成新的ACK,將接收狀態變量的數值寫入確認序號A? 。
-
更新接收狀態變量,準備接收下一個數據幀。
-
發送已生成的ACK,并轉到步驟2。
3. 停止等待協議的信道利用率
停止等待協議的優點是簡單,但缺點是信道利用率較低。圖3-13展示了這一問題。假定A和B之間有一條直通的信道來傳送分組。
假定A發送分組需要的時間是T。T等于分組長度除以數據率。再假定分組正確到達B后,B處理分組的時間可以忽略不計,立即發回確認分組。假定B發送確認分組需要時間T。如果A處理確認分組的時間也可以忽略不計,那么A在經過時間(TD+RTT+TA)后可以發送下一個分組,這里的RTT是往返時間。信道的利用率U可用下式計算:
U = T / (T<sub>D</sub> + RTT + T<sub>A</sub>)
當RTT遠大于分組發送時間T時,信道的利用率就會非常低。若出現差錯后的分組重傳,會進一步降低信道的利用率。
4. 回退N幀協議
為提高傳輸效率,發送方可以不使用低效率的停止等待協議,而采用流水線傳輸方式。發送方可連續發送多個分組,不必每發完一個分組就停頓等待確認。這樣可使信道上一直有數據不間斷地傳送。回退N幀(Go-Back-N,GBN) 協議在流水線傳輸的基礎上,利用發送窗口限制發送方連續發送分組的個數,是一種連續ARQ協議。
滑動窗口
GBN協議規定,發送方每收到一個確認,就把發送窗口向前滑動一個分組的位置。發送窗口的大小決定了發送方已發送但還沒有收到確認的最大分組數。
GBN協議的工作過程
- 接收方只按序接收分組:若某個分組出現差錯,其后的所有分組都要被重傳。
- 超時機制重傳:一旦發送方超時,立即重傳發送窗口內所有已發送的分組。
- 累積確認:接收方對分組n的確認,表明接收方已正確接收到分組n及以前的所有分組。
5. 選擇重傳協議(SR)
GBN協議的一個缺點是:一個分組的差錯可能引起大量分組的重傳。選擇重傳(Selective Repeat,SR) 協議通過選擇重傳出現差錯的分組來提高性能。接收方需要對每個正確接收到的分組進行逐一確認(選擇確認)。
SR協議比GBN協議更復雜,接收方需要足夠的緩存來暫存失序到達的分組。
6. 數據鏈路層的可靠傳輸
從以上的討論可以看出,不可靠的鏈路加上適當的協議(如停止等待協議)就可以使數據鏈路層向上提供可靠傳輸服務。但這樣做會降低數據傳輸效率,并增加協議的復雜性。因此,應根據鏈路的具體情況決定是否需要數據鏈路層提供可靠傳輸服務。
過去,通信鏈路質量較差,數據鏈路層廣泛使用可靠傳輸協議。然而,隨著通信技術的發展,現在的有線通信鏈路質量已經非常好,數據鏈路層一般不采用確認和重傳機制,而由上層協議(如運輸層的TCP)來完成差錯改正。這樣可以提高通信效率,降低設備成本。然而,在無線信道傳輸數據時,由于無線信道誤碼率較高,往往需要在數據鏈路層實現可靠傳輸服務,以盡快改正差錯,為上層提供較好的傳輸服務。
總結
數據鏈路層在計算機網絡中扮演著關鍵角色,確保數據在相鄰節點間可靠傳輸。通過介紹點對點信道和廣播信道的數據鏈路層協議,讀者可以全面了解數據鏈路層的基本概念、封裝成幀、差錯檢測和可靠傳輸等內容。
圖文來源:《計算機網絡教程》