http1.0 http1.1 http2.0特性及區別

原文地址

https://my729.github.io/blog/internetwork/http%E7%89%88%E6%9C%AC%E5%8C%BA%E5%88%AB.htmlhtml

http1.0特性

  • 無狀態:服務器不跟蹤不記錄請求過的狀態
  • 無鏈接:瀏覽器每次請求都須要創建tcp鏈接

無狀態

對於無狀態的特性能夠藉助cookie/session機制來作身份認證和狀態記錄git

無鏈接

無鏈接致使的性能缺陷有兩種:github

1. 沒法複用鏈接
每次發送請求,都須要進行一次tcp鏈接(即3次握手4次揮手),使得網絡的利用率很是低瀏覽器

2. 隊頭阻塞
http1.0規定在前一個請求響應到達以後下一個請求才能發送,若是前一個阻塞,後面的請求也給阻塞的緩存

http1.1特性

爲了解決http1.0的性能缺陷,http1.1出現了服務器

http1.1特性:cookie

  • 長鏈接:新增Connection字段,能夠設置keep-alive值保持鏈接不斷開
  • 管道化:基於上面長鏈接的基礎,管道化能夠不等第一個請求響應繼續發送後面的請求,但響應的順序仍是按照請求的順序返回
  • 緩存處理:新增字段cache-control
  • 斷點傳輸

長鏈接

http1.1默認保持長鏈接,數據傳輸完成保持tcp鏈接不斷開,繼續用這個通道傳輸數據網絡

管道化

基於長鏈接的基礎,咱們先看沒有管道化請求響應:session

tcp沒有斷開,用的同一個通道tcp

請求1 > 響應1 --> 請求2 > 響應2 --> 請求3 > 響應3

管道化的請求響應:

請求1 --> 請求2 --> 請求3 > 響應1 --> 響應2 --> 響應3

即便服務器先準備好響應2,也是按照請求順序先返回響應1

雖然管道化,能夠一次發送多個請求,可是響應還是順序返回,仍然沒法解決隊頭阻塞的問題

緩存處理

當瀏覽器請求資源時,先看是否有緩存的資源,若是有緩存,直接取,不會再發請求,若是沒有緩存,則發送請求

經過設置字段cache-control來控制

斷點傳輸

在上傳/下載資源時,若是資源過大,將其分割爲多個部分,分別上傳/下載,若是遇到網絡故障,能夠從已經上傳/下載好的地方繼續請求,不用從頭開始,提升效率

在 Header 裏兩個參數實現的,客戶端發請求時對應的是 Range 服務器端響應時對應的是 Content-Range

http2.0特性

  • 二進制分幀
  • 多路複用: 在共享TCP連接的基礎上同時發送請求和響應
  • 頭部壓縮
  • 服務器推送:服務器能夠額外的向客戶端推送資源,而無需客戶端明確的請求

二進制分幀

將全部傳輸的信息分割爲更小的消息和幀,並對它們採用二進制格式的編碼

多路複用

基於二進制分幀,在同一域名下全部訪問都是從同一個tcp鏈接中走,http消息被分解爲獨立的幀,亂序發送,服務端根據標識符和首部將消息從新組裝起來

區別

  1. http1.0 到http1.1的主要區別,就是從無鏈接到長鏈接
  2. http2.0對比1.X版本主要區別就是多路複用
相關文章
相關標籤/搜索