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


详情请扫描图中二维码或点击阅读原文了解大会更多信息。

QUIC助力Snapchat提升用户体验相关推荐

  1. 描点链接元素的优化提升用户体验

    用一些大网站的时候,发现有一个很细节的共同点:点击链接元素的时候,链接元素会产生一个明显的边框,而且这个边框的颜色和#f27b04很接近,我觉得既然很多大网站都这么做,这其中肯定有一些用户体验方面的东 ...

  2. 网络营销外包——网络营销外包专员浅析提升用户体验从哪入手?

    众所周知,在网站运营期间,网站跳出率的高低直接反映出用户对网站喜爱与否,也是检测网站性能是否丝滑的关键点,如果网站跳出率越高就证明用户体验越差,搜索引擎也不会更加注重抓取该网站.那么如果提高用户体验, ...

  3. 纯前端表格控件SpreadJS V12.1 隆重登场,专注易用性,提升用户体验

    ​ 一款优秀的开发工具,在更新迭代中,除了要满足不同场景的业务需求,也需不断优化已有功能,尤其是细节方面,要能为用户带来使用体验和开发效率的提升. 作为一款备受业界专家和开发者认可的纯前端类Excel ...

  4. paip.提升用户体验--提升java的热部署热更新能力

    paip.提升用户体验--提升java的热部署热更新能力 想让java做到php那么好的热部署能力  "fix online"/在线修复吗??直接在服务器上修改源码生效,无需重启应 ...

  5. 使用渐进式JPEG来提升用户体验

    今天才认识到原来JPEG文件有两种保存方式他们分别是Baseline JPEG(标准型)和Progressive JPEG(渐进式).两种格式有相同尺寸以及图像数据,他们的扩展名也是相同的,唯一的区别 ...

  6. android 6.0适应的机型,提升用户体验 可升Android 6.0机型盘点

    原标题:提升用户体验 可升Android 6.0机型盘点 [手机中国 导购]2009年Android系统正式发布,由此加速手机走向智能化进度.如今,随着Android系统日渐成熟,众多手机厂商都在此基 ...

  7. electron加载html加载不起来,Electron 预加载远程页面提升用户体验

    使用场景 Electron 内置 Chromium 和 Node.js,为了提升用户体验,通常 Electron 封装的前端静态文件存储在客户端本地.但总有一些特殊情况,会使用到部分远程页面. 比如微 ...

  8. APP开发中这十个细节能直接影响到用户体验,那么如何提升用户体验?

    随着软件开发技术的不断发展和完善,有众多同类选择的APP用户越来越挑剔,单单拼功能拼硬件已经不足以捕获用户芳心.在APP使用过程中,大部分用户无意识地培养出了对使用体验的重视感.这警醒企业,只盯着为用 ...

  9. 三星电子中国研究院院长张代君:Bixby绝非炫技而是为提升用户体验而生

    近日,三星正式对外发布旗下人工智能平台Bixby中文(普通话)版.与其他语音助手截然不同,Bixby包含语音.视觉.主页.提醒四大功能,可为用户提供多模交互体验.此外,Bixby还可以不断学习用户的使 ...

最新文章

  1. Java中的ClassLoader和SPI机制
  2. Mininet FAQ
  3. 汇总|SLAM常用linux命令,包括文件查找、查看文件大小、设置环境变量等
  4. MyBatis Generator:代码生成器
  5. SAP C4C Embedded Component里Lead ID和Lead TI页面的关系
  6. 全球最聪明50家公司公布:中国企业大放异彩 华为凶猛
  7. AIR-Android开发外部数据访问与存储
  8. java.net.bindexception: address already in use: jvm_bind:8080
  9. caffe安装系列——综述
  10. SecureCRT鼠标双击或拖成变成Ctrl+C的解决办法
  11. 高中数学题库及答案(经典50题)
  12. c/c++ 去掉空格函数
  13. python是什么专业术语-python术语大全
  14. vant area地区选择组件使用方法
  15. 【一名合格前端工程师的自检清单】--自检答案
  16. 谁说大象不能跳舞--myeclipse 优化
  17. SpringSecurity(六)注销登录
  18. Pandas库基本使用
  19. 华硕笔记本电脑拆机清理灰尘涂抹硅汁教程
  20. 云讯健身管理系统-11--NUXT和Redis

热门文章

  1. 洛谷P4319 变化的道路
  2. Smart Link
  3. 上币至iamToken
  4. Swift基础--方法
  5. linux系统判断是否重启、关机、查询登录诊断分析简介
  6. Domino下邮箱用户数据库限额自助释放物理空间
  7. CodeForces - 1523E Crypto Lights(组合数学+推公式)
  8. UVALive - 7511 Multiplication Table(暴力+模拟)
  9. CodeForces - 1326D2 Prefix-Suffix Palindrome (Hard version)(马拉车/回文自动机)
  10. HYSBZ - 1208 宠物收养所(Splay)