瀏覽器請求從發送到返回的完整過程

這是一道比較經典的面試題,主要考察的是對網絡方面的認識。


先通過一張圖對整個處理流程進行描述(出自參考資料1):
在這裏插入圖片描述

簡單地說:首先通過DNS域名解析出服務器IP,然後通過TCP/IP協議建立起客戶端到服務器的TCP連接。網絡連接建立好之後,通過HTTP協議發出請求包,從網絡模型的應用層傳到物理層,隨後發送出去。請求包在服務器端經過負載均衡,到達服務器,經服務器處理後返回結果給客戶端,客戶端收到結果後進行頁面渲染,最終展示到瀏覽器上。

下面將分階段進行介紹。

域名解析

每個客戶端上都配置了DNS服務器地址。DNS按照如下順序查找服務器ip:瀏覽器緩存->系統緩存->路由器緩存->ISP DNS緩存->遞歸搜索。

TCP連接

找到服務器對應的IP地址之後,在雙方進行通信之前,需要先連接網絡連接。這裏是TCP連接,需要通過3次握手來建立(事實上,在不可靠信道上建立可靠連接的次數理論上最少就是3次)。

三次握手的過程如下:
在這裏插入圖片描述
(1)第一次握手,客戶端發送一個SYN同步報文給服務器,SYN中含有客戶端的報文序列號x。
(2)第二次握手,服務器給客戶端發送一個SYN同步報文和一個ACK確認。表示收到了客戶端發送的報文,並且在SYN中放入了本次發送報文的序列號y。
(3) 第三次握手,客戶端收到服務器的回覆之後,再次發送一個SYN報文和一個ACK確認,SYN中包含報文序列號x+1。

經過三次握手之後,TCP連接建立起來,雙方之間纔可以通信。

在博主之前的文章中提到過的SYN Flood攻擊,正是利用第二次握手之後,服務器維持半連接狀態需要一定的資源這一點,來進行DDos攻擊的。

發送HTTP請求

建立好TCP連接之後,就準備開始正式通信了。

從應用層面看,這是一個HTTP請求。HTTP請求報文包含:請求行,報文頭和報文主體。

一個簡單的例子如下:

POST /user HTTP/1.1      //起始行
Host: www.user.com
Content-Type: application/x-www-form-urlencoded
Connection: Keep-Alive
User-agent: Mozilla/5.0.      //以上是首部行
(此處必須有一空行)  //空行分割header和請求內容
name=world   請求體

(1)請求行
請求行由三部分組成:請求方法,請求URL(不包含域名),HTTP協議版本。

請求方法有:GET,POST,PUT,DELETE,HEAD,OPTINS,TRACE,CONNECT。

最常用的方法是GET和POST。

GET請求不適合傳遞敏感數據,因爲請求參數會直接顯示在url中。也不適合傳遞大量數據,因爲url長度受限。
POST請求將請求參數封裝在HTTP請求數據中,對數據量沒有限制。

參考資料:
[1]https://www.jianshu.com/p/558455228c43.

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