一次HTTP請(qǐng)求過(guò)程或者輸入網(wǎng)址(tjegd.cn)后發(fā)生了什么?
前言
一、流程概括
二、具體流程
1.DNS解析
2.三次握手建立連接
2.1為什么是三次握手,二次不行嗎?
3.發(fā)送HTTP請(qǐng)求
4.服務(wù)器解析請(qǐng)求,并返回?cái)?shù)據(jù)
5.瀏覽器解析響應(yīng),展示相應(yīng)的界面
6.斷開(kāi)連接(四次揮手)
6.1為什么是四次揮手?
前言
當(dāng)我們?cè)跒g覽器中輸入一個(gè)網(wǎng)址后,瀏覽器給我們返回一個(gè)頁(yè)面過(guò)程中,到底發(fā)生了什么?
一、流程概括
1.進(jìn)行DNS解析,找到對(duì)應(yīng)ip地址的服務(wù)器
2.通過(guò)TCP協(xié)議建立連接(三次握手)
3.建立連接后,瀏覽器發(fā)送HTTP請(qǐng)求
4.服務(wù)器根據(jù)HTTP請(qǐng)求返回相應(yīng)的數(shù)據(jù)
5.瀏覽器根據(jù)協(xié)議解析數(shù)據(jù),得到資源
6.根據(jù)得到的資源顯示在頁(yè)面上
7.根據(jù)Connection的Keep-Alive屬性可以選擇是否斷開(kāi)TCP連接(四次揮手)
二、具體流程
1.DNS解析
DNS解析過(guò)程就是尋找哪臺(tái)機(jī)器上有你所要的資源,根據(jù)URL得到相應(yīng)的ip地址去尋找:
1.先在瀏覽器本地緩存中查找是否相應(yīng)的記錄,瀏覽器緩存會(huì)保存一些訪問(wèn)過(guò)網(wǎng)址的DNS信息,
2.如果沒(méi)有找到,就在本機(jī)操作系統(tǒng)緩存中查找是否有當(dāng)前要訪問(wèn)的DNS信息,
3.如果還沒(méi)有找到對(duì)應(yīng)的ip地址,就發(fā)送到路由器上,路由器根據(jù)自身查找當(dāng)前記錄,路由器本身也會(huì)存儲(chǔ)一些DNS信息,
4.如果沒(méi)有找到,這個(gè)請(qǐng)求就會(huì)發(fā)送到運(yùn)營(yíng)商上,運(yùn)營(yíng)商就是互聯(lián)網(wǎng)服務(wù)提供商,一般大部分請(qǐng)求的域名都能在這里找到,
5.如果還沒(méi)有找到,就將請(qǐng)求發(fā)送給根域名服務(wù)器進(jìn)行搜索,
6.如果還沒(méi)找到,就說(shuō)明這個(gè)域名不存在,或者說(shuō)域名過(guò)期了。
所以DNS解析過(guò)程就是
瀏覽器->操作系統(tǒng)->路由器->運(yùn)營(yíng)商->根路由器
2.三次握手建立連接
找到相對(duì)應(yīng)的服務(wù)器之后,瀏覽器要和服務(wù)器建立相對(duì)應(yīng)的連接,通過(guò)三次握手建立連接,保證建立連接無(wú)誤。
為什么要進(jìn)行三次握手?確保接收雙方發(fā)送能力和接收能力是否正常
三次揮手的過(guò)程:
1.第一次握手,客戶(hù)端向服務(wù)器發(fā)送SYN報(bào)文,并指明客戶(hù)端的初始化序列號(hào) ISN,首部的同步位SYN=1,初始序號(hào)seq=x,
2.第二次握手,服務(wù)器接收到客戶(hù)端SYN報(bào)文,并將自己的SYN報(bào)文作為響應(yīng)發(fā)送,同時(shí)把客戶(hù)端的ISN+1作為ACK的值,表明自己已經(jīng)接收到客戶(hù)端的SYN
3.第三次握手,客戶(hù)端接收到服務(wù)器SYN報(bào)文后,同樣把服務(wù)器的ISN+1作為ACK的值,表示已經(jīng)接收到服務(wù)器的SYN報(bào)文,服務(wù)器收到ACK值后,此時(shí)雙方建立連接
2.1為什么是三次握手,二次不行嗎?
三次握手的目的就是確認(rèn)客戶(hù)端和服務(wù)器兩端接收和發(fā)送能力正常,通過(guò)三次握手來(lái)保證的
1.第一次握手,客戶(hù)端發(fā)送報(bào)文,服務(wù)器接收?qǐng)?bào)文
這樣服務(wù)器端就能得到結(jié)論:客戶(hù)端的發(fā)送能力,服務(wù)器的接收能力是正常的
2.第二次握手 服務(wù)器發(fā)送報(bào)文, 客戶(hù)端接收?qǐng)?bào)文 ,
客戶(hù)端得到結(jié)論 客戶(hù)端接收能力,服務(wù)器發(fā)送能力是正常的,但是此時(shí)服務(wù)器并不知道,客戶(hù)端的接收能力是否正常,就需要第三次握手來(lái)確定
3.第三次握手 客戶(hù)端發(fā)送報(bào)文,客戶(hù)端接收?qǐng)?bào)文,
服務(wù)器就得到了 客戶(hù)端接收能力正常
這樣三次握手才能確定雙方的接收能力和發(fā)送能力是否正常
如果是兩次握手:
有一次連接的時(shí)候,客戶(hù)端發(fā)送的請(qǐng)求丟失了,客戶(hù)端等待一段時(shí)間后沒(méi)有接收到響應(yīng),就會(huì)重新發(fā)送一個(gè)請(qǐng)求,第二個(gè)請(qǐng)求成功到達(dá)后,服務(wù)返回響應(yīng)建立連接,但是第一次請(qǐng)求可能在某些網(wǎng)絡(luò)結(jié)點(diǎn)長(zhǎng)時(shí)間滯留了,延誤到連接釋放以后的某個(gè)時(shí)間才到達(dá)服務(wù)端,這樣服務(wù)器以為是建立了新的連接了,就發(fā)送響應(yīng),此時(shí)客戶(hù)端會(huì)忽略服務(wù)器發(fā)送的響應(yīng),也不發(fā)送數(shù)據(jù),而服務(wù)器這邊一直等待客戶(hù)端發(fā)送的數(shù)據(jù),造成了資源的浪費(fèi)。
3.發(fā)送HTTP請(qǐng)求
通過(guò)建立的TCP連接,客戶(hù)端向服務(wù)器發(fā)送HTTP請(qǐng)求,
1、HTTP請(qǐng)求的格式
1.首行: 【方法】+【URL】+【版本】
2.Header(請(qǐng)求報(bào)頭):請(qǐng)求的屬性 , 冒號(hào)分割鍵值對(duì)
3.空行:Header結(jié)束的標(biāo)志
4.Body : 空行后面的內(nèi)容都是Body
4.服務(wù)器解析請(qǐng)求,并返回?cái)?shù)據(jù)
服務(wù)器根據(jù)HTTP協(xié)議來(lái)解析請(qǐng)求,得到客戶(hù)端想要的數(shù)據(jù),并發(fā)送響應(yīng)
HTTP響應(yīng)格式
1.首行: 【版本號(hào)】+【狀態(tài)碼】+【狀態(tài)碼解釋】
2.Header:響應(yīng)的屬性 , 冒號(hào)分割鍵值對(duì)
3.空行:Header結(jié)束的標(biāo)志
4.Body : 空行后面的內(nèi)容都是Body
5.瀏覽器解析響應(yīng),展示相應(yīng)的界面
瀏覽器通過(guò)HTTP協(xié)議來(lái)解析服務(wù)器發(fā)送的響應(yīng),將響應(yīng)中的資源展現(xiàn)出來(lái),比如一些HTML界面,文字,圖片信息等
6.斷開(kāi)連接(四次揮手)
當(dāng)數(shù)據(jù)完成請(qǐng)求到返回的過(guò)程之后,根據(jù)Connection的Keep-Alive屬性可以選擇是否斷開(kāi)TCP連接
雙方都可以主動(dòng)斷開(kāi)連接,斷開(kāi)連接后主機(jī)中的「資源」將被釋放。
1.客戶(hù)端想斷開(kāi)連接,就會(huì)發(fā)送一個(gè)TCP首部FIN標(biāo)志為1的報(bào)文,也就是FIN報(bào)文,之后客戶(hù)端進(jìn)入FIN_wait_1狀態(tài)
2.服務(wù)器接收到客戶(hù)端發(fā)送的報(bào)文,就會(huì)回復(fù)一個(gè)ACK應(yīng)答報(bào)文,服務(wù)器進(jìn)入CLOSED_WAIT狀態(tài)
3.客戶(hù)端接收到服務(wù)器的應(yīng)答報(bào)文,就進(jìn)去FIN_wait_2狀態(tài)
4.等待服務(wù)器端處理完數(shù)據(jù)后,向客戶(hù)端發(fā)送一個(gè)FIN報(bào)文,服務(wù)器進(jìn)如LAST_ACK狀態(tài)
5.客戶(hù)端接收到FIN報(bào)文后,回復(fù)一個(gè)ACK報(bào)文,客戶(hù)端進(jìn)入TIME_WAIT 狀態(tài)
6.服務(wù)器接收到ACK報(bào)文后,就進(jìn)入了CLOSED狀態(tài),自此服務(wù)器端已經(jīng)完成連接的關(guān)閉
7.客戶(hù)端等待2個(gè)時(shí)間段后,自動(dòng)進(jìn)入CLOSED狀態(tài),自此客戶(hù)端已經(jīng)完成連接的關(guān)閉
首先客戶(hù)端發(fā)送FIN報(bào)文,就是說(shuō)明客戶(hù)端不再發(fā)送數(shù)據(jù),但是還會(huì)接收數(shù)據(jù),服務(wù)器接收到FIN時(shí),先發(fā)送響應(yīng)ACK,但是服務(wù)器這邊還有未處理完的數(shù)據(jù),還要發(fā)送數(shù)據(jù),當(dāng)服務(wù)器不再發(fā)送數(shù)據(jù)時(shí),才會(huì)發(fā)送FIN給客戶(hù)端,通過(guò)現(xiàn)在關(guān)閉連接。
6.1為什么是四次揮手?
TCP連接時(shí)不允許半打開(kāi)狀態(tài),就單向傳輸數(shù)據(jù),所以在三次握手時(shí),服務(wù)器就會(huì)把SYN和ACK同時(shí)發(fā)送給客戶(hù)端,其中,ACK 用來(lái)打開(kāi)客戶(hù)端的發(fā)送通道,SYN 用來(lái)打開(kāi)服務(wù)器的發(fā)送通道。這樣,原本的四次握手就降為三次握手了。
而當(dāng)連接處于半關(guān)閉狀態(tài)時(shí),TCP是允許單向傳輸數(shù)據(jù)的,當(dāng)客戶(hù)端要關(guān)閉連接時(shí),發(fā)送FIN但是服務(wù)器可能還沒(méi)有處理完數(shù)據(jù),等服務(wù)器處理完數(shù)據(jù)后才會(huì)發(fā)送FIN確認(rèn)關(guān)閉數(shù)據(jù),即每一方都要接收和發(fā)送FIN和ACK報(bào)文,所以就是四次揮手了