1. Http1.x
缺陷:線程阻塞,在同一時間,同一域名的請求有一定數量限制,超過限制數目的請求會被阻塞。
2. Http1.0(短連接)
缺陷:瀏覽器與服務器只保持短暫的連接,瀏覽器的每次請求都需要與服務器建立一個TCP連接(TCP連接的新建成本很高,因爲需要客戶端和服務器三次握手),服務器完成請求處理後立即斷開TCP連接,服務器不跟蹤每個客戶也不記錄過去的請求;
解決方案:添加頭信息——非標準的Connection字段Connection: keep-alive
3. Http1.1
改進點:
- 持久連接(與Http1其它版本的最大區別)
引入了持久連接,即TCP連接默認不關閉,可以被多個請求複用,不用聲明Connection: keep-alive(對於同一個域名,大多數瀏覽器允許同時建立6個持久連接) - 管道機制
即在同一個TCP連接裏面,客戶端可以同時發送多個請求。 - 分塊傳輸編碼
即服務端每產生一塊數據,就發送一塊,採用”流模式”而取代”緩存模式”。 - 新增請求方式
PUT:請求服務器存儲一個資源;
DELETE:請求服務器刪除標識的資源;
OPTIONS:請求查詢服務器的性能,或者查詢與資源相關的選項和需求;
TRACE:請求服務器回送收到的請求信息,主要用於測試或診斷;
CONNECT:保留將來使用 - 缺點:
雖然允許複用TCP連接,但是同一個TCP連接裏面,所有的數據通信是按次序進行的。服務器只有處理完一個請求,纔會接着處理下一個請求。如果前面的處理特別慢,後面就會有許多請求排隊等着。這將導致“隊頭堵塞”
避免方式:一是減少請求數,二是同時多開持久連接
4. Http/2.0
特點:
- 採用二進制格式而非文本格式;
- 完全多路複用,而非有序並阻塞的、只需一個連接即可實現並行;(解決了線頭阻塞的問題,與Http1最重要的區別)
- 使用報頭壓縮,降低開銷
- 服務器推送
4.1 二進制協議
HTTP/1.1 版的頭信息肯定是文本(ASCII編碼),數據體可以是文本,也可以是二進制。HTTP/2 則是一個徹底的二進制協議,頭信息和數據體都是二進制,並且統稱爲”幀”:頭信息幀和數據幀。
二進制協議解析起來更高效、“線上”更緊湊,更重要的是錯誤更少。
4.2 完全多路複用
HTTP/2 複用TCP連接,在一個連接裏,客戶端和瀏覽器都可以同時發送多個請求或迴應,而且不用按照順序一一對應,這樣就避免了”隊頭堵塞”。
4.3 報頭壓縮
- HTTP 協議是沒有狀態,導致每次請求都必須附上所有信息。所以,請求的很多頭字段都是重複的,比如Cookie,一樣的內容每次請求都必須附帶,這會浪費很多帶寬,也影響速度。
- 對於相同的頭部,不必再通過請求發送,只需發送一次;
- HTTP/2 對這一點做了優化,引入了頭信息壓縮機制;
- 一方面,頭信息使用gzip或compress壓縮後再發送;
- 另一方面,客戶端和服務器同時維護一張頭信息表,所有字段都會存入這個表,產生一個索引號,之後就不發送同樣字段了,只需發送索引號。
4.4 服務器推送
HTTP協議通常承載於TCP協議之上,在HTTP和TCP之間添加一個安全協議層(SSL或TSL),這個時候,就成了我們常說的HTTPS.