520發送的”我愛你“在傳輸時咋沒變成”我恨你“?計算機網絡(三)之數據鏈路層

大家好,我是後來,我會分享我在學習和工作中遇到的點滴,希望有機會我的某篇文章能夠對你有所幫助,所有的文章都會在公衆號首發,歡迎大家關注我的公衆號" 後來X大數據 ",感謝你的支持與認可。

又拖更了,說的昨天更,結果昨晚沒寫完。實在是尷尬!
最近關於計算機網絡的文章,可能是比較長,而且術語比較多,幾個朋友都和我說看不懂。

個人想法,也說給自己聽:我們每天在碎片化時間閱讀的公衆號上文章,除了獲取資訊外,關於知識類的文章,更多的是在消耗時間,並不能通過一篇文章就掌握這個知識點,所以如果我們能在這些文章中找到一些自己感興趣的文章,並願意付出時間去研究,纔有可能真正的理解和掌握作者花了若干時間寫的一篇文章。

所以,如果有想學習或瞭解計算機網絡,那可以認真看一看我寫的文章,我覺得已經過濾了很多難點。
在這裏插入圖片描述
接下來我們進入正題,數據鏈路層是幹啥的?

關於數據鏈路層的概念

先來思考一個問題,我的文章轉換爲0和1在傳輸的過程中,會不會有個別0或者是1在傳輸過程中0變成1,1變成0,那不就導致數據錯誤了麼?

數據鏈路層,屬於在物理層之上,那具體什麼是數據鏈路層呢?那有2個概念是需要清楚的

鏈路從一個結點到相鄰結點的一段物理線路(有線或無線),而中間沒有仼何其他的交換結點。在進行數據通信時,兩臺計算機之間的通信路徑往往要經過許多段這樣的鏈路。可見鏈路只是一條路徑的組成部分。

數據鏈路:當需要在一條線路上傳送數據時,除了必須有一條物理線路外,還必須有一些必要的通信協議來控制這些數據的傳輸。若把實現這些協議的硬件和軟件加到鏈路上,就構成了數據鏈路。

那也就是說:數據鏈路=若干鏈路+協議(包含實現協議的硬件+軟件)
在這裏插入圖片描述
現在最常用的方法是使用網絡適配器(既有硬件,也包括軟件)來實現這些協議。一般的適配器都包括了數據鏈路層和物理層這兩層的功能----後面會着重講適配器。

也有人把鏈路分爲物理鏈路和邏輯鏈路。物理鏈路就是上面所說的鏈路,而邏輯鏈路就是上面的數據鏈路,是物理鏈路加上必要的通信協議。

數據鏈路層使用的信道主要是2種方式

  1. 點對點信道
  2. 廣播信道

數據鏈路層的基本問題

搞清楚這個之後,那麼我們就知道,在2臺主機通信的時候,數據就是在若干段的鏈路上進行傳輸,但是比如我要發的是我愛你,機器怎麼知道從哪到哪是一個字符呢?也就是說怎麼檢測我收到的數據是否無差錯呢?

數據鏈路層協議有許多種,但有三個基本問題則是共同的。這三個基本問題是:封裝成幀、透明傳輸和差錯檢測。下面分別討論這三個基本問題。

封裝成幀

幀:是點對點信道的數據鏈路層的協議數據單元
封裝成幀就是在一段數據的前後分別添加首部和尾部,這樣就構成了一個幀。相當於做個首尾標記,也稱爲幀定界(確認幀的界限)那麼幀的數據部分長度上限,也叫做最大傳送單元MTU,相當於一個幀中數據部分的長度單元。在這裏插入圖片描述
那麼問題來了,用什麼標記做爲定界符呢?

ASCII碼一共有128位,其中可以打印的有95個,不可打印的佔了33個。這樣的話當我們的數據部分是由這可打印的95個字符構成時,使用不可打印的33個字符作爲定界符就不會發生衝突了,這個主意太棒了。

我們把幀開始符稱爲SOH,幀結束符稱爲EOT
在這裏插入圖片描述
那麼假如在幀的傳輸過程中,發送端沒發完一個幀就終端了發送,但很快又恢復了正常,這樣的話剛剛中斷的哪個幀由於沒收到幀結束符,就認爲是不完整的幀,就會直接進行丟棄。

透明傳輸

我們上面說的太理想了,事實上,由於現在發送的很多數據都是二進制的,那麼就可能會導致,數據部分中的部分字節的二進制代碼恰好和幀的開始符與結束符一樣,那麼數據鏈路層就會錯誤的找到幀的邊界,把部分幀收下,而剩下的那部分數據則會因爲幀不完整直接丟棄,造成數據的錯誤。
在這裏插入圖片描述
這個問題怎麼解決呢?核心目的是:數據中可能出現的控制字符在接收端不會被解釋爲控制字符。

解決方案就是:在數據中出現的控制字符前面加一個轉義字符就可以了。 在接收端的數據鏈路層收到數據後把數據送到網絡層時刪除掉這個轉義字符就可以了,這也稱爲字節填充或者字符填充。
在這裏插入圖片描述
那麼如果這個轉義字符也正好是數據的一部分怎麼辦,那就俄羅斯套娃,前面繼續加一個轉義字符,接收端收到連續2個轉義字符時,就會刪除其中前面的一個

差錯檢測

我們在上面只是對幀的控制字符進行了討論,認爲一個幀傳送之後只要幀的開始符和結束符在就認爲幀是完整的,那不太安全,萬一其中的數據部分丟失了一個bit怎麼辦?,稱爲比特差錯。
比如 你發給對象的“我愛你”在傳輸過程中不會因爲個別0或者1的錯誤變成“我恨你”?

我愛你=111001101000100010010001 111001111000100010110001 111001001011110110100000
我恨你=111001101000100010010001 111001101000000110101000 111001001011110110100000

所以要進行檢測,目前使用比較多的有循環冗餘檢驗CRC檢測技術,具體怎麼實現的跳過。感興趣的可以自己研究下。

但是,在數據鏈路層僅僅使用CRC技術檢測,只能做到檢測幀是不是有差錯,但是如果說收到的幀是沒錯,但是出現了幀丟失、幀重複、幀亂序。比如我們例子中的“我愛你”的個別0或1丟了。

假如:發送方連續發送三個幀:[#1][#2][#3]。假定接收端收到的每一個幀都沒有比特差錯,但卻出現下面的幾種情況
​幀丟失:收到[#1][#3]。
幀重複:收到[#1]-[#2][#2]{#3](收到兩個[#2])
幀失序:收到[#1][#3][#2](後發送的幀反而先到達了接收端)

這種情況我們在之後的運輸層給大家解釋,有人可能會疑問,這不應該就是數據鏈路層的事兒麼,怎麼還給了運輸層,原因是,之前OSI認爲必須讓數據鏈路層向上提供可靠傳輸,所以就在CRC的基礎上,還增加了幀編號、確認以及重傳機制,試圖來解決這個問題。

但是吧,現在的通信線路的質量基本上沒啥差錯,這麼搞的話影響效率,所以現在就開始分情況實施只在通信線路質量差的地方採用確認和重傳機制通信質量好的地方的話,如果數據傳輸出現差錯,那麼改正的任務由運輸層的TCP協議來完成。這就是甩鍋啊,哈哈,不過這樣做確實提高了通信效率。所以我們目前的數據鏈路層大多都是不可靠傳輸,我們今天也是討論的這種情況。

點對點協議PPP

接下來我們來說一個經典的點對點協議PPP,這是目前用的最廣的數據鏈路層協議
在這裏插入圖片描述
我們來看它是怎麼解決上面的3個問題的

PPP協議的幀格式

PPP協議有三個組成部分:

(1)一個將IP數據報封裝到串行鏈路的方法。
(2)一個用來建立、配置和測試數據鏈路連接的鏈路控制協議LCP( ink controlProtocol)。通信的雙方可協商一些選項。
(3)一套網絡控制協議NCP( Network Control Protoco),其中的每一個協議支持不同的網絡層協議,如IP、OSI的網絡層、 DECnet,以及 AppleTalk等。

那我們看完專業術語,看不懂沒關係,來一個一個分析

封裝成幀

在這裏插入圖片描述

  1. 首部和尾部分別爲4個字段和2個字段。首部的第一個和尾部的第二個都是標誌字段F,規定爲0x7E(16進製表示),用來表示一個幀的開始或結束。

  2. 首部中的地址字段A規定爲0xFF(即11111111),控制字段C規定爲0x03(即0000011)

  3. PPP首部的第四個字段是2字節的協議字段。當協議字段爲0x0021時,PPP幀的信息字段就是IP數據報。若爲0xC021,則信息字段是PPP鏈路控制協議LCP的數據,而0x8021表示這是網絡層的控制數據。

  4. 信息字段的長度是可變的,不超過1500字節。

  5. 尾部中的第一個字段(2字節)是使用CRC的幀檢驗序列FCS

字節填充

異步傳輸時,轉義字符定義爲0x7D(即01111101)

  1. 數據中出現幀標誌字段,0x7E字節,那就轉變成爲2字節序列(0x7D,0x5E)。
  2. 數據中出現一個轉義字符,0x7D字節,則把0x7D轉變成爲2字節序列(0x7D,0x5D)
  3. 數據中出現ASCII碼的控制字符,則在該字符前面要加入一個0x7D字節,同時將該字符的編碼加以改變。

零比特填充

同步傳輸時,也就是一連串的比特連續傳送,而不是逐個字符的傳送。
這個時候只要發現5個亂序的1,就會填入1個0,這樣就保證不會出現6個連續的1。
在這裏插入圖片描述

PPP協議的工作狀態

那麼來說一下PPP協議的工作狀態,它一開始是怎麼初始化的

我來說句人話:兩臺主機A和B本來呢各自安好,但是現在A非要勾搭B,那麼就要在A和B之間建立物理鏈路,那我們就讓他倆都聯網,這個時候呢,A呢就開始發一句話給B,數據就打包成了PPP幀,這裏面就包括LCP配置選項,於是建立鏈路層的LCP連接,接着就進入鑑別協議,沒問題的話建立網絡層協議NCP鏈路,然後交換數據。
在這裏插入圖片描述

廣播信道的數據鏈路層

接下來說廣播信道的數據鏈路層,廣播這個詞大家應該都清楚,就是一個人說,其他人聽。

在這裏我們指的是,在同一時刻,只能有1個用戶對外發送信息。其實局域網使用的就是廣播信道。

局域網:網絡是一個單位所有的,地理範圍和站點數目有限。

我這裏舉個例子,比如你家拉個網線,插到了路由器上,那麼連接無線的人和直接電腦連路由器的人就屬於是一個局域網,因爲你們對外只有一個網絡ip地址。

常用的局域網的網絡拓撲有星形網、環形網(最典型的就是令牌環形網)和總線網,現在最流行的是星形網

在局域網發展的早期,人們都認爲有源器件比較容易出故障,因而無源的總線結構一定會更加可靠。星形拓撲結構的中心使用了有源器件,人們就認爲這比較容易出故障,而要使這個有源器件少出故障,必須使用非常昂貴的有源器件。然而實踐證明,**連接有大量站點的總線式以太網,由於接插件的接口較多,反而很容易出現故障。**現在專用的ASIC芯片的使用可以把星形結構的集線器做得非常可靠。因此現在的以太網一般都使用星形結構的拓撲。
在這裏插入圖片描述
那麼既然是廣播信道,那麼意味着這麼多用戶需要共享信道,那怎麼分配資源呢?

  1. 靜態劃分信道:利用前面物理層我們學習的頻分複用、時分複用、波分複用等,這樣的話用戶只要獲取到了信道就不會和其他用戶發生衝突。但是代價太大,不適合局域網使用。

  2. 動態媒體接入控制:

    1)隨機接入:所有的用戶都可以隨時發消息,但要是恰好有多個用戶在同一時刻發消息,那就會都失敗,所有就必須要有一個協議來進行約定。

    2)受控接入:用戶不能隨機發消息,必須服從控制,比如說是輪詢,我挨着問一遍。

目前用的最多的就是隨機接入

傳統以太網就是最早流行的10Mbit/s速率的以太網,不過現在的速率已經演變爲了Gbit/s甚至100Gbit/s,我們這裏說原理還是用傳統以太網吧。

以太網的標準有2套,一套是DIX V2,一套是IEEE802.3,區別也不大,因此很多人也常把802.3 局域網簡稱爲“以太網”。反正現在用的都是DIX V2的,具體的發展過程都是商業競爭,這裏就不說了。所以最後的適配器上只有MAC協議,並沒有IEEE802.2 標準的LLC協議。

適配器是幹啥的,大家應該在各自電腦的網絡控制中心那裏見到過這個選項,但它到底是幹啥的
在這裏插入圖片描述
其實之前吧,不叫適配器,是一塊可插拔的網絡接口卡,稱爲網卡,不過現在的主板集成度高了,不再使用單獨的網卡了。現在主板上都嵌入了適配器,這個適配器上裝有處理器和存儲器,它的重要功能是要進行數據串行傳輸和並行傳輸的轉換。它實現的功能包含了數據鏈路層和物理層。但是現在的芯片的集成度比較高,沒法按照功能嚴格劃分開,所以我們這裏就全都講了。
在這裏插入圖片描述
適配器在接收和發送各種幀時,不使用計算機的CPU。這時計算機中的CPU可以處理其他任務。當適配器收到有差錯的幀時,就把這個幀直接丟棄而不必通知計算機。當適配器收到正確的幀時,它就使用中斷來通知該計算機,並交付協議棧中的網絡層。當計算機要發送IP數據報時,就由協議棧把IP數據報向下交給適配器,組裝成幀後發送到局域網。上圖表示適配器的作用。

我們特別要注意,計算機的硬件地址MAC地址就在適配器的ROM中,而計算機的軟件地址——IP地址則在計算機的存儲器中。

CSMA/CD協議

我們在上面說了這個隨機接入可能會引起相互衝突的問題,那怎麼處理?

  1. 無連接的工作方式
    我直接說人話吧,就是誰想發誰發,但要是衝突了,就等別人不發了你再發,稱爲載波監聽多點接入/碰撞檢測

    “載波監聽”就是用電子技術檢測總線上有沒有其他計算機也在發送。不管在發送前,還是在發送中,每個站都必須不停地檢測信道在發送前檢測信道,是爲了獲得發送權。如果檢測出已經有其他站在發送,則自己就暫時不許發送數據,必須要等到信道變爲空閒時才能發送。在發送中檢測信道,是爲了及時發現有沒有其他站的發送和本站發送的碰撞。這就稱爲碰撞檢測。

    既然每一個站在發送數據之前己經監聽到信道爲“空閒”,那麼爲什麼還會出現數據在總線上的碰撞呢?這是因爲電磁波在總線上總是以有限的速率傳播的。這和我們開討論會時相似。一聽見會場安靜,我們就立即發言,但偶爾也會發生幾個人同時搶着發言而產生衝突。而聽見沒聲音這也需要時間
    電磁波在1KM同軸電纜的傳播時延約爲5μs,我們把總線上單程端到端的傳播時延記爲r(這個符號我是真的不會打)
    大家看下圖
    在這裏插入圖片描述

    1. 在t=0時,A發送數據。B檢測到信道爲空閒。
    2. 在t=r-δ時(這裏r>δ>0),A發送的數據還沒有到達B時,由於B檢測到信道是空閒的, 因此B發送數據。
    3. 經過時間δ/2後,即在t=r - δ/2時,A發送的數據和B發送的數據發生了碰撞。但這時A和B都不知道發生了碰撞。
    4. 在t=r時,B檢測到發生了碰撞,於是停止發送數據。
    5. 在t=2x-δ時,A也檢測到發生了碰撞,因而也停止發送數據
    6. A和B發送數據均失敗,它們都要推遲一段時間再重新發送
      我們發現A最多需要2r的時間才能知道數據發生了碰撞,所以把這段時間稱爲爭用期,也叫做碰撞窗口,只有通過爭用期的“考驗”,即經過爭用期這段時間還沒有檢測到碰撞,才能肯定這次發送不會發生碰撞。這時,就可以放心把這一幀數據順利發送完畢。

以太網使用截斷二進制指數退避算法來確定碰撞後重傳的時機。這種算法讓發生碰撞的站在停止發送數據後,不是等待信道變爲空閒後就立即再發送數據,而是**推遲(這叫做退避)**一個隨機的時間。這點很容易理解,因爲如果幾個發生碰撞的站都在監聽信道,那麼都會同時發現信道變成了空閒。如果大家都同時再重新發送,那麼肯定又會發生碰撞。所以退避算法可以使各站進行重傳時再次發生衝突的概率減小。

但是這裏面又有個問題,某個站發送了一個很短的幀,但在發送完畢之前並沒有檢測出碰
。假定這個幀在繼續向前傳播到達目的站之前和別的站發送的幀發生了碰撞,因而目的站將收到有差錯的幀(當然會把它丟棄)。可是發送站卻不知道這個幀發生了碰撞,因而不會重傳這個幀。這種情況顯然是我們所不希望的。爲了避免發生這種情況,以太網規定了一個最短幀長64字節,即512bit。如果要發送的數據非常少,那麼必須加入一些填充字節,使幀長不小於64字節。對於10Mbt以太網,發送512bt的時間需要512ps,也就是上面提到的爭用期
因此凡長度小於64字節的幀都是由於衝突而異常中止的無效幀。只要收到了這種無效
幀,就應當立即將其丟棄。

同時以太網還規定了幀間的最小間隔是9.6μs,相當於是96比特時間,可以使得剛剛收到數據幀的站的接收緩存來得及清理,做好接收下一幀的準備。

  1. 曼徹斯特編碼:
    在這裏插入圖片描述
    從高低壓到低電壓,代碼1,從低電壓到高電壓代變0,這樣就保證了在每一個碼元的正中間出現一次電壓的轉換,而接收端就利用這種電壓的轉換很方便地把位同步信號提取出來。但是從曼徹斯特編碼的波形圖也不難看出其缺點,這就是它所佔的頻帶寬度比原始的基帶信號增加了一倍(因爲每秒傳送的碼元數加倍了)。

使用集線器的星形拓撲

我們前面說了,現在主要使用的還是星形結構,之前是因爲中間的源器件不穩定,但現在隨着技術的進步,有了一種可靠性非常高的設備,那就是集線器。
在這裏插入圖片描述
1990年IEEE制定出星形以太網10 BASE-T的標準802.3i。“10”代表10Mbit/s的數據率,BASE表示連接線上的信號是基帶信號,T代表雙絞線。所以這種性價比很高的10BASE-T雙絞線以太網的出現,是局域網發展史上的一個非常重要的里程碑。從此,以太網的拓撲從總線變成了星形。
那麼這集線器這麼牛逼,到底是咋玩的:
1、集線器使用了電子器件來模擬實現電纜線的工作,所以在邏輯上仍然是一個總線網,各站共享邏輯上的總線,使用的還是CSMA/CD協議。並且同一時刻最多隻允許一個站發送數據。
2、一個集線器的接口多到8-16個,通過RJ-45插頭與雙絞線和適配器相連,所以,它像一個多接口的轉發器。
3、集線器工作在物理層,他的每個接口只是轉發比特,收到1就轉發1,收到0就轉發0,不進行碰撞檢測。一旦碰撞,所有接口都收不到正確的幀。
4、專門的芯片進行自適應串音回波抵消。

以太網的MAC層:

硬件地址被稱爲物理地址或者是MAC地址,局域網的”地址“應該是每一個站的”名字“或標識符,這就相當於說A給B發消息,不會發給C,因爲有B的mac地址。

現在IE的註冊管理機構RA是局域網全球地址的法定管理機構,它負責分配地址字段的6個字節中的前三個字節(即高位24位)。世界上凡要生產局域網適配器的廠家都必須向IEEE購買由這三個字節構成的這個號(即地址塊),這個號的正式名稱是組織唯一標識符OUI,通常也叫做公司標識符。例如,3Com公司生產的適配器的MAC地址的前三個字節是0260-8c0。地址字段中的後三個字節(即低位24位)則由廠家自行指派。

說人話就是:MAC地址一共6個字節,每個字節8位,一共是48位,前24位是買的,每個企業一個,也可以買多個,但這個MAC地址不重複,後面的3個字節,企業自己分配,小企業可以團購前3位字節。

同時地址字段的第一個字節的最低位爲I/G位,0代表單個站地址(個人),1代表組地址(企業、學校等單位)。

同時還擔心有人不買OUI,就把第一字節的最低第二位規定位G/L位,0代表是全球管理,保證全球不重複,1是本地管理。

所以還剩下46位,也就以爲這一共可以有2的46次個MAC地址,超過70萬億個,到目前爲止還是可以保證每一個適配器都有一個唯一的地址。但是以後就不知道了。

下面的這就是MAC幀的格式,我們上面討論的MAC地址,就是下圖中的目的地址和源地址。
在這裏插入圖片描述
2字節的類型字段,用來標誌上一層使用的是什麼協議。最後一個字段是4字節的幀檢驗序列FCS(使用CRC檢驗)

擴展的以太網

剛剛說了上面的局域網其實覆蓋範圍是有限的,因爲10BASE-T 以太網的兩臺主機之間的距離不超過200米,不然CSMA/CD協議沒法正常工作,不過隨着技術的發展,現在直接使用光纖連接2個光纖調制解調器,這樣的話,擴大了以太網覆蓋的地理範圍,但是也帶來了問題。
在這裏插入圖片描述
比如下圖,大學裏面的以太網,本來吧是因爲線的問題覆蓋不到,所以只能每個系一個以太網,現在可以使用光纖了,所以把多個集線器連起來,形成一個大的以太網,但是合起來後這3個系相當於處於了一個碰撞域,同一時刻還是隻能由1個用戶發消息,效率還是太低。
說明這個是錯誤操作。
在這裏插入圖片描述

以太網交換機

所以擴展以太網更常用的方法是使用以太網交換機,它具有並行性,因爲他能把收到的幀暫存一下,以後再發送出去,這樣就避免了碰撞,簡稱爲存儲轉發方式
而且它還能自學習,就是用戶使用交換機時,直接插上就可以,完全不需要設置,自己會去檢測地址,然後記錄下來。
在這裏插入圖片描述
那麼我們發現以太網都沒使用共享總線模式,所以沒有碰撞問題,因此也不使用CSMA/CD協議,而是以全雙工方式工作。那麼爲啥還叫以太網,是因爲他的幀結構未改變,仍然採用以太網的幀結構。

虛擬局域網

使用以太網交換機後,技術又大變革,可以很方便的實現虛擬局域網VLAN,如下圖,需要A1-4是一個局域網,這咋辦呢?
在這裏插入圖片描述
直接在幀的首部插入一個4字節的標識符,稱爲VLAN標記,來指明發送該幀的計算機屬於哪一個虛擬局域網。
在這裏插入圖片描述

高速以太網

我們前面說的是傳統以太網,速率是10Mbit/s,現在常用的以太網都是速率爲1Gbit/s的吉比特以太網,甚至是更快的以太網。

然而IEE802.3u的標準未包括對同軸電纜的支持。這意味着想從細纜以太網升級到快速以太網的用戶必須重新佈線。因此,現在10/100Mbs以太網都使用無屏蔽雙絞線佈線。

而使用以太網進行寬帶接入,你們試過撥號上網麼,就是這玩意,但現在也基本沒人用,因爲它也不屬於是以太網上網,而是利用電話線寬帶接入互聯網的。

所以總結一下,雖然上述中關於局域網的技術發生了很大的變化,但有一個是一直延用的,那就是幀傳輸。

所以在題目中說到的,我發送的“我愛你”在傳輸的時候,它雖然被轉換爲了0 和1,同時也是按照幀傳輸的,傳輸結束後還會進行CRC等方式的檢測,看是否完整及錯誤。至於發送的幀丟失以及亂序我們後續在網絡層繼續講。

我在學習的過程中發現,技術的發展往往是通過1個點的突破而實現了整個技術的進步。我一直不喜歡用標題黨的方式來命題,比如說什麼 X天學會計算機網絡等,因爲這些個技術還真的是比較複雜的,不認真學習還真搞不懂。在技術領域,我們都要有一顆謙卑的心。

掃碼關注”後來X大數據“,回覆【電子書】,領取【超多本pdf java及大數據 電子書】

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章