未來已到——HTTP/2

HTTP/2 is the future of the Web, and it is here!

使用 HTTP/1.1 和 HTTP/2 在相同環(huán)境各加載 300 多張小圖片,性能相差一倍。

Paste_Image.png

你可以點(diǎn)擊這里的 DEMO 體驗(yàn)一下,HTTP/2 的加載快感。

歷史

超文本傳輸協(xié)議(英文:HyperText Transfer Protocol,縮寫:HTTP)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。設(shè)計(jì) HTTP 最初的目的是為了提供一種發(fā)布和接收 HTML 頁面的方法。通過 HTTP 或者 HTTPS 協(xié)議請求的資源由統(tǒng)一資源標(biāo)識(shí)符(Uniform Resource Identifiers,URI)來標(biāo)識(shí)。

HTTP 的發(fā)展是由蒂姆·伯納斯-李于 1989 年在歐洲核子研究組織(CERN)所發(fā)起。由萬維網(wǎng)協(xié)會(huì)(World Wide Web Consortium,W3C)和互聯(lián)網(wǎng)工程任務(wù)組(Internet Engineering Task Force,IETF)制定標(biāo)準(zhǔn),最終發(fā)布了一系列的 RFC,其中最著名的是 1999 年 6 月公布的 RFC 2616,定義了 HTTP 協(xié)議中現(xiàn)今廣泛使用的一個(gè)版本——HTTP 1.1。

2014 年 12 月,互聯(lián)網(wǎng)工程任務(wù)組(IETF)的 Hypertext Transfer Protocol Bis(httpbis)工作小組將 HTTP/2 標(biāo)準(zhǔn)提議遞交至 IESG 進(jìn)行討論 [1],于 2015 年 2 月 17 日被批準(zhǔn)。[2] HTTP/2 標(biāo)準(zhǔn)于 2015 年 5 月以 RFC 7540 正式發(fā)表,替換 HTTP 1.1 成為 HTTP 的實(shí)現(xiàn)標(biāo)準(zhǔn)。

以上摘要自 維基百科。

SPDY

SPDY(發(fā)音如英語:speedy)。實(shí)際上在 HTTP2 提出來之前,SPDY 流行了很長一段時(shí)間。該系列協(xié)議由谷歌開發(fā),于 2009 年公開。它的設(shè)計(jì)目標(biāo)是降低 50% 的頁面加載時(shí)間。當(dāng)下很多著名的互聯(lián)網(wǎng)公司都在自己的網(wǎng)站或 APP 中采用了 SPDY 系列協(xié)議(當(dāng)前最新版本是 SPDY/3.1),因?yàn)樗鼘π阅艿奶嵘秋@而易見的。主流的瀏覽器(谷歌、火狐、Opera)也都早已經(jīng)支持 SPDY,它已經(jīng)成為了工業(yè)標(biāo)準(zhǔn)。HTTP Working-Group 最終決定以 SPDY/2 為基礎(chǔ),開發(fā) HTTP/2。

突然在 Chrome 51 版本之后不支持 SPDY 了,Chrome 棄用了 SPDY,開始全面支持 HTTP2。

HTTP/2 的優(yōu)勢

相比 HTTP/1.x,HTTP/2 在底層傳輸做了很大的改動(dòng)和優(yōu)化:

  1. 每個(gè)服務(wù)器只用一個(gè)連接。HTTP/2 對每個(gè)服務(wù)器只使用一個(gè)連接,而不是每個(gè)文件一個(gè)連接。這樣,就省掉了多次建立連接的時(shí)間,這個(gè)時(shí)間對 TLS 尤其明顯,因?yàn)?TLS 連接費(fèi)時(shí)間。
  2. 加速 TLS 交付。HTTP/2 只需一次耗時(shí)的 TLS 握手,并且通過一個(gè)連接上的多路利用實(shí)現(xiàn)最佳性能。HTTP/2 還會(huì)壓縮首部數(shù)據(jù),省掉 HTTP/1.x 時(shí)代所需的一些優(yōu)化工作,比如拼接文件,從而提高緩存利用率。
  3. 簡化 Web 應(yīng)用。使用 HTTP/2 可以讓 Web 開發(fā)者省很多事,因?yàn)椴挥迷僮瞿切┽槍?HTTP/1.x 的優(yōu)化工作了。
  4. 適合內(nèi)容混雜的頁面。HTTP/2 特別適合混合了 HTML、CSS、JavaScript、圖片和有限多媒體的傳統(tǒng)頁面。瀏覽器可以優(yōu)先安排那些重要的文件請求,讓頁面的關(guān)鍵部分先出現(xiàn),快出現(xiàn)。
  5. 更安全。通過減少 TLS 的性能損失,可以讓更多應(yīng)用使用 TLS,從而讓用戶信息更安全。

Can I use?

在以下瀏覽器的版本都開始支持 HTTP2。

Paste_Image.png

這就尷尬了!Android 4.4.4 也就是 Kitkat 版本以下都不支持 HTTP2,谷歌 2016 年 6 月份的數(shù)據(jù)顯示 該版本的用戶占 31.6%。

不過好消息是,支持 HTTP/2 的 Web Server 基本都支持 HTTP/1.1。這樣,即使瀏覽器不支持 HTTP/2,雙方也可以協(xié)商出可用的 HTTP 版本,沒有兼容性問題。

Paste_Image.png

誰在用 HTTP2

推薦一個(gè)瀏覽器插件HTTP/2 and SPDY indicator,藍(lán)色的小圖標(biāo)亮起,就表示該網(wǎng)站使用了 HTTP/2 協(xié)議。

Paste_Image.png

** 大公司已經(jīng)走在了時(shí)代的前沿,我們這些追隨者有什么理由不跟上呢。**

不過百度這次又沒有跟上,不信你們自己去看。

服務(wù)器支持

這里是 一覽,主流的開發(fā)語言和應(yīng)用服務(wù)器都已經(jīng)支持了 HTTP/2。

最佳實(shí)踐

安裝

我們從 NGINX 開始,nginx 從 1.9.5 開始支持 HTTP/2。

  1. openssl。建議全局安裝。

  2. SSL/TLS。http2 嚴(yán)格要求使用 https,所以你得準(zhǔn)備一個(gè)證書。當(dāng)然也可以在 let's encrypt 申請一個(gè)。

  3. nginx 至少需要啟用 http_v2_module 和 http_ssl_module 這兩個(gè)模塊。先下載源碼,在安裝目錄執(zhí)行

./configure --with-http_v2_module --with-http_ssl_module
make&&make install

配置

  1. 重定向所有的請求到 SSL/TLS

    server {
     listen 80;
     location / {
     return 301 https://$host$request_uri;
     }
    }
    
  2. 開啟 HTTP/2

    server {
     listen 443 ssl http2 default_server;
    
     ssl_certificate server.crt;
     ssl_certificate_key server.key;
     ...
    }
    
  3. 最后一步,重啟 nginx

    nginx -s reload
    
  4. 為了驗(yàn)證 HTTP/2 是否開啟,你可以安裝瀏覽器插件 HTTP/2 and SPDY indicator 進(jìn)行查看。

負(fù)載均衡方案

向下兼容

需要指出的是 HTTP/2 的服務(wù)器都是向下兼容的 HTTP/1.1 的,升級(jí)了之后,你不需要擔(dān)心,之前的老版本用戶怎么辦。訪問方式如下圖,

Paste_Image.png

非完整鏈路的 HTTP/2 和 TLS

客戶端使用期望的協(xié)議連接代理服務(wù)器,比如 TLS 或 HTTP/2,然后代理服務(wù)器再去連接應(yīng)用服務(wù)器、數(shù)據(jù)庫服務(wù)器等,但不需要使用相同的協(xié)議。

Paste_Image.png

配合負(fù)載均衡

LVS 有 4 層和 7 層協(xié)議負(fù)載。所謂四層就是基于 IP+端口的負(fù)載均衡;七層就是基于 URL 等應(yīng)用層信息的負(fù)載均衡。研究過阿里云的 SLB,暫時(shí)還不支持 HTTP/2 的支持,也沒有看到 AWS、IBM 有對應(yīng)的服務(wù)支持。所以我們能用的解決方案就是:

LVS 4 層 + HTTP/2 web Server

LVS 只做請求分發(fā),由應(yīng)用服務(wù)器來處理加密解密和 HTTP/2 的支持。這樣的方式,對性能影響有多少呢,需要實(shí)際的測試,不過目前來說,沒有其他方案。

不是銀彈

對于 web 前端

HTTP1.1 時(shí)代,我們針對這個(gè)協(xié)議的特性做了很多 WEB 前端優(yōu)化,比如說 域名分片、文件合并壓縮、雪碧圖、行內(nèi)代碼等。但是到了 HTTP/2 時(shí)代,這些操作都是多余的了,對于同一個(gè)域名,只會(huì)建立起一個(gè) TCP 連接。太多的域名還會(huì)增加新建連接的初始化和 TLS 握手的時(shí)間。

在采用 HTTP/2 之前,需要找出應(yīng)用了這些優(yōu)化的代碼,分析一下它們會(huì)不會(huì)影響你的應(yīng)用設(shè)計(jì)和工作流程。這樣在遷移到 HTTP/2 之后,就可以著手改造它們,甚至撤銷某些優(yōu)化

HTTPS 的壓力

HTTPS 正式啟用之前還有很多問題要解決。

  1. 單連接開銷比較大。HPACK 數(shù)據(jù)壓縮算法會(huì)更新兩端的查找表。這樣可以讓連接有狀態(tài),而破壞狀態(tài)就意味著要重建查找表,另外單連接占用內(nèi)存較多
  2. 全站點(diǎn) HTTPS 的改造。可能涉及到 web,CDN,native 客戶端。

其他問題

  1. 需要拋棄針對 HTTP/1.x 的優(yōu)化。
  2. 對下載大文件不利。
  3. 你的客戶也許不在乎。你的客戶很可能不在乎他分享的自家貓咪的視頻是否受到 TLS 和 HTTP/2 的保護(hù)。

參考文獻(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容