從瀏覽器輸入URL到頁面展示出來,中間發生了什麼?

原文鏈接:https://blog.csdn.net/zzti_erlie/article/details/100622264

前言

這應該算是一個很經典的面試題了,前端工程師,後端工程師,包括網絡工程師都有可能被問到。開放度很高,每個人都可以針對自己熟悉的部分,進行深入的講解。

總體來說,分爲如下幾個部分

1.DNS解析
2.建立TCP連接,發送HTTP請求
3.服務端處理請求並返回HTTP響應
4.瀏覽器解析渲染頁面
5.關閉連接

DNS解析

DNS解析就是獲取服務器IP地址的過程。互聯網上每一臺計算機的唯一標識是它的IP地址,但是IP地址並不方便記憶。用戶更喜歡用方便記憶的網址去尋找互聯網上的其它計算機,例如www.baidu.com,www.taobao.com。所以互聯網設計者需要在用戶的方便性與可用性方面做一個權衡,這個權衡就是一個網址到IP地址的轉換,這個過程就是DNS解析。它實際上充當了一個翻譯的角色,實現了網址到IP地址的轉換。網址到IP地址轉換的過程是如何進行的?

DNS的解析方式有兩種

1.遞歸解析
當局部DNS服務器自己不能回答客戶機的DNS查詢時,它就需要向其他DNS服務器進行查詢。此時有兩種方式,如圖所示的是遞歸方式。局部DNS服務器自己負責向其他DNS服務器進行查詢,一般是先向該域名的根域服務器查詢,再由根域名服務器一級級向下查詢。最後得到的查詢結果返回給局部DNS服務器,再由局部DNS服務器返回給客戶端。
在這裏插入圖片描述

2.迭代解析
當局部DNS服務器自己不能回答客戶機的DNS查詢時,也可以通過迭代查詢的方式進行解析,如圖所示。局部DNS服務器不是自己向其他DNS服務器進行查詢,而是把能解析該域名的其他DNS服務器的IP地址返回給客戶端DNS程序,客戶端DNS程序再繼續向這些DNS服務器進行查詢,直到得到查詢結果爲止。也就是說,迭代解析只是幫你找到相關的服務器而已,而不會幫你去查。

在這裏插入圖片描述

再放一個詳細的流程圖
在這裏插入圖片描述
爲了提高查找的效率,DNS服務器會進行緩存。具體的緩存策略如下:
在這裏插入圖片描述

1.瀏覽器緩存

瀏覽器會先檢查是否在緩存中,沒有則調用系統庫函數進行查詢。

2 操作系統緩存

操作系統也有自己的 DNS緩存,但在這之前,會向檢查域名是否存在本地的 Hosts 文件裏,沒有則向 DNS 服務器發送查詢請求。
Linux在/etc/hosts文件中
windows在C:\Windows\System32\drivers\etc\hosts文件中

3.路由器緩存

路由器也有自己的緩存。

4.ISP DNS 緩存

ISP DNS 就是在客戶端電腦上設置的首選 DNS 服務器,它們在大多數情況下都會有緩存。

建立TCP連接

http協議是基於tcp/ip協議的,整個數據的發送和接收流程如下
在這裏插入圖片描述
TCP/IP的建議需要經歷三次握手
在這裏插入圖片描述
TCP的三次握手還是經常被問到的,這裏概述一下

第一次握手:客戶端A將標誌位SYN置爲1,隨機產生一個值爲seq=J(J的取值範圍爲=1234567)的數據包到服務器,客戶端A進入SYN_SENT狀態,等待服務端B確認;

第二次握手:服務端B收到數據包後由標誌位SYN=1知道客戶端A請求建立連接,服務端B將標誌位SYN和ACK都置爲1,ack=J+1,隨機產生一個值seq=K,並將該數據包發送給客戶端A以確認連接請求,服務端B進入SYN_RCVD狀態。

第三次握手:客戶端A收到確認後,檢查ack是否爲J+1,ACK是否爲1,如果正確則將標誌位ACK置爲1,ack=K+1,並將該數據包發送給服務端B,服務端B檢查ack是否爲K+1,ACK是否爲1,如果正確則連接建立成功,客戶端A和服務端B進入ESTABLISHED狀態,完成三次握手,隨後客戶端A與服務端B之間可以開始傳輸數據了。

如圖所示:
在這裏插入圖片描述

服務端處理請求並返回HTTP響應

服務端拿到Http請求處理後,再返回HttP響應,這裏主要涉及到一部分Http的常見知識點,如各種狀態碼,各種Header的含義。把常見的狀態碼,常見的Header瞭解一下就行了。Http相關的知識前面的文章已經介紹過了,就不重複介紹了。

瀏覽器解析渲染頁面

這部分內容偏前端一點。大家可以參考相關博問,後端幾乎很少問。

關閉連接

這裏要注意的一點是一個TCP連接是可以發送多個Http請求的,不是發送一次Http請求TCP連接就斷了。默認情況下建立 TCP 連接不會斷開,只有在請求報頭中聲明 Connection: close 纔會在請求完成後關閉連接。這裏又涉及到TCP四次揮手

在這裏插入圖片描述

第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。

第二次揮手:Server收到FIN後,發送一個ACK給Client,確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號),Server進入CLOSE_WAIT狀態。
第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。

第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接着發送一個ACK給Server,確認序號爲收到序號+1,Server進入CLOSED狀態,完成四次揮手。

參考博客

[1]https://4ark.me/post/b6c7c0a2.html
[2]https://segmentfault.com/a/1190000006879700
[3]https://www.cnblogs.com/xianyulaodi/p/6547807.html
[4]https://www.itcodemonkey.com/article/3263.html

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