數據鏈路層使用的信道主要有以下兩種類型:
點對點信道:這種信道使用一對一 的點對點通信方式。
廣播信道:這種信道使用一對多的廣播通信方式,因此過程比較複雜。廣播信道上連接的主機很多,因此必須使用專用的共享信道協議來協調這些主機的數據發送。
使用點對點信道的數據鏈路層
1.1 數據鏈路和幀
鏈路 (link) 是一條無源的點到點的物理線路段,中間沒有任何其他的交換結點。
一條鏈路只是一條通路的一個組成部分。
數據鏈路 (data link) 除了物理線路外,還必須有通信協議來控制這些數據的傳輸。若把實現這些協議的硬件和軟件加到鏈路上,就構成了數據鏈路。
現在最常用的方法是使用適配器(即網卡)來實現這些協議的硬件和軟件。
一般的適配器都包括了數據鏈路層和物理層這兩層的功能。
也有人採用另外的術語把鏈路分爲物理鏈路和邏輯鏈路。
物理鏈路就是上面所說的鏈路。
邏輯鏈路就是上面的數據鏈路,是物理鏈路加上必要的通信協議。
早期的數據通信協議曾叫做通信規程 (procedure)。因此在數據鏈路層,規程和協議是同義語。
常常在兩個對等的數據鏈路層之間畫出一個數字管道,而在這條數字管道上傳輸的數據單位是幀。
數據鏈路層不必考慮物理層如何實現比特傳輸的細節,甚至還可以更簡單地設想好像是沿着兩個數據鏈路層之間的水平方向把幀直接發送到對方。
1.2 三個基本問題
數據鏈路層協議有許多種,但有三個基本問題則是共同的。這三個基本問題是:
1. 封裝成幀
封裝成幀 就是在一段數據的前後分別添加首部和尾部,然後就構成了一個幀,確定幀的界限。
首部和尾部的一個重要作用就是進行幀定界。
當數據是由可打印的 ASCII 碼組成的文本文件時,幀定界可以使用特殊的幀定界符。
控制字符 SOH (Start Of Header) 放在一幀的最前面,表示幀的首部開始。另一個控制字符 EOT (End Of Transmission) 表示幀的結束。
2. 透明傳輸
如果數據中的某個字節的二進制代碼恰好和 SOH 或 EOT 一樣,數據鏈路層就會錯誤地“找到幀的邊界”。
這個時候就比較可怕了,我們的完整數據極有可能會丟失,那麼有什麼辦法可以解決呢?
解決方法:字節填充 (byte stuffing) 或字符填充 (character stuffing)。
發送端的數據鏈路層在數據中出現控制字符“SOH”或“EOT”的前面插入一個轉義字符“ESC” (其十六進制編碼是 1B)。
接收端的數據鏈路層在將數據送往網絡層之前刪除插入的轉義字符。
如果轉義字符也出現在數據當中,那麼應在轉義字符前面插入一個轉義字符 ESC。當接收端收到連續的兩個轉義字符時,就刪除其中前面的一個。
3. 差錯檢測
在傳輸過程中可能會產生比特差錯:1 可能會變成 0 而 0 也可能變成 1。
在一段時間內,傳輸錯誤的比特佔所傳輸比特總數的比率稱爲誤碼率 BER (Bit Error Rate)。
誤碼率與信噪比有很大的關係。
爲了保證數據傳輸的可靠性,在計算機網絡傳輸數據時,必須採用各種差錯檢測措施。
循環冗餘檢驗CRC
在數據鏈路層傳送的幀中,廣泛使用了循環冗餘檢驗 CRC 的檢錯技術。
在發送端,先把數據劃分爲組。假定每組 k 個比特。
假設待傳送的一組數據 M = 101001(現在 k = 6)。我們在 M 的後面再添加供差錯檢測用的 n 位冗餘碼一起發送。 用二進制的模 2 運算進行 2^n 乘 M 的運算,這相當於在 M 後面添加 n 個 0。
得到的 (k + n) 位的數除以事先選定好的長度爲 (n + 1) 位的除數 P,得出商是 Q 而餘數是 R,餘數 R 比除數 P 少 1 位,即 R 是 n 位。
將餘數 R 作爲冗餘碼拼接在數據 M 後面發送出去。
文字敘述比較抽象,舉個冗餘碼的例子:
現在 k = 6, M = 101001。
設 n = 3, 除數 P = 1101,
被除數是 2^nM = 101001000。
模 2 運算的結果是:商 Q = 110101,
餘數 R = 001。
把餘數 R 作爲冗餘碼添加在數據 M 的後面發送出去。發送的數據是:2^nM + R
即:101001001,共 (k + n) 位。
注意餘數的位數和被除數後面添加的0的個數一樣,都是除數位數減一位。
幀檢驗序列 FCS
下面來介紹一下幀檢驗序列 FCS,在數據後面添加上的冗餘碼稱爲幀檢驗序列 FCS (Frame Check Sequence)。
循環冗餘檢驗 CRC和幀檢驗序列 FCS 並不等同。
CRC 是一種常用的檢錯方法,而 FCS 是添加在數據後面的冗餘碼。
FCS 可以用 CRC 這種方法得出,但 CRC 並非用來獲得 FCS 的唯一方法。
接收端對收到的每一幀進行 CRC 檢驗
(1) 若得出的餘數 R = 0,則判定這個幀沒有差錯,就接受 (accept)。
(2) 若餘數 R 不等於 0,則判定這個幀有差錯,就丟棄。
但這種檢測方法並不能確定究竟是哪一個或哪幾個比特出現了差錯。
只要經過嚴格的挑選,並使用位數足夠多的除數 P,那麼出現檢測不到的差錯的概率就很小很小。
所以應當注意:僅用循環冗餘檢驗 CRC 差錯檢測技術只能做到無差錯接受 。
“無差錯接受”是指:“凡是接受的幀(即不包括丟棄的幀),我們都能以非常接近於 1 的概率認爲這些幀在傳輸過程中沒有產生差錯”。
也就是說:“凡是接收端數據鏈路層接受的幀都沒有傳輸差錯”(有差錯的幀就丟棄而不接受)。
要做到“可靠傳輸”(即發送什麼就收到什麼)就必須再加上確認和重傳機制。
應當明確,“無比特差錯”與“無傳輸差錯”是不同的概念。
在數據鏈路層使用 CRC 檢驗,能夠實現無比特差錯的傳輸,但這還不是可靠傳輸。