一次完整的 Http 請求過程

簡要過程

1、使用DNS域名解析;

2、發起TCP的3次握手

3、建立TCP連接後發起http請求;

4、服務器響應http請求,瀏覽器得到返回response;

5、瀏覽器解析response,並請求其它的資源(如js、css、圖片等);

6、瀏覽器對頁面進行渲染。

舉個例子

訪問一個網址的時候,例如www.baidu.com,具體流程如下

對www.baidu.com這個網址進行DNS域名解析到IP
通過IP,使用ARP地址解析協議,找到對應的服務器,發起TCP三次握手
建立TCP請求後,發起HTTP請求(例如TOMCAT部署的springMVC程序)
服務器響應HTTP請求,返回RESPONSE
遊覽器解析response,並請求其它的資源文件(js、css等)
遊覽器進行渲染界面
注:DNS域名解析採用的是遞歸查詢的方式,軟考時有考過,先從本地的DNS緩存中查找—>緩存中沒有的話就去找根域名服務器—–>根域名服務器找不到繼續找下一級,這樣遞歸查找到再返回給遊覽器。

具體細節

域名解析

1)首先會搜索瀏覽器自身的DNS緩存(緩存時間比較短,大概只有1分鐘,且只能容·和他們納1000條緩存)   2)如果瀏覽器自身的緩存裏面沒有找到,那麼瀏覽器會搜索系統自身的DNS緩存   3)如果還沒有找到,那麼嘗試從 hosts文件裏面去找   4)在前面三個過程都沒獲取到的情況下,就遞歸地去域名服務器去查找,

TCP連接

到了大家都非常熟悉的三次🤝和四次👋流程

正常的QA:

Q: 爲什麼連接的時候是三次握手,關閉的時候卻是四次握手?

A: 因爲當Server端收到Client端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,”你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。

Q: 爲什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

A: 一方面是爲了等待這個客戶重新連接的時候可以進行復用,另一方面必須假象網絡是不可靠的,有可以最後一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。

Q: 如果TCP連接丟失了第三個ACK包怎麼辦?

A: 如果丟失了ACK包,SERVER端將該TCP連接的狀態爲SYN_RECV,並且依次等待3秒、6秒、12秒後重新發送SYN+ACK包,以便Client重新發送ACK包。如果超過設定的次數,將會斷開連接。但是Client認爲這個連接已經建立,如果Client端向Server寫數據,Server端將以RST包響應,方能讓Client感知到Server的錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章