1. 程式人生 > >資料鏈路層(一)

資料鏈路層(一)

資料傳送模型

資料鏈路和幀

鏈路(Link)是指的從一個節點到相鄰節點的一段物理線路(有線或無線),而中間沒有任何其他的交換節點。

資料鏈路(Data Link)則是另一個概念,這是因為當需要在一條線路上傳送資料時,除了必須有一條物理線路外,還必須有一些必要的通訊協議來控制這些資料的傳輸。

資料鏈路層把網路層交下來的資料封裝成幀傳送到鏈路上,以及把接收到的幀中的資料取出並上交給網路層。在因特網中,網路層協議資料單元就是IP資料報(或簡稱為資料報、分組或包)。資料鏈路層封裝的幀,在物理層變成數字訊號在鏈路上傳輸。

資料鏈路層的三個基本問題

封裝成幀

封裝成幀,將網路層的IP資料報的前後分別新增首部和尾部,就構成了一個幀。

每一種資料鏈路層協議都規定了所能夠傳送的幀的資料部分長度的上限–即最大傳輸單元MTU(Maximum Transfer Unit),乙太網的MTU為1500個位元組。 幀的首部和尾部有幀開始符和幀結束符,稱為幀定界符。接收端收到物理層傳過來的數字訊號讀取到幀開始字元一直到幀結束字元,才認為接收到了一個完整的幀。

透明傳輸

若傳輸的資料是ASCII中**“可列印字元(共95個)”**集時,一般不會出現問題,若傳輸的資料不是僅由“可列印字元”組成時,就會出現問題,如下圖:

解決辦法是用位元組填充法。傳送端的資料鏈路層在資料中出現控制字元”SOH“或”EOT“的前面插入一個字元“ESC”(其十六進位制編碼是1B)

位元組填充(byte stuffing)或“字元填充”(character stffing)——接收端的資料鏈路層在將資料送往網路層之前刪除插入的轉義字元

如果轉義字元也出現在資料當中,那麼應在轉義字元前插入一個轉義字元。當接收端收到連續的兩個轉義字元時,就刪除其中前面的一個。

差錯控制

現實的通訊鏈路都不會是理想的。這就是說,位元在傳輸過程中可能會產生差錯:1可能會變成0,而0也可能變成1,這就叫做位元差錯。

為了保證資料傳輸的可靠性,在計算機網路傳輸資料時,必須採用各種差錯檢測措施。目前在資料鏈路層廣泛使用了迴圈冗餘檢驗CRC(Cyclic Redundancy Check)的差錯檢驗技術。

CRC運算示例 傳送的二進位制資料為101001,在其末位新增n位0,這裡n=3,添加了三個0,然後除以n+1位的隨機數,這裡4位的隨機二進位制數選擇的是1101(任何都行,只要是n+1位二進位制數)

CRC做的除法和我們一般意義上的除法不同。首先看1010和1101,因為高位都是1,所以直接商1(跟兩數的大小無關,只與最高位有關),之後也不是常規意義上將1010和1101做差,而是將其做異或,高位相同為0就不寫,異或結果為111,然後將後面的0落下來變成1110,繼續做除法。

因為1110和1101高位都是1,所以直接商1,然後做異或運算,高位相同為0直接不寫,就變成011,將後面的1落下來變成0111,繼續做除法。

因為0111的高位是0,1101高位是1,所以商0,然後進行異或運算,高位相同為0直接不寫,就變成111,將後面的0落下來變成1110,繼續做除法。

因為1110和1101高位都是1,所以商1,然後做異或運算,高位相同為0直接不寫,就變成011,將後面的0落下來就變成0110,繼續做除法。

因為0110的高位是0,1101的高位是1,所以商0,然後做異或運算,高位相同為0直接不寫,就變成110,將後面的0落下來就變成1100,繼續做除法。

因為1100和1101的高位相同都是1,所以商1,然後做異或運算,高位相同為0直接不寫,就變成001,此時後面已經沒有資料為落下來了,運算結束。

我們看整個運算結束後,什麼資料是為我們所用的。首先,餘數(FCS)是有用的,FCS稱為幀檢驗序列,新增在資料後面,即整個二進位制資料變為101001001(之前的000只是為了計算用的,這裡就不再需要了,直接用FCS替換)。再有就是隨機選擇的除數也是有用的,在傳輸過程中會再次利用101001001÷1101,如果得到的結果不是0000,則說明傳輸過程中出錯。這裡可以直接利用相同的運算方法計算一下101001001÷1101,看是不是0000

資料鏈路層只負責沒有差錯的接收,如果出錯就直接丟掉。比如一臺計算機正在從一臺伺服器上下載檔案,伺服器傳輸資料的過程中會經過很多結點將資料轉發到計算機上,如果中途某兩個結點轉發資料的過程中出現錯誤,這兩個結點中接收方結點的資料鏈路層就會將該資料丟掉,此時發生丟包,丟包以後,資料鏈路層是不負責告知伺服器重新傳輸某個資料包的,而是由計算機告知伺服器重新傳輸資料包

還有可能發生這種情況,即資料錯誤了,但是資料鏈路層在進行CRC校驗的時候,檢驗結果是正確的,所以資料鏈路層認為是正確的,這也是有可能的。一般來說,除數長度越小,發生誤判的概率越大。以十進位制除法來舉例,假如除數為2,那麼餘數只有可能是0或者1,但是如果除數是100,那麼餘數可能是0-99,餘數種類越小,出現誤判的概率越大。

兩種情況下的資料鏈路層

點到點通道(PPP協議)

點到點通道是指的一條鏈路上就一個傳送端和接收端的通道,通常用在廣域網鏈路。

PPP協議的特點
  • 簡單(不提供可靠傳輸)
  • 封裝成幀(首部 尾部,幀開始符 幀結束符)
  • 透明傳輸(加轉義字元,收到後去掉轉義字元)
  • 差錯檢驗(CRC計算FCS)
  • 支援多種網路層協議(IPV4和IPV6都可以封裝到PPP幀中)
  • 多種型別鏈路(光纖、銅線,同步、非同步,序列、並行均可)
  • 檢測連線狀態
  • 最大傳送單元(1500位元組)
  • 網路層地址協商(能夠為撥號的一端分配IP地址,子網掩碼 閘道器和DNS)
  • 資料壓縮協商(資料壓縮技術)
PPP協議的組成

PPP協議有三個組成部分 i2OjUA.png

PPP協議幀格式

iRSJcq.png 在上圖PPP幀的首部中有一個佔用2位元組的協議,這個協議的內容是標識後面的資訊部分是什麼,具體來說分以下幾種:

  • 0x0021——PPP幀的資訊欄位是IP資料報
  • 0xC021——資訊欄位是PPP鏈路控制資料
  • 0x8021——表示這時網路控制資料
  • 0xC023——資訊欄位是安全認證PAP
  • 0xC025——資訊欄位是LQR
  • 0xC223——資訊欄位是安全性認證CHAP

可以抓包檢視PPP幀首部 iRS44H.png

非同步傳輸使用位元組填充

在非同步傳輸的鏈路上,資料傳輸以位元組為單位,PPP幀的轉義符定義為0x7D,並使用位元組填充

把資訊欄位中出現的每一個0x7E位元組轉變成為2位元組序列(0x7D,0x5E)

若資訊欄位中出現一個0x7D的位元組(即出現了和轉義字元一樣的位元組合),則把0x7D轉變成為2位元組序列(0x7D,0x5D) iRS7vt.png

同步使用零位元填充

在同步傳輸的鏈路上,資料傳輸以幀為單位,PPP協議採用零位元填充方法來實現透明傳輸。如果把PPP協議幀界定符0x7E寫成二進位制01111110,可以看到中間有連續的6個1,只要想辦法在資料部分不要出現連續的6個1,就肯定不會出現這界定符。具體辦法就是“零位元填充法”。 iRktJS.png

廣播通道的區域網

iREk4K.png 使用集線器組建的區域網也是廣播通道,是匯流排型拓撲 iREZge.png

乙太網標準

乙太網(Ethernet)是一種計算機區域網組網技術。IEEE制定的IEEE 802.3標準給出了乙太網的技術標準,即乙太網的介質訪問控制協議(CSMA/CD)及物理層技術規範(包括物理層的連線、電訊號和介質訪問層協議的內容)

在IEEE 802.3標準中,為不同的傳輸介質制定了不同的物理層標準,在這些標準中前面的數字表示傳輸速度,單位是“Mbps”,最後的一個數字表示單段網線長度(基準單位是100m),Base表示“基帶”的意思。 iREKHI.png

CSMA/CD協議

CSMA/CD表示Carrier Sense Multiple Access with Collision Detection(載波監聽多點接入/碰撞檢測)

**“多點接入”**表示許多計算機以多點接入的方式連線在一根總線上。

**“載波監聽”**是指每一個站在傳送資料之前先要檢測一下總線上是否有其他計算機在傳送資料,如果有,則暫時不要傳送資料,以免發生碰撞。

比如,A計算機發送的訊號和B計算機發送的訊號在鏈路C處發生碰撞,碰撞後的訊號相互疊加,在總線上電壓變化幅度將會增加,傳送方檢測到電壓變化超過一定的門限值時,就認為發生衝突,這就是碰撞檢測iReNKe.png

乙太網最短幀

為了能夠檢測到正在傳送的幀在總線上是否產生衝突,乙太網的幀不能太短,如果太短就有可能檢測不到自己傳送的幀產生了衝突。 iRmnRf.png 假設A傳輸資料到B的時間是τ\tau,並且如果產生衝突,傳輸的資料會返回A,告訴A發生衝突了,那麼最大的產生衝突的時間就是2τ2\tau。即傳輸過去的資料剛好到B的瞬間,B也向A傳送了一個數據,此時兩個資料就產生衝突。

乙太網設計最大端到端長度為5km(實際上的乙太網覆蓋範圍遠遠沒有這麼大),單程傳播時延為大約為25.6μs,往返傳播時延為51.2μs,10M標準乙太網最小幀為: 10Mb/s×51.2μs=107b/s×51.2×106s=512b 10Mb/s\times 51.2μs =107b/s\times 51.2×10^{-6}s=512b 512位元也就是64位元組,這就意味著乙太網傳送資料幀如果前64位元組沒有檢測出衝突,後面傳送的資料就一定不會發生衝突。換句話說,如果發生碰撞,就一定在傳送前64位元組之內。由於一旦檢測出衝突就立即終止傳送,這時傳送的資料一定小於64位元組,因此凡是長度小於64位元組的幀都是由於衝突而異常終止的無效幀,只要收到了這種無效幀,就應當立即將其終止。