HTTP1.1與HTTP2在web應用中都很常見,但是他們有什么區(qū)別和聯(lián)系一直很困擾我,于是花了一陣子看了一些文章和書記,對這兩個版本的協(xié)議有所了解,下面做一個總結(jié)。
異步并發(fā)
HTTP1.1 與 HTTP2請求響應如下:

HTTP1.x的請求響應是順序執(zhí)行,即第一個請求結(jié)束后才會發(fā)送第二個請求,以此類推。如果第一個請求響應時間過長,導致后續(xù)請求無法進行,就會造成所謂的隊首阻塞,影響web性能。HTTP2引入了異步操作,即請求發(fā)送和響應是異步時時的,并不受到請求發(fā)送順序限制,但是在HTTP2中為了讓服務器按照需要的順序處理請求,加入了一個priority優(yōu)先級的屬性,瀏覽器在發(fā)送請求時,自動指定資源的優(yōu)先級從而讓服務器按照處理優(yōu)先級進行處理請求。
HTTP1.x管道
關于HTTP1.x隊首阻塞問題,影響前端性能可以通過管道技術(shù)進行優(yōu)化。通過管道技術(shù),瀏覽器可以不用等待一個請求發(fā)送響應完成再進行下一個請求的發(fā)送,而是可以直接發(fā)送多個請求,服務器在接受到請求后,遵循FIFO先進先出隊列原則進行請求處理并響應。這樣降低了對手阻塞造成的請求延遲,如下圖:

頭部壓縮
HTTP1.1在請求資源時,加入了請求頭,但通常該請求頭包含的都為純文本內(nèi)容,一般有500~800字節(jié),如果再攜帶了cookie則會更多。如果請求頭部未定義keepalive屬性(保持tcp連接)則每一次請求,都需要請求頭進行信息驗證,當一個頁面請求多達100個時,占有資源和帶寬時相當多的。所以連接復用,是HTTP1.x的一個優(yōu)化點,消除不必要的cookie開銷也是一個優(yōu)化點。連接復用,即tcp復用不但可以減少首部開銷,還可以減少由于tcp建立連接時的三次握手時間。對于HTTP2而言,連接一旦建立就是持久化的,所以不需要額外的建立連接消耗。
多路復用和域名區(qū)分
HTTP1.x只支持連接建立單一連接,并不能利用多個tcp連接進行多路復用操作,從而提升性能。為了解決該多路復用的問題,域名區(qū)分被引入。我們可以在一個主機域名上建立多個子域名,即只建立一個主機的連接,通過該域名下的子域名達到多路復用的效果,提高并行能力。域名區(qū)分使用的越多,并行能力就越強,但區(qū)分越多,新的域名都有額外的DNS查詢開銷,耗費時間,所以在實際運用中根據(jù)需求合理控制域名的個數(shù)。
連接與合并
在HTTP性能優(yōu)化的一個關鍵點就是,請求越少越好,那么如何實現(xiàn)這一點,有一個辦法,就是對請求資源進行連接合并,即把多個圖片合并成一個,把多個css和javascipt文件合并成一個css和javascript。這樣可以大大提升頁面的性能,但從另外一個層面,當css文件越大,會造成頁面首次渲染速度降低(耗時),并且當javascript文件越大,執(zhí)行響應的時間也會越久,這些都是在做優(yōu)化時,需要考慮的平衡點。