每個前端都要了解點網絡知識

OSI 參考模型 與 TCP/IP 五層模型

我們主要關注於 TCP/IP 五層模型 的 應用層傳輸層 就足夠了。

應用層:

作用:為應用程序提供服務。常見協議:HTTP、HTTPS、FTP、POP3、SMTP等。

傳輸層:

作用:實現應用程序之間的數據傳輸。協議:UDP、TCP

UDP 與 TCP

UDP

UDP 是面向無連接的協議,它只會把數據傳遞給接收端,但不會關注接收端是否已經正確接收了數據,所以有時候 UDP 會被認為是不可靠的數據報協議。但這種特性反而適合多播,實時的視頻和音頻傳輸。

優點:

無需建立連接(減少了延遲)實現簡單(效率高)頭部開銷小( 8 字節)沒有擁塞控制(更好的控制發送時間和速率)

缺點:

沒有建立連接(數據想發就發,不可靠)沒有擁塞控制(網絡條件不好時會導致丟包)

TCP

TCP 是面向有連接的協議,在使用 TCP 協議 傳輸數據之前一定需要在發送方和接收方之間建立連接。建立連接三次握手,斷開連接四次揮手~

TCP 建立連接三次握手

第一次握手:

客戶端服務端發送一個 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 狀態。此時連接建立成功。

這個過程可以用以下三句形象表示:

(客戶端):我想建立連接了,服務端你準備好沒有呀?(服務端):我準備好了,你準備好沒有?(客戶端):我也準備好了,開始吧~

TCP 關閉連接四次揮手

這個過程可以用以下四句句形象表示:

(客戶端):我想關閉連接了。(服務端):我知道了。(服務端):我現在準備關閉連接了,ok 嗎?(客戶端):ok,你關閉吧。

UDP 與 TCP 的區別

UDP 協議是面向無連接的,它不能保證數據有序且不丟失的傳到對端,但是 UDP 比 TCP 更高效。TCP 協議是面向有連接的,建立和斷開連接都需要握手,在傳輸數據的過程中,通過
滑動窗口(流量控制)、擁塞處理(慢開始,擁塞避免,快速重傳,快速恢復),能夠正確處理丟包問題,保證接收方能夠收到數據,與此同時還能夠有效利用網絡帶寬。

HTTP

HTTP (HyperText Transfer Protocol) 超文本傳輸協議 是一個基於 TCP (傳輸層) 的應用層協議,是客戶端與服務端之間請求和響應的標準。

主要特點

簡單快速

客戶端向服務器請求服務時,只需請求方法和請求路徑。

無狀態

客戶端再次向服務器請求服務時,服務器並不知道客戶端之前是否請求過。

無連接

每次請求都會建立一個 TCP 連接,請求處理完成後連接斷開。

HTTP 報文

請求行:

GET https://www.baidu.com/ HTTP/1.1 由請求方法、URL、協議版本組成

響應行:

HTTP/1.1 200 OK

協議版本、狀態碼、狀態信息組成

HTTP 請求方法

請求方法分為很多種,最常用的也就是 GET 和 POST 了。雖然請求方法很多,但更多的是為了傳達語義。更多的方法的語義描述可以閱讀 文檔 。

GET 和 POST 的區別

GET

能緩存、請求長度限制、 有歷史記錄

GET 多用於 無副作用(不修改資源)、冪等(請求次數與資源無關)的場景。

POST

POST 相對 GET 安全一點點,因為 GET 請求發送的數據包含在 URL 裡。

兩者詳細對比:

![GET與POST](https://inknight.cn/pic/note/...

)

狀態碼

狀態碼錶示了響應的狀態,可以讓我們知道這一次的請求是成功還是失敗,如果失敗,是什麼原因導致的。

2XX 成功

200 OK ,請求成功並返回數據204 No Content ,成功但無內容206 Partial Content ,範圍請求

3XX 重定向

301 永久重定向,表示資源已被分配了新的 URL302 臨時重定向,資源臨時被分配新的 URL304 資源未修改,可使用緩存

4XX 客戶端錯誤

400 請求語法錯誤401 要求身份認證403 請求被服務器拒絕404 資源不存在

5XX 服務器錯誤

500 服務器錯誤503 服務器超負載或停機維護

HTTPS

更安全的網絡傳輸協議

需要安裝證書(公鑰)經過 SSL/TLS 協議 加密,傳輸的內容是經過加密的使用 443 端口

HTTP/2

多路複用

在同一個 TCP 連接上傳輸所有的請求數據,避免 隊頭阻塞(瀏覽器限制同一個域名下的連接數)問題

Header 壓縮

使用了 HPACK 壓縮格式對傳輸的 header 進行編碼,減少了 header 的大小。並在兩端維護了索引表,用於記錄出現過的 header ,避免 header 重複傳輸。

二進制傳輸

在之前的 HTTP 版本中,我們是通過文本的方式傳輸數據。在 HTTP/2 中引入了新的編碼機制,所有傳輸的數據都會被分割,並採用二進制格式編碼。

服務端推送

服務端可以在客戶端的某個請求後,主動推送其他客戶端在之後會用到的資源。省去了客戶端重複請求的步驟,降低了延遲。

https://juejin.im/post/5c64d15d6fb9a049d37f9c20#heading-49

https://mp.weixin.qq.com/s/GICbiyJpINrHZ41u_4zT-A?

http://www.alloyteam.com/2016/07/httphttp2-0spdyhttps-reading-this-is-enough/

https://juejin.im/book/5bdc715fe51d454e755f75ef/section/5bdc72b151882516f039fce3