首先是域名解析
瀏覽器檢查是否有緩存(游覽器緩存-系統緩存-路由器緩存)。如果有,直接顯示。如果沒有,跳到第三步。
在發送http請求前,需要域名解析(DNS解析),解析獲取對應過的ip地址,DNS查詢步驟,其中一步成功則直接跳到建立連接部分:
- 瀏覽器搜索自身的DNS緩存
-
搜索操作系統自身的DNS緩存
-
讀取本地的HOST文件
-
向域名服務器發送請求
建立TCP連接(TCP三次握手)
瀏覽器獲得域名對應的IP地址后,建立TCP連接,TCP協議通過“三次握手”等方法保證傳輸的安全可靠:
-
發送方:SYN(synchronize),客戶端發送SYN包(SYN=j)到服務器
-
接收方:SYN/ACK:在接收到客戶端的syn包后,服務器也要發送一個SYN包給客戶端,即SYN+ACK包,(確認信息傳達)
-
發送方:ACK:客戶端收到SYN+ACK包后,向服務器發送ACK包(確認接收方在線可收消息,握手結束)
-
Accept:完成三次握手,客戶端與服務器開始傳送數
發送HTTP請求
客戶端向服務端發起HTTP請求(例如:POST/login.html http/1.1)。
客戶端發送請求頭信息,請求內容,最后會發送一空白行,標示客戶端請求完畢。
服務器發送HTML響應
服務器做出應答,表示對於客戶端請求的應答,例如:HTTP/1.1 200 OK。
服務器向客戶端發送應答頭信息。
服務器向客戶端發送請求頭信息后,也會發送一空白行,標示應答頭信息發送完畢,接着就以Content-type要求的數據格式發送數據給客戶端。
TCP連接的釋放
數據傳輸完畢后,雙方都可釋放連接。最開始的時候,客戶端和服務器都是處於ESTABLISHED狀態,然后客戶端主動關閉,服務器被動關閉。
-
客戶端:FIN:客戶端進程發出連接釋放報文,並且停止發送數據;
-
服務器:ACK:服務器收到連接釋放報文,發出確認報文;
-
服務器:FIN+ACK:將最后的數據發送完畢后,就向客戶端發送連接釋放報文
-
客戶端:ACK:收到服務器的連接釋放報文后,發出確認報文(服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB后,就結束了這次的TCP連接)