相信去過大廠面試的時(shí)候大都會(huì)問及七層協(xié)議缰冤、四層協(xié)議盛撑、瀏覽器瀏覽一個(gè)網(wǎng)頁是怎么實(shí)現(xiàn)的or發(fā)生了什么之類的話題,其實(shí)都是問OSI七層協(xié)議參考模型或者TCP/IP四層協(xié)議的相關(guān)知識(shí),本文只是對(duì)其協(xié)議概念進(jìn)行概述脐湾,讓大家有個(gè)基本的了解乳乌,希望大家通過本文能對(duì)網(wǎng)絡(luò)節(jié)點(diǎn)間什么怎么實(shí)現(xiàn)的有個(gè)基本的認(rèn)知捧韵。
下圖是OSI七層協(xié)議、TCP/IP五層協(xié)議汉操、TCP/IP四層協(xié)議圖:
OSI七層模型通過七個(gè)層次化的結(jié)構(gòu)模型使不同的系統(tǒng)不同的網(wǎng)絡(luò)之間實(shí)現(xiàn)可靠的通信再来,其主要作用是幫助不同類型的主機(jī)實(shí)現(xiàn)數(shù)據(jù)傳輸。
物理層
物理層是OSI參考模型的最底層磷瘤,它的作用是實(shí)現(xiàn)相鄰計(jì)算機(jī)節(jié)點(diǎn)之間比特流的透明傳送芒篷,屏蔽了具體傳輸介質(zhì)和物理設(shè)備的差異。透明傳送表示經(jīng)實(shí)際實(shí)際電路傳送后的比特流沒有發(fā)生變化采缚,對(duì)傳送的比特流來說针炉,這個(gè)電路好像看不見一樣。
我們都知道機(jī)器只能識(shí)別二進(jìn)制扳抽,即0和1篡帕,它使用高低電平表示殖侵,而物理層傳送的是比特流(即二進(jìn)制流,比特是是二進(jìn)制中的位)镰烧,所以能承載比特流的常見設(shè)備有:網(wǎng)卡拢军、網(wǎng)線、集線器拌滋、中繼器朴沿、調(diào)制調(diào)解器等。
數(shù)據(jù)鏈路層
數(shù)據(jù)鏈路層是OSI參考模型的第二層败砂,它負(fù)責(zé)建立和管理節(jié)點(diǎn)的鏈路赌渣。該層的主要功能是:通過各種控制協(xié)議,將有差錯(cuò)的物理信道變?yōu)闊o差錯(cuò)的昌犹、能可靠傳輸數(shù)據(jù)幀的數(shù)據(jù)鏈路坚芜。在計(jì)算機(jī)網(wǎng)絡(luò)中由于各種干擾(如磁場、溫度等)的存在斜姥,物理鏈路是不可靠的鸿竖,因此這一層的主要功能是在物理層提供的比特流的基礎(chǔ)上,通過差錯(cuò)控制铸敏、流量控制缚忧,使有差錯(cuò)的物理線路變?yōu)闊o差錯(cuò)的數(shù)據(jù)鏈路(即提供可靠的物理介質(zhì)的數(shù)據(jù)的方法)。數(shù)據(jù)鏈路層的具體工作是接收來自物理層的位流形式的數(shù)據(jù)杈笔,并封裝層幀闪水,傳送到上一層;同樣蒙具,也將來自上一層的數(shù)據(jù)幀球榆,拆裝為位流形式的數(shù)據(jù)轉(zhuǎn)發(fā)到物理層;并且禁筏,還負(fù)責(zé)處理接收端發(fā)回的確認(rèn)幀的信息持钉,以便提供可靠的數(shù)據(jù)傳輸。
常見的網(wǎng)橋篱昔、交換機(jī)等屬于數(shù)據(jù)鏈路層每强。
網(wǎng)絡(luò)層
網(wǎng)絡(luò)層是OSI參考模型的第三層,也是最復(fù)雜的一層州刽。他在下兩層的基礎(chǔ)上向資源子網(wǎng)絡(luò)提供服務(wù)舀射。其主要任務(wù)是:通過路由選擇算法,為報(bào)文或分組通過通信子網(wǎng)選擇最佳路徑怀伦。具體的說脆烟,數(shù)據(jù)鏈路層的數(shù)據(jù)在這一層被轉(zhuǎn)換為數(shù)據(jù)包,然后通過路由選擇房待、分組組合邢羔、順序驼抹、進(jìn)/出路由等控制,將信息從一個(gè)網(wǎng)絡(luò)設(shè)備傳送到另一個(gè)網(wǎng)絡(luò)設(shè)備拜鹤。一般的框冀,數(shù)據(jù)鏈路層解決同一網(wǎng)絡(luò)節(jié)點(diǎn)之間的通信,而網(wǎng)絡(luò)層主要解決不同網(wǎng)絡(luò)間的通信敏簿。
常見的路由器屬于網(wǎng)絡(luò)層
傳輸層
傳輸層是OSI參考模型的第四層明也,該層是通信子網(wǎng)絡(luò)和資源子網(wǎng)的接口和橋梁,起到承上啟下的作用惯裕。該層的主要任務(wù)是:向用戶提供可靠的端到端的差錯(cuò)和流量控制温数,保證報(bào)文的正確傳輸。傳輸層的作用是向高層屏蔽下層數(shù)據(jù)通信細(xì)節(jié)蜻势,即向用戶透明地傳輸報(bào)文撑刺。該層常見的的協(xié)議有TCP和UDP協(xié)議。傳輸層提供會(huì)話層和網(wǎng)絡(luò)層之間的傳輸服務(wù)握玛,它從會(huì)話層獲取數(shù)據(jù)够傍,在必要時(shí)將數(shù)據(jù)進(jìn)行分割,然后傳輸層將數(shù)據(jù)傳輸?shù)骄W(wǎng)絡(luò)層挠铲,并確保數(shù)據(jù)能正確無誤的傳送到網(wǎng)絡(luò)層冕屯,因此傳輸層負(fù)責(zé)提供兩節(jié)點(diǎn)之間數(shù)據(jù)的可靠傳送。
會(huì)話層
會(huì)話層是OSI參考模型的第五層拂苹,它是用戶應(yīng)用程序和網(wǎng)絡(luò)之間的接口愕撰,主要任務(wù)是:向兩個(gè)實(shí)體的表示層提供建立和使用連接的方法。將不同實(shí)體之間的表示層的連接稱為會(huì)話醋寝。因此會(huì)話層的任務(wù)就是組織和協(xié)調(diào)兩個(gè)會(huì)話進(jìn)程之間的通信,并對(duì)數(shù)據(jù)交換進(jìn)行管理带迟。用戶可以按照半雙工音羞、單工、和全雙工的方式建立會(huì)話仓犬。當(dāng)建立會(huì)話時(shí)嗅绰,用戶必須提供他們想要連接的遠(yuǎn)程地址,而這些地址與MAC地址或網(wǎng)絡(luò)層的邏輯地址不通過搀继,它們是為用戶專門設(shè)計(jì)的窘面,更便于用戶記憶。會(huì)話層可以理解為定義如何開始叽躯、控制财边、結(jié)束一個(gè)會(huì)話。
表示層
表示層是OSI參考模型的第六層点骑,它對(duì)來自應(yīng)用層的命令和數(shù)據(jù)進(jìn)行解釋酣难,對(duì)各種語法賦予相應(yīng)的含義谍夭,并按照一定的格式傳送給會(huì)話層。其主要功能是處理用戶信息的表示問題(如編碼憨募、數(shù)據(jù)格式轉(zhuǎn)換紧索、加密解密等)。表示層可以理解為定義數(shù)據(jù)的格式和加密方式菜谣。
應(yīng)用層
應(yīng)用層是OSI參考模型的第七層珠漂,它是計(jì)算機(jī)用戶以及各種應(yīng)用程序和網(wǎng)絡(luò)之間的接口,其功能是直接向用戶提供服務(wù)尾膊,完成用戶希望在網(wǎng)絡(luò)上完成的各種工作媳危。它在其他六層工作的基礎(chǔ)上,負(fù)責(zé)完成網(wǎng)絡(luò)中應(yīng)用程序與網(wǎng)絡(luò)操作系統(tǒng)之間的聯(lián)系眯停,建立與結(jié)束使用者之間的聯(lián)系济舆,并完成網(wǎng)絡(luò)用戶提出的各種網(wǎng)絡(luò)服務(wù)及應(yīng)用所需的監(jiān)督、管理和服務(wù)等各種協(xié)議莺债,此外該層還負(fù)責(zé)協(xié)調(diào)各個(gè)應(yīng)用程序之間的工作滋觉。應(yīng)用層可以理解為需要進(jìn)行網(wǎng)絡(luò)通信的應(yīng)用程序。
TCP/IP 五層協(xié)議將OSI參考模型中的應(yīng)用層齐邦、表示層椎侠、會(huì)話層歸為應(yīng)用層;TCP/IP 四層協(xié)議將OSI參考模型中的應(yīng)用層措拇、表示層我纪、會(huì)話層歸為應(yīng)用層,將物理層和數(shù)據(jù)鏈路層歸為網(wǎng)絡(luò)接口層
從TCP/IP四層協(xié)議來分析下瀏覽器瀏覽一個(gè)網(wǎng)頁時(shí)發(fā)生了什么:
上圖展示了基于TCP/IP四層協(xié)議的數(shù)據(jù)傳輸?shù)牧鞒蹋?br>
請求流程:應(yīng)用層(即瀏覽器將請求封裝為HTTP網(wǎng)絡(luò)請求數(shù)據(jù))——》傳送到傳輸層(按TCP協(xié)議加上TCP頭部并封裝為TCP數(shù)據(jù)報(bào)文)——》傳送到網(wǎng)絡(luò)層(按IP協(xié)議添加IP頭部并封裝為IP數(shù)據(jù)報(bào)文)——》傳送到鏈路層(將數(shù)據(jù)轉(zhuǎn)為鏈路層的數(shù)據(jù)幀丐吓,再轉(zhuǎn)為比特流浅悉,通過物理介質(zhì)進(jìn)行傳輸)——》經(jīng)過N層次的路由轉(zhuǎn)發(fā)——》傳輸?shù)竭_(dá)服務(wù)端(即接收到)的鏈路層(將比特流轉(zhuǎn)為鏈路層的數(shù)據(jù)幀)——》傳輸?shù)椒?wù)器的網(wǎng)絡(luò)層(將鏈路層的數(shù)據(jù)解析為IP層數(shù)據(jù)報(bào)文)——》傳輸?shù)椒?wù)器的傳輸層(將網(wǎng)絡(luò)層的數(shù)據(jù)解析為TCP數(shù)據(jù)報(bào)文)——》傳輸?shù)椒?wù)器的應(yīng)用層(處理HTTP數(shù)據(jù))
響應(yīng)流程與請求流程相似,只是服務(wù)器變成了發(fā)送端券犁,而瀏覽器變成接收端而已术健。
這是基于模型的數(shù)據(jù)層傳輸流程,其實(shí)現(xiàn)需要以下6大步驟:
1粘衬、域名解析
瀏覽器請求一個(gè)網(wǎng)頁是荞估,會(huì)發(fā)起HTTP請求,首先需要知道像哪天服務(wù)器發(fā)起請求稚新,我們知道HTTP協(xié)議中有域名的信息勘伺,而網(wǎng)絡(luò)通信并不能通過域名直接建立連接,所以首先進(jìn)行域名解析(DNS:提供域名和IP地址的解析服務(wù))將域名解析成IP地址褂删,以便實(shí)現(xiàn)下一步的建立TCP連接
2飞醉、建立TCP連接
使用1中解析出的IP地址,建立TCP連接屯阀,建立TCP連接時(shí)冒掌,首先需要進(jìn)行3次握手確保傳輸?shù)目煽啃栽朐#聢D是TCP3次握手的流程圖:
第一次握手:客戶端向服務(wù)端發(fā)送含有SYN標(biāo)識(shí)的數(shù)據(jù)包,表示含SYN數(shù)據(jù)包發(fā)給服務(wù)端了
第二次握手:服務(wù)端收到客戶端發(fā)來的SYN之后股毫,向客戶端發(fā)送含SYN和ACK標(biāo)識(shí)的數(shù)據(jù)包膳音,表示服務(wù)端確認(rèn)收到了客戶端的數(shù)據(jù)
第三次握手:客戶端收到服務(wù)端發(fā)過來的ACK確認(rèn)數(shù)據(jù)包之后,向服務(wù)端發(fā)送含ACK的數(shù)據(jù)包铃诬,表示知道服務(wù)端收到數(shù)據(jù)包了祭陷,當(dāng)前的連接是可靠的,可以開始傳輸數(shù)據(jù)了
3趣席、發(fā)送HTTP請求
步驟2建立TCP連接之后兵志,就可以開始將用戶請求的HTTP數(shù)據(jù)包按傳輸層-》網(wǎng)絡(luò)層-》鏈路層的數(shù)據(jù)包裝將數(shù)據(jù)傳輸給服務(wù)端了
HTTP請求報(bào)文格式大概如下:
GET PATH HTTP/1.1\r\n -》請求方法 路徑 HTTP版本
USER-AGENT: xxx\r\n -》HTTP請求頭
CONTENT-LENGTH: xxx\r\n -》HTTP請求頭
....\r\n-》HTTP請求頭
\r\n
\r\n
....\r\n-》HTTP請求內(nèi)容
4、服務(wù)器響應(yīng)HTTP請求
服務(wù)器的Nginx/Apache等服務(wù)器軟件接收客戶端發(fā)來HTTP請求宣肚,經(jīng)過解析之后進(jìn)入響應(yīng)站點(diǎn)入口想罕,解析到相應(yīng)的處理器進(jìn)行請求處理,再將響應(yīng)內(nèi)容以HTTP發(fā)送給客戶端霉涨。
HTTP響應(yīng)報(bào)文格式大概如下:
HTTP/1.1 200 ok -》HTTP版本 狀態(tài)碼 狀態(tài)描述信息
CONTENT-LENGTH: xxx\r\n -》HTTP請求頭
....\r\n-》HTTP請求頭
\r\n
\r\n
....\r\n-》HTTP請求內(nèi)容
下列是狀態(tài)的大概描述信息:
100-199: 信息性狀態(tài)碼按价;接收的請求正在處理
200-299:成功狀態(tài)碼;請求正常處理完畢
300-399:重定向狀態(tài)碼笙瑟;需要進(jìn)行附加操作以完成請求
400-499:客戶端錯(cuò)誤狀態(tài)碼楼镐;服務(wù)端無法處理的請求
500-599:服務(wù)端錯(cuò)誤狀態(tài)碼;服務(wù)端處理請求出錯(cuò)
5往枷、瀏覽器渲染
接收到服務(wù)端返回的響應(yīng)內(nèi)容框产,解析HTTP內(nèi)容,按DOM進(jìn)行渲染:構(gòu)建DOM樹-》構(gòu)建Render(渲染)樹-》布局Render(渲染)樹-》繪制Render(渲染)樹