用戶請求網站的流程——詳細分析

        ~~~~~~~~因爲想要面對一個新的開始,一個人必須有夢想、有希望、有對未來的憧憬。如果沒有這些,就不叫新的開始,而叫逃亡。 ​​​​
                                                                                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ————瑪麗亞·杜埃尼亞斯

我們經常使用瀏覽器上網查詢資源,看到網頁從空白到豐滿,這可能是一瞬間,也有可能要幾秒鐘或者直接彈出錯誤等。那麼這背後的工作流程究竟是怎樣的呢?接下來以訪問www.baidu.com爲例,進行一個流程的分析。

訪問流程簡述

當用戶在瀏覽器地址中輸入www.baidu.com時,需要經歷如下幾個流程:DNS域名解析——>建立tcp三次握手——>客戶端發出http請求——>服務端發出http響應——>tcp四次揮手斷開連接

DNS域名解析

DNS被稱爲域名解析系統,主要作用就是負責將域名解析爲對應的IP地址(當然還有反向解析,即將ip解析爲域名,一般很少用)。比如解析一下百度
在這裏插入圖片描述
在DNS解析中分爲兩種查找方式:遞歸查詢和迭代查詢
遞歸查詢:由DNS客戶端發起,一級一級的向上提交查詢申請,直到查詢結束
迭代查詢:在DNS服務器之間完成,即本地DNS向上一級DNS提交查詢,上級DNS並不直接返回查詢結果,而是告訴DNS應該去哪兒找。
在這裏插入圖片描述
DNS查詢過程如圖所示:

  1. DNS客戶端首先查詢自己host表,沒有則向本地DNS提交查詢www.baidu.com的申請
  2. 本地DNS查找自己的緩存,沒有則開始向DNS根發出查找請求
  3. 根域在查找之後向本地DNS返回了.com域的DNS服務器地址
  4. 本地DNS向.com域DNS提交查詢申請
  5. .com域DNS向本地DNS返回了.baidu.com域的DNS地址
  6. 本地DNS向.baidu.com域的DNS提交查詢申請
  7. .baidu.com域DNS返回查詢結果給本地DNS
  8. 本地DNS接收到查詢結果後,首先在本地緩存一份,然後再向客戶端返回查詢結果

建立tcp三次握手

ip協議定義了一套自己的地址規則,它實現了路由功能,允許某個局域網A主機向另一個局域網主機B發送信息。但是ip協議只是一個地址協議,並不保證數據包的完整。那麼這個時候tcp的作用就出來了,它保證數據通信的完整性和可靠性,防止丟包。
建立連接過程

  1. 客戶端首先向服務器發送一個帶有syn標識和seq隨機數的請求報文
  2. 服務端收到後返回一個ack,ack的值爲客戶端的seq+1。還包含了一個syn的標識和一個seq隨機數
  3. 客戶端收到服務端的迴應包後,再給服務端返回一個ack,ack的值就是服務端的seq+1。到此三次握手建立完成,可以開始傳送數據。

客戶端發出http請求

那麼到這裏就開始發送http請求報文了,http請求報文中主要包括:請求行、請求頭部、空行、請求主體
在這裏插入圖片描述
如圖所示,這是訪問百度時抓的一個包,空行下面是請求主體,由於是get請求,所以沒有內容。
報文結構分析
請求行:包括請求方法(get、post、head、put、delete等),請求數據信息,請求http協議版本(目前主流http/1.1俗稱長連接,相較1.0有個自由連接keepalived)
請求頭部:主要包括服務器和客戶端的版本信息,還有字符集、host,媒體、語言等類型
空行:作一個分隔,代表請求頭的結束,也代表請求主體的開始
請求主體:只有post幾條表單時纔有

服務端發出http響應

http響應報文主要也分文4個部分:起始行、響應頭部、空行、響應主體
在這裏插入圖片描述
如圖所示,這是抓取的一個響應包。
報文分析
起始行:包括http協議版本信息、響應狀態碼、狀況說明信息
響應頭部:主要包括服務器web軟件版本,服務器時間,長連接還是短連接,字符集等等
空行:與請求報文空行一樣
響應主體:一般爲html css js等代碼信息
常見的狀態碼有如下幾種
200 代表ok
301 永久跳轉
403 沒權限
404 沒有這個文件
500 未知的錯誤
502 網關錯誤
503 服務器超載,停機維護
504 網關超時

tcp四次揮手斷開連接

當客戶端與服務端通過三次握手數據傳送完畢後,就需要通過四次揮手來斷開連接。
過程解析

  1. client發送一個FIN和seq隨機數,client進入FIN_WALT_1狀態
  2. server收到FIN後,返回一個ACK給client,ACK爲client的seq+1,server進入CLOSE_WAIT狀態
  3. 當server剩餘數據發送完畢後,向client發送FIN和seq隨機數,並進入LAST_ACK狀態
  4. client收到FIN後,發送一個ACK給server,ACK值爲server的seq+1。至此server進入closed狀態,四次揮手完成。

網站集羣內部請求分析

常見的網頁資源分爲三種:靜態網頁、動態網頁、僞靜態

靜態網頁就是沒有後臺數據庫,不含有php、jsp、asp等程序,是不進行交互的,編寫的是什麼顯示的就是什麼。

動態的網頁,提供後臺數據庫,支持更多的功能,比如註冊,登錄,訂單,博客等等。動態的網頁並不是獨立存在於服務器上的網頁文件,而是當用戶請求服務器上的動態程序時,服務器解析這些程序並調用數據庫來返回一個完整的網頁內容。

僞靜態其實就是利用了rewrite(服務器重寫)技術把動態變成一個靜態的網站,當我們訪問一個網站的時候,它會進行一個rewrite重寫,再去指向真實的地址去數據庫裏面找。因爲搜索引擎對動態網站url中的?$等特殊符號的收錄存在一定問題,所以需要利用這種技術來方便搜索引擎的收錄。包括seo優化提升網站的顯示排名等。

訪問不同類型的網頁資源,有不同的訪問流程
當我們訪問靜態網頁的時候,客戶端通過http協議,下載並讀取服務器上的html文件,根據html頁面的鏈接,自上而下的請求。如果是圖片的話會邊下載邊渲染,遇到js就會加載js,當js比較複雜加載過慢,瀏覽器就會等待,這個時候鼠標就會轉圈,稱之爲js阻塞。當js加載完畢之後纔會顯示我們看到的網頁。
當我們訪問一個動態網頁時,用戶首先發出一個請求。服務器收到這個請求後,假設服務器使用nginx。nginx就會將請求轉發給php,php就會去查詢數據庫,根據數據庫返回的值,生成一個完整的網頁內容,發送給用戶,用戶收到之後,也是邊下載邊渲染,加載js,執行完畢之後,纔會顯示我們看到的網頁。

當服務器的訪問量達到億級PV時,訪問過程又有所區別了。當我們發送http請求報文,而接收這個報文的是負載均衡器。企業中常見的負載均衡器硬件的話有F5,軟件的有七層的nginx,四層的有LVS。通過負載均衡器會把這個靜態請求發送到後端的靜態web服務器(如apache、nginx),web服務器會把這個靜態請求直接響應給客戶端,但是如果這個網站架構了CDN的話,那麼向客戶端響應的就是這個CDN緩存服務器。如果是動態網站,就需要一個動態的web服務器(如tomcat)。動態服務器就負責這些動態的請求以及程序的解析。當然當用戶訪問量大,此時瓶頸就是數據庫的壓力了,一般採用分佈式緩存memcache,redis等

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