QUIC助力Snapchat提升用户体验

LiveVideoStack 2021年7月9日

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


还可输入800
全部评论
作者介绍

LiveVideoStack

音视频技术社区

文章

粉丝

视频

阅读排行
  • 2周
  • 4周
  • 16周
热门视频

HLS性能优化之旅

熊子良/资深研发工程师

贝壳找房联络中心的RTC实践

安海波/语音架构师