|
前言 世界上第一個(gè)互聯(lián)網(wǎng)web網(wǎng)頁(yè)誕生于1990年12月25日(次年8月對(duì)外開放),至今大約有28年的歷史,它是由萬(wàn)維網(wǎng)之父蒂姆·伯納斯·李(Tim Berners-Lee)與羅伯特·卡里奧在CERN(歐洲核子研究委員會(huì))一起打造,首次成功通過(guò)因特爾網(wǎng)絡(luò)實(shí)現(xiàn)HTTP代理與服務(wù)器通訊。而這次通訊成功,標(biāo)志著互聯(lián)網(wǎng)的到來(lái),具有劃時(shí)代的意義。 從1990年,世界上第一個(gè)互聯(lián)網(wǎng)Web網(wǎng)頁(yè)誕生,到現(xiàn)在2021年,已經(jīng)過(guò)去了30多個(gè)年頭。 我們每天都可以通過(guò)互聯(lián)網(wǎng)搜索信息,查看新聞,打游戲,辦公。 互聯(lián)網(wǎng)的使用已經(jīng)融入我們的生活,再也離不開了(特別是我們這一批依賴于互聯(lián)網(wǎng)生存的程序員) 那么對(duì)于互聯(lián)網(wǎng)中數(shù)據(jù)的傳輸過(guò)程,你了解多少呢?面試遇到類似的問(wèn)題你能答上來(lái)嗎? 今天我將結(jié)合動(dòng)畫形式和大家聊聊網(wǎng)絡(luò)傳輸數(shù)據(jù)的過(guò)程。 應(yīng)用層(從輸入網(wǎng)址開始) ![]() 當(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)過(guò)這樣的解析,最后會(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)求消息,就生成好了。 但是瀏覽器的工作還沒(méi)完成哦, 在這之后,瀏覽器還做了一件事,就是去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ù)庫(kù),能夠使人更方便地訪問(wèn)互聯(lián)網(wǎng) DNS解析器會(huì)向DNS服務(wù)器發(fā)送查詢消息,帶著這個(gè)域名。 然后DNS服務(wù)器就會(huì)返回相應(yīng)的響應(yīng)消息,帶上域名對(duì)應(yīng)的IP地址。 到此,瀏覽器的工作就完成了,接下來(lái)就交給操作系統(tǒng)中的TCP協(xié)議棧,也就是我們常說(shuō)的傳輸層。 傳輸層TCP(拿到數(shù)據(jù)了我該怎么做) ![]() 說(shuō)到TCP,可能有人就會(huì)問(wèn)了,TCP到底在哪呢,到底是啥呢? 首先,TCP是一個(gè)協(xié)議,傳輸控制協(xié)議。 其次,它會(huì)在系統(tǒng)中存在一個(gè)TCP傳輸實(shí)體。TCP實(shí)體可以是一個(gè)庫(kù)過(guò)程、一個(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ù)姆€(wěn)定、安全: 1、如果數(shù)據(jù)過(guò)大,本身傳輸?shù)乃俣染妥兟?,如果過(guò)程中發(fā)生問(wèn)題,又要重新傳,大大降低了效率。所以分成一個(gè)個(gè)小的數(shù)據(jù)包就能在某個(gè)包發(fā)生問(wèn)題后,只需要重傳這個(gè)包就行了。 2、分成多個(gè)數(shù)據(jù)包之后,也增加了對(duì)數(shù)據(jù)竊聽(tīng)的困難,如果要竊聽(tīng),需要拿到所有的數(shù)據(jù)并且能正確拼接才行。 3、是關(guān)于路由的問(wèn)題,不同的包經(jīng)過(guò)不同路由到底目的地,就算某個(gè)路由中斷,也只會(huì)造成比較小的影響。 所以互聯(lián)網(wǎng)就基于包交換來(lái)傳輸信息,也限定了每個(gè)數(shù)據(jù)包的大小。 TCP層的第一個(gè)工作,就將剛才拿到的數(shù)據(jù)分成一個(gè)個(gè)數(shù)據(jù)包,然后做第二步工作:加頭信息。 大家從動(dòng)畫中應(yīng)該可以看到,在每個(gè)數(shù)據(jù)包上都會(huì)加一段頭信息,頭信息中有兩個(gè)重要信息,大家一定要記?。?/p> 序號(hào)(發(fā)送數(shù)據(jù)的順序編號(hào)) ACK號(hào)(接受數(shù)據(jù)的順序編號(hào)) 這兩個(gè)信息在數(shù)據(jù)雙向傳輸中發(fā)揮了重要的作用,關(guān)系到數(shù)據(jù)的拼裝、數(shù)據(jù)重傳等,下次說(shuō)到三次握手的時(shí)候會(huì)說(shuō)到。 加上了TCP頭信息的數(shù)據(jù)包,就改名叫做TCP數(shù)據(jù)包。 然后將這個(gè)TCP數(shù)據(jù)包發(fā)送給IP協(xié)議模塊。 網(wǎng)絡(luò)層IP(我要找到傳輸?shù)姆较颍?/p> ![]() 首先我們要明確的一點(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è)備。 就像這樣: ![]() 再說(shuō)回?cái)?shù)據(jù)傳輸, IP模塊拿到TCP數(shù)據(jù)包之后,又要開始添加數(shù)據(jù)頭信息,首先增加了一個(gè)IP頭信息: IP頭信息中包含了目的地的IP地址。 然后通過(guò)這個(gè)IP地址,就知道數(shù)據(jù)傳輸?shù)姆较?,從而找到下一個(gè)路由器MAC地址。然后再次增加一個(gè)頭部,MAC頭信息: MAC頭信息就包括了下一個(gè)路由器的MAC地址。 最后的以太網(wǎng)數(shù)據(jù)包就是這個(gè)樣子:(圖片來(lái)源自參考鏈接) ![]() IP模塊會(huì)將這個(gè)數(shù)據(jù)包發(fā)送給數(shù)據(jù)鏈路層。 數(shù)據(jù)鏈路層(我才是真正把信息發(fā)出去的?。?/p> ![]() 數(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í)間而變化的電壓或電流. 然后通過(guò)網(wǎng)線或者光纖發(fā)送出去,再由路由器等轉(zhuǎn)發(fā)設(shè)備一步步到底我們的目的地——服務(wù)器。 數(shù)據(jù)接收 ![]() 數(shù)據(jù)的接收和發(fā)送的過(guò)程完全相反。 數(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ù),最終繪制到瀏覽器頁(yè)面上。 到此,整個(gè)網(wǎng)絡(luò)通信就簡(jiǎn)單介紹完了。 參考 百度百科 《網(wǎng)絡(luò)是怎樣連接的》 https://www./huanqiushiye/shijie-shangdi-yigehub.html http://www./blog/2017/06/tcp-protocol.html |
|
|