­

網絡數據原來是這麼傳輸的(結合動畫解析)

  • 2021 年 1 月 27 日
  • 筆記

前言

世界上第一個互聯網web網頁誕生於1990年12月25日(次年8月對外開放),至今大約有28年的歷史,它是由萬維網之父蒂姆·伯納斯·李(Tim Berners-Lee)與羅伯特·卡里奧在CERN(歐洲核子研究委員會)一起打造,首次成功通過因特爾網絡實現HTTP代理與服務器通訊。而這次通訊成功,標誌着互聯網的到來,具有劃時代的意義。

1990年,世界上第一個互聯網Web網頁誕生,到現在2021年,已經過去了30多個年頭。

我們每天都可以通過互聯網搜索信息,查看新聞,打遊戲,辦公。

互聯網的使用已經融入我們的生活,再也離不開了(特別是我們這一批依賴於互聯網生存的程序員)

那麼對於互聯網中數據的傳輸過程,你了解多少呢?面試遇到類似的問題你能答上來嗎?

今天我將結合動畫形式和大家聊聊網絡傳輸數據的過程

應用層(從輸入網址開始)

當我們在瀏覽器中輸入我們的網址,網絡就開始數據傳輸了。

比如我們輸入 //www.google.com

那麼瀏覽器就會根據我們輸入的這個URL,進行解析。

一般一個URL的格式如下:

//www.baidu.com:80/s?ie=utf-8

其中:

  • http 屬於協議類型
  • www.baidu.com 屬於服務器地址
  • 80 屬於端口號
  • /s 屬於路徑
  • ie=utf-8 屬於攜帶參數

經過這樣的解析,最後會形成一個叫做請求消息的東西,也叫請求報文。

這個請求報文的一般格式是這樣的:

(請求行)
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(拿到數據了我該怎麼做)

說到TCP,可能有人就會問了,TCP到底在哪呢,到底是啥呢?

  • 首先,TCP是一個協議,傳輸控制協議。
  • 其次,它會在系統中存在一個TCP傳輸實體。TCP實體可以是一個庫過程、一個用戶進程,或者內核的一部分。

所以可以理解為一個TCP進程,管理着TCP相關的流、進行TCP協議相關的工作。

TCP拿到數據之後,首先要做的就是把數據分成一個個數據包

主要是為了數據傳輸的穩定、安全

  • 1、如果數據過大,本身傳輸的速度就變慢了,如果過程中發生問題,又要重新傳,大大降低了效率。所以分成一個個小的數據包就能在某個包發生問題後,只需要重傳這個包就行了。
  • 2、分成多個數據包之後,也增加了對數據竊聽的困難,如果要竊聽,需要拿到所有的數據並且能正確拼接才行。
  • 3、是關於路由的問題,不同的包經過不同路由到底目的地,就算某個路由中斷,也只會造成比較小的影響。

所以互聯網就基於包交換來傳輸信息,也限定了每個數據包的大小。

TCP層的第一個工作,就將剛才拿到的數據分成一個個數據包,然後做第二步工作:加頭信息

大家從動畫中應該可以看到,在每個數據包上都會加一段頭信息,頭信息中有兩個重要信息,大家一定要記住:

  • 序號(發送數據的順序編號)
  • ACK號(接受數據的順序編號)

這兩個信息在數據雙向傳輸中發揮了重要的作用,關係到數據的拼裝、數據重傳等,下次說到三次握手的時候會說到。

加上了TCP頭信息的數據包,就改名叫做TCP數據包

然後將這個TCP數據包發送給IP協議模塊

網絡層IP(我要找到傳輸的方向)

首先我們要明確的一點就是,網絡中數據不是一下就從客戶端傳到服務器端的,中間會穿插很多路由器轉接。

路由器是連接兩個或多個網絡的硬件設備,在網絡間起網關的作用,是讀取每一個數據包中的地址然後決定如何傳送的專用智能性的網絡設備。

就像這樣:

再說回數據傳輸

IP模塊拿到TCP數據包之後,又要開始添加數據頭信息,首先增加了一個IP頭信息:

IP頭信息中包含了目的地的IP地址

然後通過這個IP地址,就知道數據傳輸的方向,從而找到下一個路由器MAC地址。然後再次增加一個頭部,MAC頭信息:

MAC頭信息就包括了下一個路由器的MAC地址

最後的以太網數據包就是這個樣子:(圖片來源自參考鏈接)

IP模塊會將這個數據包發送給數據鏈路層。

數據鏈路層(我才是真正把信息發出去的!)

數據鏈路層是負責網絡在現實世界的一個表現,比如以太網,Wi-Fi

數據鏈路層拿到數據包之後,會轉換成電信號或者光信號

電信號是指隨着時間而變化的電壓或電流.

然後通過網線或者光纖發送出去,再由路由器等轉發設備一步步到底我們的目的地——服務器。

數據接收

數據的接收和發送的過程完全相反。

  • 數據包到達服務器的數據鏈路層,比如以太網,然後會將其轉換為數據包(數字信號)交給IP模塊
  • IP模塊會將MAC頭部和IP頭部後面的內容,也就是TCP數據包發送給TCP模塊。
  • TCP模塊會解析TCP頭信息,然後和客戶端溝通表示收到這個數據包了。
  • TCP模塊在收到消息的所有數據包之後,就會封裝好消息,生成相應報文發給應用層,也就是HTTP層。
  • HTTP層收到消息,比如是HTML數據,就會解析這個HTML數據,最終繪製到瀏覽器頁面上。

到此,整個網絡通信就簡單介紹完了。

參考

百度百科
《網絡是怎樣連接的》
//www.ttssoo.com/huanqiushiye/shijie-shangdi-yigehub.html
//www.ruanyifeng.com/blog/2017/06/tcp-protocol.html

拜拜

有一起學習的小夥伴可以關注下❤️ 我的公眾號——碼上積木,每天剖析一個知識點,我們一起積累知識,形成完整體系架構。公眾號回復111可獲得《面試題思考與解答》以往期刊。