看 B 站,可以更快!
因?yàn)?B 站部分視頻服務(wù)器支持使用 QUIC 協(xié)議觀看視頻,QUIC 是基于 UDP 傳輸協(xié)議實(shí)現(xiàn)的,而且最新的 HTTP/3 使用的正是 QUIC 協(xié)議,它相比 HTTP/2 性能其實(shí)更好,觀看視頻體驗(yàn)更佳,特別是弱網(wǎng)環(huán)境下。
QUIC 協(xié)議性能有多好?
Chromium ( Google 的 Chrome 瀏覽器背后的引擎)團(tuán)隊(duì)表示,其發(fā)現(xiàn) QUIC 的性能優(yōu)勢特別高,使得 Google 搜索延遲減少了 2% 以上,YouTube 的重新緩沖時(shí)間減少了 9% 以上,PC 客戶端吞吐量增加了 3% 以上,移動設(shè)備的客戶端吞吐量增加了 7% 以上。
怎么用 QUIC 看 B 站視頻?
手機(jī)端我沒研究過怎么使用 QUIC 協(xié)議看 B 站視頻,但是谷歌瀏覽器則很容易搞定。
谷歌瀏覽器支持 QUIC 協(xié)議,這個(gè)是屬于實(shí)驗(yàn)性功能,QUIC 協(xié)議實(shí)際上還在草案中,還沒有正式發(fā)布,所以不是默認(rèn)啟動的,需要手動打開。
第一步,打開Chrome瀏覽器, 在地址輸入 chrome://flags/#enable-quic, 將標(biāo)志設(shè)置為 Enabled。

第二步,重啟瀏覽器后, 打開B站, 隨便點(diǎn)開個(gè)視頻,然后檢查是否使用 QUIC 協(xié)議進(jìn)行視頻播放, 檢查方法如下:
按下 F12進(jìn)入瀏覽器調(diào)試信息界面;選取 Network->Protocol, 如果 Protocol 顯示 h3 則表示目前是使用 HTTP/3 (意味著使用 QUIC 協(xié)議)協(xié)議進(jìn)行視頻內(nèi)容傳輸。

轉(zhuǎn)場


美中不足的 HTTP/2
隊(duì)頭阻塞; TCP 與 TLS 的握手時(shí)延遲; 網(wǎng)絡(luò)遷移需要重新連接;
隊(duì)頭阻塞

TCP 與 TLS 的握手時(shí)延遲

網(wǎng)絡(luò)遷移需要重新連接

QUIC 協(xié)議的特點(diǎn)
無隊(duì)頭阻塞; 更快的連接建立; 連接遷移;
無隊(duì)頭阻塞

更快的連接建立

連接遷移
HTTP/3 協(xié)議

一個(gè)叫 QPACK Encoder Stream, 用于將一個(gè)字典(key-value)傳遞給對方,比如面對不屬于靜態(tài)表的 HTTP 請求頭部,客戶端可以通過這個(gè) Stream 發(fā)送字典; 一個(gè)叫 QPACK Decoder Stream,用于響應(yīng)對方,告訴它剛發(fā)的字典已經(jīng)更新到自己的本地動態(tài)表了,后續(xù)就可以使用這個(gè)字典來編碼了。
總結(jié)
隊(duì)頭阻塞,HTTP/2 多個(gè)請求跑在一個(gè) TCP 連接中,如果序列號較低的 TCP 段在網(wǎng)絡(luò)傳輸中丟失了,即使序列號較高的 TCP 段已經(jīng)被接收了,應(yīng)用層也無法從內(nèi)核中讀取到這部分?jǐn)?shù)據(jù),從 HTTP 視角看,就是多個(gè)請求被阻塞了; TCP 和 TLS 握手時(shí)延,TCL 三次握手和 TLS 四次握手,共有 3-RTT 的時(shí)延; 連接遷移需要重新連接,移動設(shè)備從 4G 網(wǎng)絡(luò)環(huán)境切換到 WIFI 時(shí),由于 TCP 是基于四元組來確認(rèn)一條 TCP 連接的,那么網(wǎng)絡(luò)環(huán)境變化后,就會導(dǎo)致 IP 地址或端口變化,于是 TCP 只能斷開連接,然后再重新建立連接,切換網(wǎng)絡(luò)環(huán)境的成本高;
無隊(duì)頭阻塞,QUIC 連接上的多個(gè) Stream 之間并沒有依賴,都是獨(dú)立的,也不會有底層協(xié)議限制,某個(gè)流發(fā)生丟包了,只會影響該流,其他流不受影響; 建立連接速度快,因?yàn)?QUIC 內(nèi)部包含 TLS1.3,因此僅需 1 個(gè) RTT 就可以「同時(shí)」完成建立連接與 TLS 密鑰協(xié)商,甚至在第二次連接的時(shí)候,應(yīng)用數(shù)據(jù)包可以和 QUIC 握手信息(連接信息 + TLS 信息)一起發(fā)送,達(dá)到 0-RTT 的效果。 連接遷移,QUIC 協(xié)議沒有用四元組的方式來“綁定”連接,而是通過連接 ID 來標(biāo)記通信的兩個(gè)端點(diǎn),客戶端和服務(wù)器可以各自選擇一組 ID 來標(biāo)記自己,因此即使移動設(shè)備的網(wǎng)絡(luò)變化后,導(dǎo)致 IP 地址變化了,只要仍保有上下文信息(比如連接 ID、TLS 密鑰等),就可以“無縫”地復(fù)用原連接,消除重連的成本;
參考連接
https://medium.com/faun/http-2-spdy-and-http-3-quic-bae7d9a3d484
https://developers.google.com/web/fundamentals/performance/http2?hl=zh-cn
https://blog.cloudflare.com/http3-the-past-present-and-future/
https://tools.ietf.org/html/draft-ietf-quic-http-34
https://tools.ietf.org/html/draft-ietf-quic-transport-34#section-17
https://ably.com/topic/http3?amp%3Butm_campaign=evergreen&%3Butm_source=reddit&utm_medium=referral
https://www.nginx.org.cn/article/detail/422
https://www.bilibili.com/read/cv793000/
https://www.chinaz.com/2020/1009/1192436.shtml
有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)
歡迎大家關(guān)注Java之道公眾號
好文章,我在看??
