1. 程式人生 > >網路資料原來是這麼傳輸的(結合動畫解析)

網路資料原來是這麼傳輸的(結合動畫解析)

## 前言 >世界上第一個網際網路web網頁誕生於1990年12月25日(次年8月對外開放),至今大約有28年的歷史,它是由全球資訊網之父蒂姆·伯納斯·李(Tim Berners-Lee)與羅伯特·卡里奧在CERN(歐洲核子研究委員會)一起打造,首次成功通過因特爾網路實現HTTP代理與伺服器通訊。而這次通訊成功,標誌著網際網路的到來,具有劃時代的意義。 從`1990年`,世界上第一個網際網路Web網頁誕生,到現在`2021年`,已經過去了30多個年頭。 我們每天都可以通過網際網路搜尋資訊,檢視新聞,打遊戲,辦公。 網際網路的使用已經`融入`我們的生活,再也離不開了(特別是我們這一批依賴於網際網路生存的程式設計師) 那麼對於網際網路中`資料的傳輸過程`,你瞭解多少呢?面試遇到類似的問題你能答上來嗎? 今天我將結合動畫形式和大家聊聊`網路傳輸資料的過程`。 ## 應用層(從輸入網址開始) ![](http://jimulz.gitee.io/blog-img/202101/26gif1.gif) 當我們在瀏覽器中輸入我們的網址,網路就開始資料傳輸了。 比如我們輸入 `http://www.google.com` 那麼瀏覽器就會根據我們輸入的這個URL,進行解析。 一般一個`URL`的格式如下: ```java http://www.baidu.com:80/s?ie=utf-8 ``` 其中: * `http` 屬於協議型別 * `www.baidu.com` 屬於伺服器地址 * `80` 屬於埠號 * `/s` 屬於路徑 * `ie=utf-8` 屬於攜帶引數 經過這樣的解析,最後會形成一個叫做`請求訊息`的東西,也叫請求報文。 這個請求報文的一般格式是這樣的: ```java (請求行) GET /s HTTP/1.1 (請求頭Header) Host: www.baidu.com Content-Type: text/plain (請求體Body) name=123 ``` * 請求行(包括請求方法、請求路徑、HTTP版本) * 請求頭Header(包括域名、資料型別、cookie、等等) * 請求體Body(一般儲存post請求時候的一些引數資料) 到此一個`請求報文`,或者叫HTTP請求訊息,就生成好了。 但是瀏覽器的工作還沒完成哦, 在這之後,瀏覽器還做了一件事,就是去`DNS伺服器`上查詢這個域名對應的`IP地址`。 當然瀏覽器本身是查詢不了的,需要藉助電腦上的`DNS解析器`,其實就是一個`DNS客戶端`。 >DNS,域名系統(英文:Domain Name System,縮寫:DNS)是網際網路的一項服務。它作為將域名和IP地址相互對映的一個分散式資料庫,能夠使人更方便地訪問網際網路 `DNS解析器`會向`DNS伺服器`傳送查詢訊息,帶著這個域名。 然後DNS伺服器就會返回相應的`響應訊息`,帶上域名對應的`IP地址`。 到此,瀏覽器的工作就完成了,接下來就交給作業系統中的`TCP協議棧`,也就是我們常說的傳輸層。 ## 傳輸層TCP(拿到資料了我該怎麼做) ![](http://jimulz.gitee.io/blog-img/202101/26gif2.gif) 說到TCP,可能有人就會問了,`TCP`到底在哪呢,到底是啥呢? * `首先`,TCP是一個協議,傳輸控制協議。 * `其次`,它會在系統中存在一個TCP傳輸實體。TCP實體可以是一個庫過程、一個使用者程序,或者核心的一部分。 所以可以理解為一個`TCP程序`,管理著`TCP`相關的流、進行`TCP協議`相關的工作。 TCP拿到資料之後,首先要做的就是把資料分成一個個`資料包`。 主要是為了資料傳輸的`穩定、安全`: * 1、如果資料過大,本身傳輸的速度就變慢了,如果過程中發生問題,又要重新傳,大大降低了效率。所以分成一個個小的資料包就能在某個包發生問題後,只需要重傳這個包就行了。 * 2、分成多個數據包之後,也增加了對資料竊聽的困難,如果要竊聽,需要拿到所有的資料並且能正確拼接才行。 * 3、是關於路由的問題,不同的包經過不同路由到底目的地,就算某個路由中斷,也只會造成比較小的影響。 所以網際網路就基於`包交換`來傳輸資訊,也限定了每個資料包的大小。 `TCP層`的第一個工作,就將剛才拿到的資料分成一個個`資料包`,然後做第二步工作:`加頭資訊`。 大家從動畫中應該可以看到,在每個資料包上都會加一段頭資訊,`頭資訊`中有兩個重要資訊,大家一定要記住: * 序號(傳送資料的順序編號) * ACK號(接受資料的順序編號) 這兩個資訊在資料雙向傳輸中發揮了重要的作用,關係到資料的`拼裝、資料重傳`等,下次說到三次握手的時候會說到。 加上了`TCP頭資訊`的資料包,就改名叫做`TCP資料包`。 然後將這個TCP資料包傳送給`IP協議模組`。 ## 網路層IP(我要找到傳輸的方向) ![](http://jimulz.gitee.io/blog-img/202101/26gif3.gif) 首先我們要明確的一點就是,網路中資料不是一下就從客戶端傳到伺服器端的,中間會穿插很多路由器轉接。 >路由器是連線兩個或多個網路的硬體裝置,在網路間起閘道器的作用,是讀取每一個數據包中的地址然後決定如何傳送的專用智慧性的網路裝置。 就像這樣: ![](http://jimulz.gitee.io/blog-img/202101/26luyou.png) 再說回`資料傳輸`, `IP模組`拿到TCP資料包之後,又要開始新增資料頭資訊,首先增加了一個IP頭資訊: `IP頭資訊`中包含了目的地的`IP地址`。 然後通過這個IP地址,就知道資料傳輸的方向,從而找到下一個路由器`MAC地址`。然後再次增加一個頭部,MAC頭資訊: `MAC頭資訊`就包括了下一個路由器的`MAC地址`。 最後的`乙太網資料包`就是這個樣子:(圖片來源自參考連結) ![](http://www.ruanyifeng.com/blogimg/asset/201205/bg2012052913.png) `IP模組`會將這個資料包傳送給資料鏈路層。 ## 資料鏈路層(我才是真正把資訊發出去的!) ![](http://jimulz.gitee.io/blog-img/202101/26gif4.gif) `資料鏈路層`是負責網路在現實世界的一個表現,比如`乙太網,Wi-Fi`。 資料鏈路層拿到資料包之後,會轉換成`電訊號或者光訊號`。 >電訊號是指隨著時間而變化的電壓或電流. 然後通過`網線或者光纖`傳送出去,再由路由器等轉發裝置一步步到底我們的目的地——伺服器。 ## 資料接收 ![](http://jimulz.gitee.io/blog-img/202101/26jieshou.png) 資料的接收和傳送的過程完全相反。 * 資料包到達伺服器的`資料鏈路層`,比如乙太網,然後會將其轉換為資料包(數字訊號)交給`IP模組`。 * `IP模組`會將MAC頭部和IP頭部後面的內容,也就是TCP資料包傳送給TCP模組。 * `TCP模組`會解析TCP頭資訊,然後和客戶端溝通表示收到這個資料包了。 * `TCP模組`在收到訊息的所有資料包之後,就會封裝好訊息,生成相應報文發給應用層,也就是HTTP層。 * `HTTP層`收到訊息,比如是HTML資料,就會解析這個HTML資料,最終繪製到瀏覽器頁面上。 到此,整個網路通訊就簡單介紹完了。 ## 參考 百度百科 《網路是怎樣連線的》 https://www.ttssoo.com/huanqiushiye/shijie-shangdi-yigehub.html http://www.ruanyifeng.com/blog/2017/06/tcp-protocol.html ## 拜拜 > 有一起學習的小夥伴可以關注下❤️ 我的公眾號——碼上積木,每天剖析一個知識點,我們一起積累知識,形成完整體系架構。公眾號回覆111可獲得《面試題思考與解答》以往期刊。 ![](https://s1.ax1x.com/2020/11/05/BRV7Mq