1. 程式人生 > >HTTP協議部分總結

HTTP協議部分總結

AD field 傳輸 http 嘗試 AR 按順序 驗證 支持斷點續傳

HTTP協議

  • HTTP定義在七層協議中的應用層,TCP解決的是傳輸層的邏輯

  • HTTP使用TCP而不是UDP的原因在於打開一個網頁必須傳送很多數據,而TCP協議提供傳輸控制,按順序組織數據,和錯誤糾正

  • HTTP連接使用的是“請求—響應”的方式,不僅在請求時需要先建立連接,而且需要客戶端向服務器發出請求後,服務器端才能回復數據

HTTP/1.0

影響一個HTTP網絡請求的因素主要有兩個:帶寬、延遲

  • 帶寬:如今網絡基礎建設已經使得帶寬得到極大的提升,不再需要擔心由帶寬而影響網速

  • 延遲

    • 瀏覽器阻塞(HOL blocking):瀏覽器會因為一些原因阻塞請求。瀏覽器對於同一個域名,同時只能有數個連接(不同的瀏覽器內核連接數量不同),超過瀏覽器最大連接數限制,後續請求就會被阻塞

    • DNS 查詢(DNS Lookup):瀏覽器需要知道目標服務器的 IP 才能建立連接。將域名解析為 IP 的這個系統就是 DNS。這個通常可以利用DNS緩存結果來達到減少這個時間的目的

    • 建立連接(Initial connection):HTTP 是基於 TCP 協議的,瀏覽器最快也要在第三次握手時才能捎帶 HTTP 請求報文,達到真正的建立連接,但是這些連接無法復用會導致每次請求都經歷三次握手和慢啟動。三次握手在高延遲的場景下影響較明顯,慢啟動則對文件類大請求影響較大

缺陷

  1. 每個請求都需單獨建立連接(keep-alive能解決部分問題單不能交叉推送)

  2. 每個請求和響應都需要完整的頭信息

  3. 數據未加密

HTTP/1.1

  相較於1.0的區別體現在以下幾個方面

  1. 緩存處理:在HTTP1.0中主要使用header裏的If-Modified-Since,Expires來做為緩存判斷的標準,HTTP1.1則引入了更多的緩存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供選擇的緩存頭來控制緩存策略。

  2. 帶寬優化及網絡連接的使用:HTTP1.0中,存在一些浪費帶寬的現象,例如客戶端只是需要某個對象的一部分,而服務器卻將整個對象送過來了,並且不支持斷點續傳功能,HTTP1.1則在請求頭引入了range頭域,它允許只請求資源的某個部分,即返回碼是206(Partial Content),這樣就方便了開發者自由的選擇以便於充分利用帶寬和連接

  3. 錯誤通知:在HTTP1.1中新增了24個錯誤狀態響應碼,如409(Conflict)表示請求的資源與資源的當前狀態發生沖突;410(Gone)表示服務器上的某個資源被永久性的刪除

  4. 瀏覽器請求:HTTP 1.1支持長連接(PersistentConnection)和請求的流水線(Pipelining)處理,在一個TCP連接上可以傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲,在HTTP1.1中默認開啟Connection: keep-alive,一定程度上彌補了HTTP1.0每次請求都要創建連接的缺點

  5. 地址的維護:在HTTP1.0中認為每臺服務器都綁定一個唯一的IP地址,因此,請求消息中的URL並沒有傳遞主機名 即hostname 但隨著虛擬主機技術的發展,在一臺物理服務器上可以存在多個虛擬主機(Multi-homed Web Servers),並且它們共享一個IP地址 HTTP1.1的請求消息和響應消息都應支持Host頭域,且請求消息中如果沒有Host頭域會報告一個錯誤(400 Bad Request)

HTTP/2.0

相較於1.x的區別體現在以下幾個方面

  1. 新的二進制格式(Binary Format):HTTP1.x的解析是基於文本。基於文本協議的格式解析存在天然缺陷,文本的表現形式有多樣性,要做到健壯性考慮的場景必然很多,二進制則不同,只認0和1的組合。基於這種考慮HTTP2.0的協議解析決定采用二進制格式,實現方便且健壯

  2. 多路復用(MultiPlexing):即連接共享,即每一個request都是是用作連接共享機制的。一個request對應一個id,這樣一個連接上可以有多個request,每個連接的request可以隨機的混雜在一起,接收方可以根據request的 id將request再歸屬到各自不同的服務端請求裏面

  3. header壓縮:HTTP1.x的header帶有大量信息,而且每次都要重復發送,HTTP2.0使用encoder來減少需要傳輸的header大小,通訊雙方各自cache一份header fields表,既避免了重復header的傳輸,又減小了需要傳輸的大小

  4. 服務端推送(server push):如網頁有一個XX.css的請求,在客戶端收到XX.css數據的同時,服務端會將XX.js的文件推送給客戶端,當客戶端再次嘗試獲取XX.js時就可以直接從緩存中獲取到,不用再發請求了

HTTP2.0只適用於HTTPS的場景

  • 由於HTTPS是在HTTP和TCP之間增加了一層SSL,即secure socket layer,增加了數據安全傳輸及客戶端和服務器端的身份驗證,因此HTTP2.0只適用於HTTPS的場景。

HTTPS與HTTP的區別

主要體現在以下幾個方面

  1. HTTPS協議需要到CA申請證書,一般免費證書很少,需要交費

  2. HTTP協議運行在TCP之上,所有傳輸的內容都是明文,HTTPS運行在SSL/TLS之上,SSL/TLS運行在TCP之上,所有傳輸的內容都經過加密的。

  3. HTTPHTTPS使用的是完全不同的連接方式,默認端口不同,前者是80,後者是443。

  4. HTTPS可以有效的防止運營商劫持,解決了防劫持的一個大問題 即從HTTPHTTP => TCP 變為HTTPS的 HTTP => SSL/TLS(加密、解密過程) => TCP

以上幾點帶來的好處

HTTP協議部分總結