從HTTP發展角度研究HTTP

前言

做爲前端開發者,咱們有必要了解數據在網絡中是怎樣傳輸的,而HTTP是瀏覽器中使用最多的與服務器進行通訊的協議,經過對協議的學習,使咱們對瀏覽器工做流程及解決項目優化瓶頸都有很重要的意義。所以本文就HTTP的發展歷程及發展各個階段作了哪些優化進行總結說明。也算是對本身這一階段的學習作個總結。css

HTTP/0.9

主要功能是在網絡之間傳輸HTML超文本文件,因此又叫超文本傳輸協議,實現較爲簡單,只是基於請求與響應。整個傳輸過程是基於TCP下的,因此傳輸以前要首先創建TCP鏈接。具體流程圖以下圖所示: html

HTTP/0.9請求流程圖
總結HTTP/0.9具備如下特色:

  • 只有一個請求行,沒有請求頭請求體
  • 服務器沒有響應頭,只返回數據就OK。
  • 文件傳輸採用ASCll字符流傳輸。

HTTP/1.0

隨着互聯網的不斷髮展,咱們對瀏覽器展現的頁面要求也愈來愈高,在瀏覽器中加載的資源不能只侷限於HTML,還包括JS、CSS、IMG、video、audio等其餘類型資源,因此HTTP在數據傳輸過程當中加入了請求頭響應頭(以key-value對形式存在),用來傳輸更多信息。流程圖以下: 前端

HTTP/1.0請求流程
有了請求頭和響應頭後,瀏覽器和服務器就能夠交換更多的信息,而且作不一樣的處理,比較典型的幾個頭信息以下:

  • 經過Accept/Content-Type協商接收/傳輸文件類型,包括html、image、application等。
  • 經過Accept-Encoding/Content-Encoding協商壓縮類型,包括gzip、br、deflate等。
  • 經過Cache-Control肯定是否緩存。
  • 經過Accept-Language支持國際化。
  • 加入用戶代理User-Agent用於服務端統計客戶端數據。
  • 引入狀態碼,可讓瀏覽器根據不一樣狀態碼處理不一樣邏輯。

HTTP/1.1

HTTP/1.0的大幅度改進,增長了客戶端與服務端的拓展性,但因爲客戶端對性能或者用戶體驗的要求不斷提升,當資源過多時沒法知足咱們的需求,所以HTTP/1.1又作了大量改進,主要改進有如下幾點:瀏覽器

1. 改進持久鏈接

首先HTTP/1.0採用的是短鏈接,也就是每次請求都要創建TCP鏈接、斷開鏈接的操做,無形增大了不少開銷。因此HTTP/1.1增長了持久鏈接,意思是鏈接一旦創建,就能夠傳輸屢次HTTP請求,經過頭信息Connection: keep-alive實現,默認開啓,而且容許同一域名下最多同時創建6個TCP鏈接。如需關閉傳入close便可。緩存

2. 對動態內容提供支持

在HTTP/1.0 時,經過響應頭中設置Content-Length告知瀏覽器資源大小,但目前不少頁面的內容都是動態生成的,傳輸前沒法判斷資源大小,因此瀏覽器不知道何時傳輸完。安全

HTTP/1.1 經過引入 Chunk transfer 機制來解決這個問題,服務器會將數據分割成若干個任意大小的數據塊,每一個數據塊發送時會附上上個數據塊的長度,最後使用一個零長度的塊做爲發送數據完成的標誌。這樣就提供了對動態內容的支持。服務器

3. 引入 Cookie、安全機制

經過引入cookie記錄和保存用戶信息,由服務器端生成,經過set-cookie告知客戶端,瀏覽器將其存放在內存或磁盤中,set-cookie只能包含一個name/value名值對,可是服務器能夠發送多個set-cookie頭部,客戶端經過cookie請求頭將cookie發送服務端驗證,響應頭不一樣的是,他只能發送一個cookie請求頭,但它能夠包含多個名值對cookie

  • cookie在HTTP中明文傳遞,因此有安全性問題(https解決)。
  • 大小不該超過4k,若是過大在某些代理服務器或瀏覽器中會出現問題。

HTTP/2.0

在HTTP/1.1中仍然存在不少能夠優化的問題好比TCP慢啓動、帶寬利用率不高、併發鏈接的限制、在同一TCP鏈接內每一個請求時串行的、不支持服務器推送等問題。網絡

在HTTP/2.0版本中對上述問題主要作了如下改進:併發

1. 經過多路複用改善串行請求

具體實現是在應用層添加二進制分幀層,數據經過二進制分幀層變成一個個標有streamID的數據流,每一個stream能夠包含一個或多個數據幀。接收端能夠經過streamID將消息進行組裝。這樣就實現了同一TCP中能夠併發傳送多個HTTP請求。

2. 設置請求優先級

對於某些關鍵性資源,例如js、css咱們每每但願服務端優先處理,在HTTP/2.0中能夠經過stream中的Priority設置幀來配置優先級

3. 服務端推送

對於HTML頁面中引用的資源,若是咱們在請求html時,服務端解析到須要哪些js或css資源文件而且一併發送給客戶端,而不是等到客戶端解析html後去請求資源文件。這種對於頁面的加載的速度提高是很是大的。

HTTP/2.0中能夠實現將資源提早推送到客戶端進行緩存。由服務端把請求放到PUSH_PROMISE幀,再額外推送資源。客戶端再解析到資源請求時就能夠直接在緩存中讀取

服務端推送流程圖

4. 支持同一域名維護一個TCP鏈接

這樣減小TCP鏈接個數,從而優化TCP慢啓動的問題

相關文章
相關標籤/搜索