1. 程式人生 > >28張圖解 | 網際網路究竟是「如何連線,如何進行通訊」的?

28張圖解 | 網際網路究竟是「如何連線,如何進行通訊」的?

![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-2-1/1612147854165-image.png) # 前言 ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-30/1612015776326-image.png) 在[上一篇](https://www.wmyskxz.com/2021/01/30/tu-jie-wang-luo-jiu-jing-shi-ru-he-yun-zuo-de/)中,我們講解了網路是靠跨洋的海底電纜以及各大網際網路組織制定的規則、協議來進行連線運作的。 **但是具體是怎麼進行連線的?** 沒有說明得很清楚,今天就讓我們一起來探索探索。 # 一個簡單的網路 當兩臺計算機需要通訊時,您必須**物理的** *(通常使用網線)* 或**無線的** *(例如 Wifi 或藍芽)* 連結它們,所有現代計算機都可以維持這樣的連結。 ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-30/1612017327236-image.png) 這樣的網路不限於兩臺計算機之間,你**可以接入任意數量**的計算機,但很快也會**變得複雜**起來: ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-30/1612017923360-image.png) 例如,如果要連線 6 臺裝置,則需要 15 根網線,每臺計算機需要連線 5 根網線! 為了解決這樣的問題,我們需要一個**中間裝置**,讓所有計算機接入它,由這個中間裝置做**轉發**,這樣就能有效的減少網線的數量了: ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-30/1612019782397-image.png) 這樣一來,雖然減少了網線的數量,但同時也增加了要求。 最初我只需要把資訊通過合適的網線傳送出去就可以了,但現在,所有的資訊都統一發到**中間裝置**那裡,**誰發給誰的**,還必須計算機裝置自己說清楚。*(就像寫郵件一樣的)* ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-30/1612020980560-image.png) 另一點要求是這個中間裝置**不能進行廣播**。 ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-30/1612021974361-2021-01-30%2023.51.27.gif) 如果我們只是無腦的做轉發,讓所有其他計算機都接受到,把**是否要接受資訊的權利和判斷**交給接受的計算機,這既不安全也極大的浪費了網路資源。 *(當然自主搭建較為安全的網路環境中,我們可以使用只是無腦轉發的集線器來完成這一工作)* 所以我們中間裝置需要更加**智慧**一些,只轉發給需要資訊的人就好了: ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-31/1612022747097-2021-01-31%2000.04.40.gif) 要做到這一點,首先我們每臺裝置都需要一個**唯一的標識** *(名字)* 才行,這在**每一個網路裝置**出廠之前,生產它的廠家就已經給它賦予一個全球唯一的 **MAC 地址**。 ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-31/1612023322848-image.png) 形象地說,這就像我們的身份證號碼一樣,具有唯一性。 另一點就是我們需要一個地方記錄,哪一個 MAC 地址的裝置對應著中間裝置的物理連線的哪一個埠: ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-31/1612054183408-2021-01-31%2008.48.34.gif) 實際上,這就是**交換機**乾的事情。*(注意這是交換機不是路由器)* **可是這張表是如何建立的呢?** ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-31/1612055263736-image.png) 最開始啟動的時候,這張表是空白的。 當有資料交換髮生時,**交換機通過源 MAC 地址不斷進行學習到 MAC 地址表中**,並與埠進行關聯: ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-31/1612055830387-2021-01-31%2009.14.54.gif) 交換機在 MAC 地址表中**並未查詢到目標 MAC 地址**,因此該資料將從出了其入口介面之外所有的介面**泛洪**出去: ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-31/1612057065167-2021-01-31%2009.35.32.gif) C、D 機器在收到資料後就將資料丟棄了——因為並不是發給自己的——相反 B 機器因為 MAC 地址符合,就收下了,並且需要回複數據給 A 機器。 好了,此時對於交換機來說,又是一個**新的源 MAC 地址的資料**發來了,記錄學習的同時也查詢到要去往 A 機器的目標 MAC 地址已經存在了,於是直接轉發到 `01` 埠就好了: ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-31/1612057912918-2021-01-31%2009.51.00.gif) 就在這樣不斷的資料交換中,交換機不斷更新維護著自己的 MAC 地址表。 好了,現在總算有了一個由**交換機**組建的簡單網路了: ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-31/1612058141757-image.png) # 更大的網路 到目前為止,執行一切良好,可是**如果是連線成千上萬億臺計算機呢?** 我們很容易想到,理論上,可以通過多個交換機互聯來進行無限的擴充套件: ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-31/1612059031912-image.png) 但是由於**交換機本身沒有 MAC 地址**,所以數量超過一定時,每臺交換機維護的 MAC 地址表將會變得無法維護——事實上也無法儲存這麼大資料的 MAC 地址表。 所以我們需要一種擁有獨立 MAC 地址,幫助我們做轉發的裝置——**路由器**由此誕生。 ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-31/1612059931350-image.png) **路由器的每一個埠,都有一個獨立的 MAC 地址。** 這樣就有效減少了每臺裝置需要維護的 MAC 地址表的數量,但同時隨著網路的擴充套件,新的問題又出現了。 上面說到,MAC 地址就像我們的身份證一樣,雖然具有**唯一性**,但就像人和身份證的關係一樣,小範圍內,我能輕易的找到你,一旦範圍擴大 *(或者說環境變複雜)*,身份證這樣的資訊似乎對於「快速找到你」這件事來說,幫助很小。 ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-31/1612062072878-image.png) 我們需要另外一種資訊,來幫助定位——這就是 **IP 地址**,類似於你寫在快遞單上的地址一樣,它能幫助我們在網路中定位到你的終端。 為了適應這一改變,我們傳送的資料需要新增上更多的資訊: ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-31/1612062288511-image.png) 同樣的,**路由器**也對應需要額外的記錄 IP 地址與 MAC 地址的對應關係: ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-31/1612094231736-image.png) **IP** 地址的發明把紛繁複雜的網路世界 *(主要是不同網路硬體裝置)* 統一規劃到了一個整齊的網路中。 由於 IP 地址是跟地域掛鉤的,所以在網路中找到你的裝置就容易多了 *(就像你買淘寶需要先填寫自己的收貨地址一樣)*,我們也能夠使用路由器搭建起更大的網路: ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-1-31/1612096843357-image.png) # 網際網路 上面的網路非常接近我們所謂的 Internet,但是我們缺少一些東西。 我們不太可能在世界的每個地方之間都鋪設上電纜,事實上,**電話基礎設施**已經先於網路基礎設施連線起了全世界,這是我們需要完美的電線。 ![1858 年的跨大西洋海底電報電纜](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-2-1/1612141576546-image.png) 為了將我們的網路連線到電話基礎設施,我們需要一種稱為**調變解調器** *(俗稱"貓")* 的特殊裝置,這個裝置可以將來自我們網路的資訊轉換為可由電話基礎架構管理的資訊,反之亦然。 ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-2-1/1612141843675-image.png) *(相信不少小夥伴都還記得需要「撥號上網」的日子,這就是把網路接入電話基礎設施的過程,現在已經優化了)* 到此,我們的網路已經連上了電話基礎架構。 但我們的目的是把訊息傳送給我們要到達的其他網路——目前為止,這一整套網路都是基於自己的目的搭建的——為此,我們還需要把網路連線到 Internet 服務提供商(ISP)。 ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-2-1/1612142650498-image.png) ISP 是管理一些特殊路由器的公司,這些路由器都連結在一起,並且還可以訪問其他 ISP 的路由器。 *(中國的 ISP 服務商耳熟能詳:電信、網通、移動、聯通、鐵通等。)* 因此,來自我們網路的訊息將通過這麼多 ISP 網路搭建的基礎網路架構來傳送到目標網路——網際網路的基礎結構也由這個網路組成。 現在經過一系列的發展,已經形成了三層 ISP 結構的因特網了: ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-2-1/1612144629767-image.png) 由此,整個網際網路基礎架構就搭設好了。*(實際更復雜)* # 尋找目標終端 如果要把訊息傳送到計算機,則必須要指定 **IP 地址**,它是由一系列由點分割的四個數字組成,例如:`192.168.2.10`。 這對於計算機來說完全是可以的,但我們人類卻很難記住這種地址。 於是我們給 IP 地址加上了一個易於理解的名字,即 **域名 domain name**。 ![常見域名字尾](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-2-1/1612145531198-image.png) 例如 `google.com` 是作為 IP 地址 `173.194.121.32` 的域名使用,訪問這兩個地址是訪問的同一伺服器,這也是我們訪問 Internet 的簡便方法。 ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-2-1/1612145647781-image.png) 雖然我們通常使用域名來訪問網站,但 Internet 和 Web 卻並不等同,網路是基礎設施,在網際網路之上還有許多不同於 Web 的其他服務,例如電子郵件。 這兩者的轉換需要網際網路的**域名系統**服務來支撐,我們會在後續詳細說到。 另外我們可以給微信好友傳送訊息,也是因為我們通過微信 App 連入了騰訊的伺服器,以此為橋樑互相知道了 IP 地址。 ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-2-1/1612145864598-image.png) 總之,我們通訊必須指定 IP 地址。 # 後記 本篇文章,我們從最初兩臺互連的計算機一步一步發展到搭建起了整個網際網路的基礎通訊架構: 1. 通過交換機、路由器、調變解調器、ISP、跨洋電纜**物理橋接**; 2. 通過 MAC 地址、IP 地址的發展讓整個網路的網路裝置**邏輯互連**; ![](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-2-1/1612146383742-image.png) 至少對於這個複雜的 Internet 黑盒有了一定的瞭解和認識。 這其中涉及到很多複雜的協議 *(例如保證可靠通訊的 TCP/IP 協議)* 和演算法 *(查詢 IP 位置最佳路徑的路由演算法)* 等都沒有提及,**本篇的重點還是網路世界中的裝置是如何進行連結的**。 也是使用了 **PPT** 製作了動圖幫助大家理解,希望大家能夠有所收穫。 後續也會繼續跟大家一起學習計算機網路的基礎知識,也會嘗試著跟著[後端學習路線圖](https://roadmap.sh/backend)的腳步跟著大家一起學習進階。 ![https://roadmap.sh/backend](https://cdn.jsdelivr.net/gh/wmyskxz/BlogImage02/2021-2-1/1612147071259-image.png) (完) # 參考資料 1. 這就是網路嗎?|閃客sun - https://mp.weixin.qq.com/s/9frk_VS8Vh0mY-rXnitKFw 1. How does the Internet work? - https://developer.mozilla.org/en-US/docs/Learn/Common_questions/How_does_the_Internet_work 1. 知乎 | 交換機 MAC 表的獲取? - https://www.zhihu.com/question/58187639 1. 百度百科|MAC地址 - https://baike.baidu.com/item/MAC%E5%9C%B0%E5%9D%80 1. 為什麼有 MAC 地址還要有 IP 地址? - https://blog.csdn.net/qq_15760109/article/details/78210151 > - 本文已收錄至我的 Github 程式設計師成長系列 **【More Than Java】,學習,不止 Code,歡迎 star:[https://github.com/wmyskxz/MoreThanJava](https://github.com/wmyskxz/MoreThanJava)** > - **個人公眾號** :wmyskxz,**個人獨立域名部落格**:wmyskxz.com,堅持原創輸出,下方掃碼關注,2020,與您共同成長! ![](https://cdn.jsdelivr.net/gh/wmyskxz/img/img/common/qrcode.png) 非常感謝各位人才能 **看到這裡**,如果覺得本篇文章寫得不錯,覺得 **「我沒有三顆心臟」有點東西** 的話,**求點贊,求關注,求分享,求留言!** 創作不易,各位的支援和認可,就是我創作的最大動力,我們下篇文