三個基本問題
數據鏈路層的三個基本問題
- 封裝成幀:必須知道每一幀數據哪里開始,哪里結束,保證每一幀數據的完整。
- 透明傳輸:當幀的數據部分出現幀頭或幀尾標志位的數據時,需要對其進行轉義。
- 差錯控制:判斷傳輸中是否出現差錯。
封裝成幀
- 封裝成幀(framing)就是在一段數據的前后分別添加首部和尾部,然后就構成了一個幀。確定幀的界限。
- 首部和尾部的一個重要作用就是進行幀定界。
**用控制字符進行幀定界的方法舉例 **
試想:幀還未發送完,發送端出了問題,只能重發該幀,接收端卻直接收了前面的“半截子幀”,它會拋棄嗎?
答案是會拋棄,接收端直接收有成對的幀頭和幀尾的數據。
透明傳輸
若數據中存在與幀結束符相同的數據,那么計算機會誤以為該數據即為幀結束符,而造成錯誤。
解決透明傳輸問題
- 發送端的數據鏈路層在數據中出現控制字符“SOH”或“EOT”的前面插入一個轉義字符“ESC”(其十六進制編碼是 1B)。
- 字節填充(byte stuffing)或字符填充(character stuffing)——接收端的數據鏈路層在將數據送往網絡層之前刪除插入的轉義字符。
- 如果轉義字符也出現數據當中,那么應在轉義字符前面插入一個轉義字符。當接收端收到連續的兩個轉義字符時,就刪除其中前面的一個。
差錯控制
傳輸過程中可能會產生比特差錯:1可能變成0而0也可能變成1.
在一段時間內,傳輸錯誤的比特占所傳輸比特總數的比率稱為誤碼率BER(Bit Error Rate)。
誤碼率與信噪比有很大的關系。
為了保證數據傳輸的可靠性,在計算機網絡傳輸數據時,必須采用各種差錯檢測措施。
解決方法
循環冗余檢驗的原理(CRC)
原理說明
- 被除數為101001;根據除數的位數n在被除數后面加 n-1 個0;比如除數四位就在被除數后加三個0;
- 進行的是異或運算,相同得0,不同得1;
- 得到的商可以舍去,我們只要余數;在原來數據101001的后面加上余數001(前面被除數尾部加了多少位商就保留多少位),則實際傳輸的數據為:101001 001
- 接收端受到數據101001 001之后,除以1101如果商為0,則說明數據傳輸過程中沒有錯誤,接受;如果商不為0說明傳輸過程中出現錯誤,把該數據丟棄;
- 過於除數,是數據鏈路層的協議決定的,用戶不必關心。
幀檢驗序列 FCS
- 在數據后面添加上的冗余碼稱為幀檢驗序列 FCS (Frame Check Sequence)。
- 循環冗余檢驗 CRC 和幀檢驗序列 FCS並不等同。
- CRC 是一種常用的檢錯方法,而 FCS 是添加在數據后面的冗余碼。
- FCS 可以用 CRC 這種方法得出,但 CRC 並非用來獲得 FCS 的唯一方法。
小結
僅用循環冗余檢驗 CRC 差錯檢測技術只能做到無差錯接受(accept)。
- “無差錯接受”是指:“凡是接受的幀(即不包括丟棄的幀),我們都能以非常接近於 1 的概率認為這些幀在傳輸過程中沒有產生差錯”
- 要做到“可靠傳輸”(即發送什么就收到什么)就必須再加上確認和重傳機制。
- 無差別接收只是在數據在路由器之間傳輸時進行,並不要求路由器確認或重傳數據,而是路由器的始端和末端連接的計算機和服務器之間會進行數據的確認或重傳。
CRC並不能100%准確,也可能多次錯誤碰巧造成余數為零