本文內(nèi)容
??從本節(jié)開始介紹數(shù)據(jù)鏈路層的內(nèi)容,數(shù)據(jù)鏈路層屬于計算機(jī)網(wǎng)絡(luò)的低層,需要對其上層網(wǎng)絡(luò)層提供服務(wù)。本文主要介紹數(shù)據(jù)鏈路層的一些基本概念和數(shù)據(jù)鏈路層的兩個功能:封裝成幀和差錯控制衬衬。
1 數(shù)據(jù)鏈路層的基本概念
??(1) 節(jié)點(diǎn):主要是指主機(jī)、路由器改橘。
??(2) 鏈路:網(wǎng)絡(luò)中兩個節(jié)點(diǎn)之間的物理通道滋尉。
??(3) 數(shù)據(jù)鏈路:網(wǎng)絡(luò)中兩個節(jié)點(diǎn)之間的邏輯通道,把實(shí)現(xiàn)控制數(shù)據(jù)傳輸協(xié)議的硬件和軟件加到鏈路上就構(gòu)成了數(shù)據(jù)鏈路飞主。
??(4) 幀:鏈路層的協(xié)議數(shù)據(jù)單元狮惜,封裝網(wǎng)絡(luò)層的數(shù)據(jù)報。
??數(shù)據(jù)鏈路層的功能:在物理層提供服務(wù)的基礎(chǔ)上向網(wǎng)絡(luò)層提供服務(wù)碌识,其最基本的服務(wù)是將源自網(wǎng)絡(luò)層來的數(shù)據(jù)可靠的傳輸?shù)较噜徆?jié)點(diǎn)的目標(biāo)機(jī)網(wǎng)絡(luò)層碾篡。其主要作用是加強(qiáng)物理層傳輸原始比特流的功能,將物理層提供的可能出錯的物理連接改造成邏輯上無差錯的數(shù)據(jù)鏈路丸冕,使之對網(wǎng)絡(luò)層表現(xiàn)為一條無差錯的鏈路耽梅。
功能一:為網(wǎng)絡(luò)層提供服務(wù)。無確認(rèn)無連接服務(wù)胖烛,有確認(rèn)無連接服務(wù)眼姐、有確認(rèn)有連接服務(wù)诅迷。
功能二:鏈路管理,即連接的建立众旗,維持罢杉。釋放(用于面向連接的服務(wù))。
功能三:組幀贡歧。
功能四:流量控制滩租。
功能五:差錯控制。
2 封裝成幀
??組裝成幀就是在一段數(shù)據(jù)的前后部分添加首部和尾部利朵,這樣就構(gòu)成了一個幀律想。幀是數(shù)據(jù)鏈路層的數(shù)據(jù)傳送單元。接收端再收到物理層上交的比特流后绍弟,就能根據(jù)首部和尾部的標(biāo)記技即,從收到的比特流中識別幀的開始和結(jié)束。
??首部和尾部包含很多控制信息樟遣,其中一個重要作用就是:幀定界(確定幀的界限)而叼。
??幀同步:接收方應(yīng)當(dāng)能夠從接收到的二進(jìn)制比特流中區(qū)分出幀的起始和終止。
??幀長:幀的數(shù)據(jù)部分長度加上幀首部和幀尾部的長度豹悬。
??最大傳送單元(MUT葵陵,Maximum Transfer Unit):每一種鏈路層都規(guī)定了所能傳送幀的數(shù)據(jù)部分長度上限。
??組幀的四種方式:字符計數(shù)法瞻佛、字符填充法脱篙、零比特填充法、違規(guī)編碼法涤久。
??透明傳輸:指不管所傳數(shù)據(jù)是什么樣的比特組合涡尘,都應(yīng)當(dāng)能夠在鏈路上傳送。因此响迂,鏈路層就看不見有什么妨礙數(shù)據(jù)傳輸?shù)臇|西考抄。
??當(dāng)所傳的數(shù)據(jù)中的比特組恰巧與某一個控制信息完全一樣時,就必須采取適當(dāng)?shù)拇胧┱嵬菇邮辗讲粫⑦@樣的錯誤認(rèn)為是某種控制信息川梅。這樣才能保證數(shù)據(jù)鏈路層的傳輸是透明的。
例如如果傳送的比特流中數(shù)據(jù)部分的數(shù)據(jù)恰好和幀尾部相同然遏,那么在傳輸過程碰到該部分?jǐn)?shù)據(jù)時贫途,接收端可能誤認(rèn)為到這里傳輸結(jié)束了,那直接丟棄之后的數(shù)據(jù)了待侵,這就會導(dǎo)致數(shù)據(jù)傳輸不完整丢早,所以就要采取適當(dāng)?shù)拇胧词褂羞@些問題也要保證數(shù)據(jù)能正確的傳輸,保證鏈路層對任何數(shù)據(jù)都能傳送怨酝,在數(shù)據(jù)看來傀缩,鏈路層沒有東西妨礙自己傳送或者說鏈路層對數(shù)據(jù)是透明的。
??2.1 字符計數(shù)法
??字符計數(shù)法:幀首部使用一個計數(shù)字段(第一個字節(jié))來表明幀的長度农猬。在接收時根據(jù)幀首部的字?jǐn)?shù)計數(shù)就可以知道一個幀的長度赡艰。
??缺點(diǎn):如果其中某個幀的計數(shù)錯誤,那么會導(dǎo)致之后傳輸?shù)臄?shù)據(jù)全部錯誤斤葱。
對于上圖慷垮,如果第1幀的計數(shù)在傳輸過程中發(fā)生錯誤又5變成了4,那么接收端在接收到4個字符就認(rèn)為該幀數(shù)據(jù)接收完畢了揍堕,開始接收下一幀料身,認(rèn)為下一幀的字?jǐn)?shù)計數(shù)是4,下一幀的數(shù)據(jù)也會出錯.......最終導(dǎo)致數(shù)據(jù)錯誤鹤啡。
??2.2 字符填充法
??當(dāng)數(shù)據(jù)時由可打印的ASCII碼組成的文本文件時惯驼,幀定界可以使用特殊的幀定界符蹲嚣〉莨澹控制字符SOH(Start Of Header)放在一幀的最前面,表示幀的首部開始隙畜。另一個控制符EOT(End Of Transmission)表示幀結(jié)束抖部。SOH和EOT是控制符的名稱,它們的二進(jìn)制編碼分別是0000 0001和0000 0100议惰。
當(dāng)使用ASCII編碼時慎颗,一共有128個不同的ASCII碼,其中可打印的有95個言询,有33個是不可打印的俯萎,,SOH和EOT就是不可打印的編碼运杭,所以可以用來作為控制符夫啊。
??當(dāng)傳送到幀是用文本文件組成的幀時(文本文件中的字符都是從鍵盤上輸入的),其數(shù)據(jù)部分顯然不會出現(xiàn)像SOH或EOT這樣的幀定界控制符辆憔,可見不管從鍵盤上輸入什么字符都可以放在幀上傳輸過去撇眯,因此這樣的傳輸就是透明傳輸。
??但是當(dāng)數(shù)據(jù)部分是非ASCII碼的文本文件時(如二進(jìn)制代碼的計算機(jī)程序或圖像等)虱咧,數(shù)據(jù)中的某個字節(jié)的二進(jìn)制代碼恰好和SOH或EOT這樣的控制字符一樣熊榛。這樣接收端就會錯誤的找到幀的邊界,把部分幀收下腕巡,丟棄部分?jǐn)?shù)據(jù)玄坦。
??為了解決透明傳輸問題,在發(fā)送端的數(shù)據(jù)鏈路層中出現(xiàn)控制字符SOH或EOT的前面插入一個轉(zhuǎn)義字符“ESC”(其二進(jìn)制編碼為0001 1011)绘沉。而在接收端的數(shù)據(jù)鏈路層在把數(shù)據(jù)送往網(wǎng)絡(luò)層之前刪除這個插入的轉(zhuǎn)入字符煎楣。
如果轉(zhuǎn)義字符也在數(shù)據(jù)中云挟,同樣需要在轉(zhuǎn)義字符前再插入一個轉(zhuǎn)義字符。當(dāng)接收端接收到連續(xù)的兩個轉(zhuǎn)義字符時转质,就刪除其中前面的一格個园欣。
??2.3 零比特填充法
零比特填充法幀的控制信息的首部和尾部是相同的。
??零比特填充法:在發(fā)送端休蟹,掃描整個信息字段沸枯,只要有連續(xù)的5個1,就立即填入1個0赂弓。在接收端收到一個幀時绑榴,先找到標(biāo)志字段確定邊界,再用硬件對比特流進(jìn)行掃描盈魁。發(fā)現(xiàn)連續(xù)5個1時翔怎,就把后面的0刪除。杨耙。
??零比特填充保證了透明傳輸赤套,在傳送的比特流中可以傳送任意比特組合,而不會引起對幀邊界的判斷錯誤珊膜。
??2.4 違規(guī)編碼法
??在曼徹斯特編碼中容握,一個碼元可以用前高后低表示1,前低后高表示0车柠,只有這兩種情況剔氏,不存在前高后高和前低后低這兩種情況。所以可以使用這兩種不存在的情況作為定界幀的起始和終止竹祷。
??由于字節(jié)計數(shù)法中的count字段的脆弱性(其值若有差錯將導(dǎo)致災(zāi)難性后果)及字符填充實(shí)現(xiàn)上的復(fù)雜性和不兼容性谈跛,目前普遍使用的是比特填充和違規(guī)編碼法。
3 差錯控制
??差錯的由來:現(xiàn)實(shí)中的通信鏈路都不會是理想的塑陵,由于噪聲的存在感憾,比特在傳輸?shù)倪^程可能會產(chǎn)生差錯。
??噪聲分為全局性和局部性猿妈。
(1) 全局性噪聲是由于線路電氣特性所產(chǎn)生的隨機(jī)噪聲(熱噪聲)吹菱,是信道固有的,隨機(jī)存在的彭则△⑺ⅲ可以通過提高信噪比來減少或避免干擾。
(2) 局部性噪聲是外界特定的短暫原因所造成的沖擊噪聲俯抖,是產(chǎn)生差錯的主要原因输瓜。可以利用編碼技術(shù)來解決。
??在數(shù)據(jù)傳輸過程中尤揣,差錯可以分為位錯和幀錯搔啊。
注:發(fā)送的幀為[#1]-[#2]-[#3]。
??差錯控制方法:檢錯編碼和糾錯編碼 北戏。
這里的差錯控制是針對的是比特錯负芋,幀錯后面再說。
?? 3.1 奇偶校驗(yàn)碼
??奇偶檢驗(yàn)碼分為奇檢驗(yàn)碼和偶檢驗(yàn)碼嗜愈。由n-1位信息元和在數(shù)據(jù)信息前的1位校驗(yàn)元組成旧蛾。
(1) 奇檢驗(yàn)碼:將數(shù)據(jù)轉(zhuǎn)換為二進(jìn)制數(shù)據(jù),數(shù)據(jù)中的“1”的個數(shù)加上檢驗(yàn)元的“1”的個數(shù)為奇數(shù)蠕嫁,如果接收端的1的個數(shù)是偶數(shù)锨天,說明一定發(fā)生了錯誤。
(2) 偶檢驗(yàn)碼:將數(shù)據(jù)轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)剃毒,數(shù)據(jù)中的“1”的個數(shù)加上檢驗(yàn)元的“1”的個數(shù)為偶數(shù)病袄。如果接收端的1的個數(shù)是奇數(shù),說明一定發(fā)生了錯誤赘阀。
??奇偶檢驗(yàn)碼的特點(diǎn):
??(1) 奇偶檢驗(yàn)碼可以檢測比特錯益缠,但是不能檢測到是哪個比特出現(xiàn)差錯。
??例如纤壁,如果一個字符S的ASCII編碼從底到高一次為1100101左刽,采用奇校驗(yàn),那么發(fā)送端發(fā)送的就是11100101(加上校驗(yàn)元酌媒,1的個數(shù)是奇數(shù)),經(jīng)過傳輸后迄靠,如果接收端收到的字符秒咨,如果是11100111,1的個數(shù)變成了6個掌挚,說明一定發(fā)生了錯誤雨席,但是不能檢測是哪個比特出現(xiàn)了錯誤。
??(2) 奇偶校驗(yàn)碼只能檢測出奇數(shù)個比特錯誤吠式,檢錯能力為50%陡厘。
??對于上例,如果接收端接收的數(shù)據(jù)是11010101特占,即發(fā)生了2位比特錯誤糙置,但是2個位錯正好相抵消,即一個由0變?yōu)?是目,另一個由1變成0谤饭,數(shù)據(jù)中的1個數(shù)仍然是5,所以同樣不能檢測出錯誤。同理揉抵,只有發(fā)生奇數(shù)個比特錯誤時亡容,才可以檢測出來。
?? 3.2 循環(huán)冗余碼CRC
??冗余編碼:在數(shù)據(jù)發(fā)送前冤今,先按某種關(guān)系附加上一定的冗余位闺兢,構(gòu)成一個符合某一規(guī)則的碼字后再發(fā)送。當(dāng)要發(fā)送的有效數(shù)據(jù)變化時戏罢,相應(yīng)的冗余位也隨之變化列敲,使碼字遵從不變的規(guī)則。接收端根據(jù)收到的碼字是否仍符合原規(guī)則帖汞,從而判斷是否出錯戴而。
??循環(huán)冗余檢驗(yàn)原理:在發(fā)送端,假設(shè)要發(fā)送k個比特翩蘸,CRC運(yùn)算就是在這k個比特后添加供查錯檢驗(yàn)的n位冗余碼所意,n位冗余碼又稱為幀檢驗(yàn)序列FCS(Frame Check Sequence),然后構(gòu)成一個幀發(fā)送出去催首,一共發(fā)送(k + n)個位扶踊。這n位冗余碼可以通過發(fā)送的數(shù)據(jù)和一個數(shù)相除得來,這個數(shù)是收發(fā)雙發(fā)事先約定好的數(shù)郎任。接收端收到發(fā)送端發(fā)送的(k + n)位比特后秧耗,需要將這些比特位和FCS相除,如果余數(shù)是0舶治,表示沒有差錯就接收分井,反之,則丟棄霉猛。
??舉例說明:如果客戶端要發(fā)送的數(shù)據(jù)是M = 101001尺锚,除數(shù)多項(xiàng)式P = 1101。
(1) 先確定n的大小惜浅。由于1101 = 1 * 23 + 1 * 22 + 0 * 21 + 1 * 21瘫辩,所以該多項(xiàng)式是3階,即(n = 3)坛悉,也就是如果多項(xiàng)式是N位伐厌,階就是N-1位,同樣如果除數(shù)多項(xiàng)式為11000裸影,那么階數(shù)就是4挣轨,n的值就是4。
(2) 計算n為冗余碼(FCS)空民。n位冗余碼是M 與 P的余數(shù)刃唐,先用n位的0代替冗余碼添加到M之后即被除數(shù)為101001000羞迷,然后在于P相除,所得的余數(shù)就是冗余碼画饥。
(3) 發(fā)送端發(fā)送的數(shù)據(jù)就是101001001衔瓮。
(4) 如果接收端接收到的數(shù)據(jù)是101001001,那么同樣除以P抖甘,看余數(shù)是否為0热鞍。如果是0,表示數(shù)據(jù)沒有發(fā)生錯誤衔彻,則接受薇宠,反之則丟棄。
??FCS的生成以及接收端CRC檢驗(yàn)都是由硬件實(shí)現(xiàn)的艰额,處理很迅速澄港,因此不會延誤數(shù)據(jù)的傳輸。
??在數(shù)據(jù)鏈路層僅僅使用循環(huán)冗余檢驗(yàn)CRC差錯檢測技術(shù)柄沮,只能做到對幀的無差錯接收回梧,即凡是接收端數(shù)據(jù)鏈路層接受的幀,都可以以非非常接近1的概率認(rèn)為這些幀在傳輸過程中沒有產(chǎn)生差錯祖搓。接收端丟棄的幀雖然曾經(jīng)接收到了狱意,但最終還是因?yàn)橛胁铄e被丟棄。所以通痴罚可以認(rèn)為:凡是接收端數(shù)據(jù)鏈路層接收的幀均為無差錯详囤。
注:鏈路層使用CRC檢驗(yàn),能夠?qū)崿F(xiàn)無比特差錯的傳輸镐作,只接受沒有錯誤的信息藏姐,丟棄錯誤的數(shù)據(jù),但這并不是可靠傳輸滑肉。可靠傳輸是發(fā)送端發(fā)送什么包各,接收端就收到什么。
?? 3.3 海明碼
??海明碼可以發(fā)現(xiàn)雙比特錯靶庙,糾正單比特錯。
??工作流程:
(1) 確定校驗(yàn)碼位數(shù)r娃属。
(2) 確定檢驗(yàn)碼和數(shù)據(jù)的位置六荒。
(3) 求出校驗(yàn)碼的值。
(4) 檢錯并糾錯矾端。
??(1) 確定校驗(yàn)碼的位數(shù)r
??海明不等式:2r ≥ k + r +1????????r為冗余信息位掏击,k為信息位。
??加入要發(fā)送的數(shù)據(jù)D = 101101秩铆,數(shù)據(jù)位數(shù)k = 6砚亭,帶入海明不等式灯变,滿足不等式的r最小值為4。即D = 101101的海明碼應(yīng)該有10(6 + 4)位捅膘。其中6位是數(shù)據(jù)位添祸,4位是檢驗(yàn)碼位。
??(2) 確定校驗(yàn)碼和數(shù)據(jù)的位置
??假設(shè)4為檢驗(yàn)碼分配為P1寻仗、P2刃泌、P3、P4署尤;數(shù)據(jù)從左到右分別為D1耙替、D2....D6
??檢驗(yàn)碼要放在2的n次冪的位置,即1曹体、2俗扇、4、8這四個位置箕别。
??(3) 求出檢驗(yàn)碼的值
這里因?yàn)樽畲蟮奈粩?shù)就是10铜幽,10最少需要4個二進(jìn)制位表示,所以所有數(shù)據(jù)都是用4個二進(jìn)制位表示究孕。
??對于每一個校驗(yàn)碼都可以檢驗(yàn)一個或多個數(shù)字啥酱。
對于第一個檢驗(yàn)碼P1,它負(fù)責(zé)檢驗(yàn)所有二進(jìn)制第4位(最后一位)是1的數(shù)據(jù)位厨诸,即數(shù)據(jù)位1镶殷、3、5微酬、7和9绘趋。P1的值需要和這些數(shù)據(jù)位的數(shù)異或運(yùn)算,需要最后的結(jié)果是0來確定P1的值颗管。所以P1^ 1 ^ 0 ^ 1 ^ 0 = 0陷遮,得P1 = 0。
??對于第二個檢驗(yàn)碼P2垦江,它負(fù)責(zé)校驗(yàn)所有二進(jìn)制位第3位是1的數(shù)據(jù)位帽馋,即數(shù)據(jù)位2、3比吭、6绽族、7、10衩藤,P2的值計算方法和P1相同吧慢,即P2 ^ 1 ^ 1 ^ 1 ^ 1 = 0,得P2 = 0赏表。同理可以計算出其余的檢驗(yàn)碼的值检诗。
??所以求出數(shù)據(jù)的海明碼位0010011101匈仗。
??(4) 檢錯并糾錯
??假設(shè)在數(shù)據(jù)的傳輸過程中第5位出錯,因此接收到的數(shù)據(jù)位就是0010111101逢慌。接收端接收到數(shù)據(jù)后悠轩,會進(jìn)行檢錯,分別計算檢驗(yàn)碼與檢驗(yàn)的位的異或的值涕癣。
P1和數(shù)據(jù)位3哗蜈、5、7坠韩、9的值作異或運(yùn)算:0 ^ 1 ^ 1 ^ 1 ^ 0 = 1;
P2和數(shù)據(jù)位3距潘、6、7只搁、10的值作異或運(yùn)算:0 ^ 1 ^ 1 ^ 1 ^ 1 = 0;
P3和數(shù)據(jù)位5音比、6、7的值作異或運(yùn)算:0 ^ 1 ^ 1 ^ 1= 1;
P4和數(shù)據(jù)位9氢惋、10的值作異或運(yùn)算:1 ^ 0 ^ 1 = 0;
??將上述的值逆序組成一個二進(jìn)制數(shù):0101洞翩,其所對應(yīng)的十進(jìn)制數(shù)就是5,即第5位發(fā)生了錯誤焰望,所以直接將第5位的數(shù)變?yōu)?即可實(shí)現(xiàn)糾錯的功能骚亿。