天天看點

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

資料鍊路層屬于計算機網絡的低層。資料鍊路層使用的信道主要有以下兩種類型:

(1)點對點信道。這種信道使用一對一的點對點通信方式。

(2)廣播信道。這種信道使用一對多的廣播通信方式,是以過程比較複雜。廣播信道上連接配接的主機很多,是以必須使用專用的共享信道協定來協調這些主機的資料發送。

區域網路雖然是個網絡,但我們并不把區域網路放在網絡層中讨論。這是因為在網絡層要讨論的問題是多個網絡互連的問題,是讨論分組怎樣從一個網絡,通過kk;;;l,ii路由器,轉發到另外一個網絡。在本章中我我們研究的是在同一個區域網路中,分組怎樣從一台主機傳送到另一台主機,但并不經過路由器轉發。從整個網際網路來看,區域網路仍屬于資料鍊路層的範圍。

本章首先介紹點對點信道和在這種信道上最常用的點對點協定PPP。然後再用較大的篇幅讨論共享信道的區域網路和有關的協定。

本章最重要的内容是:

(1)資料鍊路層的點對點信道和廣播信道的特點,以及這兩種信道所使用的協定(PPP協定以及CSMA/CD協定)的特點。

(2)資料鍊路層的三個基本問題:封裝成幀、透明傳輸和差錯檢測。

(3)以太網MAC層的硬體位址。

(4)擴充卡、轉發器、集線器、網橋、以太網交換機的作用以及使用場合。

下面看一下兩台主機通過網際網路進行通信時資料鍊路層所處的地位(圖3-1)。

圖3-1(a)表示使用者主機H1通過電話線上網,中間經過三個路由器(R1,R2和R3)連接配接到遠端主機H2。所經過的網絡可以是多種的,如電話網、區域網路和廣域網。當主機H1向H2發送資料時,從協定的層次上看,資料的流動如圖3-1(b)所示。主機H1和H2都有完整的五層協定棧,但路由器在轉發分組時使用的協定棧隻有下面的三層(當路由器之間在交換路由資訊時,則根據所使用的路由協定的不同,也有可能需要使用運輸層協定)。資料進入路由器後要先從實體層上到網絡層,在轉發表中找到下一跳的位址後,再下到實體層轉發出去。是以資料從主機H1傳送到主機H2需要在路徑中的各結點的協定棧向上和向下流動多次,如圖中的淺灰色箭頭所示。

然而當我們專門研究資料鍊路層的問題時,在許多情況下我們可以隻關心在協定棧中水準方向的各資料鍊路層。于是,當主機H1向主機H2發送資料時,我們可以想象資料就在資料鍊路層從左向右沿水準方向傳送的,如通圖3-2從左到右的粗箭頭所示,即通過這樣的鍊路

H1的鍊路層層 →  R1的鍊路層R →  R2的鍊路層 →  R3的鍊路層 →  H2的鍊路層

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

圖3-2指出,從資料鍊路層來看,H1到H2 的通信可以看成由四段不同的鍊路層通信組成,即:H1→  R1,R1→  R2,R2→  R3,R3→ H2。這四段不同的鍊路層可能采用不同的資料鍊路層協定。

使用點對點信道的資料鍊路層

資料鍊路和幀

所謂的鍊路(link)就是從一個結點到相鄰結點的一段實體線路(有線或無線),而中間沒有任何其他的交換結點。在進行資料通信時,兩台計算機之間的通信路徑往往要經過許多段這樣的鍊路。可見鍊路隻是一條路徑的組成部分。

資料鍊路(data link)則是另一個概念。這是因為當需要在一條線路上傳送資料時,除了必須有一天實體線路外,還必須有一些必要的通信協定來控制這些資料的傳輸。若把實作這些協定的硬體和軟體加到鍊路上,就構成了資料鍊路。現在最常用的方法是使用網絡擴充卡(既有硬體,也包括軟體)來實作這些協定。一般的擴充卡都包括了資料鍊路層和實體層這兩層的功能。

也有人采用另外的術語,這就是把鍊路分為實體鍊路和邏輯鍊路。實體鍊路就是上面所說的鍊路,而邏輯鍊路就是上面的資料鍊路,是實體鍊路加上必要的通信協定。

早起的資料通信協定曾叫做通信規程。因為在資料鍊路層,規程和協定是同義詞。

下面再介紹點對點通信的資料鍊路層的協定資料單元——幀。

資料鍊路層把網絡層交下來的資料構成幀發送到鍊路上,以及把接收到的幀中的資料取到并上交給網絡層。在網際網路中,網絡層協定資料單元就是IP資料報(簡稱為資料包、分組或包)。

為了把主要精力放在點對點信道的資料鍊路層協定上,可以采用如圖3-3(a)所示的三層模型。在這種三層模型中,不管在哪一段鍊路上的通信(主機和路由器之間或兩個路由器之間),我們都看成是結點對結點的通信(如圖中的結點A和B),而每個結點隻有下三層——網絡層、資料鍊路層和實體層。

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

 點對點信道的資料鍊路層在進行通信時的主要步驟如下:

(1)結點 A 的資料鍊路層把網絡層交下來的IP資料包添加首部和尾部封裝成幀。

(2)結點 A 把封裝好的幀發送給結點B的資料鍊路層。

(3)若結點 B 的資料鍊路層收到的幀無差錯,則從收到的幀中提取出IP資料報交給上面的網絡層;否則丢棄這個幀。

資料鍊路層不必考慮實體層如何實作比特傳輸的細節。我們甚至還可以更簡單地設想好像是沿着兩個資料鍊路層之間的水準方向把幀直接發送到對方,如圖3-3(b)所示。

三個基本問題

資料鍊路層協定有許多種,但有三個基本問題則是共同的。這三個基本問題是:封裝成幀、透明傳輸和差錯檢測。下面分别讨論這三個基本問題。

1.封裝成幀

封裝成幀(framing)就是在一段資料的前後分别添加首部和尾部,這也就構成了一個幀。接收端在收到實體層上交的比特流後,就能根據首部和尾部的标記,從收到的比特流中識别幀的開始和結束。圖3-4表示幀的首部和尾部封裝成幀的一般概念。我們知道,分組交換的一個重要概念就是:所有在網際網路上傳送的資料都以分組(即IP資料報)為傳送機關。網絡層的IP資料報傳送到資料鍊路層就稱為幀的資料部分。在幀的資料部分的前面和後面分别添加上首部和尾部,構成一個完整的幀。這樣的幀就是資料鍊路層的資料傳送單元。一個幀的幀長等于幀的資料備份長度加上幀首部和幀尾部的長度。首部和尾部的一個重要作用就是進行幀定界(即确定幀的界限)。此外,首部和尾部還包括許多必要的控制資訊。在發送幀時,是從幀首部開始發送的。各種資料鍊路層協定都對幀首部和幀尾部的格式有明确的規定。顯然,為了提高幀的傳輸效率,應當使幀的資料部分長度盡可能地大于首部和尾部的長度。但是,每一種鍊路層協定都規定了所能傳送的幀的資料部分長度上線——最大的傳送單元MTU(Maximum Transfer Unit)。圖3-4給出了幀的首部和尾部的位置,以及幀的資料部分和MTU的關系。

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

當資料是由可列印的ASCII碼組成的文本檔案時,幀定界可以使用特殊的幀定界符。我們知道,ASCII碼是7位編碼,一共可組合成128個不同的ASCII碼,其中可列印的有95個(“可列印的字元”就是“可以從鍵盤上輸入的字元”,因而也是可列印的。我們使用的标準鍵盤有47個鍵可輸入94個字元(包括使用shift鍵),加上空格鍵,一共可輸入95個可列印字元),而不可列印的控制字元有33個。圖3-5的例子可說明幀定界的概念。控制字元SOH(Start Of Header)放在一幀的最前面,表示幀的首部開始。另一個控制字元EOT(End Of Transmission)表示幀的結束。請注意,SOH和EOT都是控制字元的名稱。它們的十六進制編碼分别是01(二進制00000001)和04(00000100)。SOH(或EOT)并不是S,O,H或(E,O,T)三個字元。

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

 當資料在傳輸過程中出現差錯時,幀定界符的作用更加明顯。假定發送端在尚未發送完一個幀時突然出故障,中斷了發送。但随後很快又恢複正常,于是重新從頭開始發送剛才未發送完的幀。由于使用了幀定界符,接收端就知道前面收到的資料是個不完整的幀(隻有首部開始符SOH而沒有傳輸結束符EOT),必須丢棄。而後面收到的資料有明确的幀定界符(SOH和EOT),是以這是一個完整的幀,應當手下。

2.透明傳輸

由于幀的開始和結束的标記使用專門指明的控制字元,是以,所傳輸的資料中的任何8比特的組合一定不允許和用作幀定界的控制字元的比特編碼一樣,否則就會出現幀定界的錯誤。

當傳送的幀是用文本檔案組成的幀時(文本檔案中的字元都是從鍵盤上輸入的),其資料部分顯然不會出現像SOH或EOT這樣的幀定界控制字元。可見不管從鍵盤上輸入什麼字元都可以放在這樣的幀中傳輸過去,是以這樣的傳輸就是透明傳輸。

 但資料部分是非ASCII碼的文本檔案時(如二進制代碼的計算機程式或圖像等),情況就不同了。如果資料中的某個位元組的二進制代碼恰好和SOH或EOT這種控制字元一樣(見圖 3-6),資料鍊路層就會錯誤地“找到幀的邊界”,把部分幀收下(誤認為是個完整的幀),而把剩下的那部分資料丢棄(這部分找不到幀定界控制字元SOH)。

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

 像圖3-6所示的幀的傳輸顯然就不是“透明傳輸”,因為當遇到資料中碰巧出現字元“EOT”時就傳不過去了。資料中的“EOT”被接收端錯誤地解釋為“傳輸結束”的控制字元,而在其後面的資料因找不到“SOH”被接收端當作無效幀而丢棄。但實際上在資料中出現的“EOT”并非控制字元而僅僅是二進制資料00000100。

前面提到的“透明”是一個很重要的術語。它表示:某一個實際存在的事務看起來卻好像不存在一樣(例如,你看不見在你前面有塊 100% 透明的玻璃的存在)。“在資料鍊路層透明傳輸資料”表示無論什麼樣的比特組合的資料,都能夠按照原樣沒有差錯地通過這個資料鍊路層。是以,對所傳送的資料來說,這些資料就“看不見”資料鍊路層有什麼妨礙資料傳輸的東西。或者說,資料鍊路層對這些資料來說是透明的。

為了解決透明傳輸問題,就必須設法使資料中可能出現的控制字元“SOH”和“EOT”在接收端不被解釋為控制字元。具體的方法是:發送端的資料鍊路層在資料中出現控制字元“SOH”或“EOT”的前面插入一個轉義字元“ESC”(其十六進制編碼是1B,二進制是00011011)。而在接收端的資料鍊路層在把資料送往網絡層之前删除這個插入的轉義字元。這種方法稱為位元組填充(byte stuffing)或字元填充(character stuffing)。如果轉義字元也出現在資料當中,那麼解決方法仍然是在轉義字元的前面插入一個轉義字元。是以,當接收端收到連續的兩個轉義字元時,就删除其中前面的一個。圖3-7表示用位元組填充法解決透明傳輸的問題。

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

3.差錯檢測

現實的通信鍊路都不會是理想的。這就是說,比特在傳輸過程中可能會産生差錯:1可能變成0,而0也可能變成1。這就叫做比特差錯。 比特差湊是傳輸差錯中的一種。本小節所說的“差錯”,如無特殊說明,就是指“比特差錯”。在一段時間内,傳輸錯誤的比特占所傳輸比特總數的比率稱為誤碼率BER(Bit Error Rate)。例如,誤碼率為

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

時,表示,表示平均每傳送

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

個比特就會出現一個比特的差錯。誤碼率與信噪比有很大的關系。如果設法提高信噪比,就可以使誤碼率減小。實際的通信鍊路并非是理想的,它不可能使誤碼率下降到零。是以,為了保證資料傳輸的可能性,在計算機網絡傳輸資料時,必須采用各種差錯檢測措施。目前在資料鍊路層廣泛使用了循環備援檢驗CRC(Cyclic Redundancy Check) 的檢錯技術。

下面我們通過一個簡單的例子來說明循環備援檢驗的原理。

在發送端,先把資料劃分為組,假定每組k個比特。現假定待傳送的資料M=101001(k = 6)。CRC運算就是在資料M的後面添加供差錯檢驗用的n位備援碼,然後構成一個幀發送出去,一共發送(k+n)位。在所要發送的資料後面添加n位的備援碼,雖然增大了資料傳輸的開銷,但卻可以進行差錯檢測。當傳輸可能出現差錯時,付出這種代價往往是很值得的。

這n為備援碼可以用以下方法得出。用二進制的模2運算(用模2運算進行加法時不進位,例如,1111 + 1010 = 0101,減法和加法一樣,按加法的規則計算)進行

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

乘M的運算,這相當于在M後面添加n個0。得到的(k+n)位的數除以收發雙方實作商定的長度為(n+1)位的除數P,得出商是Q而餘數是R(n位,比P少一位)。關于除數P下面還要介紹。在圖3-8所示的例子中,M=101001(即k=6)。假定除數P=1101(即n=3)。經模2除法運算後的結果是:商Q=110101(這個商并沒有什麼用處),而餘數R=001。這個餘數R就作為備援碼拼接在資料M的後面發送出去。這種為了進行檢錯而添加的備援碼常稱為幀校驗序列FCS(Frame Check Sequence)。是以,加上FCS後發送的幀是101001001(即

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

M+FCS),共有(k+n)位。

順便說一下,循環備援檢驗CRC和幀檢驗序列FCS并不是同一概念,CRC是一種檢錯方法,而FCS是添加在資料後面的備援碼,在檢錯方法上可以選用CRC,但也可不選用CRC。

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

在接收端把接收到的資料以幀為機關進行CRC檢測:把收到的每一個幀都除以同樣的除數P(模2運算) ,然後檢查得到的餘數R。

如果在傳輸過程中無差錯,那麼經過CRC檢驗後得到的餘數R肯定是0(讀者可以自己驗算一下。被除數現在是101001001,而除數是P=1101,看餘數R是否為0)。

但如果出現誤碼,那麼餘數R仍等于零的機率是非常非常小的(這可以通過不太複雜的機率計算得出,例如,參考[TANE11])。

總之,在接收端對收到的每一幀經過CRC檢驗後,有以下兩種情況:

(1)、若得出的餘數R=0,則判定這個幀沒有差錯,就接收(accept)。

(2)、若除數R≠0,則判定這個幀有差錯(但無法确定究竟是哪一位或哪幾位出現了差錯),就放棄。

一種較友善的方法是用多項式來表示循環備援檢驗過程。在上面的例子中,用多項式P(X)=

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+1表示上面的除數P=1101(最高位對應于

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

,最低位對應于

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

)。多項式P(X)稱為生成多項式。現在廣泛使用的生成多項式P(X)有以下幾種:

CRC-16=

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+1

CRC-CCITT=

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+1

CRC-32=

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+

《計網之資料鍊路層 一》使用點對點信道的資料鍊路層

+1

在資料鍊路層,發送端幀檢驗序列FCS的生産和接收端的CSC檢驗都是用硬體來完成的,處理很迅速,是以并不會延誤資料的傳輸。

從以上的讨論不難看出,如果我們在傳送資料時不以幀為機關來傳送,那麼就無法加入備援碼以進行差錯檢驗。是以,如果要在資料鍊路層進行差錯校驗,就必須把資料劃分為幀,每一幀都加上備援碼,一幀接一幀地傳送,然後在接收方逐幀進行差錯檢驗。

最後再強調一下,在資料鍊路層若僅僅使用循環備援檢驗CRC差錯檢測技術,則隻能做到對幀的無差錯接受,即:“凡接收端資料鍊路層接受的幀,我們都能以非常接近1的機率認為這些幀在傳輸過程中沒有産生差錯 ”。接收端丢棄的幀雖然曾收到了,但 最終還是因為有差錯被丢棄,即沒有被接受。以上所述的可以近似地表述為(通常都是這樣認為):“凡是接收端資料鍊路層接受到的幀均無差錯”。

請注意,我們現在并沒有要求資料鍊路層向網絡層提供“可靠傳輸”的服務。所謂“可靠傳輸”就是:資料鍊路層的發送端發送什麼,在接收端就接收什麼。傳輸差錯可分為兩大類:一類就是前面所說的最基本的比特差錯,而另一類傳輸差錯則是更複雜些,這就是收到的幀并沒有出現比特差錯,但卻出現了幀丢失、幀重複或幀失序。例如,發送方連續傳送三個幀:[#1]-[#2]-[#3]。假定接收端接收到的每一個幀都沒有比特差錯,但卻出現下面的幾種情況:

幀丢失:收到[#1]-[#3](丢失[#2])。

幀重複:收到[#1]-[#2]-[#2]-[#3](收到兩個[#2])。

幀失序:收到[#1]-[#3]-[#2](後發送的幀反而先到達了接收端,這與一般資料鍊路層的傳輸概念不一樣)。

以上三種情況都屬于“出現傳輸差錯”,但都不是這些幀裡有“比特差錯”。幀丢失很容易了解。但出現幀重複和幀失序的情況則較為複雜,對這些問題我們現在不展開讨論。在學完第5章的5.4節後,我們就會知道什麼情況下接收端可能會出現幀重複和幀失序。

總之,我們應當明确,“無比特差錯”與“無傳輸差錯”并不是同樣的概念。在資料鍊路層會用CRC校驗,能夠實作無比特差錯的傳輸,但這還不是可靠傳輸。

我們知道,過去OSI的觀點是:必須讓資料鍊路層向上層提供可靠傳輸。是以在CRC檢錯的基礎上,增加了幀編号、确認和重傳機制。收到正确的的幀就要向發送端确認。發送端在一定的期限内若沒有收到對方的确認,就認為出現了差錯,因而就進行重傳,直到收到對方的确認為止。這種方法在曆史上曾經起到很好的作用。但現在的通信線路的品質已經大大提高了,由通信鍊路品質不好引起差錯的機率已經大大降低了。是以,現在網際網路就采取了差別對待的方法:

對于通信品質良好的有線傳輸線路,資料鍊路層協定不使用确認和重傳機制,即不要求資料鍊路層向上層提供可靠傳輸的服務。如果在資料鍊路層傳輸資料時出現了差錯并且需要進行改正,那麼改正差錯的任務就由上層協定(例如,運輸層的TCP協定)來完成。

對于通信品質較差的無線傳輸鍊路。資料鍊路層協定使用确認和重傳機制,資料鍊路層向上提供可靠的傳輸服務。

實踐證明,這樣做就可以提高通信效率。

可靠傳輸協定在運輸層讨論,本章介紹的資料鍊路層協定都不是可靠傳輸的協定。

參考文獻:計算機網絡7