首先要明確一個問題,鏈路層干了什么事情?鏈路層的作用是什么?
物理層是解決了實際的連線問題,傳輸?shù)氖潜忍匚?,鏈路層就是?guī)定一次發(fā)送多少個01,這就是幀。
鏈路層的作用有三個
1:封裝成幀
2:透明傳輸
3:差錯檢測
在物理層搭建好的時候,人們提出鏈路層這個概念后,就有各種各樣的協(xié)議騰空出世,在眾多的協(xié)議中有一種要以太網(wǎng)的協(xié)議脫引而出,這個協(xié)議放在后面介紹?,F(xiàn)在我們將一講另一種形式。
那還是要講講數(shù)據(jù)傳輸?shù)男问?。在鏈路層?shù)據(jù)傳輸有倆種方式
一:點對點。
二:廣播
A:點對點

如圖,結(jié)點a和結(jié)點b傳輸數(shù)據(jù),鏈路層接過網(wǎng)絡層下傳的數(shù)據(jù),經(jīng)過處理(封裝為幀),交給物理層,物理層傳輸數(shù)據(jù)到結(jié)點b,結(jié)點b收到數(shù)據(jù)后,將數(shù)據(jù)一層一層上傳最后到網(wǎng)絡層?;ヂ?lián)網(wǎng)采用分層的好處就是在與每一層干的事情不影響別的層,鏈路層不必考慮物理層怎么實現(xiàn),在物理上是如上這樣傳輸?shù)?,但是在邏輯上就可以簡單的看為,結(jié)點a的鏈路層直接和結(jié)點b的鏈路層直接交流。
封裝成幀——就是規(guī)定多少個01為一組
就是在一段數(shù)據(jù)前后加上一個標記為,說明這幾個數(shù)據(jù)是一個幀,接受放就能根據(jù)這些標記點,分辨幀,幀的頭部放一些控制信息,比如里面數(shù)據(jù)是什么那個協(xié)議,比如里面放的是ip協(xié)議的數(shù)據(jù)。 要發(fā)送的數(shù)據(jù)放在幀的數(shù)據(jù)部分。頭部+數(shù)據(jù)=幀的長度。規(guī)定了一個幀的數(shù)據(jù)的最大長度——MTU,那為了傳輸?shù)男?,就要盡量的讓數(shù)據(jù)部分大于頭部的長度。
幀的形式:

那在數(shù)據(jù)流里怎么規(guī)定一幀是有多少個數(shù)據(jù),也就是說怎么來規(guī)定一個幀?
規(guī)定在幀的和結(jié)尾都有一個特殊的字符來標示就好了,幀開始用SOH,幀結(jié)束用EOH。那這樣就可以約束一個幀了,發(fā)送方西安發(fā)送一個SOH表示幀開始,幀結(jié)束的時候發(fā)送EOH,標示幀結(jié)束,接收方收到數(shù)據(jù),如果有SOH,但是沒有EOH,則就丟棄這個幀,若是SOH,EOH都有就表明這是一個完整的幀,則收下這個幀。
那現(xiàn)在出現(xiàn)了一個問題,標示一個幀是用兩個字符來標示的,那如果傳送的數(shù)據(jù)里面有這倆特殊字符怎么辦?怎么還繼續(xù)標示一個完整的幀?
這就是透明傳輸解決的問題。
透明 傳輸就是不管發(fā)送方發(fā)送的是什么數(shù)據(jù),都可以按照原樣沒有差錯的通過數(shù)據(jù)鏈路層傳送出去。
那解決的方法就是 在數(shù)據(jù)里面出現(xiàn)的控制符不被解釋為控制符號。具體就是在數(shù)據(jù)中出現(xiàn)的控制符號前面加上一個轉(zhuǎn)義字符(“ESC”)如果轉(zhuǎn)義字符也出現(xiàn)在數(shù)據(jù)中,那就繼續(xù)在前面再加一個轉(zhuǎn)義字符。接收方在接受的時候刪掉之前添加的這些轉(zhuǎn)義字符就好。這有個專業(yè)的名詞——字符填充或者字節(jié)填充。
那請在思考一個問題?——傳送的時候要是出現(xiàn)了差錯怎么辦,接收方如是收下這些個錯誤的數(shù)據(jù),那這就大錯特錯了。必須要采取一個措施來針對這些事。
此時,,差錯檢測就千呼萬喚始出來
這種差錯檢測的方法有好幾種,現(xiàn)在主要采用的 循環(huán)冗余檢驗法 ,在這里就不介紹了,總之,采用這種方法能檢測出來數(shù)據(jù)有沒有出現(xiàn)差錯,接受方收到這個幀,采用這種方法若是檢測出出現(xiàn)了差錯,則就丟掉這個幀,反之,則接受。但是需要注意的是,在鏈路層沒有機制能實現(xiàn)出現(xiàn)差錯的幀重新發(fā)送,這不是數(shù)據(jù)鏈路層該干的事情,但是我們可以這樣認為,因為在接收方全都收到了發(fā)送方發(fā)的數(shù)據(jù),至于丟不丟掉這個幀是接收方的事情,發(fā)送方并不知道,在發(fā)送方看來,我發(fā)送的數(shù)據(jù)你接收方全部都接受了,所以這實現(xiàn)了無差錯傳輸,即就是凡在接收端數(shù)據(jù)鏈路層接受的幀無差錯。
在點對點傳輸形式中 ppp(point-to-point Practical是用的最廣泛的協(xié)議
我們知道上網(wǎng)要聯(lián)入一個ISP才可以上網(wǎng)。ppp協(xié)議就是用戶在和ISP進行通信的時候所使用的數(shù)據(jù)鏈路層協(xié)議。
ppp協(xié)議的特點:
簡單——這個很明了不用解釋,當然是越簡單越好
封裝為幀,——這本就是數(shù)據(jù)鏈路層實現(xiàn)的基本問題
透明傳輸,——這本就是數(shù)據(jù)鏈路層實現(xiàn)的基本問題
差錯檢測 ——這本就是數(shù)據(jù)鏈路層實現(xiàn)的基本問題
各種網(wǎng)絡協(xié)議——要能傳送各種的協(xié)議,要不然他的功能太單一
各種的鏈路網(wǎng)絡——因為物理層的鏈路形式有多種。
檢測鏈接狀態(tài)——要有一種機制來檢測鏈路的狀態(tài),比如一段鏈路出現(xiàn)發(fā)生故障,要過多長時間重新發(fā)送。
最大傳送單元(MTU)
網(wǎng)路地址協(xié)商——要有一種機制能確保兩個實體知道彼此的網(wǎng)絡層地址
數(shù)據(jù)壓縮協(xié)商——傳送的越小越好,越快嘛
那ppp協(xié)議中還包含了LCP和NCP
LCP(Link Control Protocol):配置和測試數(shù)據(jù)鏈路連接的鏈路層控制協(xié)議
NCP:(Network Control Protocol):網(wǎng)絡控制協(xié)議
ppp協(xié)議的數(shù)據(jù)幀格式如下:

那ppp協(xié)議在用戶和ISP中是怎么工作的呢?
當用戶通過撥號接入ISP中,就建立了一條用戶到IS的物理連接,因為IP地址是動態(tài)分配的,用戶要向ISP申請一個ip地址,,那就是當用戶向ISP發(fā)送一系列的鏈路控制協(xié)議ICP分組(封裝為多個ppp數(shù)據(jù)包)就建立LCP連接,這些分組就回送給用戶一些PPP參數(shù),接下來還要建立網(wǎng)絡配置,網(wǎng)絡控制協(xié)議NCP給接入的用戶非配一個臨時的IP地址,這樣個人電腦就成互聯(lián)網(wǎng)上的一個有IP地址的主機。當用戶通信完畢后,NCP釋放網(wǎng)絡層連接,收回原來分配出去的IP地址,然后釋放鏈路層的連接,最后釋放物理層的連接。 ppp鏈路的開始和結(jié)束都是鏈路靜止的。
B:廣播
廣播就是在一個局域網(wǎng)上傳輸是一對多的形式,在同一個局域網(wǎng)中,存在a,b,c,d四臺主機,a要發(fā)送數(shù)據(jù)給d,其實在一個局域網(wǎng)上的b,c,d都能接受到,這就是廣播的形式。
局域網(wǎng)有三種連線方式
1,星形網(wǎng)——連接在集線器上
2: 環(huán)形網(wǎng)——直接連接在總線上
3:總線網(wǎng)——直接連接在總線上
以太網(wǎng)的幀的形式:

頭部的長度固定為18字節(jié),數(shù)據(jù)的長度最短為46字節(jié),最長為1500字節(jié),所以整個幀最短為64字節(jié),最長為1518字節(jié),如果數(shù)據(jù)很長,那就要分割為多個幀發(fā)送。
以太網(wǎng)也是一種局域網(wǎng),在鏈路層剛提出的時候,會用各種各樣的局域網(wǎng),也會有各種各樣的協(xié)議,在這些協(xié)議中, **以太網(wǎng)協(xié)議**被廣泛應用。
以太網(wǎng)規(guī)定為了適應各種各樣的局域網(wǎng),它將以太網(wǎng)劃分為倆個子層,邏輯鏈路控制——LLC(Logical link control)和媒體接入控制——MAC(Medium Access Control)但是隨著發(fā)展,LLC層被逐漸廢棄
那一個局域網(wǎng)中一個電腦要向一個電腦發(fā)送數(shù)據(jù),就想a給b打電話,起碼要知道b的電話號碼,并且b這個號碼是唯一的,這樣才能打通電話,那現(xiàn)在就是怎么用一串數(shù)字來表示一個計算機。以太網(wǎng)規(guī)定,聯(lián)入互聯(lián)網(wǎng)的設備都有一個適配器(也叫做網(wǎng)卡),適配器都有一個唯一的數(shù)字來表示,這也就是這個設備的唯一標示。
發(fā)送數(shù)據(jù)的時候,在數(shù)據(jù)包的頭部放入發(fā)送方mac地址,接收方的mac地址,還有各種版本控制信息,在數(shù)據(jù)部分放入數(shù)據(jù),通過廣播的形式發(fā)送,同一個局域網(wǎng)上的所有設備都能接受到這個數(shù)據(jù)包,然后檢測頭部信息中接受方的地址是不是發(fā)送給自己的,若是,則接受,反之,丟棄。
適配器在接受和發(fā)送數(shù)據(jù)包的時候不使用CPU,CPU可以處理別的事情,當適配器收到有差錯的幀的時候,就丟掉,而不用通知CPU,適配器接受正確的幀的時,就使用中斷來通知計算機,交給上一層。計算機的硬件地址就在適配的ROM中。這樣就利用廣播的特性實現(xiàn)了一對一的通信。
為了是以太網(wǎng)盡可能的簡單規(guī)定了一下幾點:
1:以太網(wǎng)不先建立就可以發(fā)送數(shù)據(jù),這不像ppp協(xié)議一樣,先是建立連接,然后再才是通信,網(wǎng)卡對發(fā)送的數(shù)據(jù)不編號,也不要求對方回發(fā)ACK(確認),以太網(wǎng)提供的是不可靠的交付,如果運輸層要求對出現(xiàn)差錯的幀重新傳送,則以太網(wǎng)并不知這個是重傳的幀。
2:使用曼切斯特編碼(即就是用一個周期的特殊的波形來表示0和1)波形的變化就說明有數(shù)據(jù)在傳輸,反之,就沒有。
既然以太網(wǎng)是用總線的方式連接在一塊的。那在同一時刻,總線上不可能有倆計算機同時發(fā)送消息。那計算機怎么知道總線現(xiàn)在有沒有計算機在發(fā)送數(shù)據(jù)?
在這里采用了CSMA/CD協(xié)議——載波監(jiān)聽多點接入/碰撞檢測(Carrier Sense Multiple Access with Collision Detection)。
CSMA/CD協(xié)議的基本要點
1:多點接入: 說明這是總線型網(wǎng)絡,很多計算機以多點接入的方式連接在總線上,
2:載波監(jiān)聽: 利用電子技術(shù)檢測總線上有沒有其他計算機在發(fā)送數(shù)據(jù),其實就是檢測信道上的波形有沒有變化。無論在發(fā)送前,還是發(fā)送中,亦或是發(fā)送后,每個設備都要必須不停的檢測信道。如果沒有設備發(fā)送,則獲得發(fā)送權(quán),反之,則要等待信道為空閑發(fā)送。在發(fā)送中檢測信道是為了及時發(fā)現(xiàn)有沒有其他站的發(fā)送和本站發(fā)送碰撞。這就是碰撞檢測
3:碰撞檢測: 也就是邊發(fā)送邊檢測 ,網(wǎng)卡檢測信道上的信號電壓的變化情況,當好幾個設備同時都在發(fā)送數(shù)據(jù),總線上的信號電壓變化比較大,當大于一定的值的時候,就可以認為總線上至少有倆站在發(fā)送數(shù)據(jù),發(fā)生了碰撞??偩€上的傳輸?shù)男盘柧蜁a(chǎn)生嚴重的失真,無法從中恢復出有用的信息來,因此,一旦發(fā)生碰撞檢測,網(wǎng)卡就要立即停止發(fā)送,等待一段時間后繼續(xù)發(fā)送。
那具體是要等待多上時間才繼續(xù)發(fā)送呢?
以太網(wǎng)使用截斷二進制指數(shù)退避算法實現(xiàn),大體的概念就是在讓發(fā)送碰撞的站在停止發(fā)送數(shù)據(jù)后,并不是等待信道變?yōu)榭臻e后就立即發(fā)送數(shù)據(jù),而是**推遲**
一個隨機數(shù)時間,時間到了后繼續(xù)發(fā)送。那要下一次還是沒有發(fā)送成功呢,規(guī)定,發(fā)送16次后還是沒發(fā)送成功,就認為出現(xiàn)了錯誤。
那各位有沒有想過,發(fā)生碰撞的檢測的前提是已經(jīng)發(fā)送了數(shù)據(jù),然后發(fā)生了碰撞,那既然都發(fā)送了數(shù)據(jù),為什么還發(fā)生了碰撞檢測?
因為信道有延遲,電磁波傳輸速率是有限的,比如a發(fā)送數(shù)據(jù)給b,要經(jīng)過5μs,此時b發(fā)送數(shù)據(jù)給a,因為數(shù)據(jù)要等待5μs才可以,按在b看來,此時信道就是空閑的,特別很開心的發(fā)送數(shù)據(jù),然后就碰撞了。那a發(fā)送的數(shù)據(jù)最遲要經(jīng)過 總線端到端的往返傳播時延 能到達b。 有一個最小的幀間最小間隔為9.6μs。
很明顯,在CSMA/CD協(xié)議時,一個幀不可能同時發(fā)送數(shù)據(jù)和接受數(shù)據(jù),但是必須一邊發(fā)送一遍監(jiān)聽信道,所以,使用這種協(xié)議的以太網(wǎng)不可能進行全雙工通信而只能進行雙向交替通信(半雙工通信)
總結(jié):
1:網(wǎng)卡將上一層的數(shù)據(jù)包放在mac數(shù)據(jù)包里面,經(jīng)過一系列的精加工(發(fā)送方的mac地址,接收方的mac地址,等)放入網(wǎng)卡的緩存中,準備發(fā)送
2:檢測信道:若是檢測信道為空閑,并且在9.6μs內(nèi)保持信道空閑,則發(fā)送。反之,等待。
3:發(fā)送中不斷的檢測信道,有沒有發(fā)生碰撞,若是沒有,則沒有發(fā)生碰撞,若是發(fā)生了碰撞,就立即停止發(fā)送數(shù)據(jù),并按規(guī)定發(fā)送人為干擾后,網(wǎng)卡就執(zhí)行退避算法,若是傳了16次不成功,就停止發(fā)送上一層報告出現(xiàn)了錯誤。
以太網(wǎng)有好幾種連線方式下面就說說這個
開始就直接連接在總線上。不過后來啊,集線器出現(xiàn)了,集線器采用星形網(wǎng)。因為集線器還是使用電子器件來模擬實際電纜線的工作,整個系統(tǒng)還是一一個傳統(tǒng)以太網(wǎng)運行,使用的還是CSMA/CD協(xié)議。而且,有好幾個接口,集線器工作在物理層,因為它是個連線的嘛。只是簡單的轉(zhuǎn)發(fā)數(shù)據(jù),收到1就轉(zhuǎn)發(fā)1,也不緩存,要是幾個接口發(fā)生了碰撞,那所有的接口都不能收到正確的幀。
隨著發(fā)展,出現(xiàn)了以太網(wǎng)分組交換機,工作在鏈路層。它每個接口都直接和一個主機或者另一個以太網(wǎng)交換機連接,而且以全雙工方式,同時連通多對接口,使得多對主機能夠直接通信,相互通行的主機都是獨占媒體,無碰撞的傳輸數(shù)據(jù)。,而且它還是緩存,當一個接口的主機比較繁忙時,還能緩存數(shù)據(jù)。它有一個交換表(地址表)里面存放著連接在它上面的主機的接口號,它采用自學習的算法自動建立這個表(后面講)而且呢,轉(zhuǎn)發(fā)速度比較快,因為采用了專門的芯片。
以太網(wǎng)交換機的自學習的算法。


交換了兩幀后的交換表
它的這樣的,A向B發(fā)送數(shù)據(jù),剛開始的時候表是空的,交換機就用廣播的形式發(fā)送數(shù)據(jù),每個設備都能收到數(shù)據(jù)包,然后看頭部里面的接受方是不是自己的mac地址。此時以太網(wǎng)交換機就記下A主機在一號接口。B發(fā)送數(shù)據(jù)給A,以太網(wǎng)交換機查找表發(fā)現(xiàn)了A在一號接口,就講這個數(shù)據(jù)數(shù)據(jù)包從一號接口發(fā)送出去,并且它發(fā)現(xiàn)交換表里面沒有B,就記下B 在二號口,如此一來,就知道所有的主機的接口了,這個表也就完善了。
但是有時候為了增加一些網(wǎng)絡的可靠性,在使用以太網(wǎng)交換機的時候,往往會添加一些冗余的鏈路,那這樣可能就會導致以太網(wǎng)交換機 在網(wǎng)絡中的某個環(huán)路中無限的重復,為了防止這樣的情況,規(guī)定不該表網(wǎng)絡的實際拓撲結(jié)構(gòu),但是邏輯上則切段了某切鏈路,使得一臺主機到其他主機都是無環(huán)路的樹狀結(jié)構(gòu),而從消除兜圈子。拓撲排序就是消除圖的環(huán)路的算法。
以太網(wǎng)交換機沒有采取CSMA/CD的協(xié)議,并且還是雙全工的方式工作的,因為不會產(chǎn)生碰撞嘛。但是它還是繼續(xù)采用了以太網(wǎng)的幀結(jié)構(gòu)。