前言
世界上第一個網際網路web網頁誕生於1990年12月25日(次年8月對外開放),至今大約有28年的歷史,它是由全球資訊網之父蒂姆·伯納斯·李(Tim Berners-Lee)與羅伯特·卡里奧在CERN(歐洲核子研究委員會)一起打造,首次成功通過因特爾網路實現HTTP代理與伺服器通訊。而這次通訊成功,標誌著網際網路的到來,具有劃時代的意義。
從1990年
,世界上第一個網際網路Web網頁誕生,到現在2021年
,已經過去了30多個年頭。
我們每天都可以通過網際網路搜尋資訊,檢視新聞,打遊戲,辦公。
網際網路的使用已經融入
我們的生活,再也離不開了(特別是我們這一批依賴於網際網路生存的程式設計師)
那麼對於網際網路中資料的傳輸過程
,你瞭解多少呢?面試遇到類似的問題你能答上來嗎?
今天我將結合動畫形式和大家聊聊網路傳輸資料的過程
。
應用層(從輸入網址開始)
當我們在瀏覽器中輸入我們的網址,網路就開始資料傳輸了。
比如我們輸入 http://www.google.com
那麼瀏覽器就會根據我們輸入的這個URL,進行解析。
一般一個URL
的格式如下:
http://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資料,最終繪製到瀏覽器頁面上。
到此,整個網路通訊就簡單介紹完了。
參考
百度百科
《網路是怎樣連線的》
https://www.ttssoo.com/huanqiushiye/shijie-shangdi-yigehub.html
http://www.ruanyifeng.com/blog/2017/06/tcp-protocol.html
拜拜
有一起學習的小夥伴可以關注下❤️ 我的公眾號——碼上積木,每天剖析一個知識點,我們一起積累知識,形成完整體系架構。公眾號回覆111可獲得《面試題思考與解答》以往期刊。