-
首先http請求是基於tcp/ip協議的,所以要通過DNS服務器將域名解析為相應ip地址如果url里不包含端口號,則會使用該協議的默認端口號。DNS解析詳細過程參考https://blog.csdn.net/qq_39393899/article/details/80405979
-
建立一個socket連接,socket相當於tcp/ip協議的接口,便於我們去使用這個協議(比如create,listen,accept,connect,read和write等等)。socket還有心跳機制,用於保持客戶端服務端的連接,按照一定的時間間隔發送一個自己命名的包給對方。由於socket連接基於tcp/ip協議,所以要經過三次握手。
-
HTTP請求格式分別是請求行、請求頭、空行、消息體,每部分內容占一行。
請求行 :由三部分組成:分別是請求方法( GET/POST/DELETE/PUT/HEAD )、 URI 路徑、 HTTP 版本號。
請求頭:緩存相關信息(Cache-Control,If-Modified-Since)、客戶端身份信息(User-Agent)等鍵值對信息。空行。
主體:客戶端發給服務端的請求數據,這部分數據並不是每個請求必須的。
-
服務器響應HTTP請求
服務器接收處理完請求后返回一個HTTP響應消息給客戶端。HTTP響應消息的格式包括:狀態行、響應頭、空行、消息體。每部分內容占一行。
狀態行 :有 HTTP 協議版本號, 狀態碼 和狀態說明三部分構成。
響應頭:用於說明數據的一些信息,比如數據類型、內容長度等鍵值對。空行。
消息體:服務端返回給客戶端的HTML文本內容。或者其他格式的數據,比如:視頻流、圖片或者音頻數據。
-
瀏覽器解析html代碼,並請求html代碼中的資源
瀏覽器拿到html文件后,就開始解析其中的html代碼,遇到js/css/image等靜態資源時,向服務器端發起一個HTTP請求,如果服務器端返回304狀態碼(告訴瀏覽器服務器端沒有修改該資源),那么瀏覽器會直接讀取本地的該資源的緩存文件。否則開啟新線程向服務器端去請求下載。(這個時候就用上keep-alive特性了,建立一次HTTP連接,可以請求多個資源。)
最后,瀏覽器利用自己內部的工作機制,把請求到的靜態資源和html代碼進行渲染,再呈現給用戶。
