簡要過程
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的錯誤。