从浏览器地址栏输入网址,到网页彻底打开,中间都发生了什么?
從輸入域名到網(wǎng)頁(yè)打開(kāi)的簡(jiǎn)單過(guò)程如下,還附加我自己的理解:
1.DNS域名解析
客戶端輸入域名后,由DNS服務(wù)器來(lái)將域名解析成對(duì)應(yīng)服務(wù)器的IP地址
2.建立TCP連接;
獲得服務(wù)器IP之后,就需要三次握手的協(xié)議才能建立連接
1)客戶端發(fā)送SYN包請(qǐng)求,等待服務(wù)器確認(rèn)
2)服務(wù)器確認(rèn)收到SYN包請(qǐng)求后,同時(shí)自己也返回一個(gè)包給客戶端,即返回SYN+ACK
3)客戶端收到SYN+ACK包之后,返回給服務(wù)器一個(gè)確認(rèn)包ACK包表示收到,然后雙方達(dá)成協(xié)議,建立連接
3.發(fā)送HTTP請(qǐng)求;
與服務(wù)器建立連接之后,就可以向服務(wù)器發(fā)送請(qǐng)求了,請(qǐng)求需要遵循h(huán)ttp協(xié)議
4.服務(wù)器處理請(qǐng)求;
被請(qǐng)求的服務(wù)器解析用戶請(qǐng)求的有哪些資源,通過(guò)服務(wù)器返回?cái)?shù)據(jù)給客戶端
5.返回響應(yīng)結(jié)果;
給客戶端返回請(qǐng)求的狀態(tài)碼,通過(guò)狀態(tài)碼可以知道服務(wù)器端的處理是否正常
常見(jiàn)狀態(tài)碼:狀態(tài)碼
100 Continue 繼續(xù),客戶端應(yīng)當(dāng)繼續(xù)發(fā)送請(qǐng)求。這個(gè)臨時(shí)響應(yīng)是用來(lái)通知客戶端它的部分請(qǐng)求已經(jīng)被服務(wù)器接收,且仍未被拒絕
200 OK 請(qǐng)求成功,表示正常狀態(tài)
301 Moved Permanently 請(qǐng)求的網(wǎng)頁(yè)已永久移動(dòng)到新位置。
400 Bad Request 語(yǔ)義有誤,當(dāng)前請(qǐng)求無(wú)法被服務(wù)器理解。或者是請(qǐng)求參數(shù)有錯(cuò)誤
404 Not Found 請(qǐng)求失敗,請(qǐng)求所希望得到的資源未被在服務(wù)器上發(fā)現(xiàn)。多數(shù)情況是找不到輸入域名對(duì)應(yīng)的網(wǎng)頁(yè)。? ?
500 Internal Server Error 一般來(lái)說(shuō),這個(gè)問(wèn)題都會(huì)在服務(wù)器端的源代碼出現(xiàn)錯(cuò)誤時(shí)出現(xiàn)。。
6.瀏覽器渲染:
返回成功之后,瀏覽器拿到請(qǐng)求頁(yè)面的代碼,將其解析渲染出來(lái)。解析和渲染的過(guò)程主要由瀏覽器的渲染引擎實(shí)現(xiàn)
7. 斷開(kāi)連接:
數(shù)據(jù)傳輸完畢,需要斷開(kāi)tcp連接,此時(shí)tcp發(fā)起4次揮手
1)客戶端發(fā)送給服務(wù)器,告訴服務(wù)器需要關(guān)閉tcp了
2)服務(wù)器發(fā)送給客戶端,告訴客戶端我準(zhǔn)備一下就關(guān)閉
3)服務(wù)器發(fā)送給客戶端,告訴客戶端我已經(jīng)準(zhǔn)備好關(guān)閉了
4)客戶端發(fā)送給服務(wù)器,告訴服務(wù)器我也準(zhǔn)備好關(guān)閉了。
?
我自己是用? "到外面吃飯" 這種方式來(lái)理解的:
1. 比如我要到某某餐館吃飯,我先在地圖上搜 餐館在哪里,然后通過(guò)導(dǎo)航 找到該餐館(域名解析)
2. 到達(dá)餐館過(guò)后,我想我到底要吃什么:(建立連接)
1) 摸了摸口袋里的錢,發(fā)現(xiàn)只有兩塊錢,然后詢問(wèn)老板有沒(méi)有兩元的東西。(客戶端發(fā)送包,等待服務(wù)器確認(rèn))
2) 老板一看我的樣子,就知道是個(gè)窮逼(服務(wù)器收到包),然后說(shuō)只有饅頭價(jià)格兩元一個(gè)!(再返回一個(gè)包)
3) 我欣喜若狂,掏出我壓箱底的兩元錢,告訴老板我要了(客戶端返回一個(gè)包),老板表示蚊子再小也是肉,就接受了這個(gè)訂單。我們快樂(lè)地達(dá)成了協(xié)議(達(dá)成協(xié)議)
3. 老板給后廚說(shuō)準(zhǔn)備一個(gè)饅頭(發(fā)送http請(qǐng)求)。
4. 后廚收到請(qǐng)求之后,開(kāi)始準(zhǔn)備饅頭的材料(處理請(qǐng)求)。
5. 沒(méi)過(guò)多久,我就拿到了熱騰騰的饅頭(返回響應(yīng)結(jié)果)。
6. 拿到饅頭之后我就開(kāi)始了愉快的進(jìn)食過(guò)程。(渲染)
7. 吃飽之后就離開(kāi)餐館:(斷開(kāi)連接)
1)我對(duì)老板說(shuō):老板,結(jié)賬,我準(zhǔn)備走了
2)老板對(duì)我說(shuō):稍等一下,馬上就來(lái)
3)老板又對(duì)我說(shuō):一共兩元。
4)我付了賬,對(duì)老板說(shuō):這饅頭真好吃,我下次再來(lái)。
雖然上面的過(guò)程和真實(shí)的響應(yīng)過(guò)程對(duì)應(yīng)起來(lái)比較牽強(qiáng),但是這能夠幫助我理解什么時(shí)候是做什么事情,并不像原來(lái)一樣全靠記憶。
轉(zhuǎn)載于:https://www.cnblogs.com/zjjDaily/p/8302476.html
總結(jié)
以上是生活随笔為你收集整理的从浏览器地址栏输入网址,到网页彻底打开,中间都发生了什么?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Redis缓存数据库(一)
- 下一篇: linux下curl的使用