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