前言
世界上第一個互聯網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可獲得《面試題思考與解答》以往期刊,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/253465.html
標籤:其他

