A Multipath Extension to the QUIC Module for ns-3

Posted on Apr 16, 2024

https://dl.acm.org/doi/abs/10.1145/3592149.3592803 Jianping Pan

存在的问题

大多数(MP)QUIC实验平台都是建立在真实系统或网络模拟器基础上的,给进一步研究和实验带来了挑战。在研究界,MPQUIC仿真平台在很大程度上是空白

论文的工作

  • 基于ns-3的QUIC模块的MPQUIC实现和改进,以及实现的功能描述
  • 在各种场景下通过一系列扩展实验展示了MPQUIC的性能

工作达到的效果

满足了对可扩展多路径、灵活的路径调度器和兼容的拥塞控制算法的需求

QUIC

QUIC在 2021 年被互联网工程任务组(IETF)标准化为 “QUICv1”。QUIC 的创新功能,如流复用、帧结构和 0-RTT 握手,使其能够提高传输性能并轻松适应各种应用。目前,越来越多的网络浏览器和服务器支持通过 QUIC 或 HTTP/3 传输。

QUIC的局限性

缺乏多路径管理策略

QUIC 的多路径扩展(MPQUIC)也成为研究界关注的话题

工作时间线

自 2021 年起,我们在 QUIC 模块的基础上为 ns-3 开发了 MPQUIC 平台。我们的实现和改进实现了某些功能,例如多路径的可扩展性、多路径调度器切换的灵活性以及与不同拥塞控制算法的兼容性。2022 年,我们修正了在最初的版本中,我们发现了几个错误,并进一步丰富了路径调度程序集。自第一版发布以来,我们的实现已在一些研究工作中得到应用。

论文大概内容

  • 介绍了通过ns-3的QUIC模块实现MPQUIC的情况
  • 扩展了对MPQUIC实现性能的评估
  • 总结本文并讨论未来工作

MPQUIC协议描述

QUIC 的工作原理与传统 TCP 连接不同,它能缓解线路头部阻塞问题,缩短传输延迟,并采用加密技术。基于 QUIC 的几个显著特点和改进,MPQUIC的设计规范分为以下五个部分。

  • 路径识别:在单路径 QUIC 连接中,增加的数据包编号用于识别丢失的数据包。如果所有数据包在 MPQUIC 中共享一个编号空间,但通过不同的路径发送,那么它们可能会错序到达,从而导致对数据包丢失的误解。为解决这一问题,MPQUIC 在数据包标头中加入了路径标识,并创建了每个路径的编号空间,从而将不同路径上的数据包编号相互隔离,并将顺序特性限制在该路径上。这可以防止中间件意外丢弃数据包编号相同但路径不同的数据包。
  • 路径管理。在 MPQUIC 中,路径管理器负责路径的创建和删除。图中显示,QUIC 中的数据包有效载荷由多个帧组成,这些帧可存储流数据或控制信息。利用这种帧结构,MPQUIC 可以定义一些特定类型的帧来存储多路径信息。为了管理多路径,MPQUIC 引入了新的帧,如 ADD_ADDRESS 和 REMOVE_ADDRESS,以帮助建立和删除路径。此外,由于连接 ID 支持零往返时间(0-RTT),MPQUIC 能够在一次握手中验证新路径,而 MPTCP 则需要三次握手才能使用任何路径。
    • Packet Header 中的 Path ID:这可能表示该数据包被发送或接收的路径标识符。在多路径传输中,每个路径都会有一个唯一的标识符,以便在发送和接收数据时能够区分不同的路径。
    • 帧中的 Path ID:对于"MP_ACK"帧,“Path ID"可能表示该确认(ACK)是针对哪条路径的数据包。在"ADD_ADDRESS"和"REMOVE_ADDRESS"帧中,“Path ID"可能是用来指示要添加或移除的地址对应的路径标识符。
    • 总的来说,“Path ID"在不同上下文中的含义可能略有不同,但其核心概念是为了标识和管理在多路径传输中的不同路径。在Packet Header中,它可能用于标识整个数据包应该在哪个路径上传输;而在特定帧中,它用于指明该帧操作(如确认、添加地址、移除地址)所涉及的具体路径。这样设计可以确保在进行路径管理和控制时能够明确指向正确的路径。
  • 可靠的数据传输。MP_ACK 帧的定义是为了处理 MPQUIC 中的丢包恢复问题。由于回执取决于数据包编号,并且需要包含所有未回执的数据包编号,如果仍使用原始的 ACK 帧,按路径编号空间的多路径传输会造成冲突和过大的帧。因此,我们引入了 MP_ACK 帧,将庞大的确认信息分割成更小的基于路径的帧,以防止冲突。此外,MPQUIC 可以在不同路径上传输 MP_ACK 帧,而 MPTCP 则必须在接收数据的同一路径上返回确认。
  • 数据包调度。MPQUIC 中的路径调度器负责将数据包分配到不同的路径上。最简单的调度算法是循环调度(Round-Robin,RR),它可以按顺序将数据包调度到不同的路径上,但当两个数据流的带宽和 RTT 相差很大时,可能会导致高延迟。因此,MPQUIC 默认使用最小 RTT(MRTT),这在 Linux 内核的 MPTCP 中已经实现。只要拥塞窗口还有空间,就会优先选择 RTT 测量值最小的路径。此外,还有一些先进的调度算法被提出。例如,BLEST和 ECF通过估计在慢速路径的 RTT 内快速路径上可以发送多少数据包来调度数据包。Peekaboo是一种基于强化学习算法的自适应多路径调度器。
  • 拥塞控制。传输层协议的拥塞控制通过决定何时以及如何调整发送窗口来实现流畅高效的传输。NewReno 和 CUBIC被广泛用于单路径 TCP 和 QUIC,但在多路径协议中会造成不公平。因此,MPQUIC 的默认拥塞控制算法采用了 OLIA、它整合了来自所有路径的信息,在 MPTCP 中也表现出色。

在ns-3中实现MPQUIC所面临的挑战

MPQUIC 的代码实现基于 ns-3 中的 QUIC 模块。由于该模块是为单路径连接而设计的,因此在多路径连接时需要进行许多调整,同时还要保持原有的传输功能。修改过程中也会遇到一些挑战。

  • QUIC 只考虑一个路径连接。主机地址和对等地址对于单个连接来说是单一的,由应用程序直接分配。因此,ns-3 QUIC 模块不支持多地址对操作。不过,多路径传输层协议需要具备探索多个本地地址并将地址公布给对等设备的能力。因此,我们应该在实现过程中加入此类功能。
  • QUIC 模块的发送和接收功能是环环相扣、逐一相连的。如果只是在某些基本功能中增加多路径,就会破坏整个传输过程。因此,我们必须彻底检查数据流,并在所有相关功能中实现多路径功能。具体来说,m_tcb 是 QuicSocketState 的一个实例,在整个 QUIC 模块中使用,它包含了丢失检测变量以及拥塞控制管理状态,如往返时间、确认延迟、丢失事件等。然而,在多路径实施中,每条路径都应保持一个独立的空间来管理这些控制信息。QuicSocketTxBuffer 也存在类似的情况,它不仅是一个简单的帧存储列表,还负责根据可用窗口和最大传输单位进行帧的分割和重新组装。因此,我们的实现无法直接为每条路径实例化缓冲器对象。相反,每条路径都需要一个独立的 QuicTxPacketList 空间,用于存储缓冲区中已发送的数据包。
  • 多径传输的拥塞控制算法设计应将不同路径的因素以耦合的方式考虑在内。虽然 QUIC 中的拥塞控制是可扩展的,但 QuicCongestionOps 的接口只考虑了单路径因素,这是不够的。
  • 此外,QUIC 模块中还缺少一个基于多路径的调度器。因此,我们建立了一个涉及多路径因素并保持可扩展性的新拥塞控制类,以及一个灵活并兼容各种算法的调度器类。 总体而言,MPQUIC 实现的主要挑战是地址宣传、路径分离和基于 ns-3 QUIC 模块的算法扩展,同时保持原有的传输功能。

ns-3中MPQUIC的实现

目前状态和缺失的功能

论文工作于 2021 年开始实施,并随着 IETF 草案的更新而不断改进。以下是论文的实现与 IETF 最新草案一致的支持功能。论文的实现支持中提到的大部分功能,包括握手协商和传输参数、路径设置和删除、具有多个数据包编号空间的多路径操作、路径调度和拥塞控制。当前版本修复了初始版本中的几个错误。例如,作者发现在使用 RR 调度器传输时,由于意外的路径关闭标志,数据包的大小会减小到一个很小的数字。此后,我们还丰富了路径调度程序集。

以下是中提到的一些缺失功能,论文作者将在今后的工作中加以考虑。引入了一个 PATH_STATUS 帧,用于通知对等方按优先级发送数据包。论文中的实现能够在本地显示路径状态,但目前还不支持在对等网络之间传输路径状态。在路径关闭阶段,包含一个 RETIRE_CONNECTION_ID 帧,用于向接收对等体表明发送方将不再发送任何与该路径上使用的连接 ID 相关的数据包,而论文当前的版本不包含该帧。另一方面,论文的 MPQUIC 实现目前只支持发送带有来包给出的路径的 MP_ACK。MP_ACK帧可以通过不同的路径返回,这将是未来的工作。此外,将继续改进我们的实施,使其与最新的 IETF 草案保持一致。