網路協議 3 - 物理層 和 MAC 層

来源:https://www.cnblogs.com/cool2feel/archive/2019/08/27/11418299.html
-Advertisement-
Play Games

在上一篇博文中,我們見證了 IP 地址的誕生,機器一旦有了 IP,就可以在網路的環境里和其他的機器展開溝通了。 今天,我們來認識下 物理層 和 MAC 層。 日常生活中,身為 90 後的我們,如果不是通信相關專業出身的,應該從來沒有接觸過物理層和 MAC 層的設備。我們接觸最多的,可能就是路由器了。 ...


在上一篇博文中,我們見證了 IP 地址的誕生,機器一旦有了 IP,就可以在網路的環境里和其他的機器展開溝通了。

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

    日常生活中,身為 90 後的我們,如果不是通信相關專業出身的,應該從來沒有接觸過物理層和 MAC 層的設備。我們接觸最多的,可能就是路由器了。而路由器實際上是第三層-網路層的設備了。

    那咱們怎麼認識物理層呢?就不扯那些深奧的理論了,從宿舍聯機打魔獸說起吧。

    要想宿舍里的幾臺電腦連接到一個區域網內,第一反應就是買個路由器,大家都連上去就 OK 了。但是在 15 年前,路由器還沒有那麼普及的時候,你在校園裡找個通信專業的學生問,知道怎麼組建宿舍區域網嗎?他應該會回答你,有三種方式:

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

物理層

    上面三種方式中,網線連接和集線器是完全在物理層工作,咱們就先見識下這兩種方式。

網線連接

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

    當然,除了通過網線連接外,我們還需要配置這兩臺電腦的 IP 地址、子網掩碼和預設網關,將這三項配置成為一個網路,否則是不通的。

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

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

集線器

    這種設備有多個口,可以將宿舍里的多臺電腦連接起來。和交換機不同的是,集線器很“傻”,它沒有大腦,完全在物理層工作,將自己收到的每一個位元組,都複製到其它埠上去。

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

數據鏈路層

    上面通過 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 地址對應哪個口,學習的成果叫轉發表

 

歡迎添加個人微信號:Like若所思。

歡迎關註我的公眾號,不僅為你推薦最新的博文,還有更多驚喜和資源在等著你!一起學習共同進步!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 08.27自我總結 Vue的使用 一.掛載點 這樣設置好了後這個vue中的內容會與對應的css選擇器進行關聯 註意點: 掛載點只遍歷第一個匹配的結果 html與body標簽不可以作為掛載點 掛載點的只一般就採用id選擇器(唯一性) 二.插值表達式 :Vue中的msg變數發生變化的再沒其他約數條件下m ...
  • if語句 語法: if (expression1) { } else if (expression2) { } else { } 執行機制: 先對expression1做判定,如果為真,執行對應的代碼塊中的代碼執行完畢,分支結束 如果expression1為假,再根據這種機制往下對其它的表達式做判定 ...
  • Juqery插件編寫 基礎說明 ...
  • DOM簡介: 1、DOM:Document Object Model(簡稱文檔對象模型),是專門用於操作網頁內容API一套標準!網頁內容:字元、圖片等各種資源 2、核心DOM:操作一切結構化文檔的API標準!特點:強大,萬能;缺點:操作繁瑣。 3、HTML DOM:專門操作HTML網頁的API標準- ...
  • 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8" /> 5 <meta name="viewport" content="width=device-width, initial-scale=1"> 6 <title></title ...
  • 1.前端框架一般依賴node.js,我們首先要安裝node.js.請參考: http://www.cnblogs.com/wuac/p/6381819.html to:安裝好node.js後npm也安裝OK了 , 自己在設置一下環境變數路徑配置 自行百度。。 查看node版本命令:node -v 查 ...
  • 08.27自我總結 Vue的介紹及安裝和導入 一Vue的介紹 進式 JavaScript 框架 三大主流框架之一:Angular React Vue 先進的前端設計模式:MVVM 這個我們可以和之前的 設置模式結合其實他相當於mvcmc他將其中的邏輯控制又進行劃分劃分成視圖的邏輯,數據的邏輯. 可以 ...
  • 來,講故事: 單體架構(1): 小藍創辦了一家公司,由於資金緊張,招聘了小白負責行政,小紅負責財務,小黑負責技術,小黃負責運營,5個人擼起袖子就是乾,準備向市場推一個 “××寶” 的產品。 實際上每個人職責界限都不那麼明確,小白忙了小紅幫,小紅忙了小黑幫,小黑忙了沒人幫,小黃不忙到處幫,小藍組織幫幫 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...