HTTP/2(超文字傳輸協定第2版,最初命名為HTTP 2.0),簡稱為h2(基於TLS/1.2或以上版本的加密連接)或h2c(非加密連接)[1],是HTTP協定的的第二個主要版本,使用於萬維網。
此條目需要精通或熟悉計算機科學的編者參與及協助編輯。 (2020年1月20日) |
HTTP/2是HTTP協定自1999年HTTP 1.1的改進版RFC 2616[2]發佈後的首個更新,主要基於SPDY協定。它由互聯網工程任務組(IETF)的Hypertext Transfer Protocol Bis(httpbis)工作小組進行開發。[3]該組織於2014年12月將HTTP/2標準提議遞交至IESG進行討論[4],於2015年2月17日被批准。[5]
HTTP/2標準於2015年5月以RFC 7540正式發表。[6]HTTP/2的標準化工作由Chrome、Opera、Firefox[7]、Internet Explorer 11、Safari、Amazon Silk及Edge等瀏覽器提供支援。[8]
多數主流瀏覽器已經在2015年底支援了該協定。[9]此外,根據W3Techs的數據,截至2021年10月,全球有46.5%的網站支援了HTTP/2。[10]
協定的制定
協定制定伊始,工作群組章程關注了下列目標和受關心的問題:[3]
- 建立一個協商協定標準,即應用層協定協商(ALPN),以便客戶端能夠從HTTP/1.0、HTTP/1.1、HTTP/2乃至其他非HTTP協定中做出選擇。
- 與HTTP/1.1在請求方法、狀態碼乃至URI和絕大多數HTTP頭部欄位等方面保持高度相容性。
- 通過以下舉措,減少網絡延遲,提高瀏覽器的頁面載入速度:
- 支援現有的HTTP應用場景,包括桌面和流動裝置瀏覽器、網絡API、不同規格的網絡伺服器和正向代理、反向代理伺服器軟件、防火牆和CDN等。
Facebook對各方案進行了評價並最終推薦了SPDY協定[11]。HTTP 2.0的首個草稿於2012年11月發佈,其內容基本和SPDY協定相同[12]。
協定之間的的比較
HTTP/2相比HTTP/1.1的修改並不會破壞現有程式的工作,但是新的程式可以藉由新特性得到更好的速度。[13]
HTTP/2保留了HTTP/1.1的大部分語意,例如請求方法、狀態碼乃至URI和絕大多數HTTP頭欄位一致。而HTTP/2採用了新的方法來編碼、傳輸客戶端和伺服器之間的數據。[13]
SPDY(發音同「speedy」)是一個由Google主導的HTTP替代協定。[14]SPDY一開始主要關注降低延遲,採用了TCP通道,但是使用了不同的協定來達到此目的。其與HTTP/1.1相比,主要的改變有:[15]
- 實現無需先入先出的多路復用
- 為簡化客戶端和伺服器開發的訊息—幀機制
- 強制性壓縮(包括HTTP頭部)
- 優先級排序
- 雙向通訊
HTTP/2的開發基於SPDY進行躍進式改進。在諸多修改中,最顯著的改進在於,HTTP/2使用了一份經過客製化的壓縮演算法,基於霍夫曼編碼,以此替代了SPDY的動態流壓縮演算法,以避免對協定的Oracle攻擊——這一類攻擊以CRIME為代表。此外,HTTP/2禁用了諸多加密套件,以保證基於TLS的連接的前向安全。
新特性
在HTTP/2的第一版草案(對SPDY協定的復刻)中,新增的效能改進不僅包括HTTP/1.1中已有的多路復用,修復隊頭阻塞問題,允許設置設定請求優先級,還包含了一個頭部壓縮演算法(HPACK)[16][17]。此外, HTTP/2採用了二進制而非明文來打包、傳輸客戶端和伺服器之間的數據。[13]
有別於HTTP/1.1在連接中的明文請求,HTTP/2與SPDY一樣,將一個TCP連接分為若干個流(Stream),每個流中可以傳輸若干訊息(Message),每個訊息由若干最小的二進制幀(Frame)組成。[13]這也是HTTP/1.1與HTTP/2最大的區別所在。HTTP/2中,每個用戶的操作行為被分配了一個流編號(Stream ID),這意味着用戶與伺服器端之間建立了一個TCP通道;協定將每個請求分割為二進制的控制幀與數據幀部分,以便解析。這個舉措在SPDY中的實踐表明,相比HTTP/1.1,新頁面載入可以加快11.81%到47.7%[18]
HPACK演算法是新引入HTTP/2的一個演算法,用於對HTTP頭部做壓縮。其原理在於:
網站為了使請求數減少,通常採用對頁面上的圖片、指令碼進行極簡化處理。但是,這一舉措十分不方便,也不高效,依然需要諸多HTTP連結來載入頁面和頁面資源。
HTTP/2引入了伺服器推播,即伺服器端向客戶端傳送比客戶端請求更多的數據。這允許伺服器直接提供瀏覽器彩現頁面所需資源,而無須瀏覽器在收到、解析頁面後再提起一輪請求,節約了載入時間。[19]
瀏覽器支援
截至2015年末,主要的瀏覽器的最新版本已經支援HTTP/2這一協定。[20]其中:
- Google Chrome、Mozilla Firefox、Microsoft Edge和Opera已支援HTTP/2,並預設啟用。
- Internet Explorer自IE 11開始支援HTTP/2,並預設啟用。[21]
HTTP/2的設計本身允許非加密的HTTP協定,也允許使用TLS 1.2或更新版本協定進行加密。[22]協定本身未要求必須使用加密,[23] 惟多數客戶端(例如Firefox[24]、Chrome、Safari、Opera、IE和Edge等)的開發者聲明,他們只會實現通過TLS加密的HTTP/2協定,這使得經TLS加密的HTTP/2成為了事實上的強制標準,而h2c事實上被主流瀏覽器廢棄。[25]
2015年9月,Google宣佈了移除對SPDY支援的計劃,擁抱HTTP/2[26],並將在Chrome 51中生效。[27][28]
HTTP/2的實現
HTTP/2工作群組在其官方Github上羅列了諸多已經支援該協定的代碼實現。[29]
批評與爭議
HTTP/2的開發過程乃至協定本身都曾受到批評。
FreeBSD和Varnish cache的開發者保羅-恆寧·坎瀑批評稱,這個標準檔案的準備過程短得不切實際,而且未基於除了SPDY之外的任何協定,以至於其他協定失去了對草案進行改進的機會。[30]Kampala批評說,這個協定本身與HTTP不一致,而且還毫無必要地變得極為複雜。[30]他還認為,這個協定違背了互聯網協定的分層原則[30],例如說,將本屬於TCP傳輸層的流控制(flow control)功能放入了協定中。
一開始,以HTTP工作群組某位主席為首的成員在郵寄清單[31]建議引入強制使用TLS協定實現的HTTP/2(Mandatory TLS in HTTP/2.0),這招致了爭議。批評者認為,加密增加了十分不必要的開銷,而且很多HTTP服務實際上無需加密,提供者也無意為此花費更多的資源。而支持者認為,實踐中TLS加密的開銷微不足道。[32]
Poul-Henning Kamp批評IETF在制定HTTP/2時,遵循了一個特定的「政治議程」(political agenda),壓縮了討論的空間。[30][33][34]
強制加密議程的批評者認為,其基於現有的證書框架,對於開源社區並非新創造,亦不是獨特的。2013年,一位思科員工表示,現有證書模型與路由器一類的小型化裝置並不相容,因為現有的證書框架需要為每張證書付出不可避免的成本,還需要進行每年更新的流程。[35]工作群組最終未能在強制加密這一點上達成一致,但是大部分客戶端只實現了基於TLS的HTTP/2,使之成為事實標準。[23]
HTTP/2也被批評未能支援機會性加密,即類似SMTP中存在已久的STARTTLS一樣能抵禦被動監控的措施。 批評者指出,HTTP/2的提議違背了IETF自身制定的《最佳實踐 188》(BCP 188) 即 RFC 7258。[36]這份檔案指出,被動監控應被當作一種攻擊,IETF指定的標準應當設置抵禦這種攻擊的措施(例如機會性加密)。目前,已經有一系列機會性加密規範被提出[37][38] [39],工作群組也制定了draft-ietf-httpbis-http2-encryption-01這一官方版方案。
參考資料
參見
外部連結
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.