Snapchat QUIC實踐:小協議解決大問題在
熟悉網絡的小伙伴,應該都知道下一代的應用層網絡傳輸協HTTP3將有重大轉變底層網絡層的傳輸協議將會由目前的TCP變成UDP,并基于谷歌開源的QUIC協議為中間層。我們都知道UDB協議似乎無序不可靠的協議,但是其傳輸高效,可以并行傳輸可以極大提高傳輸性能,那么在HTTP3下傳輸的可靠性就要有QUIC來保證。QUIC也從最初的實驗,到實際使用,逐漸成了一個眾所矚目的協議,谷歌,臉書,亞馬遜,Cloudflare等都有在線上嘗試和使用。本文我們就來學習一下Snapchat的QUIC實踐。
現狀
Snapchat(色拉布)是由Stanford兩位學生開發“閱后即焚”照片分享應用站點。使用Snapchat用戶可以拍照、錄制視頻、增加文字描述和圖片,并可以通過網絡分享給自己好友和粉絲。在其中服務性能,尤其是網絡性能是關鍵,在分享東西時如果延遲就會有很大影響。
根據他們的分析:在Snapchat 的服務流程中UI渲染和數據磁盤持久化寫入都可以在幾毫秒內實現,而其中瓶頸在于網絡上的延遲,可能需要幾秒鐘,而且錯誤率和對硬件設備限制都很高。為了減少網絡延遲和錯誤,在通過使用減少請求包和響應包,減少不必要的同步,利用全球內容分發CDN廠商加速等常規的做法。當然他們也使用了新的傳輸技術,下一代高速UDP Internet網絡協議QUIC 。
老架構
Snapchatter使用QUIC之前的網絡棧。以發送Snap為例,在應用層,Snap媒體通過入HTTP2請求傳輸中。使用TLS 在安全層 來保證連接的安全,利用TCP將請求拆分成chunk上傳Snap到服務器。然而,TCP+TLS+HTTP2 堆棧對于移動網絡環境來說并不是最理想的。 例如,如果 Snapchatter 在WiFi和 WAN之間切換,TCP 請求將失敗。對于與朋友聊天的用戶,由于連接斷開而無法發送消息會導致體驗下降。
QUIC優勢
QUIC是一種互聯網傳輸協議,由谷歌的工程師開發。QUIC 是HTTP3的基礎,底層基于UDP,用來取代HTTP2的TCP+TLS+。 QUIC 解決了許多傳輸層和應用層問題,同時幾乎不需要應用程序開發人員進行更改。如上圖所示,QUIC沒有改變網絡層網絡協議,也無需更改高層的HTTP協議。
與HTTP2的TCP+TLS+協議棧相比,QUIC在以下幾個方面做了改進:
- 更快的連接建立:QUIC 握手支持零往返與,在發送有效載荷之減少TCP+TLS 的1-3 次往返交互 。
- 改進的擁塞控制:QUIC具有可插拔的擁塞控制,并且為擁塞控制算法提供比TCP 更豐富的信息。 例如QUIC BBR v1 和QUIC BBR v2 。
- 無隊頭阻塞的多路復用:對于HTTP2連接,當TCP 數據包丟失時,該連接上的任何流都無法前進,直到數據包被遠端重新傳輸和接收。這會導致延遲增加,并可能降低移動網絡連接上的用戶體驗。 QUIC 消除了在同一連接上復用的其他流的這種停滯。
- 跨IP地址的連接遷移: 如果IP更改,TCP請求會失敗。 而QUIC連接由QUIC 協議層隨機生成的64位標識符識別,因此使用QUIC的客戶端可以繼續進行中的請求,在IP地址更改時不會中斷,從而實現不受干擾的用戶體驗。
- 連接丟失檢測: QUIC可以快速檢測連接丟失,避免長時間請求被掛起。
- QUIC的這些優勢,非常適合有解決Snapchat的問題,極大地提高了其用戶體驗。
- 更快的連接建立:在采用QUIC之前,p90 連接建立需要長達300毫秒。這種連接設置延遲轉化為用戶等待延遲,并阻止用戶接收快照和查看信息。QUIC更快的連接直接減少了用戶等待延遲并改善了用戶體驗。
- 改進的堵塞控制:Snapchat上傳的Snap媒體大小可以能會達到10MB以上。更好的擁塞控制算法可提高吞吐量、降低延遲和錯誤率,尤其是對于大型媒體。
- 多路復用,無隊頭阻塞: Snapchat具有豐富的短內容用例,包括Snaps、Stories、Discover內容等。通常有多個下載流使用同一連接。 QUIC消除了HTTP2頭阻塞問題,例如避免發送消息請求阻塞聚光燈請求。
- 跨 P地址的連接遷移:與朋友一起時,由于wifi連接中斷而無法發送消息可能會導致體驗下降。連接遷移解決了這個痛點。
- 檢測連接丟失: 由于連接丟失而導致的長時間加載微調器令人不安,尤其是當 Snapchatter 處于全屏模式欣賞內容時。使用 QUIC,當請求因連接丟失而失敗時,我們可以檢測并重試,同時提供用戶友好的UI。
效果
Snapchat 的客戶端網絡堆棧建立在開源移動網絡庫Cronet之上。Snap利用Cronet實現QUIC,還通過豐富的指標和日志提高了服務可觀察性,構建了客戶端和服務器網絡性能的統一視圖。
根據Snapchat不同地區不同協議對比??傮w上來說,啟用QUIC將 p90/P99 網絡延遲提高了6-20%,網絡錯誤降低了3%-8%。對低網絡連接用戶群還有更多改進。
Snapchat于2019年10月廣告服務上啟用了QUIC。可以觀察到 P90/P99 的延遲和錯誤率大有改善。
如上面所示,所有錯誤代碼的錯誤率都有所改善,包括連接超時、連接丟失、請求超時。在按國家和地區對延遲改進進行的進一步細分中,可以觀察到網絡質量相對較差且與服務的地理距離較遠的國家和地區的延遲改進更高。
在第二個示例中,在QUIC的基礎上,在客戶端到服務器路徑上啟用BBR擁塞控制也帶來了顯著的延遲改進。更大的請求有效負載還有更多改進。
在最后一個示例中,通過在安卓啟用連接遷移,丟失wifi連接時的網絡請求成功率提高了20%。
總結
Snapchat的QUIC實踐嘗試取得了很好的效果,通過使用新技術,解決了服務上的痛點,提高性能,極大提高了用戶的使用體驗。通過小協議解決大問題,這樣的案例,可以直接拿來使用,或者用來作為調研報告說服領導進行架構完善。