Xlink-draft
Xlink-draft:Multipath Extension for QUIC
[toc]
写在前面
【draft-liu-multipath-quic-04 (ietf.org) : 2021.9】
Quic 扩展 for mpquic
1. Introduction
在本文中,我们提出了对当前QUIC设计的一个扩展,以支持对单个连接同时使用多条路径。该方案基于几个基本设计点:
尽可能重复使用QUIC-v1的机制,QUIC-v1支持连接迁移和路径验证。
为了避免中间盒丢弃数据包的风险(可能只支持QUIC-v1),请使用与QUIC v1相同的数据包头格式。
端点需要每个不同路径的设置路径标识符,用于跟踪数据包的状态。由于我们希望保持数据包头格式不变[QUIC-TRANSPORT],连接ID(以及连接ID的序列号)将是路径标识符的良好选择。
为了方便数据包丢失检测和恢复,端点对每个路径标识符使用不同的数据包编号空间。
拥塞控制、RTT测量和PMTU发现应按路径进行(遵循[QUIC-TRANSPORT])
2. 公约和定义
本文件中的关键词“必须”、“不得”、“必需”、“应”、“不得”、“应”、“不应”、“建议”、“不建议”、“可”和“可选”仅当以所有大写字母出现时,才应按照BCP 14[RFC2119][RFC8174]中的描述进行解释,如下所示。
我们假设读者熟悉[QUIC-TRANSPORT]中使用的术语。此外,我们还定义了以下术语:
- 路径标识符(Path ID):用于在端点处的QUIC连接中标识路径的标识符。路径标识符用于多路径控制帧(PATH_STATUS帧)中,以识别路径。默认情况下,它被定义为用于在该特定路径第4.1节上发送数据包的目标连接ID的序列号,但如果该连接ID的长度为零,则可以使用替代定义。
- 包号空间标识符(Packet number space identifier ID):用于区分不同路径的包号空间的标识符。它用于1-RTT数据包和确认帧(ACK_MP)。每个节点为其提供给对等方的每个CID维护一个“接收到的数据包”列表,该列表用于确认使用该CID接收到的数据包。第4.2节路径标识符和包号空间标识符之间的区别在于,在多路径控制帧中使用路径标识符来识别路径,在1-RTT包和ACK_MP帧中使用包号空间标识符来区分不同路径的包号空间。
路径标识符和包号空间标识符之间的区别在于,路径标识符在多路径控制帧中用于标识路径,包号空间标识符在1-RTT包和ACK_MP帧中用于区分不同路径的包号空间
3. Enabled Multipath QUIC - Handshake
此扩展定义了一个新的传输参数,用于在连接握手期间协商多路径扩展的使用,如[QUIC-transport]中所述。新的传输参数定义如下:
- 名称:enable_multipath(TBD-experiments 0xbaba)
- 值:0(默认)表示禁用,1表示启用,如果对等方未携带enable_multipath(TBD-experiments 0xbaba)传输参数,则表示对等方不支持多路径,端点必须以单路径回退到[QUIC-TRANSPORT],并且不得在后面的数据包中发送任何MP帧,也不得使用第5.1节中定义的多路径特定AEAD算法。
请注意,传输参数active_connection_id_limit
[QUIC-transport]限制了可用连接id的数量,也限制了并发路径的数量。
4. 路径管理 Path management
端点在握手流中协商后,两个端点 启用多路径功能,端点可以开始使用多个路径。
本方案为路径管理增加了一个多路径控制框架:
- 接收端声明路径状态和偏好的 PATH_STATUS 帧
所有新的MP帧都以1-RTT数据包[QUIC-TRANSPORT]发送。
4.1. Path Identifier and Connection ID
端点需要每个不同路径的路径标识符,用于跟踪数据包的状态。端点使用1-RTT数据包头中的连接ID(Connection IDs)作为每个方向上的路径标识符,并使用MP帧中连接ID的序列号来标识引用的路径。
遵循[QUIC-TRANSPORT],每个端点都使用新的连接ID帧(NEW_CONNECTION_ID)为自己声明可用的连接ID。在端点添加新路径之前,它应该检查每侧是否至少有一个未使用的可用连接ID。
端点可以根据1-RTT数据包的目的连接ID找到接收数据包的路径。端点可以通过其连接ID或连接ID的序列号找到路径的上下文。
路径标识符中的标识符类型字段用于区分以下3种不同类型的路径标识符:
- Type 0:指控制帧的发送方在发送数据时在指定的路径上使用的连接标识符。如果此连接标识符长度非零,则应使用此方法。如果此连接标识符的长度为零,则不得使用此方法。
- Type 1:指控制帧接收器在通过指定路径发送数据时使用的连接标识符。如果此连接标识符为零长度,则不得使用此方法。
- Type 2:指发送或接收控制帧的路径。
4.2. Path Packet Number Spaces
为了方便数据包丢失检测和恢复,端点对每个数据包编号空间标识符使用不同的数据包编号空间。发送端选择1-RTT数据包中使用的连接标识符。发送到不同路径的1-RTT数据包应尽可能携带不同的连接标识符,但如果对等方使用0-lenght CID,则会出现异常。在所有情况下,1-RTT数据包的数据包编号空间特定于这些数据包中的连接ID。
包号空间标识符(Packet Number Space Identifier)(PN Space ID)是用于区分不同路径的包号空间的标识符。它用于1-RTT数据包和确认帧(ACK_MP 帧)。在1-RTT数据包中,我们使用目的地连接ID的序列号作为数据包编号空间标识符,并在ACK_MP帧中添加数据包编号空间标识符字段。
注意:如果一个对等方使用零长度的CID,那么发送到该对等方的所有数据包都必须在一个数字空间中编号,因为数据包级别的解密实现将只看到一个连接ID序列号(默认数字0)
4.3. 路径初始化
如图所示:客户端提供一个未被使用的可用连接ID(C1 带有 序列号1),服务端提供了两个可用的连接ID(S1带有序列号1,S2带有序列号2)。当客户端想要开启一条新路径的时候,首先检查是否有两端都未被使用的可用的连接ID,选择连接ID S2作为新路径的目的连接ID。
在端点启动新路径之前,端点需要通过NEW_CONNECTION_ID帧交换未被使用的可用连接ID。例如,如果目标是维护2条路径,则每个端点应向其对等方提供至少3个CID:2个正在使用,一个备用。如果客户端已经使用了所有分配的CID,则应该停用那些不再使用的CID,服务器应该提供替换,如[QUIC-TRANSPORT]中所述。
如果传输参数“active_connection_id_limit”协商为N,并且服务器提供了N个连接id,客户端启动了N条路径,则达到该限制。如果客户端想要启动一条新路径,它必须退出其中一条已建立的路径。
路径验证使用QUIC Transport[QUIC-Transport]中定义的Path_CHALLENGE和Path_RESPONSE。
4.4 路径状态管理
端点使用 PATH_STATUS 通知对等方应按照这些帧表示的首选项发送数据包。端点使用对等方用于PATH_STATUS(描述发送方的路径标识符)的CID的序列号。
在示例图1中,如果客户机希望发送一个PATH_STATUS,告诉服务器它更喜欢CID序列号为1(服务器端)的路径,那么客户机应该在PATH_状态框中使用服务器的标识符(序列1)
PATH状态框描述了4种路径状态:
- 放弃一条路径,释放相应的资源。
- 将路径标记为“可用”,即允许对等方使用自己的逻辑在可用路径之间分割流量。
- 将路径标记为“备用”,即,如果另一条路径可用,则建议不在该路径上发送流量。
- 标记路径的优先级,即路径1为权重8,路径2为权重2,建议路径1的优先级高于路径2,对等方应尝试在路径1中发送更多数据。
PATH_STATUS可以通过不同的路径发送,而不是路径标识符字段标识的路径
4.5 路径关闭
想要删除路径的端点不应该依赖于闲置时间或数据包丢失之类的隐式信号,而是应该通过发送PATH_STATUS来使用显式ask放弃路径
4.5.1 通过 PATH_STATUS 帧关闭路径
客户端和服务器都可以通过发送PATH_STATUS来关闭路径,通过相应的路径标识符放弃该路径。一旦路径被标记为“放弃”,就意味着可以释放与该路径相关的资源。
图2展示了一个路径关闭的示例。在这种情况下,我们将关闭第一条路径。对于第一条路径,服务器的1-RTT数据包使用DCID C1,其序列号为1;客户端的1-RTT数据包使用DCID S2,其序列号为2。对于第二条路径,服务器的1-RTT数据包使用DCID C2,其序列号为2;客户端的1-RTT数据包使用序列号为3的CID S3。请注意,两条路径使用不同的数据包编号空间。(为了便于区分CID序列号和PATH_STATUS sequence number,我们将“PATH_STATUS sequence number”称为“PSSN”。)
在客户端检测到网络环境变化(客户端的4G/Wi-Fi关闭,Wi-Fi信号衰减到阈值)或端点检测到RTT质量或丢失率变差的情况下,客户端或服务器可以立即终止路径。
4.5.2 RETIRE_CONNECTION_ID 帧的影响
接收 RETIRE_CONNECTION_ID 帧会导致端点丢弃与该连接ID关联的资源。如果对等方使用该连接ID来标识从对等方到该端点的路径,则资源包括用于发送确认的接收数据包列表。对等方可能会决定继续使用之前与连接ID关联的相同IP地址和UDP端口发送数据,但这样做时必须使用不同的连接ID
4.5.3 闲置超时 Idle timeout
[QUIC-TRANSPORT]允许在连接闲置时间过长时关闭连接。多路径QUIC中的连接空闲超时被定义为“在闲置超期时间内,任何路径上都没有接收到数据包”。这意味着,如果所有路径在在闲置超期时间内保持空闲,则连接将隐式关闭。
5. 使用TLS保证mpquic的安全
为了便于在通过多条路径发送数据时进行丢失检测和恢复,本规范定义了通过多条路径发送的数据包如何使用不同的数据包编号空间。这需要改变AEAD应用于数据包保护的方式(如第5.1节所述),以及更严格的密钥更新约束(如第5.2节所述)
5.1. QUIC多路径数据包保护
[QUIC-TLS]第5节规定了QUIC V1的数据包保护。对于QUIC多路径,数据包保护的一般原则不变。设置数据包保护密钥、初始机密、报头保护、使用0-RTT密钥、接收无序保护数据包、接收保护数据包或重试数据包完整性不需要更改。然而,为1-RTT数据包使用多个数字空间需要改变AEAD的使用。
[QUIC-TLS]的第5.3节规定了AEAD的使用,尤其是通过组合数据包保护 IV 和数据包编号而形成的nonce,N的使用。QUIC multipath使用多个数据包编号空间,因此仅数据包编号不能保证nonce的唯一性。为了保证这种唯一性,我们通过将数据包保护IV与数据包编号和路径标识符相结合来构造nonce N,对于1-RTT数据包,路径标识符是数据包报头中存在的目的地连接ID的序列号,如[QUIC-TRANSPORT]第5.1.1节所定义,或者,如果连接ID为零长度,则为零。[QUIC-TRANSPORT]第19节将该连接ID序列号编码为可变长度整数,允许最大值为2^ 62-1;对于QUIC多路径,我们要求在不更新数据包保护密钥的情况下使用不超过2^32-1的值
对于QUIC多径,nonce的构造从96 bit path-and-packet-number的构造开始,该路径和分组号由字节顺序的32位Connection ID Sequence Number、two zero bits, and the 62 bits of the reconstructed QUIC packet number in network byte order。如果IV大于96位,则将path-and-packet-number用零左填充到IV的大小。填充的数据包号和IV的异或形成AEAD nonce。
例如,假设IV值为“6b26114b9cba2b63a9e8dd4f”,连接ID序列号为“3”,包号为“aead”,则nonce将设为“6b2611489cba2b63a9a873e2”。
5.2. QUIC多路径密钥更新
[QUIC-TLS]第6节规定了QUIC V1的关键相位位更新过程。对于多路径QUIC,密钥更新的一般原则不变。在QUIC V1之后,密钥相位位用于指示用于保护数据包的数据包保护密钥。切换钥匙相位位,以向每个后续钥匙更新发送信号。由于网络延迟,使用旧密钥保护的数据包可能比使用新密钥保护的数据包来得晚。因此,端点需要保留旧的数据包密钥,以允许处理这些延迟的数据包,并且必须区分新密钥和旧密钥。在QUIC V1中,这是使用数据包编号完成的,因此规则变得简单:如果数据包编号低于当前密钥阶段的任何数据包编号,则使用旧密钥。
在QUIC多路径中,在启动密钥更新过程中需要谨慎。因为不同的路径使用不同的数据包编号空间,但共享一个密钥,所以当在一条路径上启动密钥更新时,发送到另一条路径的数据包需要知道转换何时完成。否则,其他路径可能使用旧密钥发送数据包,但在当前密钥阶段跳过发送任何数据包,并直接跳到下一个密钥阶段发送数据包。当这种情况发生时,由于端点只能保留两组具有1位密钥相位位的分组保护密钥,因此其他路径无法区分应该使用哪个密钥来解码接收到的分组,这导致密钥旋转同步问题。
为了解决这种同步问题,在QUIC多路径中,如果密钥更新在一条路径上初始化,发送方应在所有活动路径上发送至少一个包含新密钥的数据包。关于对密钥更新的响应过程,在每条路径上具有当前密钥的数据包得到确认之前,端点不得启动后续密钥更新。遵循第5.4节。在[QUIC-TLS]中,关键相位位受到保护,因此同时发送多个关键相位位翻转的数据包不应导致可链接性问题
遵循第5.4节。在[QUIC-TLS]中,密钥相位位受到保护,因此发送多个密钥相位位同时翻转的数据包不应导致可链接性问题。
6. MPQUIC 负载均衡
本规范遵循[QUIC-TRANSPORT]中定义的连接ID协商。对于支持多路径QUIC的无状态或低状态负载平衡器,实现应使用[QUIC-LB]中定义的连接ID生成和负载平衡器路由规范,确保具有属于同一连接的连接ID的数据包可以路由到同一服务器。
7. 包调度
7.1 基本调度
对于传出数据包,数据包调度器决定该数据包的传输路径。基本的静态调度策略由四个主要部分组成:
- 路径状态:调度器可能想要决定应该激活哪个路径来传输数据。例如,调度器可以选择只使用这两条路径中的一条,而完全忽略另一条。调度器将选定的路径标记为“可用”状态,将未选定的路径标记为“备用”状态。
- 路径优先级:由于在不同路径上传输数据的成本并不总是相等。例如,5G路径和wifi路径的能源(电池)成本非常不同。在另一个示例中,通过wifi路径和蜂窝路径的传输可能会对每个分组产生不同的费用。请注意,用户的偏好可能会随着时间的推移而改变。例如,某些移动运营商为特定的流媒体应用程序提供无限量的免费数据。因此,路径优先级应该在调度程序中可用。
- 路径选择算法:选择算法将数据包分割到不同的路径上,并确定要选择的路径的顺序。选择算法将拥塞控制器状态作为输入,例如平滑RTT(SRTT)、估计带宽(EBW)和拥塞窗口大小(CWND),以及应用程序定义的信息,例如路径优先级和路径状态。该算法的输出是一个有序的路径列表,用于放置数据包。举几个例子,一些常用的算法是:-Round-Robin:没有优先级。为了传输数据,它一个接一个地选择路径。-lowest RTT:它首先选择RTT最低的路径,并向其提供数据包,直到该路径的拥塞窗口满为止。然后选择RTT第二低的路径。-Highest-Bandwidth:它首先选择带宽最高的路径,并向其提供数据包,直到该路径的拥塞窗口已满。然后选择带宽第二大的路径。
- 数据包重新注入:多径传输中的一个主要挑战是多径线路头(MP HoL)阻塞[XLINK]。当在慢路径发送的数据包比在快路径发送的数据包晚到达时,就会发生阻塞,导致无序到达;无序数据包没有资格提交给应用程序,因此快速路径必须等待。Wi-Fi、LTE和5G的显著异构性,以及移动终端的频繁切换将进一步加剧这一问题。可以实现分组重新注入,以牺牲冗余通信开销来克服MP HoL阻塞。在重新注入中,发送方跟踪未确认数据包的队列。当没有更多的数据包要发送时,发送方可以在其他路径上发送未确认数据包的副本,而无需等待原始路径上的丢失恢复,从而允许接收方继续使用数据,而不会受到阻塞效应的影响。
7.2 Per-stream 策略
由于QUIC支持流多路复用,因此允许流关联流优先级以表达应用程序的意图。例如,网页中的对象可能依赖于其他对象,因此在quic scheduler中具有不同的优先级。流优先级感知的分组调度算法将显著提高性能。
优先级管理方案由两个独立的优先级范围组成。用户定义的优先级范围包括应用程序明确指定优先级的流,而默认优先级范围包括应用程序未设置优先级的流。只有当用户定义范围内的流没有数据要发送时,默认优先级范围内的流才能发送。在相同的范围内,可以使用加权循环进行调度——优先级越高的流在每一轮中获得更多的数据发送配额。还可以在默认优先级范围内动态设置/更改流的优先级,以便在需要时首先启用短流。
8. 拥塞控制和丢包检测
8.1 Congestion Control
实现可以支持耦合的拥塞控制器,如LIA[MPTCP-LIA]、OLIA[MPTCP-OLIA]等,或者在使用不相交网络路径的环境中支持解耦的拥塞控制器。在解耦拥塞控制中,每条路径运行自己的拥塞控制器,而不与其他路径的拥塞控制器交互。也就是说,在拥塞控制方面,路径的行为与同一网络路径上的正常QUIC连接完全相同。每条路径可以独立选择拥塞控制算法。
8.2 数据包编号空间和确认
每条路径都有自己的数据包编号空间,用于传输1-RTT数据包。
初始和握手数据包的确认必须使用[QUIC-TRANSPORT]中规定的ACK帧进行。[QUIC-TRANSPORT]中定义的ACK帧不携带路径标识符。如果由于某种原因,在多路径协商状态不明确的情况下,1RTT数据包中接收到ACK帧,则必须将其解释为确认在路径号0上发送的数据包。在端点成功协商多路径支持后,他们应该使用ACK_MP帧而不是ACK帧来表示1-RTT数据包的确认,以及第10.2节中规定的0-RTT数据包的确认。根据发送确认MP帧的不同策略,第9.2节的确认MP帧可以通过不同的路径返回,也可以通过路径标识符标识的相同路径返回
8.3 流控制
待定
9 新 帧
所有新帧必须在1-RTT数据包中发送,并且不得使用其他加密级别。如果端点从其他加密级别的数据包接收MP帧,它必须将MP_PROTOCOL_VIOLATION作为连接错误返回,并关闭连接。
9.1 PATH_STATUS帧
PATH_STATUS帧由端点用于通知对等方一条路径的当前状态,对等方应根据这些帧中表达的偏好发送数据包。端点使用对等方用于PATH_STATUS帧(描述发送方的路径标识符)的CID序列号。PATH_STATUS的格式如图4所示。
PATH_STATUS包含以下字段:
路径标识符:路径的标识符,其格式如图5所示
标识符类型:标识符类型字段设置为指示路径标识符的类型。
- 类型0:指控制帧的发送方在通过指定路径发送数据时使用的连接标识符。如果此连接标识符长度非零,则应使用此方法。如果此连接标识符长度为零,则不得使用此方法。
- 类型1:指控制帧接收器在通过指定路径发送数据时使用的连接标识符。如果此连接标识符长度为零,则不得使用此方法。-类型2:指发送或接收控制帧的路径
路径标识符内容:指定路径标识符的可变长度整数
注意:如果PATH_STATUS的接收器在该路径上使用非零长度的连接ID,则端点应使用0x00类型作为控制帧中的路径标识符。如果PATH_STATUS的接收方使用的是0长度的连接ID,而对等方在该路径上使用的是非零长度的连接ID,则端点应使用0x01类型作为路径标识符。如果两个端点都在该路径上使用0长度的连接ID,则端点应仅使用0x02类型作为路径标识符。
Path Status sequence number(路径状态序列号):一个可变长度整数,指定为该PATH_STATUS帧分配的序列号。每个路径都有不同的路径状态序列号空间。
为该Path Status指定的序列号。每个路径都有不同的路径状态序列号空间。路径状态字段的可用值为:0:放弃 1:待机 2:可用,
如果路径状态字段的值为2-可用,则接收方可以使用路径优先级字段来表示对等方路径的优先级权重。帧的接收可能会出现故障。如果对等方之前接收到同一路径标识符的另一个路径状态帧,其序列号等于或高于该传入帧的序列号,则该对等方必须忽略该传入路径状态帧。应确认路径_状态帧。如果包含PATH_状态帧的数据包被视为丢失,则只有当它是为该路径发送的最后一个状态时,对等方才应该重复它——如序列号所示。
【未完待续】
阿里草案的看法
ali的方案,增加了Qoe_control_signal帧用于感知qoe
mpquic没法测双向RTT,包分离速率是不是个好选择?
more …
由于作者水平有限,难免出现错误,如发现,请联系指正。