QUIC 助力 Snapchat 提升用戶體驗

Snapchat(色拉布)是由斯坦福大學兩位學生開發的一款 “閱後即焚” 照片分享應用。利用該應用程序,用戶可以拍照、錄製視頻、添加文字和圖畫,並將他們發送到自己在該應用上的好友列表, 這些照片及視頻被稱爲“快照”("Snaps")。本文來自 Snapchat Client Network Team,主要介紹了 Snapchat 在使用 QUIC 協議後,用戶體驗得到了很大提升。

翻譯 / Alex

技術 review / 劉連響

在 Snapchat,我們的目標是讓 Snapchat Camera 能夠以最快的方式分享精彩瞬間。我們不希望用戶在跟朋友分享的時候發生任何的延時。

在使用 Snapchat 的時候,網絡請求特別重要。與 UI 更新和磁盤寫入需要消耗數毫秒相比,網絡延時可以高達數秒,而且伴隨着高錯誤率和設備受限。爲了降低延時和錯誤,我們把請求和響應變得儘可能小,降低不必要的同步,通過全球內容分發合作伙伴,使媒體信息接近用戶,並使用更加高效的、下一代網絡協議——QUIC(Quick UDP Internet Connections)。

01

QUIC 協議是如何助力 Snapchat 的?

讓我們先來看看 QUIC 之前的網絡堆棧。以 Snap 爲例,在應用層,我們先將 Snap 媒體放入 HTTP2 request payload 中,然後使用 TLS 確保安全層上的連接安全,再通過 TCP 將請求分塊,並將 Snap 上傳到服務器。然而,對於移動網絡環境來說,TCP+TLS+HTTP2 協議棧是次優的。比如,當 Snap 用戶在 Wifi 和 WWAN 之間切換的時候,TCP 就會請求失敗。當 Snap 用戶在和朋友聊天的時候,由於連接中斷而無法發送信息會給他們帶來糟糕的體驗。

QUIC 是由谷歌工程師開發的一種互聯網傳輸協議。QUIC 基於 UDP, 是替換 TCP+TLS+HTTP2 的 HTTP3 的基礎。它解決了許多傳輸層和應用層的問題,而且應用開發者無需任何修改或者只需做小部分改動。如上圖所示,QUIC 不會改變底層操作系統網絡協議,也不會更改 HTTP。

和 TCP+TLS+HTTP2 協議棧相比,QUIC 有如下優點:

**更快建連:**在發送有效載荷之前,TCP+TLS 需要 1~3 個 RTT(往返時延),QUIC 支持 0RTT。 

**改進的擁塞控制:**QUIC 擁有可插拔的擁塞控制,與 TCP 相比,QUIC 向擁塞控制算法提供更豐富的信息,如 QUIC BBR v1 和 QUIC BBR v2。

**避免隊頭阻塞的多路複用:**對於 HTTP2 連接來說,當丟失一個 TCP 包時,該連接上的 stream 無法繼續前進,直到這個包被再次傳輸或者被接收方收到。這就導致延時增加,進而降低用戶體驗(在移動網絡連接環境中)。而 QUIC 會通過多路複用其他 stream 來消除這種延時。 

**連接遷移:**如果 IP 地址發生改變,TCP 請求將會失敗。而 QUIC 連接是以一個 64 位的隨機數作爲 ID 來標識, 即使 IP 地址改變,客戶端仍可不受干擾地繼續請求,使用戶體驗如常。

**發現連接丟失:**QUIC 可以快速發現連接丟失,並避免長時間的請求掛起。

QUIC 的這些優點很好地應用在 Snapchat 的用例中:

**更快建連:**在使用 QUIC 之前,Snapchat p90 建立連接需要耗時 300 毫秒,這種連接上的延時轉變爲用戶等待延時,並阻止用戶接收和查看 Snap 信息。而 QUIC 上的更快連接直接減少了用戶等待時間並提升了用戶體驗。

**改進的擁塞控制:**Snap 上,用戶上傳的媒體文件可高達 10MB。更好的擁塞控制算法可以提升流量,並降低延時和錯誤率(尤其對於大文件來說)。

**避免隊頭阻塞的多路複用:**Snapchat 擁有豐富的短內容用例,如 Snaps 和故事、發現內容等。一般情況下,多種下載 stream 會使用同一個連接。QUIC 消除了 HTTP2 隊頭阻塞問題,如避免發送信息請求阻塞 spotlight 短視頻請求。

**連接遷移:**如果 wifi 連接斷掉,無法發送信息,將會大大降低 Snap 用戶的體驗,而 QUIC 解決這個痛點。

**發現連接丟失:**發生丟失連接時,不斷加載的旋轉圖標着實令人感到厭煩(尤其當用戶正使用全屏模式觀看內容時)。使用了 QUIC,當丟失連接導致的請求失敗發生時,我們會立即發現,並再次嘗試連接,同時向用戶提供友好的界面。 

02

QUIC 在 Snapchat 的應用

Snapchat 的客戶端網絡堆棧建立在開源移動網絡庫 Cronet 之上。Snap 之所以使用 Cronet,是因爲它不僅支持 QUIC,還可以通過豐富的指標和日誌提升可觀察性。使我們能夠更加全面地觀測客戶端和服務端網絡性能。

示例展示

我們根據不同國家和平臺的網絡性能選擇不同的協議。總體來說,我們觀察到啓用 QUIC 將 p90/P99 網絡延時提高了 6~20%,網絡錯誤降低了 3%~8%。QUIC 對低網絡連接用戶羣還有更多改進。這裏我們展示了三個示例。

第一個示例: 2019 年 10 月,我們在廣告服務上啓用了 QUIC。我們觀察到, P90/P99 的延時和錯誤率有所改善。

我們觀察到,所有錯誤代碼的錯誤率都有所改善,包括連接超時、連接丟失、請求超時。在按國家和地區進一步細分時,我們發現,網絡質量相對較差且與我們的服務地理距離較遠的國家和地區的延時改善程度更高。

**第二個示例:**在 QUIC 之上,在客戶端到服務器路徑上啓用 BBR 擁塞控制也帶來了顯著的延時改進。更大的 request payload 得到的改進更多。

**最後一個示例:**在 Android 上啓用連接遷移後,wifi 連接斷掉時的網絡請求成功率提升了 20%。

03

未來工作

成功集成了 QUIC 使得我們不斷向前推進,未來,我們將會在 QUIC 上付諸更多努力:

提高 QUIC 的覆蓋率

進一步利用 QUIC 的優點:包括在 BBR V2 上進行試驗,支持在 iOS 上的連接遷移等。

原文鏈接:

https://eng.snap.com/quic-at-snap

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/jgmxcQs5xpOr-VPBPVffWg