三次握手和四次揮手
請求類型
SYN :請求建立
ACK :請求確認
FIN :請求關閉
三次握手
- 1:客戶端發送一個 SYN
- 2:服務端收到 SYN,返回一個 SYN 和 ACK
- 3:客戶端返回一個 ACK,此時建立連接。
為什么三次?
我的理解是,防止客戶端發送 SYN 后,過來很久時間服務端才收到,若此時客戶端不再需要建立連接,服務端建立連接會導致資源的浪費,所以需要再次返回一個 SYN 和 ACK。
四次揮手
- 1:客戶端發送 FIN
- 2:服務端收到 FIN,返回 ACK
- 3:服務端關閉連接后返回 FIN
- 4:客戶端收到 FIN,返回 ACK
為什么 2、3 不一起返回?
我的理解是,當服務端收到 FIN 后,會關閉連接,但關閉是一個異步的操作,需要時間去關閉,這個時間不確定,如果花了很長時間才關閉,客戶端就會等很久,但客戶端其實不需要關心你那邊有沒有關閉,所以服務端會先返回一個 ACK,告訴客戶端我知道了,正在關,客戶端收到后可以去先執行其他事務,而服務端等到關閉后,再發送一個 FIN,此時客戶端收到后,會返回一個 ACK 表示明白。
HTTP 狀態碼
100、200:狀態
- 100:消息處理,繼續請求
- 200:成功請求
300+ 資源更改
比如鏈接重定向、緩存已修改,常見為:
- 300:重定向多個鏈接,服務器根據用戶請求來進行跳轉
- 301:永久重定向
- 302:臨時重定向
- 303:其他 URL 位置可以找到這個請求
- 304:文件未修改,可以繼續使用(HTTP 緩存使用的),只返回 header 所以更快
400+ 請求錯誤
常見為:
- 400:無法理解的請求
- 401:請求頁面需要賬號和密碼,也就是訪問受限,和登陸接口 token 過期一樣
- 403:頁面請求被禁止
- 404:頁面不存在
500+ 服務端錯誤
常見為:
- 500:服務器發生了一個不可預知的錯誤,通常就是沒有進行錯誤處理,導致代碼出現問題。。
- 501:服務器不支持所請求的功能
- 502:錯誤網關,服務器作為網關或代理,從上游服務器收到無效響應,比如這個請求的代碼去請求了另一個 api,這個 api 掛掉了。
- 503:服務器暫時無法使用,超載或宕機。。
- 504:網關超時,服務器作為網關或代理,從上游服務器收到無效響應,比如這個請求的代碼去請求了另一個 api,這個 api 超時了。
HTTP 的持續連接
- HTTP1.0:輪詢請求,持續請求保持不斷開,比較消耗資源
- HTTP1.1:在請求頭帶上 Connection: keep-alive,可以保持連接
HTTP 緩存
首先瀏覽器的緩存可以理解為在瀏覽器內部有一個小型的緩存數據庫,某鍵對應某文件。
而頁面在加載的時候,會根據要求把文件放入緩存,也會根據需求去讀取使用,具體分為兩種類型:
- 強制緩存
- 協商緩存
強制緩存
假設文件為強制緩存,流程如下:
- 1:讀取緩存數據庫的數據,有數據進入下一步,無數據進入第 3 步。
- 2:檢查數據是否到期,到期進入下一步,未到期則使用。
- 3:請求數據使用并緩存到本地緩存數據庫中。
是否強制緩存根據相應頭上的一個字段判斷,根據 HTTP 的版本不同,有不同為不同的字段:
HTTP1.0:Expires 字段代碼其到期時間。
HTTP1.1:Cache-Control 字段控制,其可選值如下:
- private:前端保存
- public:前后端都保存
- max-age:緩存的內容將在 n 秒后失效
- no-store:有內容都不會緩存
- no-cache:需要使用對比緩存來驗證緩存數據
協商緩存
假設文件為協商緩存,流程如下:
- 1:讀取緩存數據庫的數據,有數據進入下一步,無數據進入第 3 步。
- 2:發送請求,確認數據是否修改,修改則進入下一步,未修改則使用。
- 3:請求數據使用并緩存到本地緩存數據庫中。
分開說一下 HTTP1.0 和 HTTP2.0 的區別。
HTTP1.0
在文件的第一次請求時,響應頭會返回一個字段:Last-Modified,代表此資源的最后修改時間,瀏覽器保留此值。
在后面的請求中,請求頭中會存在 If-Modified-Since 的字段,值為第一次的 Last-Modified 的值。
服務器以此進行比較,判斷最后返回 200 或 304,若是 200 的話,取響應頭的 Last-Modified 值更新本地保存的。
PS:這樣比較的話,如果文件僅僅是 ctrl + s 一下,也會進行更新。
HTTP1.1
在文件的第一次請求時,響應頭會返回一個字段:Etag,代表服務器以此資源而生成一個 id 標志,瀏覽器保留此值。
在后面的請求中,請求頭中會存在 If-None-Match 的字段,值為第一次的 Etag 的值。
服務器以此進行比較,判斷最后返回 200 或 304,若是 200 的話,取響應頭的 Etag 值更新本地保存的。
PS:這樣比較的話,文件內容不變是不會更新的。