http/2時代的web性能

http/2時代的web性能

2015年HTTP/2已經開始取代SPDY而登上歷史的舞臺。一直以來我們耳熟能詳的那些Web性能優化技術,很可能會成爲歷史。HTTP/2在Web性能優化方面有哪些優勢呢?與HTTP/1.1有什麼不同?

本文和本次分享參考:第二屆前端開發者大會講師Holger Bartel的ppt

本文是爲分享的PPT做準備的。敘述可能不具體和不到位。分享:Lecture 01 HTTP/2時代的Web性能

Slider: http://slides.com/wujiarong/deck#/

0 等待和延遲

生活中,我們經常處於各種各樣的等待狀態。

當我們打開瀏覽器。情況仍然得不到很好的改善。

loading…

沒有人願意等待。通常,等待都要等很長時間。

你應該聽朋友說過。請等我一下,結果等了十幾分鍾。
你應該聽女朋友說過。很快就好,結果等了將近1小時。

沒有人喜歡等待。

何爲等待:

直到某個時間點或者某個事件發生,才採取某些行動的延遲行爲

等待即延遲

1 網頁性能

定義:wiki百科

Web performance refers to the speed in which web pages are downloaded and displayed on the user’s web browser.

由此可見。web性能分爲兩個部分:網頁加載的速度和網頁渲染出來的速度。

網頁加載的速度往往用時間來衡量。也就是網頁加載時間。我們通常說是,網頁性能。

一般來說,我們說網頁性能,說的其實是網頁加載時間:page loading time。顧名思義,這個時間當然是越短越好。

隨着互聯網和web技術的快速發展,我們想呈現給用戶的東西越來越多。從一開始的純文本、到少量圖片、到更多的圖片、甚至視頻。

爲了提升用戶體驗,使得呈現內容以更友好的形式呈現給用戶。我們開始添加大量的css改善效果,添加js動畫和css3動畫增加動態性。

用戶角度所謂的快:期待2-3秒加載一個網頁。

50%的用戶會關掉瀏覽器的tab,如果一個網頁加載時間超過4s。

無可厚非,動態性的增加和呈現優化,大大地提升了用戶體驗。但隨之而來的代價是,網頁加載時間越來越長。

研究表明,1s時間的網頁延遲,將導致:

  • 減少11%的網頁瀏覽量
  • 減少16%的用戶滿意度
  • 減少7%的利潤轉化

我們來看一個用戶體驗表格。

From: Chapter 10. Primer on Web Performance

web性能社區的非官方公認:在250ms內,頁面加載完成或者能有儘可能多的可視化反饋,能留住用戶!

總結:越快越好!

2 web性能影響案例

亞馬遜:網頁加載速度增加100ms,銷售額減少1%(參考:Amazon

Walmart: 每優化1s,增加2%的利潤轉化。

Akamai研究發現:

  • 47%的用戶希望網頁在2s以內加載完成
  • 40%的用戶會關閉網頁,如果網頁加載時間超過3秒
  • 52%的網購者更願意到網頁加載速度更快的購物網站購物

3 全球帶寬情況

兩個數據

全球平均帶寬(下載):21.3Mbps (21.3/8 MB/s)

全球手機平均下載速度:10.9Mbps (10.9/8 MB/s)

From: netindex

幾張圖片

全球下載帶寬情況:

歐洲:

北美:

南美洲:

非洲:

Bandwidth and Round-Trip Time

RTT(Round-Trip Time): 往返時延。在計算機網絡中它是一個重要的性能指標,表示從發送端發送數據開始,到發送端收到來自接收端的確認(接收端收到數據後便立即發送確認),總共經歷的時延。

更大的帶寬不代表更快的網頁加載速度!More Bandwidth Doesn’t Matter(much)

相對帶寬,RTT對於網頁性能的影響更大。

結論:
增加帶寬對網頁加載速度的提升不會有很大的影響。相反,應該減少RTT,或者RTT的個數。

4 改善web性能

4.0 HTTP是如何工作的?

超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最爲廣泛的一種網絡協議。所有的WWW文件都必須遵守這個標準。設計HTTP最初的目的是爲了提供一種發佈和接收HTML頁面的方法。

1960年美國人Ted Nelson構思了一種通過計算機處理文本信息的方法,並稱之爲超文本(hypertext),這成爲了HTTP超文本傳輸協議標準架構的發展根基。

Ted Nelson組織協調萬維網協會(World Wide Web Consortium)和互聯網工程工作小組(Internet Engineering Task Force )共同合作研究,最終發佈了一系列的RFC,其中著名的RFC 2616定義了HTTP 1.1。

短視頻視頻:Basic concepts of web applications, how they work and the HTTP protocol

Different types of HTTP requests

  • GET:This request is Used to get the Response header and the response body
  • HEAD:This request is used to get back The response header only (not the response body as returned by the GET request..)
  • POST:This request is used to submit data (eg : for to be used in HTML forms etc..)…
  • PUT:Used for uploading resource
  • PATCH:Is used to modify the resource
  • DELETE:Used for deleting resource
  • TRACE:simply echoes back the request sent by the client…This can be used for testing the servers and Checking weather the server is alive or not..

使用Telnet展現HTTP請求

Telnet www.baidu.com 80
GET / HTTP/1.1
TRACE / HTTP/1.1

4.1 HTTP/0.9 (1991)

HTTP 0.9作爲HTTP協議的第一個版本。是非常弱的。請求(Request)只有一行,比如:

GET www.cnblogs.com

從如此簡單的請求體,沒有POST方法,沒有HTTP 頭可以看出,那個時代的HTTP客戶端只能接收一種類型:純文本。並且,如果得不到所求的信息,也沒有404 500等錯誤出現。

雖然HTTP 0.9看起來如此弱,但已經能滿足那個時代的需求了。

4.2 HTTP/1.0 (1996)

由於萬維網需求激增,HTTP/0.9深感不能滿足需求。這時候,拓展了很多功能的HTTP/1.0出來了。

HTTP/1.1的變化包括:

  1. 引入了POST方法
  2. 引入了HTTP頭、狀態碼
  3. HTTP傳輸內容不侷限於文本。可以是圖片、視頻、文檔等

4.3 HTTP/1.1 (1999)

HTTP/1.1相對於1.0的改變不算太大。

主要是:
1. 增加了host頭字段。
2. 增加了Range字段,使得客戶端通過HTTP下載時只下載內容的一部分,這使得多線程下載也成爲可能。

這裏對於HTTP/1.1及以前的幾個版本不做具體且深入的介紹。如果有興趣或者質疑,請自行google。

從1.1發佈到SPDY提出,中間11年時間。HTTP在這麼長的時間內沒有做任何更新。

我們知道HTTP/1.1在web性能方面存在着很多問題。

比如:

  1. 較爲龐大的HTTP Head,佔用較多的網絡流量。
  2. 明文傳輸,不安全。
  3. 非持久連接:每個請求都要建立TCP連接,耗時巨大。
  4. 持久連接:單個TCP連接,可以發送多次請求。但是多個請求之間是有先後順序的,後面發送的請求必須等待上一個請求返回才能發送響應。這會很容易導致後面的請求被阻塞,同樣耗時。

這些問題足以導致出現很多安全性問題,和很差的網頁性能,也就是很長的網頁加載時間。

爲了解決這些問題。關注web性能的社區或公司,就想出了很多的處理方案和誕生了一些針對改善web性能的技術。

比如:
雅虎14條網頁性能優化原則。參考:YaHoo Web優化的14條法則

  1. 減少HTTP請求次數
  2. 使用CDN(Content Delivery Network, 內容分發網絡)
  3. 增加Expires Header(web cache)
  4. 壓縮頁面元素
  5. 把樣式表放在頭上
  6. 把腳本文件放在底部
  7. 避免CSS表達式
  8. 把JavaScript和CSS放到外部文件中
  9. 減少DNS查詢次數
  10. 最小化JavaScript代碼
  11. 避免重定向
  12. 刪除重複的腳本文件
  13. 配置ETags
  14. 緩存Ajax

我們來分析一下什麼因素影響網頁性能,也就是會延長網頁的加載時間。

一個網頁,從瀏覽器請求,到服務器響應,返回數據或者資源,到瀏覽器接受完畢。其實宏觀來說涉及了三個對象。

  • 瀏覽器:請求數量影響PLT
  • 路由網絡:帶寬和RTT影響PTL
  • 服務器:服務器響應時間、數據庫響應時間等影響PTL

我們暫時不討論服務器響應時間,因爲這個是人爲可控的,而且一般來說是後臺工程師的任務。

我們來看看瀏覽器和路由網絡對PTL的影響。

在瀏覽器端,請求數量多少取決於網頁結構和內容。如果圖片、小圖標、CSS文件、JS文件等太多,請求數量自然居高不下。這樣就大大增加了PTL。

因此,在瀏覽器這個對象的視角。我們應該儘可能減少請求次數、增加併發連接數、儘量避免阻塞加載。

這樣就產生了以上14條實踐中的:1、3、5、6、8、12、13、14

從路由網絡的視角。影響PTL的,是我們上面分析過的兩個指標:帶寬和RTT。

因此,在資源傳輸的中間環節,我們可以通過:增加帶寬、帶寬一定是減少數據量、減少RTT,這三個途徑來減少PTL。

也因此產生了14條實踐中的:2、4、9、10、11

把以上的內容再歸結起來,涉及到的技術就有:

  1. 文件拼接和壓縮
  2. 雪碧圖
  3. Inline Image
  4. Domain Sharding

爲了從根本上解決以上的問題,而不是需要前端後臺工程師做大量的性能優化工作,一個偉大的嘗試出現了。那就是SPDY。

4.4 SPDY (2010)

我們看看SPDY做了什麼。參考:SPDY 協議介紹

  1. 多路複用
    允許在一個TCP連接裏面,允許無限併發流(在雙方資源可承受的情況下)。因爲請求是在一個單一的通道交錯傳輸,TCP的可以達到很高的效率,從而更少的網絡連接需要,可以以很高的 數據密度做傳輸。
  2. 具備優先級的請求
    雖然無限的並行數據流的解決了序列化的問題,但是它們引入了另一個問題:如果由於信道帶寬的限制,客戶端可能會阻止怕堵塞通道的要求。爲了克服這個問題,SPDY實現請求的優先次序:客戶端可以請求儘可能多的項目,每個請求分配一個優先級。這樣即使高優先級的請求仍處在pending狀態,通道也不會傳輸非關鍵的,低優先級的請求,這樣就有效地阻止了傳輸擁塞。
  3. HTTP Header 壓縮
    對於HTTP 請求,響應頭,SPDY都做了壓縮,這樣包更小,對於RESTFUL類型的WEB2.0 ,or OpenAPI 業務,將會有可觀的效率提升。
  4. 服務器端推送
    SPDY通過X-Associated-Content 協議頭來向客戶端推送數據,頭通知客戶端,我要向你推送資源,準備接收好了。最近火爆的Google+ ,如果你用chrome瀏覽器,默認就採用SPDY技術,並且開啓了服務器推送技術。服務器的推技術,全面提升了用戶體驗,是G+ 產品很快佔據了足夠多的優勢,最近Facebook 開發自己的瀏覽器,也有擺脫現在技術限制的考慮
  5. 服務器暗示
    不像上面提到的PUSH 技術,服務器會先告訴瀏覽器,你可以下載ABC資源了,這個ABC資源,可能就是下一個頁面的JS ,CSS ,或者內容。服務器不會主動推送的,仍舊等待客戶端請求,這對於低速網絡,是個很大的優化,有點類似於我們的預加載技術。

4.5 HTTP/2 (2015)

HTTP/2基於SPDY,優於SPDY。參考:HTTP/2 新特性淺析

不同點:

  1. HTTP/2 支持明文 HTTP 傳輸,而 SPDY 強制使用 HTTPS
  2. HTTP/2 消息頭的壓縮算法採用 HPACK ,而非 SPDY 採用的 DELEFT

HTTP2優勢:

  1. HTTP/2 採用二進制格式傳輸數據,而非 HTTP/1.x 的文本格式。二進制格式在協議的解析和優化擴展上帶來更多的優勢和可能。
  2. HTTP/2 對消息頭採用 HPACK 進行壓縮傳輸,能夠節省消息頭佔用的網絡的流量。而 HTTP/1.x 每次請求,都會攜帶大量冗餘頭信息,浪費了很多帶寬資源。頭壓縮能夠很好的解決該問題。
  3. 多路複用,直白的說就是所有的請求都是通過一個 TCP 連接併發完成。HTTP/1.x 雖然能利用一個連接完成多次請求,但是多個請求之間是有先後順序的,後面發送的請求必須等待上一個請求返回才能發送響應。這會很容易導致後面的請求被阻塞,而 HTTP/2 做到了真正的併發請求。
  4. 同時, 流還支持優先級和流量控制。
  5. Server Push:服務端能夠更快的把資源推送給客戶端。例如服務端可以主動把 JS 和 CSS 文件推送給客戶端,而不需要客戶端解析 HTML 再發送這些請求。當客戶端需要的時候,它已經在客戶端了。

5 擁抱HTTP/2

使用HTTP/2

第一步:使用SSL\TLS加密你的HTTP連接,也就是使用HTTPS

第二步:配置支持HTTP/2的服務器

第三步:檢查瀏覽器兼容性

nodejs width HTTP/2

利用Package: http2可以部署nodejs的http2服務。

代碼:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章