網絡協議 3 - 從物理層到 MAC 層

    在上一篇博文中,咱們見證了 IP 地址的誕生,機器一旦有了 IP,就能夠在網絡的環境裏和其餘的機器展開溝通了。html

    今天,咱們來認識下 物理層MAC 層。nginx

    平常生活中,身爲 90 後的咱們,若是不是通訊相關專業出身的,應該歷來沒有接觸過物理層和 MAC 層的設備。咱們接觸最多的,可能就是路由器了。而路由器其實是第三層-網絡層的設備了。算法

    那我們怎麼認識物理層呢?就不扯那些深奧的理論了,從宿舍聯機打魔獸提及吧。緩存

    要想宿舍裏的幾臺電腦鏈接到一個局域網內,第一反應就是買個路由器,你們都連上去就 OK 了。可是在 15 年前,路由器尚未那麼普及的時候,你在校園裏找個通訊專業的學生問,知道怎麼組建宿舍局域網嗎?他應該會回答你,有三種方式:網絡

  1. 網線鏈接
  2. 集線器鏈接
  3. 交換機

物理層

    上面三種方式中,網線鏈接和集線器是徹底在物理層工做,我們就先見識下這兩種方式。學習

網線鏈接

    是的,你沒看錯,是用一根網線鏈接在兩個電腦上。網線水晶頭的第 一、2 和第 三、6腳,分別起着發、收信號的做用,要想經過一根網線將兩臺電腦鏈接在一個局域網上,須要額外作的操做就是將網線其中一端的 1 號和 3 號線、2 號和 6 號線互換一下位置,這樣就能在物理層實現一端發送的信號,另外一端成功接收。計算機網絡

    固然,除了經過網線鏈接外,咱們還須要配置這兩臺電腦的 IP 地址、子網掩碼和默認網關,將這三項配置成爲一個網絡,不然是不通的。cdn

    這樣,一個宿舍的兩臺電腦就能夠聯機打魔獸了。htm

    問題來,若是又有一個舍友買了電腦,怎麼把三臺電腦連一塊兒呢?先別說交換機這高檔的東西,對於 15 年前的大學生來講,交換機太貴了,買不起。好在除了交換機外,還有個叫作 Hub 的東西,也就是集線器blog

集線器

    這種設備有多個口,能夠將宿舍裏的多臺電腦鏈接起來。和交換機不一樣的是,集線器很「傻」,它沒有大腦,徹底在物理層工做,將本身收到的每個字節,都複製到其它端口上去。

    這就像,小明想找小紅表白,他不知道小紅在哪一個小區,因而他就找其它小夥伴,讓每一個小夥伴負責一個小區,去每一戶問是否是小紅家,找到小紅的小夥伴就將表白語告訴小紅。

數據鏈路層

    上面經過 Hub 實現局域網的方式,你可能已經發現了,Hub 採起的是廣播的模式。若是每一臺電腦發出的包,局域網內的其它電腦都能收到,那就麻煩了。這就須要解決幾個問題:

  1. 這個包是發給誰的?誰接收?
  2. 你們都在發生消息,會不會產生混亂?有沒有前後的規則?
  3. 若是發生的時候出錯了,怎麼辦?

    這幾個問題,都是數據鏈路層,也就是 MAC 層要解決的問題。MAC 的全稱是 Medium Access Control,即媒體介質訪問控制。這裏的控制,其實就是控制在往媒體上發數據時,誰先發、誰後發的問題,也就是防止發生混亂。這就解決了第二個問題。這個問題中的規則,學名叫多路訪問。和咱們交通管制同樣,常見的有下面三種方式:

  • 方式一:分車道。每一個車一個車道,你走你的,我走個人,互不干擾。這在計算機網絡中叫作信道劃分
  • 方式二:今天單號出現,明天雙號出現,輪着來。這叫作輪流協議
  • 方式三:無論三七二十一,有事先出門,發現很堵,就回去等待 ,錯太高峯期再走。這叫作隨機接入協議。著名的以太網,用的就是這種方式。

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

    解決第一個問題就牽扯到第二層的網絡包格式。對於以太網,第二層的最開始,就是目標的 MAC 地址和源的 MAC 地址。

    接下來是類型。大部分的類型是 IP 數據包,其中 IP 裏面包含 TCP、UDP,以及 HTTP 等,這些都是裏層封裝的事情。

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

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

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

    這裏還有一個沒有解決的問題,當源機器知道目標機器的時候,能夠將模板地址放入包裏。若是不知道呢?一個廣播的網絡裏面接入了 N 臺地址,我怎麼知道每一個 MAC 地址是誰呢?這就是 ARP 協議,也就是已知 IP 地址,求 MAC 地址的協議

    在一個局域網裏,若是知道了 IP 地址,不知道 MAC 地址怎麼辦?這個在網絡協議-概述中有提過,本地通訊靠「吼」。

    發送一個廣播包,廣而告之,誰說這個 IP 誰來回答。具體詢問和回答的報文就像下面這樣:

    爲了不每次都用 ARP 協議,機器本地會進行 ARP 緩存。固然,緩存的 MAC 地址會有一個過時時間。

    上面解決了廣播發出的包,局域網內全部機器都能收到的問題。那麼 Hub 是採用怎麼樣的方式?

    實際上,Hub 無論某個接口是否須要,全部的數據都會發送出去,而後讓主機來判斷是否須要相關數據。這種方式會有兩個問題:

  1. 機器數目大幅增多後,產生衝突的機率就提升了。這很好理解,那麼多小夥伴去找小紅,發生交通事故的機率要大於,直接去她家表白發生交通事故的機率;
  2. 把大量不須要發送的包發送出去,浪費資源。

    明顯能夠看出,要解決上面兩個問題,只要咱們知道哪一個接口對應哪一個 MAC 地址就行了。若是目標 MAC 地址不是這臺電腦的,這個口就不用轉發了。

    那麼,誰能知道目標 MAC 地址是否就是鏈接某個口的電腦的 MAC 地址呢?這就須要一個能把 MAC 頭拿下來,檢查一下目標 MAC 地址,而後根據策略轉發的設備,也就是咱們以前提過的,二層設備-交換機

    交換機怎麼知道每一個口對應的電腦的 MAC 地址呢?這須要交換機能學習。這個也是交換機和 Hub 最明顯的區別。

    一臺 MAC1 電腦將一個包發送給另外一臺 MAC2 電腦,當這個包到達交換機的時候,一開始交換機也不知道 MAC2 電腦再哪一個口,因此沒辦法,它只能將包轉發給除了來的那個口以外的其餘全部的口。可是,這個時候,交換機會幹一件很聰明的事情,就是交換機記住,MAC1 是來自一個明確的口,之後有包的目的地址是 MAC1 的,就直接發送到對應口就能夠了。

    當交換機做爲一個關卡同樣,過來一段時間後,就有了整個網絡的一個結構了。這個時候,基本上不用廣播,所有能夠準確轉發。而交換機學習的結果,咱們成爲轉發表。固然,每臺機器的 IP 地址會變,所在的口也會變,因此轉發表也是有一個過時時間的。

小結

上面扯了一大堆,實際上也就是幾句話的事:

  • MAC 層是用來解決多路訪問的堵車問題的
  • ARP 是經過「吼」的方式來尋找目標 MAC 地址,以後會記住一段時間,這個叫作 ARP 緩存
  • 交換機是升級版的 Hub,它有 MAC 地址學習能力,學完就能記住每一個 MAC 地址對應哪一個口,學習的成果叫轉發表

參考:

  1. 劉超-趣談網絡協議系列課;
相關文章
相關標籤/搜索