http1.X與2.0

HTTP

HTTP 1.X

  1. HTTP是創建在TCP協議上的,HTTP協議的瓶頸及優化都是基於TCP協議自己的特性。web

  2. TCP創建鏈接時有三次握手 會有1.5RTT的延遲,爲了不每次請求都經歷握手待來的延遲,應用層會選擇不一樣策略的http長鏈接。算法

HTTP 1.0 鏈接不能複用以及有head of line blocking問題。

http1.0協議頭裏能夠設置Connection:Keep-Alive。在header裏設置Keep-Alive能夠在必定時間內複用鏈接,具體複用時間的長短能夠由服務器控制,通常在15s左右。到http1.1以後Connection的默認值就是Keep-Alive,若是要關閉鏈接複用須要顯式的設置Connection:Close。
<br />
head of line blocking會由於一個request沒有到達服務器或者一個response由於網絡沒有及時返回而影響後續全部請求。

鏈接複用問題

tcp長連接
http long-polling

客戶端在初始狀態會發送一個polling請求到服務器,服務器並不會立刻返回業務數據,而是等待有新的業務數據產生時返回。因此鏈接會被保持,一旦結束立刻又會發起一個新的polling請求,反覆如此。安全

http streaming

與long-polling不一樣,server並不會結束初始的streaming請求,而是持續的經過這個通道返回最新的業務數據,但這個通道時單向的。服務器

web socket

與傳統的 tcp socket鏈接類似,也是基於tcp協議,並提供雙向的數據通道。cookie

解決head of line blocking

http pipelining

讓每一個請求不用等待其餘請求的response返回以後才發出,而是幾乎在同一時間把request發送給服務器。網絡

SPDY

http 1.X存在諸多問題,在嘗試了各類優化手段後提出的SPDY方案。socket

SPDY目標

  • 下降延遲,客戶端的單鏈接單請求,server的FIFO響應隊列都是延遲的大頭。
  • http最初設計都是客戶端發起請求,而後server響應,server沒法主動push內容到客戶端。
  • 壓縮http header,http1.x的header愈來愈膨脹,cookie和user agent很容易讓header的size增至1kb大小,甚至更多。並且因爲http的無狀態特性,header必須每次request都重複攜帶,很浪費流量。

SPDY基礎功能

  • 多路複用。多路複用經過多個請求stream共享一個tcp鏈接的方式,解決了http 1.x hold of line blocking 的問題,下降了延遲同時提升了帶寬的利用率。
  • 請求優先級。多路複用帶來一個新的問題,在鏈接共享的基礎上可能致使一些關鍵請求被阻塞。
  • header壓縮。 http1.X的 header不少時候都是重複多餘的。選擇合適的壓縮算法能夠減少包的大小和數量。

SPDY高級功能

  • server推送。 http1.x只能由客戶端發起請求,而後服務器被動的發送response。開啓server push以後,server經過X-Associated-Content header告知客戶端會有新的內容推送過來。
  • server暗示。 和server push不一樣的是,server hint並不會主動推送內容,只是告訴有新的內容產生,內容的下載仍是須要客戶端主動發起請求。server hint經過X-Subresources header來通知。

HTTP 2.0

  • 客戶端向server發送request這種基本模式不會變。
  • 老的scheme不會變,使用http://和https://的服務和應用不會要作任何更改。
  • 使用http1.x的客戶端和服務器能夠無縫的經過代理方式轉接到http2.0 上
  • 不識別http2.0的代理服務器能夠將請求降級到http1.x

HTTP 2.0主要改動

新的二進制格式

http 1.x是明文協議,格式由strat line,header,body組成。須要作協議解析來識別這3哥部分,http1.x的解析是基於文本的,而文本格式解析存在自然缺陷,二進制比文本格式更方便且健壯。


http 2.0的格式定義更接近tcp。由Length,Type,Flags,Stream ID,Payload5個部分組成。tcp

  • length定義了整個frame的開始到結束
  • type定義frame的類型
  • flags用bit位定義了一些重要的參數
  • stream id用做流控制
  • payload就是request的正文

鏈接共享

stream id 做用就是鏈接共享機制,一個request對應一個stream並分配一個id,這樣一個鏈接上能夠有多個stream,每一個stream的frame隨機混雜在一塊兒,接收方根據stream id將frame再歸屬到各自不一樣的request裏面。每一個stream均可以設置優先級和依賴。優化

header壓縮

http2.0使用encoder來減小須要傳輸的header大小,通信雙方各自cache一份header fields表,避免重複header傳輸,減小傳輸大小。加密

壓縮算法選擇

SPDY/2使用的是gzip 壓縮算法,後來出現BREACHCRIME 2種攻擊方式,即便走SSL的SPDY也能夠破解內容,http2.0採用HPACK的壓縮算法。

重置鏈接表現

對於http 1.x來講,是經過設置tcp segment裏的reset flag來通知對端關閉鏈接。http2.0引入RST_STREAM 類型的frame,能夠在不斷開鏈接的前提下取消某個request的stream。

流量控制

http2.0 經過相似receive window的作法,數據的接收方經過告知對方本身的flow window大小代表本身還能接收多少數據。只有Data類型的 frame纔有流量控制功能。

服務推送

http2.0 經過push的方式將客戶端需求的內容預先推送過去,也叫cache push。若是客戶端退出,需取消server push,能夠經過發送RST_STREAM類型的frame來作到。

Nagle Algorithm/TCP Delayed Ack

Nagle Algorithm/TCP Delayed Ack是一組對立的算法。http2.0能夠經過TCP_NODELAY禁用Nagle或TCP_QUICKACK禁用ACK。官方推薦設置TCP_NODELAY

更安全的SSL

HTTP2.0使用了tls的拓展ALPN來作協議升級,除此以外加密這塊還有一個改動,HTTP2.0對tls的安全性作了近一步增強

相關文章
相關標籤/搜索