做爲前端開發者,咱們有必要了解數據在網絡中是怎樣傳輸的,而HTTP是瀏覽器中使用最多的與服務器進行通訊的協議,經過對協議的學習,使咱們對瀏覽器工做流程及解決項目優化瓶頸都有很重要的意義。所以本文就HTTP的發展歷程及發展各個階段作了哪些優化進行總結說明。也算是對本身這一階段的學習作個總結。css
主要功能是在網絡之間傳輸HTML超文本文件,因此又叫超文本傳輸協議,實現較爲簡單,只是基於請求與響應。整個傳輸過程是基於TCP下的,因此傳輸以前要首先創建TCP鏈接。具體流程圖以下圖所示: html
總結HTTP/0.9具備如下特色:隨着互聯網的不斷髮展,咱們對瀏覽器展現的頁面要求也愈來愈高,在瀏覽器中加載的資源不能只侷限於HTML,還包括JS、CSS、IMG、video、audio等其餘類型資源,因此HTTP在數據傳輸過程當中加入了請求頭與響應頭(以key-value對形式存在),用來傳輸更多信息。流程圖以下: 前端
有了請求頭和響應頭後,瀏覽器和服務器就能夠交換更多的信息,而且作不一樣的處理,比較典型的幾個頭信息以下:HTTP/1.0的大幅度改進,增長了客戶端與服務端的拓展性,但因爲客戶端對性能或者用戶體驗的要求不斷提升,當資源過多時沒法知足咱們的需求,所以HTTP/1.1又作了大量改進,主要改進有如下幾點:瀏覽器
首先HTTP/1.0採用的是短鏈接,也就是每次請求都要創建TCP鏈接、斷開鏈接的操做,無形增大了不少開銷。因此HTTP/1.1增長了持久鏈接,意思是鏈接一旦創建,就能夠傳輸屢次HTTP請求,經過頭信息Connection: keep-alive實現,默認開啓,而且容許同一域名下最多同時創建6個TCP鏈接。如需關閉傳入close便可。緩存
在HTTP/1.0 時,經過響應頭中設置Content-Length告知瀏覽器資源大小,但目前不少頁面的內容都是動態生成的,傳輸前沒法判斷資源大小,因此瀏覽器不知道何時傳輸完。安全
HTTP/1.1 經過引入 Chunk transfer 機制來解決這個問題,服務器會將數據分割成若干個任意大小的數據塊,每一個數據塊發送時會附上上個數據塊的長度,最後使用一個零長度的塊做爲發送數據完成的標誌。這樣就提供了對動態內容的支持。服務器
經過引入cookie記錄和保存用戶信息,由服務器端生成,經過set-cookie告知客戶端,瀏覽器將其存放在內存或磁盤中,set-cookie只能包含一個name/value名值對,可是服務器能夠發送多個set-cookie頭部,客戶端經過cookie請求頭將cookie發送服務端驗證,響應頭不一樣的是,他只能發送一個cookie請求頭,但它能夠包含多個名值對 。cookie
在HTTP/1.1中仍然存在不少能夠優化的問題好比TCP慢啓動、帶寬利用率不高、併發鏈接的限制、在同一TCP鏈接內每一個請求時串行的、不支持服務器推送等問題。網絡
在HTTP/2.0版本中對上述問題主要作了如下改進:併發
具體實現是在應用層添加二進制分幀層,數據經過二進制分幀層變成一個個標有streamID的數據流,每一個stream能夠包含一個或多個數據幀。接收端能夠經過streamID將消息進行組裝。這樣就實現了同一TCP中能夠併發傳送多個HTTP請求。
對於某些關鍵性資源,例如js、css咱們每每但願服務端優先處理,在HTTP/2.0中能夠經過stream中的Priority設置幀來配置優先級
對於HTML頁面中引用的資源,若是咱們在請求html時,服務端解析到須要哪些js或css資源文件而且一併發送給客戶端,而不是等到客戶端解析html後去請求資源文件。這種對於頁面的加載的速度提高是很是大的。
HTTP/2.0中能夠實現將資源提早推送到客戶端進行緩存。由服務端把請求放到PUSH_PROMISE幀,再額外推送資源。客戶端再解析到資源請求時就能夠直接在緩存中讀取
這樣減小TCP鏈接個數,從而優化TCP慢啓動的問題