下面以訪問baidu頁面來做一個過程分析
- 輸入 URL:http://www.baidu.com
- DNS 域名解析
- 計算機無法識別域名,計算機與計算機之間要想進行通信,必須通過ip地址用來定位該計算機所在的位置
- 在瀏覽器中,輸入的ip地址或者域名,默認給你加了一個80端口號(對方的服務器監聽的就是80端口)
- 158.12.25.652 域名就是為了好記
- 為了好記,所以我們的萬維網提供了 一個 域名這樣的概念
- 當你輸入了 ip 地址后,瀏覽器會自動去 找DNS域名解析服務器,
- 建立 TCP 連接(Socket):三次握手,確保這個一定是一個有效的請求和響應,這個三次握手在業界相信大多數人都不陌生,雖然它是提高了傳輸的有效性,但是這個導致的直接問題就是整個傳輸過程是很耗時的,也就是說每次http請求都會經歷三次握手這個過程,消耗的時間也是不言而喻,並且傳統的http協議規定一次請求只能請求一個文件,所以一些頂級網站千方百計的采取一些減少http請求的策略,大多數就是采取一次http請求能夠請求多個文件這樣的實現,欣喜的是,http2.0已經支持能夠一次http能夠請求多個文件,這個還是值得期待全部推行開來的,只不過肯定需要過上一段時間,慢慢去等待推行吧。
- 將用戶輸入的地址封裝成 HTTP Request 請求報文 發送到服務器
- 瀏覽器將用戶輸入的 URL 地址根據HTTP協議 封裝成了 http 請求報文(請求頭+請求行+請求體)
- 該報文說白了也就是字符串而已,最終也要被轉成了二進制數據再發送到服務器
- 后台服務器接收到用戶HTTP Request 請求報文
- 后台服務器接收到 客戶端發送給自己的數據(二進制數據)
-
- 首先把二進制數據按照編碼解析成字符,(人類可以識別的)
- 解析成字符之后,再按照 HTTP 協議規范中定義的格式解析出來
-
后台服務器處理用戶請求信息
- 當得到用戶請求報文之后,根據請求報文中的 get、port或者 URL、或者URL中的查詢字符串或者 請求體中的數據
- 根據用戶的特定的請求數據做特定的處理
- 后台服務器將相應結果封裝到 HTTP Response 響應報文中 發送給客戶端
- 當我們解析和處理完用戶請求報文消息之后
- 服務器開始將具體的 要發送給客戶端的數據 根據 HTTP 協議規范 封裝成 HTTP協議響應報文
- 響應頭、響應字段、響應體
- 該數據說白了也是具有特定格式的字符串而已,最終這個字符串也要轉換成二進制數據發送到客戶端
- 發送到客戶端也是通過 Socket(ip地址、端口號) 發送到了該客戶單
- 用戶瀏覽器接收到響應后開始渲染html、css,解析和執行 JavaScript 代碼
- 當客戶端解析到 服務器發送過來的 二進制數據
- 客戶端瀏覽器也會將 二進制數據 根據編碼類型解析成 字符串
- 然后根據 HTTP 協議,解析服務器發送過來的 響應報文
- 然后根據響應報文中的報文內容(報文頭、報文體)做具體的解析
- 當瀏覽器在解析的過程中遇到 一些靜態資源時,會再次重復上面的步驟