
翻译、编辑:Alex
技术审校:刘连响
本文来自Smashing Magazine,原文链接:
https://www.smashingmagazine.com/2021/08/http3-performance-improvements-part2/
Robin讲HTTP/3 #004#
连接迁移是QUIC的第三个性能特性,它通过保持现有连接不变,使QUIC在网络间传输时更快。这确实有效,但这种网络变化并不经常发生,连接仍然需要重新设置它们的发送速率。
我们在第一部分讨论过,QUIC的CID允许它在切换网络时进行连接迁移。我们通过“客户端在下载大文件时从Wi-Fi切换到4G网络”说明了这一特性。在TCP上,此类下载很可能会中止,但使用QUIC便有可能继续下载。
不过,先要考虑这种情况的实际发生频率。你也许认为,当你在一个建筑物内多个Wi-Fi接入点或者马路上各个信号塔间移动时也会发生连接迁移。但在这些场景中,你的设备IP通常不会发生变化,因为无线基站之间的转变在更加底层的协议中完成。因此,只有在完全不同的网络间移动时才会发生连接迁移,所以我说这种情况并不常见。
其次,除了下载大文件、实时视频会议和传输视频流之外,我们可以问问连接迁移是否还适用于其他应用场景。如果你在加载网页时正切换网络,你也许确实需要重新请求一些(后来的)资源。
不过,加载网页通常只需几秒,所以刚巧碰上切换网络的情况并不常见。除此之外,对于迫切需要解决这一问题的应用场景来说,通常已有其他缓解措施。比如,提供大文件下载的服务器支持HTTP范围请求[1]以允许可恢复下载。
网络1断开与网络2连接之间通常存在一些重叠时间(overlap time),所以视频应用可以打开多个连接(每个网络一个),并在旧网络完全消失之前同步它们。用户仍将注意到网络切换,但是视频并不会完全断开。
再次,无法确保新、旧网络的可用带宽一样。因此,即使是概念上的连接完好,QUIC服务器也无法一直保持高速发送数据。而为了避免新的网络过载,它需要重置(或者至少降低)发送速率,并在拥塞控制器的慢启动阶段[2]重新开始。
因为初始发送速率通常太低,无法真正支持如视频流这样的数据,所以即使在QUIC上,也会出现质量损失(quality loss)或者其他暂时性的小问题。某种程度上,连接迁移的目的更多是防止连接上下文混乱以及服务器上的开销,而不是提升性能。
“你知道吗?
注意,正如前文对0-RTT的讨论,我们可以开发一些高级技术来改进连接迁移。比如,我们可以尝试记住上次特定网络上有多少可用带宽,并在新的连接迁移时努力提升到这一水平。除此之外,我们也可以想象不仅仅切换网络,也可以同时使用两个网络。这个概念被称为“多路径(multipath)”,我们在下文会详细介绍[3]。
到目前为止,我们已经讨论了主动连接迁移(active connection migration),其中用户在不同的网络间移动。但也存在被动连接迁移(passive connection migration)[4]的情况,其中特定网络本身会更改参数。NAT[5] rebinding是一个很好的例子,(虽然本文不会全面讨论NAT)它意味着连接的端口号可以在任何特定时间更改,而不发出警告。在大多数路由器中,UDP比TCP更经常出现这种情况。
一旦发生端口号改变,QUIC将不会更改CID,且大多数实现也将假设用户依然在同一物理网络上,从而不会重新设置拥塞窗口或者其他参数。PING[6]和timeout indicator[7]等一些QUIC中的特性也会阻止CID的更改,因为这通常会导致长闲置连接(long-idle connection)的发生。
我们在第一部分曾讨论过:出于安全考虑,QUIC不使用单一CID,而是在执行主动迁移时更改CID。实际情况更加复杂,因为客户端和服务器都有单独的CID列表(在QUIC RFC中被称为source and destination CID[8])。参见下图5。

图 5:QUIC使用了不同的客户端和服务器CID
这种做法使每个端都可以选择自身的CID格式和内容,而这对于实现高级路由和负载均衡至关重要。通过连接迁移,负载均衡器不再查看四元组来识别连接并将其发送到正确的后端服务器。不过,如果所有的QUIC连接都将使用随机CID,这将在很大程度上增加负载均衡器的内存需求,因为它需要存储CID到后端服务器的映射。此外,这种做法也不适用于连接迁移,因为CID会更改为新的随机值。
因此,部署在均衡负载器后面的QUIC后端服务器拥有属于自己的CID可预测格式(predictable format)非常重要,这样负载均衡器才能从CID中获取正确的后端服务器(即使在迁移之后)。IETF提案文件[9]中描述了用于执行这一操作的一些选项。为了实现这一切,服务器需要能够选择自己的CID,可是如果连接发起者(对于QUIC来说,始终是客户端)已经选择了CID,服务器就无法再这么做了。这就是