趣談網絡協議 - 第5講 | 從物理層到MAC層:如何在宿舍裏自己組網玩聯機遊戲?

這系列相關博客,參考 極客時間-趣談網絡協議

上一節,我們見證了 IP地址的誕生,或者說是整個操作系統的誕生。一旦機器有了 IP,就可以在網絡的環境裏和其他的機器展開溝通了。

故事就從我的大學宿舍開始講起吧。作爲一個八零後,我要暴露年齡了。

我們宿舍四個人,大一的時候學校不讓上網,不給開通網絡。但是,宿舍有一個人比較有錢,率先買了 —臺電腦。那買了電腦幹什麼呢?

首先,有單機遊戲可以打,比如說《拳皇》。兩個人用一個鍵盤,照樣打得火熱。後來有第二個人買了電腦,那兩臺電腦能不能連接起來呢?你會說,當然能啊,買個路由器不就行了。

現在一臺家用路由器非常便宜,一百多塊的事情。那時候路由器絕對是奢侈品。一直到大四,我們宿舍都沒有買路由器。可能是因爲那時候技術沒有現在這麼發達,導致我對網絡技術的認知是逐漸深入的, 而且每一層都是實實在在接觸到的。

第一層(物理層)
使用路由器,是在第三層上。我們先從第一層物理層開始說。

第一層(物理層)

物理層能折騰啥?現在的同學可能想不到,我們當時去學校配電腦的地方買網線,賣網線的師傅都會問,你的網線是要電腦連電腦啊,還是電腦連網口啊?

我們要的是電腦連電腦。這種方式就是一根網線,有兩個頭。一頭插在一臺電腦的網卡上,另一頭插在另一臺電腦的網卡上。但是在當時,普通的網線這樣是通不了的,所以水晶頭要做交叉線,用的就是所謂的1-3、2-6交叉接法

水晶頭的 第1、2腳 和 第3、6腳,它們分別起着收、發信號的作用。將一端的1號和3號線、2號和6號線互換一下位置,就能夠在物理層實現一端發送的信號,另一端能收到。

當然電腦連電腦,除了網線要交叉,還需要配置這兩臺電腦的IP地址、子網掩碼和默認網關。這三個概念上一節詳細描述過了。要想兩臺電腦能夠通信,這三項必須配置成爲一個網絡,可以一個是192.168.0.1/24,另一個是 192.168.0.2/24, 否則是不通的。

這裏我想問你一個問題,兩臺電腦之間的網絡包,包含MAC層嗎?當然包含,要完整。IP層要封裝了 MAC層才能將包放入物理層。

到此爲止,兩臺電腦已經構成了一個最小的局域網,也即 LAN。可以玩聯機局域網遊戲啦!

等到第三個哥們也買了一臺電腦,怎麼把三臺電腦連在一起呢?

先別說交換機,當時交換機也貴。有一個叫作 Hub 的東西,也就是集線器。這種設備有多個口,可以將宿舍裏的多臺電腦連接起來。但是,和交換機不同,集線器沒有大腦,它完全在物理層工作。它會將自己收到的每一個字節,都複製到其他端口上去。這是第一層物理層聯通的方案

第二層(數據鏈路層)

第二層(數據鏈路層)

你可能已經發現問題了。Hub採取的是廣播的模式,如果每一臺電腦發出的包,宿舍的每個電腦都能收 到,那就麻煩了。這就需要解決幾個問題:

  1. 這個包是發給誰的?誰應該接收?
  2. 大家都在發,會不會產生混亂?有沒有誰先發、誰後發的規則?
  3. 如果發送的時候出現了錯誤,怎麼辦?

多路訪問算法 解決 媒體訪問控制問題:誰先發、誰後發?

這幾個問題,都是第二層,數據鏈路層,也即MAC層要解決的問題。MAC的全稱是 Medium Access Control,即媒體訪問控制。控制什麼呢?其實就是控制在往媒體上發數據的時候,誰先發、誰後發的問題,防止發生混亂。這解決的是第二個問題。這個問題中的規則,學名叫多路訪問。有很多算法可以解決這個問題。就像車管所管束馬路上跑的車,能想的辦法都想過了。

比如接下來這三種方式:

  • 方式一:分多個車道。每個車一個車道,你走你的,我走我的。這在計算機網絡裏叫作信道劃分
  • 方式二:今天單號出行,明天雙號出行,輪着來。這在計算機網絡裏叫作輪流協議
  • 方式三:不管三七二十一,有事兒先出門,發現特堵,就回去。錯過高峯再出。我們叫作隨機接入協議。著名的以太網,用的就是這個方式。

解決了第二個問題,就是解決了媒體接入控制的問題,MAC的問題也就解決好了。這和MAC地址沒什麼關係。

鏈路層地址 網絡包格式 解決: 發給誰,誰接收?

接下來要解決第一個問題:發給誰,誰接收?這裏用到一個物理地址,叫作鏈路層地址。但是因爲第二層主要解決媒體接入控制的問題,所以它常被稱爲MAC地址

解決第一個問題就牽扯到第二層的網絡包格式。對於以太網,第二層的最開始,就是目標的MAC地址源的MAC地址
在這裏插入圖片描述
接下來是類型,大部分的類型是IP數據包,然後IP裏面包含TCP、UDP,以及HTTP等,這都是裏層封裝的事情。

有了這個目標MAC地址,數據包在鏈路上廣播,MAC的網卡才能發現,這個包是給它的。MAC的網卡把包收進來,然後打開IP包,發現IP地址也是自己的,再打開TCP包,發現端口是自己,也就是 80,而 nginx就是監聽80。

於是將請求提交給nginx,nginx返回一個網頁。然後將網頁需要發回請求的機器。然後層層封裝,最後到MAC層。因爲來的時候有源MAC地址,返回的時候,源MAC就變成了目標MAC,再返給請求的機器。

CRC(循環冗餘檢測)解決: 如果發送的時候出現了錯誤,怎麼辦?

對於以太網,第二層的最後面是CRC,也就是循環冗餘檢測。通過XOR異或算法,來計算整個包是否在發送的過程中出現了錯誤,主要解決第三個問題

ARP協議 解決:不知道目標機器MAC地址

這裏還有一個沒有解決的問題,當源機器知道目標機器的時候,可以將目標地址放入包裏面,如果不知道呢? 一個廣播的網絡裏面接入了N臺機器,我怎麼知道每個MAC地址是誰呢?這就是ARP協議,也就是已知IP地址,求MAC地址的協議。
在這裏插入圖片描述
在一個局域網裏面,當知道了 IP地址,不知道MAC怎麼辦呢?靠"吼”。
在這裏插入圖片描述
廣而告之,發送一個廣播包,誰是這個IP誰來回答。具體詢問和回答的報文就像下面這樣:
在這裏插入圖片描述
爲了避免每次都用ARP請求,機器本地也會進行ARP緩存。當然機器會不斷地上線下線,IP也可能會變,所以ARP的MAC地址緩存過一段時間就會過期。

局域網

好了,至此我們宿舍四個電腦就組成了一個局域網。用Hub連接起來,就可以玩局域網版的《魔獸爭霸》了。 
在這裏插入圖片描述
打開遊戲,進入"局域網選項”,選擇一張地圖,點擊"創建遊戲”,就可以進入這張地圖的房間中。 等同一個局域網裏的其他小夥伴加入後,遊戲就可以開始了。

這種組網的方法,對一個宿舍來說沒有問題,但是一旦機器數目增多,問題就出現了。因爲Hub是廣播 的,不管某個接口是否需要,所有的Bit都會被髮送出去,然後讓主機來判斷是不是需要。這種方式路上的車少就沒問題,車一多,產生衝突的概率就提高了。而且把不需要的包轉發過去,純屬浪費。看來 Hub 這種不管三七二十一都轉發的設備是不行了,需要點兒智能的。因爲每個口都只連接一臺電腦,這臺電腦又不怎麼換IP和MAC地址,只要記住這臺電腦的MAC地址,如果目標MAC地址不是這臺電腦的,這個口就不用轉發了。

交換機

誰能知道目標MAC地址是否就是連接某個口的電腦的MAC地址呢?這就需要一個能把MAC頭拿下來,檢查一下目標MAC地址,然後根據策略轉發的設備,按第二節課中講過的,這個設備顯然是個二層設備,我們稱爲交換機

交換機怎麼知道每個口的電腦的MAC地址呢?這需要交換機會學習。

一臺MAC1電腦將一個包發送給另一臺MAC2電腦,當這個包到達交換機的時候,一開始交換機也不知道MAC2的電腦在哪個口,所以沒辦法,它只能將包轉發給出了來的那個口之外的其他所有的口。但是,這個時候,交換機會幹一件非常聰明的事情,就是交換機會記住,MAC1是來自一個明確的口。以後有包的目的地址是MAC1的,直接發送到這個口就可以了。

當交換機作爲一個關卡一樣,過了一段時間之後,就有了整個網絡的一個結構了,這個時候,基本上不用廣播了,全部可以準確轉發。當然,每個機器的IP地址會變,所在的口也會變,因而交換機上的學習的結果,我們稱爲轉發表,是有一個過期時間的

有了交換機,一般來說,你接個幾十臺、上百臺機器打遊戲,應該沒啥問題。你可以組個戰隊了。能上網了,就可以玩網遊了。

這裏,給你推薦一個課程,極客時間新上線了《從0開始學遊戲開發》,由原網易遊戲引擎架構師、資深底層技術專家蔡能老師,手把手帶你梳理遊戲開發的流程和細節,爲你剖析熱門遊戲的成功之道。幫助普通程序員成爲遊戲開發工程師,步入遊戲開發之路。

小結

好了,今天的內容差不多了,我們來總結一下,有三個重點需要你記住:
第一,MAC層是用來解決多路訪問的堵車問題的;
第二,ARP是通過吼的方式來尋找目標MAC地址的,吼完之後記住一段時間,這個叫作緩存;
第三,交換機是有MAC地址學習能力的,學完了它就知道誰在哪兒了,不用廣播了。

最後,給你留兩個思考題吧。

  1. 在二層中我們講了 ARP協議,即已知IP地址求MAC ;還有一種RARP協議,即已知MAC求IP 的,你知道它可以用來幹什麼嗎?
  2. 如果一個局域網裏面有多個交換機,ARP廣播的模式會出現什麼問題呢?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章