WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计

本文是WWDC 2022 Reduce networking delays for a more responsive app

视频的翻译,视频链接见:https://developer.apple.com/videos/play/wwdc2022/10078/

原作者:Vidhi Goel

本文主要讲如何通过降低网络延迟,构建快速响应的应用。 

Latency Matters

网络延迟是指数据从网络的一个节点发送至另一个节点的时间。它决定了应用内容下发的速度。所有联网的应用都会因为网络延迟而导致较差的体验问题。比如即使升级到1G的带宽,视频通话仍可能会卡顿;即使买了最贵的路由器,视频会议的体验有时仍然不佳;即使部署了Mesh WiFi,我的应用有时仍然需要加载数秒钟。

为了找到问题产生的原因,你需要理解数据包是怎么传输的。应用程序把数据包发给服务器,中间需要经过一系列的网络协议栈。很多人会认为数据包是没有延迟直接发给服务器的,而实际情况是,数据包需要在网络设备的队列中等待处理,一些瓶颈链路经常会有很大的队列,数据包需要排队等待处理,网络设备中的这些队列导致应用到服务器的往返时间(RTT)变得很大。

WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第1张图片

当需要多次RTT来完成一次请求时,这个问题就变得更加严重了。比如在TLS1.2 over TCP的情况下,第一个响应包需要等待4个RTT。

WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第2张图片

由于每一次的RTT都因为排队而变大,导致多次往返后总时长过大。应用的响应时间由两个值的乘积决定:RTT的值和RTT的次数。为了降低网络延迟,提高应用响应速度,你必须降低这两个值。

WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第3张图片

有一项研究揭示了增加带宽和降低延迟对于页面加载时间的影响。

这个测试在固定延迟的情况下,将带宽从1M增加到10M。可以看到从1M增加到2M时,页面加载时间有大幅降低,但是在4M以后,继续增加带宽对于页面加载时间几乎没有帮助。这就是即使我们升级到1G带宽的网络后应用仍然存在响应慢的原因。

在另一项对比测试中,可以看到延迟每降低20ms,页面加载时间就会有线性的降低。

 WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第4张图片

 WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第5张图片

 Design responsive apps

下面介绍一些降低延迟,提高响应速度的简单方法。

你可以通过采用更现代的网络协议比如IPv6,TLS1.3,HTTP/3 来大幅度的降低延迟。你需要做的就是在客户端使用URLSession和Network framework 的API,并在你的服务端启用这些新的网络协议。

WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第6张图片

自从HTTP/3发布以来,仅仅一年的时间,已经有20%的网络流量在使用HTTP/3,这个数字仍在持续增长。在不同的HTTP版本Safari的流量里,HTTP/3是最快的。相比于HTTP/1来说,HTTP/3的请求次数中位数是HTTP/1的一半多一点。这意味着你的网络请求会快很多。 

WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第7张图片

 当设备从WiFi网络切换到移动网络时,链接重建的过程可能会让应用短暂无响应。使用连接迁移技术可以消除这个问题。你只需要在URLSession configureation或者NWParameters里设置multipathServiceType 为handover即可启用。

WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第8张图片

 如果你是直接使用UDP来发送自定义协议的数据,在iOS16和macOS ventura中有一个更好的方式来发送UDP数据。QUIC相比纯粹的UDP有很多的优势,最重要的一点是,QUIC可以通过避免网络拥塞来降低延迟,减少丢包。

设置QUIC Options的 isDatagram 参数为true,并设置你想要的最大帧大小。创建完成之后,你就可以像其他QUIC 流一样发送和接收UDP数据流。

 WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第9张图片

 Speed up your server

接下来,我将解释服务器如何影响您的应用程序的响应速度。 尽管服务器的硬件往往是最顶级的,但实际上它可能成为您的应用程序运行缓慢的原因。 我们在 macOS Monterey 中引入了网络质量工具,您可以使用此工具来测量ISP以及服务器上的缓冲区膨胀。 您需要将服务器配置为网络质量工具的目标。 然后运行 networkQuality 工具,首先测试 Apple 的默认服务器,然后测试您自己配置的服务器。 如果该工具在使用默认服务器时得分很高,但在与您自己的服务器通信时却没有那么好,那么您的服务器的响应能力可能还有提升的空间。

WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第10张图片

现在,我将向您展示一个示例,我们使用这种技术来改进流媒体视频。

您可能有过这样的经历,如果你拖动在线视频的播放进度条,视频会重新缓冲很长时间。因此,我们调查了随机访问速度缓慢的原因。我们使用网络质量工具来测试流媒体服务器的行为,我们发现响应性得分很差。

WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第11张图片

我在右侧播放了一个 WWDC 视频。然后,我跳过了视频。视频重新缓冲时屏幕没有显示任何内容。几秒钟后,视频出现了。借助 macOS 上网络质量工具的详细输出,我们发现服务器上出现了巨大的缓存队列。所以我们看了一下服务器配置。具体来说,我们查看了 TCP、TLS 和 HTTP 缓冲区大小,它们分别配置为 4MB、256KB 和 4MB。

因为硬件的RAM 很充足,所以缓冲区设置的很大。但这并不意味着缓冲越大越好。我们的响应性测量明确了这个问题——一个新生成的数据包在这些大缓冲区中的陈旧数据后面排队,这在传输最新的数据包时造成了很多额外的延迟。因此,我们将缓冲区大小减少到 HTTP 的 256KB、TLS 的 16KB 和 TCP 的 128KB

WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第12张图片

这是 Apache Traffic Server 的配置文件。 TCP not-sent low-water mark设置为 128KB ,并打开可以减小缓冲区的其他选项。对于 TLS,我们开启了动态记录大小,对于 HTTP/2,我们减少了low-water mark和缓冲区块大小。我们建议为您的 Apache Traffic Server 使用这些配置,如果您使用不同的 Web 服务器,请查找其类似选项。

进行这些更改后,我们再次运行网络质量工具。这次我们获得了很高的 RPM 分数!在右侧,我播放了相同的视频,但这次当我拖动进度条时,视频立即恢复了播放。通过消除服务器上不必要的排队,我们使视频随机拖动的响应更快。

无论您的应用程序如何使用网络,服务器上的这些更改都可以使您的应用程序更具响应性并提供更好的用户体验。以上就是通过更新服务器配置来提高响应性的方法。

Speed up the network

 第三个会极大地影响响应速度的因素是网络本身。 Apple 在 iOS 15 和 macOS Monterey 中引入了网络质量工具。很多人使用相同的方法开发了很多网络质量测试工具。 比如Waveform 开发了Bufferbloat 测试程序。还有一个用GO编写的响应性测试的开源实现。 Ookla 在他们的 Speedtest 应用程序中添加了响应测试。 Ookla 的应用程序以毫秒为单位显示往返时间,如果用 60,000 除以该数字,可以算出每分钟往返次数或 RPM。您可以使用这些工具来衡量您自己的网络的运行情况。

WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第13张图片

了解网络延迟的最佳方法是使用延迟敏感的应用程序。因此,我将向您展示我在远程机器上的屏幕共享体验。我设置网络条件来模拟一个有代表性的接入网络,来自其他设备的流量共享该网络。在这里,我使用屏幕共享登录到我的远程计算机。

WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第14张图片

我单击了不同的 Finder 菜单,但每个菜单的显示都非常缓慢。 为了检查这种交互有多少延迟,我在本地机器上启动了一个显示时间的应用程序,并在远程机器上启动了同一个应用程序。 即使这些计算机上的时间是同步的,我的远程屏幕也没有定期更新,并且显示时间延迟了几秒钟。 延迟更新的原因是在网络最慢的链接处存在一个大队列,来自屏幕共享应用程序的数据包卡在这个大队列中。 

WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第15张图片

为了解决这个排队问题,Apple 正在与网络社区合作开发一种名为 L4S 的新技术。它在 iOS 16 和 macOS Ventura 中作为测试版提供。

WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第16张图片

L4S 可以显著降低排队延迟,并实现零拥塞丢包。为了能始终保持较短的队列,网络设备会在拥塞时主动发出拥塞信号而不是丢弃数据包,然后发送方根据来自网络的拥塞反馈调整其发送速率。这种方式可以在网络中保持非常小的队列,且不会丢失任何数据包,这将使您的应用程序具有高度响应性。现在,让我们看看 L4S 如何改进屏幕共享。这次,我使用了相同的机器和相同的网络,但这次我启用了 L4S。当我点击不同的 Finder 菜单时,它们会立即显示出来。我在两台机器上都启动了 Time 应用程序。现在,远程屏幕和本地机器上的时间几乎完全同步。

 WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第17张图片

这项技术不仅仅能用于屏幕共享。 L4S 改进了当今的所有应用程序,并为未来的应用程序打开了一扇门,这些应用程序在今天看来是不可能的。下图绘制了来自屏幕共享应用程序的数据包观察到的平均往返时间,在测试屏幕共享程序时,同时存在来自其他应用的背景流量。 

WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第18张图片

将经典排队与 L4S 进行比较表明,使用 L4S 可以大大减少往返时间(这个图彻底震惊了我,L4S效果这么好吗?)。这是我的屏幕共享体验显着改善的主要原因。测试使用 HTTP/3 或 QUIC 和 L4S 的应用程序。您可以在 iOS 16 的开发人员设置中或在 macOS Ventura 上通过默认写入启用 L4S。要使用 Linux 服务器进行测试,您的 QUIC 实现需要支持准确的 ECN 和可扩展的拥塞控制算法。为确保您在部署支持 L4S 的网络时做好准备,请测试您的应用程序与 L4S 的兼容性,并针对您可能遇到的任何问题提供反馈。

WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第19张图片

现在您知道减少延迟对于提高应用程序的响应能力至关重要。因此,采用 HTTP/3 和 QUIC,以减少往返次数并更快地将内容交付到您的应用程序。消除服务器上不必要的排队,以提供更具响应性的交互。通过在开发人员设置中启用它并提供反馈来测试您的应用与 L4S 的兼容性。最后,与您的服务器提供商讨论启用 L4S 支持。感谢收看! ♪

WWDC: 打造高响应app,大幅降低网络延迟的锦囊妙计_第20张图片

你可能感兴趣的:(wwdc,udp,quic,l4s,http/3)