網(wǎng)絡(luò)數(shù)據(jù)原來是這么傳輸?shù)模ńY(jié)合動(dòng)畫解析)

前言

世界上第一個(gè)互聯(lián)網(wǎng)web網(wǎng)頁誕生于1990年12月25日(次年8月對(duì)外開放),至今大約有28年的歷史,它是由萬維網(wǎng)之父蒂姆·伯納斯·李(Tim Berners-Lee)與羅伯特·卡里奧在CERN(歐洲核子研究委員會(huì))一起打造,首次成功通過因特爾網(wǎng)絡(luò)實(shí)現(xiàn)HTTP代理與服務(wù)器通訊。而這次通訊成功,標(biāo)志著互聯(lián)網(wǎng)的到來,具有劃時(shí)代的意義。

1990年,世界上第一個(gè)互聯(lián)網(wǎng)Web網(wǎng)頁誕生,到現(xiàn)在2021年,已經(jīng)過去了30多個(gè)年頭。

我們每天都可以通過互聯(lián)網(wǎng)搜索信息,查看新聞,打游戲,辦公。

互聯(lián)網(wǎng)的使用已經(jīng)融入我們的生活,再也離不開了(特別是我們這一批依賴于互聯(lián)網(wǎng)生存的程序員)

那么對(duì)于互聯(lián)網(wǎng)中數(shù)據(jù)的傳輸過程,你了解多少呢?面試遇到類似的問題你能答上來嗎?

今天我將結(jié)合動(dòng)畫形式和大家聊聊網(wǎng)絡(luò)傳輸數(shù)據(jù)的過程。

應(yīng)用層(從輸入網(wǎng)址開始)

image

當(dāng)我們?cè)跒g覽器中輸入我們的網(wǎng)址,網(wǎng)絡(luò)就開始數(shù)據(jù)傳輸了。

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

那么瀏覽器就會(huì)根據(jù)我們輸入的這個(gè)URL,進(jìn)行解析。

一般一個(gè)URL的格式如下:

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

其中:

  • http 屬于協(xié)議類型
  • www.baidu.com 屬于服務(wù)器地址
  • 80 屬于端口號(hào)
  • /s 屬于路徑
  • ie=utf-8 屬于攜帶參數(shù)

經(jīng)過這樣的解析,最后會(huì)形成一個(gè)叫做請(qǐng)求消息的東西,也叫請(qǐng)求報(bào)文。

這個(gè)請(qǐng)求報(bào)文的一般格式是這樣的:

(請(qǐng)求行)
GET /s HTTP/1.1

(請(qǐng)求頭Header)
Host: www.baidu.com
Content-Type: text/plain

(請(qǐng)求體Body)
name=123
  • 請(qǐng)求行(包括請(qǐng)求方法、請(qǐng)求路徑、HTTP版本)
  • 請(qǐng)求頭Header(包括域名、數(shù)據(jù)類型、cookie、等等)
  • 請(qǐng)求體Body(一般存儲(chǔ)post請(qǐng)求時(shí)候的一些參數(shù)數(shù)據(jù))

到此一個(gè)請(qǐng)求報(bào)文,或者叫HTTP請(qǐng)求消息,就生成好了。

但是瀏覽器的工作還沒完成哦,

在這之后,瀏覽器還做了一件事,就是去DNS服務(wù)器上查詢這個(gè)域名對(duì)應(yīng)的IP地址

當(dāng)然瀏覽器本身是查詢不了的,需要借助電腦上的DNS解析器,其實(shí)就是一個(gè)DNS客戶端。

DNS,域名系統(tǒng)(英文:Domain Name System,縮寫:DNS)是互聯(lián)網(wǎng)的一項(xiàng)服務(wù)。它作為將域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫,能夠使人更方便地訪問互聯(lián)網(wǎng)

DNS解析器會(huì)向DNS服務(wù)器發(fā)送查詢消息,帶著這個(gè)域名。
然后DNS服務(wù)器就會(huì)返回相應(yīng)的響應(yīng)消息,帶上域名對(duì)應(yīng)的IP地址

到此,瀏覽器的工作就完成了,接下來就交給操作系統(tǒng)中的TCP協(xié)議棧,也就是我們常說的傳輸層。

傳輸層TCP(拿到數(shù)據(jù)了我該怎么做)

image

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

  • 首先,TCP是一個(gè)協(xié)議,傳輸控制協(xié)議。
  • 其次,它會(huì)在系統(tǒng)中存在一個(gè)TCP傳輸實(shí)體。TCP實(shí)體可以是一個(gè)庫過程、一個(gè)用戶進(jìn)程,或者內(nèi)核的一部分。

所以可以理解為一個(gè)TCP進(jìn)程,管理著TCP相關(guān)的流、進(jìn)行TCP協(xié)議相關(guān)的工作。

TCP拿到數(shù)據(jù)之后,首先要做的就是把數(shù)據(jù)分成一個(gè)個(gè)數(shù)據(jù)包。

主要是為了數(shù)據(jù)傳輸?shù)?code>穩(wěn)定、安全:

  • 1、如果數(shù)據(jù)過大,本身傳輸?shù)乃俣染妥兟?,如果過程中發(fā)生問題,又要重新傳,大大降低了效率。所以分成一個(gè)個(gè)小的數(shù)據(jù)包就能在某個(gè)包發(fā)生問題后,只需要重傳這個(gè)包就行了。
  • 2、分成多個(gè)數(shù)據(jù)包之后,也增加了對(duì)數(shù)據(jù)竊聽的困難,如果要竊聽,需要拿到所有的數(shù)據(jù)并且能正確拼接才行。
  • 3、是關(guān)于路由的問題,不同的包經(jīng)過不同路由到底目的地,就算某個(gè)路由中斷,也只會(huì)造成比較小的影響。

所以互聯(lián)網(wǎng)就基于包交換來傳輸信息,也限定了每個(gè)數(shù)據(jù)包的大小。

TCP層的第一個(gè)工作,就將剛才拿到的數(shù)據(jù)分成一個(gè)個(gè)數(shù)據(jù)包,然后做第二步工作:加頭信息。

大家從動(dòng)畫中應(yīng)該可以看到,在每個(gè)數(shù)據(jù)包上都會(huì)加一段頭信息,頭信息中有兩個(gè)重要信息,大家一定要記住:

  • 序號(hào)(發(fā)送數(shù)據(jù)的順序編號(hào))
  • ACK號(hào)(接受數(shù)據(jù)的順序編號(hào))

這兩個(gè)信息在數(shù)據(jù)雙向傳輸中發(fā)揮了重要的作用,關(guān)系到數(shù)據(jù)的拼裝、數(shù)據(jù)重傳等,下次說到三次握手的時(shí)候會(huì)說到。

加上了TCP頭信息的數(shù)據(jù)包,就改名叫做TCP數(shù)據(jù)包

然后將這個(gè)TCP數(shù)據(jù)包發(fā)送給IP協(xié)議模塊。

網(wǎng)絡(luò)層IP(我要找到傳輸?shù)姆较颍?/h2>
image

首先我們要明確的一點(diǎn)就是,網(wǎng)絡(luò)中數(shù)據(jù)不是一下就從客戶端傳到服務(wù)器端的,中間會(huì)穿插很多路由器轉(zhuǎn)接。

路由器是連接兩個(gè)或多個(gè)網(wǎng)絡(luò)的硬件設(shè)備,在網(wǎng)絡(luò)間起網(wǎng)關(guān)的作用,是讀取每一個(gè)數(shù)據(jù)包中的地址然后決定如何傳送的專用智能性的網(wǎng)絡(luò)設(shè)備。

就像這樣:

image

再說回數(shù)據(jù)傳輸,

IP模塊拿到TCP數(shù)據(jù)包之后,又要開始添加數(shù)據(jù)頭信息,首先增加了一個(gè)IP頭信息:

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

然后通過這個(gè)IP地址,就知道數(shù)據(jù)傳輸?shù)姆较?,從而找到下一個(gè)路由器MAC地址。然后再次增加一個(gè)頭部,MAC頭信息:

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

最后的以太網(wǎng)數(shù)據(jù)包就是這個(gè)樣子:(圖片來源自參考鏈接)

image

IP模塊會(huì)將這個(gè)數(shù)據(jù)包發(fā)送給數(shù)據(jù)鏈路層。

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

image

數(shù)據(jù)鏈路層是負(fù)責(zé)網(wǎng)絡(luò)在現(xiàn)實(shí)世界的一個(gè)表現(xiàn),比如以太網(wǎng),Wi-Fi。

數(shù)據(jù)鏈路層拿到數(shù)據(jù)包之后,會(huì)轉(zhuǎn)換成電信號(hào)或者光信號(hào)。

電信號(hào)是指隨著時(shí)間而變化的電壓或電流.

然后通過網(wǎng)線或者光纖發(fā)送出去,再由路由器等轉(zhuǎn)發(fā)設(shè)備一步步到底我們的目的地——服務(wù)器。

數(shù)據(jù)接收

image

數(shù)據(jù)的接收和發(fā)送的過程完全相反。

  • 數(shù)據(jù)包到達(dá)服務(wù)器的數(shù)據(jù)鏈路層,比如以太網(wǎng),然后會(huì)將其轉(zhuǎn)換為數(shù)據(jù)包(數(shù)字信號(hào))交給IP模塊
  • IP模塊會(huì)將MAC頭部和IP頭部后面的內(nèi)容,也就是TCP數(shù)據(jù)包發(fā)送給TCP模塊。
  • TCP模塊會(huì)解析TCP頭信息,然后和客戶端溝通表示收到這個(gè)數(shù)據(jù)包了。
  • TCP模塊在收到消息的所有數(shù)據(jù)包之后,就會(huì)封裝好消息,生成相應(yīng)報(bào)文發(fā)給應(yīng)用層,也就是HTTP層。
  • HTTP層收到消息,比如是HTML數(shù)據(jù),就會(huì)解析這個(gè)HTML數(shù)據(jù),最終繪制到瀏覽器頁面上。

到此,整個(gè)網(wǎng)絡(luò)通信就簡單介紹完了。

參考

百度百科
《網(wǎng)絡(luò)是怎樣連接的》
https://www.ttssoo.com/huanqiushiye/shijie-shangdi-yigehub.html
http://www.ruanyifeng.com/blog/2017/06/tcp-protocol.html

拜拜

感謝大家的閱讀,有一起學(xué)習(xí)的小伙伴可以關(guān)注下我的公眾號(hào)——碼上積木????
每天一個(gè)知識(shí)點(diǎn),建立完整知識(shí)體系架構(gòu)。
這里有一群很好的Android小伙伴,歡迎大家加入~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容