前端主要關注於應用層的 HTTP 協議,傳輸層的 TCP 協議,斷舍離一下,就主要總結這兩種協議了。前端
咱們主要關注於 TCP/IP 五層模型
的 應用層 和 傳輸層 就足夠了。瀏覽器
應用層:緩存
HTTP
、HTTPS
、FTP
、POP3
、SMTP
等。傳輸層:安全
UDP
、TCP
UDP 是面向無鏈接的協議,它只會把數據傳遞給接收端,但不會關注接收端是否已經正確接收了數據,因此有時候 UDP 會被認爲是不可靠的數據報協議。但這種特性反而適合多播,實時的視頻和音頻傳輸。服務器
優勢:網絡
缺點:post
TCP 是面向有鏈接的協議,在使用
TCP 協議
傳輸數據以前必定須要在發送方和接收方之間創建鏈接。創建鏈接三次握手,斷開鏈接四次揮手~this
第一次握手:
網絡傳輸協議
客戶端向服務端發送一個 SYN(Seq=X) 包,客戶端進入 SYN-SENT
狀態,等待服務端的 ACK(Ack=X+1)回覆。 ps: Seq 是序號,Ack 是確認序號。編碼
第二次握手:
服務端根據接收到客戶端發來的 SYN(Seq=X) 包後返回一個 ACK(Ack=X+1) 以及 SYN(Seq=Y) 包給客戶端,服務端進入 SYN-RECIVED
狀態,等待客戶端的 ACK(Ack=Y+1) 回覆。
第三次握手:
客戶端接收到 ACK(X+1) 後,進入 ESTABLISHED
狀態。根據服務端發來的 SYN(Y) 返回一個 ACK(Y+1) 包給服務端。 服務端 接收 ACK(Y+1)後進入 ESTABLISHED
狀態。此時鏈接創建成功。
這個過程能夠用如下三句形象表示:
- (客戶端):我想創建鏈接了,服務端你準備好沒有呀?
- (服務端):我準備好了,你準備好沒有?
- (客戶端):我也準備好了,開始吧~
這個過程能夠用如下四句句形象表示:
- (客戶端):我想關閉鏈接了。
- (服務端):我知道了。
- (服務端):我如今準備關閉鏈接了,ok 嗎?
- (客戶端):ok,你關閉吧。
HTTP (HyperText Transfer Protocol) 超文本傳輸協議 是一個基於 TCP (傳輸層) 的應用層協議,是客戶端與服務端之間請求和響應的標準。
客戶端向服務器請求服務時,只需請求方法和請求路徑。
客戶端再次向服務器請求服務時,服務器並不知道客戶端以前是否請求過。
每次請求都會創建一個 TCP 鏈接,請求處理完成後鏈接斷開。
請求行:
GET https://www.baidu.com/ HTTP/1.1
由請求方法、URL、協議版本組成
響應行:
HTTP/1.1 200 OK
協議版本、狀態碼、狀態信息組成
請求方法分爲不少種,最經常使用的也就是 GET
和 POST
了。雖然請求方法不少,但更多的是爲了傳達語義。更多的方法的語義描述能夠閱讀 文檔 。
能緩存、請求長度限制、 有歷史記錄
GET
多用於 無反作用(不修改資源)、冪等(請求次數與資源無關)的場景。
POST
相對GET
安全一點點,由於GET
請求發送的數據包含在 URL 裏。
二者詳細對比:
狀態碼錶示了響應的狀態,可讓咱們知道這一次的請求是成功仍是失敗,若是失敗,是什麼緣由致使的。
2XX 成功
3XX 重定向
4XX 客戶端錯誤
5XX 服務器錯誤
更安全的網絡傳輸協議
在同一個 TCP 鏈接上傳輸全部的請求數據,避免 隊頭阻塞(瀏覽器限制同一個域名下的鏈接數)問題
使用了 HPACK 壓縮格式對傳輸的 header 進行編碼,減小了 header 的大小。並在兩端維護了索引表,用於記錄出現過的 header ,避免 header 重複傳輸。
在以前的 HTTP 版本中,咱們是經過文本的方式傳輸數據。在 HTTP/2 中引入了新的編碼機制,全部傳輸的數據都會被分割,並採用二進制格式編碼。
服務端能夠在客戶端的某個請求後,主動推送其餘客戶端在以後會用到的資源。省去了客戶端重複請求的步驟,下降了延遲。
參考資料: