首先我們要明白什么是http。
http:超文本傳輸協議(HTTP,HyperText Transfer Protocol)。
超文本傳輸協議是互聯網上應用最為廣泛的一種網絡協議。所有的WWW文件都必須遵守這個標准。
設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。1960年美國人Ted Nelson構思了一種通過計算機處理文本信息的方法,並稱之為超文本(hypertext),這成為了HTTP超文本傳輸協議標准架構的發展根基。Ted Nelson組織協調萬維網協會(World Wide Web Consortium)和互聯網工程工作小組(Internet Engineering Task Force )共同合作研究,最終發布了一系列的RFC(Request For Comments,是一系列以編號排定的文件。文件收集了有關互聯網相關信息,以及UNIX和互聯網社區的軟件文件。),其中著名的RFC 2616定義了HTTP 1.1。
在大家弄懂什么是http后,我們再說一次完整的http請求經歷哪些過程。例如當我們在web瀏覽器的地址欄中輸入: www.baidu.com,然后回車,會發生什么呢?
過程概述:
1.對www.baidu.com這個網址進行DNS域名解析,得到對應的IP地址
2.根據這個IP,找到對應的服務器,發起TCP的三次握手
3.建立TCP連接后發起HTTP請求
4.服務器響應HTTP請求,瀏覽器得到html代碼
5.瀏覽器解析html代碼,並請求html代碼中的資源(如js、css圖片等)(先得到html代碼,才能去找這些資源)
6.瀏覽器對頁面進行渲染呈現給用戶
下面詳細說一下過程中的TCP連接(三次握手):
拿到域名對應的IP地址之后,User-Agent(一般指瀏覽器)會以一個隨機端口(1024<端口<65535)向服務器的WEB程序(常用的有httpd,nginx)等的80端口。這個連接請求(原始的http請求經過TCP/IP4層模型的層層封包)到達服務器端后(這中間有各種路由設備,局域網內除外),進入到網卡,然后是進入到內核的TCP/IP協議棧(用於識別連接請求,解封包,一層一層的剝開),還有可能要經過Netfilter防火牆(屬於內核的模塊)的過濾,最終達到WEB程序,最終建立了TCP/IP的連接。
建立TCP連接之后,發起HTTP請求
HTTP請求報文由三部分組成:請求行,請求頭和請求正文
請求行:用於描述客戶端的請求方式,請求的資源名稱以及使用的HTTP協議的版本號(例:GET/books/java.html HTTP/1.1)
請求頭:用於描述客戶端請求哪台主機,以及客戶端的一些環境信息等
注:這里提一個請求頭 Connection,Connection設置為 keep-alive用於說明 客戶端這邊設置的是,本次HTTP請求之后並不需要關閉TCP連接,這樣可以使下次HTTP請求使用相同的TCP通道,節省TCP建立連接的時間
請求正文:當使用POST, PUT等方法時,通常需要客戶端向服務器傳遞數據。這些數據就儲存在請求正文中(GET方式是保存在url地址后面,不會放到這里)
服務器端響應http請求,瀏覽器得到html代碼
HTTP響應也由三部分組成:狀態碼,響應頭和實體內容
狀態碼:狀態碼用於表示服務器對請求的處理結果
列舉幾種常見的:200(沒有問題) 302(要你去找別人) 304(要你去拿緩存) 307(要你去拿緩存) 403(有這個資源,但是沒有訪問權限) 404(服務器沒有這個資源) 500(服務器這邊有問題)
若干響應頭:響應頭用於描述服務器的基本信息,以及客戶端如何處理數據
實體內容:服務器返回給客戶端的數據
注:html資源文件應該不是通過 HTTP響應直接返回去的,應該是通過nginx通過io操作去拿到的吧。
瀏覽器解析html代碼,並請求html代碼中的資源
瀏覽器拿到html文件后,就開始解析其中的html代碼,遇到js/css/image等靜態資源時,就向服務器端去請求下載(會使用多線程下載,每個瀏覽器的線程數不一樣),這是時候就用上 keep-alive特性了,建立一次HTTP連接,可以請求多個資源,下載資源的順序就是按照代碼里面的順序,但是由於每個資源大小不一樣,而瀏覽器又是多線程請求請求資源,所以這里顯示的順序並不一定是代碼里面的順序。
瀏覽器對頁面進行渲染呈現給用戶
最后,瀏覽器利用自己內部的工作機制,把請求的靜態資源和html代碼進行渲染,渲染之后呈現給用戶
瀏覽器是一個邊解析邊渲染的過程。首先瀏覽器解析HTML文件構建DOM樹,然后解析CSS文件構建渲染樹,等到渲染樹構建完成后,瀏覽器開始布局渲染樹並將其繪制到屏幕上。這個過程比較復雜,涉及到兩個概念: reflow(回流)和repain(重繪)。DOM節點中的各個元素都是以盒模型的形式存在,這些都需要瀏覽器去計算其位置和大小等,這個過程稱為relow;當盒模型的位置,大小以及其他屬性,如顏色,字體,等確定下來之后,瀏覽器便開始繪制內容,這個過程稱為repain。頁面在首次加載時必然會經歷reflow和repain。reflow和repain過程是非常消耗性能的,尤其是在移動設備上,它會破壞用戶體驗,有時會造成頁面卡頓。所以我們應該盡可能少的減少reflow和repain。
自此一次完整的HTTP事務宣告完成.
總結:
域名解析 --> 發起TCP的3次握手 --> 建立TCP連接后發起http請求 --> 服務器響應http請求,瀏覽器得到html代碼 --> 瀏覽器解析html代碼,並請求html代碼中的資源(如js、css、圖片等) --> 瀏覽器對頁面進行渲染呈現給用戶。
關於http請求的完整分析就是這些了,希望對你有幫助;歡迎樓下就做。贊一下,頂一下!