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/