在Snapchat,我們的目標是讓Snapchat Camera能夠以最快的方式分享精彩瞬間。我們不希望用戶在跟朋友分享的時候發(fā)生任何的延時。
在使用Snapchat的時候,網絡請求特別重要。與UI更新和磁盤寫入需要消耗數毫秒相比,網絡延時可以高達數秒,而且伴隨著高錯誤率和設備受限。為了降低延時和錯誤,我們把請求和響應變得盡可能小,降低不必要的同步,通過全球內容分發(fā)合作伙伴,使媒體信息接近用戶,并使用更加高效的、下一代網絡協議——QUIC(Quick UDP Internet Connections)。
01
—
QUIC協議是如何助力Snapchat的?
讓我們先來看看QUIC之前的網絡堆棧。以Snap為例,在應用層,我們先將Snap媒體放入HTTP2 request payload中,然后使用TLS確保安全層上的連接安全,再通過TCP將請求分塊,并將Snap上傳到服務器。然而,對于移動網絡環(huán)境來說,TCP+TLS+HTTP2協議棧是次優(yōu)的。比如,當Snap用戶在Wifi和WWAN之間切換的時候,TCP就會請求失敗。當Snap用戶在和朋友聊天的時候,由于連接中斷而無法發(fā)送信息會給他們帶來糟糕的體驗。
QUIC是由谷歌工程師開發(fā)的一種互聯網傳輸協議。QUIC基于UDP, 是替換TCP+TLS+HTTP2的HTTP3的基礎。它解決了許多傳輸層和應用層的問題,而且應用開發(fā)者無需任何修改或者只需做小部分改動。如上圖所示,QUIC不會改變底層操作系統(tǒng)網絡協議,也不會更改HTTP。
和TCP+TLS+HTTP2協議棧相比,QUIC有如下優(yōu)點:
更快建連:在發(fā)送有效載荷之前,TCP+TLS需要1~3個RTT(往返時延),QUIC支持0RTT。
改進的擁塞控制:QUIC擁有可插拔的擁塞控制,與TCP相比,QUIC向擁塞控制算法提供更豐富的信息,如QUIC BBR v1和QUIC BBR v2。
避免隊頭阻塞的多路復用:對于HTTP2連接來說,當丟失一個TCP包時,該連接上的stream無法繼續(xù)前進,直到這個包被再次傳輸或者被接收方收到。這就導致延時增加,進而降低用戶體驗(在移動網絡連接環(huán)境中)。而QUIC會通過多路復用其他stream來消除這種延時。
連接遷移:如果IP地址發(fā)生改變,TCP請求將會失敗。而QUIC連接是以一個 64 位的隨機數作為 ID 來標識, 即使IP地址改變,客戶端仍可不受干擾地繼續(xù)請求,使用戶體驗如常。
發(fā)現連接丟失:QUIC可以快速發(fā)現連接丟失,并避免長時間的請求掛起。
QUIC的這些優(yōu)點很好地應用在Snapchat的用例中:
更快建連:在使用QUIC之前,Snapchat p90建立連接需要耗時300毫秒,這種連接上的延時轉變?yōu)橛脩舻却訒r,并阻止用戶接收和查看Snap信息。而QUIC上的更快連接直接減少了用戶等待時間并提升了用戶體驗。
改進的擁塞控制:Snap上,用戶上傳的媒體文件可高達10MB。更好的擁塞控制算法可以提升流量,并降低延時和錯誤率(尤其對于大文件來說)。
避免隊頭阻塞的多路復用:Snapchat擁有豐富的短內容用例,如Snaps和故事、發(fā)現內容等。一般情況下,多種下載stream會使用同一個連接。QUIC消除了HTTP2隊頭阻塞問題,如避免發(fā)送信息請求阻塞spotlight短視頻請求。
連接遷移:如果wifi連接斷掉,無法發(fā)送信息,將會大大降低Snap用戶的體驗,而QUIC解決這個痛點。
發(fā)現連接丟失:發(fā)生丟失連接時,不斷加載的旋轉圖標著實令人感到厭煩(尤其當用戶正使用全屏模式觀看內容時)。使用了QUIC,當丟失連接導致的請求失敗發(fā)生時,我們會立即發(fā)現,并再次嘗試連接,同時向用戶提供友好的界面。
02
—
QUIC在Snapchat的應用
Snapchat的客戶端網絡堆棧建立在開源移動網絡庫Cronet之上。Snap之所以使用Cronet,是因為它不僅支持QUIC,還可以通過豐富的指標和日志提升可觀察性。使我們能夠更加全面地觀測客戶端和服務端網絡性能。
示例展示
我們根據不同國家和平臺的網絡性能選擇不同的協議??傮w來說,我們觀察到啟用 QUIC 將 p90/P99 網絡延時提高了 6~20%,網絡錯誤降低了 3%~8%。QUIC對低網絡連接用戶群還有更多改進。這里我們展示了三個示例。
第一個示例: 2019 年 10 月,我們在廣告服務上啟用了 QUIC。我們觀察到, P90/P99 的延時和錯誤率有所改善。
我們觀察到,所有錯誤代碼的錯誤率都有所改善,包括連接超時、連接丟失、請求超時。在按國家和地區(qū)進一步細分時,我們發(fā)現,網絡質量相對較差且與我們的服務地理距離較遠的國家和地區(qū)的延時改善程度更高。
第二個示例:在 QUIC 之上,在客戶端到服務器路徑上啟用 BBR 擁塞控制也帶來了顯著的延時改進。更大的request payload得到的改進更多。
最后一個示例:在Android上啟用連接遷移后,wifi連接斷掉時的網絡請求成功率提升了20%。
03
—
未來工作
成功集成了QUIC使得我們不斷向前推進,未來,我們將會在QUIC上付諸更多努力:
提高QUIC的覆蓋率
進一步利用QUIC的優(yōu)點:包括在 BBR V2 上進行試驗,支持在 iOS 上的連接遷移等。