五分鐘技術趣談 | HTTP演進史
Part 01
協(xié)議簡介
HTTP協(xié)議是當今最流行的一種網絡協(xié)議,在日常生活中隨處可見,無論使用手機、電腦還是其它終端設備,windows、IOS或是Android,瀏覽器或是APP,這背后的網絡通訊都離不開它。HTTP采用客戶端-服務端之間請求和應答的架構設計,是一種能夠獲取如 HTML這樣的網絡資源的通訊協(xié)議,是在 Web 上進行數(shù)據(jù)交換的基礎。
Part 02
發(fā)展歷程
HTTP協(xié)議自1989年被英國工程師和計算機科學家蒂姆·伯納斯·李提出后,至今經歷30多年的演進,形成了五個主要版本,如下圖所示:
2.1 HTTP/0.9
作為鼻祖版本,奠定了協(xié)議的核心內容,如確定了客戶端-服務端交互的架構,域名:端口來確定目標地址,還有回車換行作為基本的分隔符等。
0.9版本功能上只相當于后續(xù)版本的一個小小子集,不支持Header,僅支持GET方法,服務器只能回應HTML格式的字符串,不能響應別的格式。具有典型的無狀態(tài)性,每個訪問都獨立處理,處理完成后就會關閉TCP連接。
2.2 HTTP/1.0
1.0版本在0.9版本基礎上做了大量的擴展,增加了POST和HEAD方法,引入了請求頭、返回碼,還支持了多字符集和多行請求,傳輸不僅僅局限于文本能力,如圖像、視頻、二進制文件。可謂是麻雀雖小五臟俱全,是第一個具備廣泛實際應用價值的協(xié)議版本。
1.0版本與0.9版本存在相同的缺陷,由于都是無狀態(tài)連接,建立的TCP連接不能被復用,并且前一個請求響應到達之后下一個請求才能發(fā)送,容易造成隊頭阻塞影響性能。
2.3 HTTP/1.1
1.1版本在1.0版本上做了功能擴展以及傳輸性能的優(yōu)化。
功能包括新增了PUT、PATCH、OPTIONS、DELETE方法,豐富了響應狀態(tài)碼,引入了range斷點續(xù)傳,增加了TLS的支持,以及更多的連接模型支持,如短連接、長連接、websocket模型等;此外還引入了Host請求頭,用來指定服務器域名,這樣一臺主機上就可以部署多個域名服務端,這為虛擬化技術的興起打下了堅實的基礎。
性能方面引入長連接,設置請求頭Connection: keep-alive可以保持連接不斷開,使得連接能被多個請求復用,但每個請求是串行執(zhí)行,仍然存在隊頭阻塞問題。為了優(yōu)化該問題,在長連接的基礎上引入了管道化技術,可以不等待上一個請求響應而繼續(xù)發(fā)送后續(xù)的請求,進一步提升傳輸效率,然而服務端響應是嚴格按照順序返回的,隊頭阻塞問題依然沒有解決。
2.4 HTTP/2.0
2.0版本與其說是對1.x版本的優(yōu)化,倒不如說是一次革新,主要的調整主要包含:二進制化分幀、多路復用、頭部壓縮、服務端推送。
- 二進制化分幀
1.x是文本協(xié)議,然而2.0是以二進制幀為基本單位,將所有傳輸?shù)男畔⒎指顬橄⒑蛶⒉捎枚M制格式的編碼,一幀中包含數(shù)據(jù)和標識符,使得網絡傳輸變得高效而靈活。
- 多路復用
1.x中建立多個連接的消耗以及效率都存在問題,2.0版本借助于二進制幀中的標識進行區(qū)分,實現(xiàn)多個請求可以同時在一個TCP連接上并發(fā)的鏈路復用。
- 頭部壓縮
1.1版本每次發(fā)送請求都要帶相同的header,2.0版本使用HPACK算法對header進行壓縮,且對header信息進行增量更新,有效減少了數(shù)據(jù)量從而提高了傳輸效率。
- 服務端推送
和1.x版本采用的一問一答交互模式不同,2.0版本允許服務器主動向客戶端發(fā)送資源,從而可以有效減少額外的延遲時間。
HTTP/2.0的傳輸示意圖如下所示:
2.0版本雖然大幅提升了1.1版本的性能,然而基于TCP的實現(xiàn)卻遺留下3個問題:
1.有序字節(jié)流引出的隊頭阻塞,使得2.0版本的多路復用能力大打折扣;
2.TCP與TLS疊加了握手時延,建連接時長還有1倍的下降空間;
3. 基于TCP四元組確定一個連接,這種誕生于有線網絡的設計,并不適合移動狀態(tài)下的無線網絡,這意味著IP地址的頻繁變動會導致TCP連接、TLS會話反復握手,成本高昂。
2.5 HTTP/3.0
隨著5G網絡和互聯(lián)網技術的發(fā)展,目前過半的互聯(lián)網流量已經通過無線傳輸。這種趨勢給整體的網絡瀏覽體驗帶來了挑戰(zhàn),其中關鍵點在于解決在無線覆蓋率不足的情況下TCP中的隊頭阻塞問題,3.0版本隨之應運而生。
HTTP/3.0又稱為HTTP Over QUIC,是最新一代HTTP協(xié)議,棄用TCP協(xié)議改為使用基于UDP協(xié)議的QUIC協(xié)議來實現(xiàn),QUIC協(xié)議的核心思想是將TCP協(xié)議在內核實現(xiàn)的諸如可靠傳輸、流量控制、擁塞控制等功能轉移到用戶態(tài)來實現(xiàn),這樣就避開了TCP機制的天然缺陷。HTTP/3.0與HTTP/2.0架構區(qū)別如下圖所示:
但是目前很多網絡設備對于UDP數(shù)據(jù)包策略不夠友好,進行攔截從而導致成功連接率下降,此外正確安全的配置HTTP/3和QUIC極其復雜,要將其變?yōu)橐环N簡單易用的商業(yè)服務路還很長。
Part 03
回顧總結
HTTP經歷30多年的演化,實現(xiàn)了跨越式的發(fā)展,由最初只能串行的傳輸超文本文件到如今可以并行的傳輸多媒體文件,功能、性能以及安全性上都取得了巨大的提升。最后簡短總結一下幾個里程碑版本:
- HTTP/0.9 確立了交互架構,實現(xiàn)基本請求響應。
- HTTP/1.0 增加 HTTP 頭,豐富傳輸資源類型,奠定互聯(lián)網發(fā)展基礎。
- HTTP/1.1 增加長連接、管道化,提升了 HTTP 傳輸效率。
- HTTP/2.0 采用二進制傳輸格式,通過 HTTP 多路復用、頭部壓縮、服務器端推送,將傳輸效率在 HTTP + TCP 架構上發(fā)揮到了極致。
- HTTP/3.0 將傳輸層替換為 QUIC,通過改進的擁塞控制、流量控制、0-RTT 建連、傳輸層多路復用、連接遷移等特性,進一步提升了 HTTP 傳輸效率。