前言
互聯(lián)網(wǎng)世界中,HTTP協(xié)議算是使用最廣泛的協(xié)議。最近Http2.0誕生再次使得互聯(lián)網(wǎng)技術(shù)成為關(guān)注的焦點(diǎn)淌实。接下來我們一起看看關(guān)于HTTP的那些事。
HTTP
說道HTTP難免會提及TCP協(xié)議越败,HTTP是建立在TCP協(xié)議之上的触幼,TCP協(xié)議作為傳輸層協(xié)議其實(shí)離應(yīng)用層并不遠(yuǎn)。
TCP協(xié)議的性能直接影響了HTTP:
- TCP建立連接時(shí)需要三次握手1.5個(gè)RTT
- 慢啟動(slow start)
目前究飞,影響網(wǎng)路請求的兩個(gè)主要因素: 帶寬和延遲置谦。隨著網(wǎng)絡(luò)基礎(chǔ)設(shè)施建設(shè)帶寬得到極大提升堂鲤,大部分是延遲在影響響應(yīng)速度。
HTTP 1.0 最大問題:
- 連接無法復(fù)用
- head-of-line blocking (隊(duì)頭阻塞)
連接無法復(fù)用會導(dǎo)致每次都需要進(jìn)行三次握手和慢啟動媒峡。
head-of-line blocking 則會導(dǎo)致帶寬無法充分利用瘟栖,以及后續(xù)健康請求阻塞。
解決連接無法復(fù)用問題
在HTTP 1.0協(xié)議里設(shè)置Connection: Keep-Alive
谅阿“胗矗可以在一定時(shí)間內(nèi)復(fù)用連接。對于PC端瀏覽器來說效果明顯签餐,對移動APP來說成效不大寓涨。
方案一: 基于TCP的長鏈接
基于TCP協(xié)議,使用TCP的Socket編程技術(shù)氯檐。 成熟方案如:Google的protobuf戒良。
缺點(diǎn):實(shí)現(xiàn)難度大,需要自己制定協(xié)議冠摄。
有點(diǎn):信息的上報(bào)和推送變及時(shí)糯崎,減輕服務(wù)器壓力。
方案二: http long-polling
客戶端在初始狀態(tài)就會發(fā)送一個(gè)polling請求到服務(wù)器河泳,服務(wù)器并不會馬上返回業(yè)務(wù)數(shù)據(jù)沃呢,而是等待有新的業(yè)務(wù)數(shù)據(jù)產(chǎn)生的時(shí)候再返回。
難度:鏈接增多會增加服務(wù)器壓力乔询,移動網(wǎng)絡(luò)不穩(wěn)定需要考慮重建鏈接樟插,穩(wěn)定性不好,需要業(yè)務(wù)數(shù)據(jù)過期機(jī)制竿刁。
方案三: http streaming
同long-polling不同的是黄锤,server并不會結(jié)束初始的streaming請求,而是持續(xù)的通過這個(gè)通道返回最新的業(yè)務(wù)數(shù)據(jù)食拜。
方案四:web socket
優(yōu)點(diǎn):雙向的數(shù)據(jù)通道鸵熟,提供了http所缺少的長連接功能。
缺點(diǎn):較新负甸,大部分瀏覽器不支持流强。
head-of-line blocking
http pipelining
缺點(diǎn):只適用于http1.1,絕大部分http代理服務(wù)器不支持等
其他技術(shù)
- Spriting (圖片合并)
- Inlining (內(nèi)容內(nèi)嵌)
- Concatenation (文件合并)
- Domain Sharding (域名分片)
SPDY
為了解決http1.0和1.1存在的問題呻待,Google在2012年提出了SPDY方案打月。
目標(biāo):
- 降低延遲,客戶單的單鏈接單請求蚕捉,server的FIFO響應(yīng)隊(duì)列都是延遲的大頭奏篙。
- http 最初是客戶端發(fā)請求,服務(wù)器響應(yīng),服務(wù)器無法主動push內(nèi)容秘通。
- 壓縮http header为严。
SPDY設(shè)計(jì):
位于HTTP之下,TCP和SSL之上肺稀,兼容老版本第股,還可以使用已有的SSL功能。SPDY分為基礎(chǔ)功能和高級功能话原,基礎(chǔ)功能默認(rèn)開啟夕吻,高級功能手動開啟。
基礎(chǔ)功能
- 多路復(fù)用(multiplexing)稿静。多路復(fù)用通過多個(gè)請求stream共享一個(gè)tcp連接的方式梭冠。解決了隊(duì)頭阻塞,降低了延遲提高帶寬利用率改备。
- 請求優(yōu)先級(request prioritization)控漠。在多路復(fù)用的時(shí)候會出現(xiàn)關(guān)鍵請求被阻塞。SPDY 允許每次request設(shè)置優(yōu)先級悬钳。
- header壓縮盐捷。壓縮率達(dá)到80%以上。
高級功能
- server推送(server push) 默勾。開啟server push 之后碉渡,服務(wù)器通過
X-Associated-Content header
告知客戶端有新內(nèi)容推送過來。 - server暗示(server hint) 母剥。不推送滞诺,只提示有新內(nèi)容。
HTTP 2.0
SPDY的誕生和表現(xiàn)說明了兩件事:
- 一是現(xiàn)有互聯(lián)網(wǎng)設(shè)施基礎(chǔ)和http協(xié)議廣泛使用的前提下环疼,可以通過修改協(xié)議層來優(yōu)化http1.x习霹。
- 針對http1.x的修改業(yè)界反饋很好
優(yōu)點(diǎn): 多路復(fù)用,請求壓縮炫隶,優(yōu)先級控制淋叶,server push等亮點(diǎn)。
HTTP2.0主要改動
-
新的二進(jìn)制格式
http1.x誕生的時(shí)候使用明文協(xié)議伪阶,三部分組成:start line, header, body煞檩。協(xié)議解析,基于文本的栅贴,基于文本的協(xié)議解析存在缺陷斟湃,需要考慮的場景很多。http2.0 采用二進(jìn)制格式檐薯,實(shí)現(xiàn)方便且健壯桐早。http2.0的格式定義更接近tcp層的方式。
- length:定義了整個(gè)frame的開始到結(jié)束。
- type:定義frame的類型(一共10種)
- flags: 用bit位定義一些重要的參數(shù)
- stream ID 用作流控制
- payload: request的正文
-
連接共享(多路復(fù)用)
使用上面提到的Stream id用來作連接共享機(jī)制的哄酝。一個(gè)request對應(yīng)一個(gè)stream并分配一個(gè)id,接收方可以根據(jù)id區(qū)分frame歸屬哪個(gè)不同的frame祷膳√招疲可以調(diào)整優(yōu)先級,并且可以動態(tài)調(diào)整直晨。
header壓縮
重置連接表現(xiàn)更好
-
Server Push
http2.0能通過push方式將客戶端需要的內(nèi)容預(yù)先推送出去搀军,所以也叫“cache push”.
流量控制(Flow control)
更安全的SSL
移動端的HTTP現(xiàn)狀
iOS下http現(xiàn)狀
iOS系統(tǒng)從iOS8開始通過NSURLSession來支持SPDY,在iOS9+開始支持HTTP2.0.新版本的ATS默認(rèn)支持https進(jìn)行網(wǎng)絡(luò)傳輸勇皇。
Android下HTTP現(xiàn)狀
http2.0只能在新系統(tǒng)中支持罩句,SPDY作為過渡方案存在。
結(jié)束
HTTP1.x到SPDY敛摘,再到HTTP2.0的一些主要變遷技術(shù)點(diǎn)门烂。