天天看點

HTTP及其2.0版本綜述

1.HTTP的曆史

HTTP出現已有近30年的曆史了。

最早的版本HTTP 0.9釋出于1991。

随後的HTTP 1.0釋出于1996.5,提供了緩存相關的Head,如If-Modified-Since,Expires等。

1999年釋出的HTTP 1.1是使用最廣泛的版本,其改進的特征如下:

  • 增強了緩存相關的Head: Entity tag,If-Unmodified-Since, If-Match, If-None-Match
  • 對象請求更精确,提供的請求Head: Range
  • 為了支援共享IP的多個虛拟伺服器,提供的請求Head為Host: www.sina.com.cn
  • 用戶端與伺服器之間的長連接配接(persistent connection),提供的Head為Connection: keep-alive
  • 用戶端與伺服器之間的連接配接順序流水線處理pipeline
  • 更豐富的錯誤響應狀态碼

但是HTTP1.1仍然有如下明顯的不足:

  • 連接配接可以串聯,但是無法并發
  • 明文傳輸
  • Header體積過于龐大
  • keep-alive造成伺服器壓力山大

2.SPDY

由于HTTP繼續改進緩慢,忍無可忍的Google在2009釋出了 SPDY。SPDY仍然是一個應用層協定,在TCP之上,在SSL/TLS和HTTP之間。主要是從會話的角度增強了HTTP 1.1以提高Web頁面的通路速度。HTTP 2.0主要就是基于SPDY标準化推出的,可以說SPDY幾乎完全被HTTP 2.0接受。SPDY的最後版本是SPDY 3.1,HTTP 2.0釋出後就終止獨立發展了。

SPDY從一開始就建立在SSL/TLS安全會話的基礎上,因而強制要求HTTPS,為此還提供了專門的安全會話協商協定NPN。

NPN (Next Protocol Negotiation)是一個TLS的擴充,以支援在應用層的443端口使用SPDY協定。NPN自始至終都隻是RFC内部草案,随着SPDY向HTTP 2.0的标準化推進,2012年10月就已經終止了(Chrome 51以後的浏覽器就不支援了)。用以替代NPN的是ALPN。

ALPN (Application-Layer Protocol Negotiation)也一個TLS的擴充,以支援在應用層的443端口使用HTTP2協定。ALPN于2014年7月釋出為RFC 7301标準。

3.HTTP2.0

萬事俱備,HTTP 2.0終于橫空出世了。HTTP 2.0也被稱為HTTP/2,或H2。2015年5月IETF釋出,是SPDY 2的标準化。

HTTP 2.0規範由兩個部分組成:

  • Hypertext Transfer Protocol version 2,RFC7540
  • HPACK - Header Compression for HTTP/2,RFC7541

HTTP 2.0規範的特點:

  • 資料以二進制編碼傳輸(通過二進制分幀層Binary framing,該層屬于應用層,位于SSL/TLS與HTTP之間,也導緻無法向後相容)

與SPDY不同的是,HTTP 2.0支援密文傳輸,也支援明文傳輸;而SPDY隻支援密文傳輸。

  • 消息頭壓縮傳輸以降低網絡的流量

與SPDY不同的是,HTTP 2.0采用HPACK壓縮算法,而SPDY采用DEFLATE壓縮算法

  • 多路複用,即一個TCP連接配接可以一次發生多個請求,一次接收多個響應;并發的請求或響應之間無互相阻塞
  • 服務端主動把靜态JS/CSS等資源推送給用戶端

4. 對HTTP 2.0的支援情況

支援HTTP 2.0的伺服器或用戶端實作清單如下:

https://github.com/http2/http2-spec/wiki/Implementations

4.1 伺服器

伺服器要支援HTTPS 2.0,除了TLS 1.2+,還需要一個TLS擴充ALPN,不同的伺服器實作不同。目前伺服器的支援情況如下:

  • Nginx 1.9.5+
  • NodeJS 8.4.0+ (node-http2)
  • Apache 2.4.17+ (mod_http2)

a2enmod http2

site配置檔案中:Protocols h2 http/1.1

  • Apache Tomcat 8.5+ (libtcnative,JDK8)
  • Apache Tomcat 9.0+ (JDK9)
  • Undertow 1.3 (alpn_boot)
  • Undertow 1.4+
  • Jetty 9.4.8 (alpn_boot)

4.2 浏覽器

支援HTTP 2.0的浏覽器:

  • Google Chrome 49, 65~69
  • Mozilla Firefox 59~62
  • Microsoft Edge 16~18
  • Safari 11.1, 12, TP
  • IE 11

4.3 支援HTTP 2.0的用戶端工具

  • OpenSSL 1.0.2+
  • LibreSSL 2.5.0+
  • curl 7.36.0 , libcurl(基于nghttp2)

curl --http2

  • Wireshark

4.4 支援HTTP 2.0的開發類庫

  • C語言

nghttp2

  • Java語言

JDK 9, 10

Apache HttpComponents 5.0-beta1(2018.1.18)

OkHttp

Netty

Jetty

5. 驗證伺服器是否支援HTTP 2.0

https://tools.keycdn.com/http2-test

chrome://net-internals/#http2

6. 對比HTTP1.1與HTTP2.0加載圖檔的效果

https://http2.akamai.com/demo

參考連結:

http://dev.chromium.org/spdy

https://github.com/http2

https://nghttp2.org/

繼續閱讀