最近我們公司的官網由原來的http1.1已升級到http2,而我們前端開發對http2還是一片懵懂,更不知道為何換成了這個,故此補充了下http2的相關知識。
http1.1相比於http1.0有哪些優勢?
-
緩存處理
在HTTP1.0中主要使用header里的If-Modified-Since,Expires來做為緩存判斷的標准,
HTTP1.1則引入了更多的緩存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供選擇的緩存頭來控制緩存策略。 -
帶寬優化及網絡連接的使用
HTTP1.0中,存在一些浪費帶寬的現象,例如客戶端只是需要某個對象的一部分,而服務器卻將整個對象送過來了,並且不支持斷點續傳功能,HTTP1.1則在請求頭引入了range頭域,它允許只請求資源的某個部分,即返回碼是206(Partial Content),這樣就方便了開發者自由的選擇以便於充分利用帶寬和連接。 -
錯誤通知的管理
在HTTP1.1中新增了24個錯誤狀態響應碼,如409(Conflict)表示請求的資源與資源的當前狀態發生沖突;410(Gone)表示服務器上的某個資源被永久性的刪除。 -
Host頭處理
在HTTP1.0中認為每台服務器都綁定一個唯一的IP地址,因此,請求消息中的URL並沒有傳遞主機名(hostname)。但隨着虛擬主機技術的發展,在一台物理服務器上可以存在多個虛擬主機(Multi-homed Web Servers),並且它們共享一個IP地址。
HTTP1.1的請求消息和響應消息都應支持Host頭域,且請求消息中如果沒有Host頭域會報告一個錯誤(400 Bad Request)。 -
長連接
HTTP 1.1支持長連接(PersistentConnection)和請求的流水線(Pipelining)處理,在一個TCP連接上可以傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲,在HTTP1.1中默認開啟Connection: keep-alive,一定程度上彌補了HTTP1.0每次請求都要創建連接的缺點。
http2相比於http1.1有哪些優勢?
- 二進制分幀
HTTP/2 采用二進制格式傳輸數據,而非 HTTP 1.x 的文本格式,二進制協議解析起來更高效。HTTP/2 中,同域名下所有通信都在單個連接上完成,該連接可以承載任意數量的雙向數據流。每個數據流都以消息的形式發送,而消息又由一個或多個幀組成。多個幀之間可以亂序發送,根據幀首部的流標識可以重新組裝。 - 多路復用
多路復用代替原來的序列和阻塞機制。所有就是請求的都是通過一個 TCP連接並發完成。 HTTP 1.x 中,如果想並發多個請求,必須使用多個 TCP 鏈接,且瀏覽器為了控制資源,還會對單個域名有 6-8個的TCP鏈接請求限制 - 服務器推送
服務端可以在發送頁面HTML時主動推送其它資源,而不用等到瀏覽器解析到相應位置,發起請求再響應。 - 頭部壓縮
HTTP 1.1請求的大小變得越來越大,有時甚至會大於TCP窗口的初始大小,因為它們需要等待帶着ACK的響應回來以后才能繼續被發送。HTTP/2對消息頭采用HPACK(專為http/2頭部設計的壓縮格式)進行壓縮傳輸,能夠節省消息頭占用的網絡的流量。而HTTP/1.x每次請求,都會攜帶大量冗余頭信息,浪費了很多帶寬資源。
HTTP2.0的多路復用和HTTP1.X中的長連接復用有什么區別?
- HTTP/1.0 一次請求-響應,建立一個連接,用完關閉;每一個請求都要建立一個連接;
- HTTP/1.1 Pipeling解決方式為,若干個請求排隊串行化單線程處理,后面的請求等待前面請求的返回才能獲得執行機會,一旦有某請求超時等,后續請求只能被阻塞,毫無辦法,也就是人們常說的線頭阻塞;
- HTTP/2多個請求可同時在一個連接上並行執行。某個請求任務耗時嚴重,不會影響到其它連接的正常執行;
nginx上http2.0配置
盡管HTTP2.0其實可以支持非HTTPS的,但是現在主流的瀏覽器像chrome,firefox表示還是只支持基於 TLS 部署的HTTP2.0協議,所以要想升級成HTTP2.0還是先升級HTTPS為好。
在https基礎上配置成http2就非常簡單了,
在 Nginx 上 開啟 HTTP/2 需要 Nginx 1.9.5 以上版本,並且需要 OpenSSL 版本在 1.0.2 以上。
查看openssl版本
openss version
OpenSSL 1.0.2k-fips 26 Jan 2017
修改Nginx配置
在 server 配置段中的 listen 后增加 http2 即可。
server{
listen 443 ssl http2;
···
}
重啟nginx nginx -s reload
至此可以在瀏覽器訪問看看http2是否生效