1. 數據鏈路層的三個基本問題
1.1 數據鏈路和幀
(1)鏈路(Link):指從一個節點到相鄰節點的一段物理線路(有線或無線),而中間沒有任何其他交換節點。
①注意:集線器不是交換節點,因此計算機A和路由器1之間是一條鏈路。
②交換機是一個交換節點,因此,計算機B和路由器3之間的鏈路有鏈路4和鏈路5兩條。
(2)數據鏈路(Data Link):物理線路+通信協議。數據鏈路層的協議數據單元被稱為幀。
①數據鏈路層把網絡層交下來的數據(被稱為IP數據報、數據報、分組或包)添加首部和尾部封裝成幀發送到鏈路上,以及把接收到的幀中的數據取出來並上交給網絡層。
②數據鏈路層封裝的幀,在物理層變成數字信號在鏈路上傳輸。如果不考慮物理層的傳輸細節,就可以認為數據幀通過數據鏈路由從節點A發送到節點B(如上圖虛線所示)
1.2 3個基本問題
(1)封裝成幀
①數據鏈路層將IP的數據報的前后分別添加首部和尾部,構成一個幀。但因該層的協議很多,不同協議的幀的首部和尾部信息所有不同。
②幀的首部和尾部有幀開始符和結束符,被稱為幀定界符。
③每一種數據鏈路層協議都規定了所能傳送幀的數據部分的長度上限——最大傳輸單元(MTU),以太網的MTU為1500個字節(指的是數據部分長度。注意,MTU不是越大越好,因為MTU越大意味着單個數據包,在線路質量較差的網絡環境中,數據包中 bit位發生錯誤的概率也越大,丟包率會越高。同時MTU越大,傳送一個數據包時延也越大,會影響其他計算機的通信從而造成用戶體驗差。因此,1500字節是一個折衷的結果)
(2)透明傳輸
①幀定界符:可以選用ASCII碼表中的SOH(0x01)作為幀開始定界符,EOT(0x04)為幀結束定界符。
②如果數據部分出現“EOT”或“SOH”時要進行字節填充。(具體方法:發送端的數據鏈路層在數據中出現控制字符“EOT”、“SOH”以及“ESC”,則在前面插入一個轉義字符“ESC”的編碼。接收端的數據鏈路層在收到刪除這個插入的轉義字符。這樣用字節填充法解決透明傳輸的問題)。
(3)差錯檢測
①現實的通信鏈路都不會是理想的,在傳輸過程中可能會產生差錯。為了保證數據傳輸的可靠性,必須采用各種差錯檢驗技術(如循環冗余檢驗,CRC)。
②要讓接收端能夠判斷幀在傳輸過程中是否有差,需要在幀中包含用於檢測錯誤的信息,這部分信息稱為“幀校驗序列(FCS)”
③以CRC技術為例計算FCS。假設要檢測的數據為M=101001(注意,不僅包含幀的數據部分,還包含了數據鏈路層的首部),要想得到n位FCS。則計算過程如下:
A.要得到n位的FCS,則必須先在M后面添加n位(這里假設n為3)的0,得到被除數101001 000。再除以收發雙方事先商定好的n+1位除數P(設為1101),得到商Q,余數R(n位,比除數少一位),這個R(001)就是要計算的FCS。
B.接收方收到后,會使用M和FCS合成一個二進制數(即101001001),再除以P(1101),如果余數為0,表示該幀沒有差錯。否則表示傳輸有差錯,就會丟棄從而出現丟包現象(這個得由傳輸層的TCP協議通過丟包重傳來實現可靠傳輸)
④幀檢驗序列FCS包含了幀的數據部分(來自網絡層)和數據鏈路層的首部。這意味着,如果通信經過多條鏈路時,IP數據報的源和目標地址會被修改或者經過路由器時網絡層首部的TTL(生存時間減1),這些會造成IP數據報的變化。而當通信由一條鏈路到下一條鏈路時由於協議不同,會造成數據鏈路層首部格式不同,幀開始和結束符也不同,這都需要將幀進行重新封裝,重新計算FCS。幸運的是,這些都是由硬件完成的,處理速度很快,不會延誤數據的傳輸。