QUIC的不可靠传输扩展(draft-ietf-quic-datagram-00)

原文:https://tools.ietf.org/html/draft-ietf-quic-datagram-00

文档类型:活跃Internet-Draft (quic WG)
上次更新:2020-03-09 (最新版本 2020-02-26)
替代: draft-pauly-quic-datagram
Stream IETF
目的RFC: 建议标准

网络工作组
预定状态: 标准跟踪
到期日:2020.8.29
提出人:Apple Inc. & Google LLC

摘要

本文定义了QUIC传输协议的一个扩展,增加支持在QUIC链接上收发非可靠数据。

1. 介绍

QUIC[I-D.ietf-quic-transport]提供了一种安全、多路链接用来传输用户数据的可靠流。QUIC的可靠性基于流,但是有些帧类型不适合重传。

有些应用,尤其是需要实时传送的数据,想要非可靠的传送数据。这些应用可以直接使用UDP作为传输层,安全性使用DTLS保证。扩展QUIC来支持传输非可靠应用数据会提供安全传输的另一种选择,还能享受共享可靠流加密和认证的好处。

本文定义了两种携带不需要重传应用数据的新QUIC帧类型。

2. 动机

通过QUIC传输不可靠的数据比现有的解决方案更有优势:
1、对同一对端同时打开可靠TLS流和非可靠DTLS流可以共享一个握手和认证。能减少握手请求时延。
2、QUIC使用了比DTLS握手更细致的丢失恢复机制,丢失重传定时器使QUIC数据的丢失回复更快。
3、不可靠的QUIC数据报可以支持确认,应用程序可以知道是否成功接收了数据报。
4、QUIC有拥塞控制机制,应用就不用自己实现了

这些连接延迟的减少,以及应用对数据传输的可观察性,对于优化音频/视频流应用、游戏应用和其他实时网络应用程序非常有用。
不可靠的QUIC包也可以用于在QUIC上实现IP包隧道,例如用于虚拟专用网(VPN)。internet层隧道协议通常需要可靠的、经过身份验证的握手,然后是不可靠的安全IP数据包传输。例如,这可能需要用于控制数据的TLS连接,以及用于隧道化IP数据包的DTLS连接。一个单一QUIC连接可以支持两个部分使用不可靠的数据。

3.传输参数

支持接收DATAGRAM帧的能力在QUIC传输参数中通告(名字max_datagram_frame_size, 值为0x0020)。max_datagram_frame_size传输参数是一个整数值(变长整数),表示终端愿意接收的DATAGRAM帧 (包括帧类型,长度,和负载)最大大小,以字节计。包含这个参数的终端支持DATAGRAM帧类型,并且愿意在这个链接中接收这样的帧。在发送接收max_datagram_frame_size参数前不能发送DATAGRAM帧。
不能发送大于从对端接收的max_datagram_frame_size值的DATAGRAM帧。如果还没发送max_datagram_frame_size参数就收到了DATAGRAM帧,必须用PROTOCOL_VIOLATION错误终止链接。如果收到DATAGRAM帧比发送的max_datagram_frame_size大,必须用PROTOCOL_VIOLATION错误终止链接。想要使用DATAGRAM帧需要保证发送的max_datagram_frame_size值足够对端使用。建议在max_datagram_frame_size参数中发送65536,来告诉对端本端将接收QUIC包中任意DATAGRAM帧。

客户端使用0-RTT时,可能会保持服务端max_datagram_frame_size参数。这样允许客户端在0-RTT包中发送DATAGRAM帧。服务端决定接收0-RTT数据时,必须发送max_datagram_frame_size参数,这个值必须大于等于之前这个链接上NewSessionTicket消息发送给客户端的值,如果客户端保存了max_datagram_frame_size参数的0-RTT状态,则必须确认服务端发送的max_datagram_frame_size新值不小于已保存的值。不然,客户端必须用PROTOCOL_VIOLATION错误终止链接。

应用协议必须规定缺失max_datagram_frame_size参数时的行为。如果DATAGRRAM支持在应用中是不可或缺的,应用协议在max_datagram_frame_size不存在时可以握手失败。

4. Datagram帧类型

DATAGRAM帧用来以不可靠的方式传送应用数据。DATAGRAM帧类型形式为0b0011000X(或者0x30和0x31)。DATAGRAM帧类型中最不重要的位是LEN位(0x01)。它表示有长度字段存在。如果这个位被设置成0,则没有长度字段并且数据字段一直到包结束。如果此位被设置成1,则存在长度字段。

DATAGRAM帧包括下列字段:
Length: 一个边长整数,指示以字节为单的数据长度。这个字段仅在LEN位设置时出现。
如果LEN位没有设置,数据延伸到QUIC包结束。注意空数据是允许的(0长度)。
Datagram数据: 用来传送的数据。

5. 行为和使用

当应用在QUIC连接上发送非可靠数据时,QUIC将产生一个新的DATAGRAM帧,然后在第一个可用包中发送。这个帧应该尽快发送,并可能与别的帧组合在一起。

当一个QUIC终端接收到一个有效DATAGRAM帧,它应该立即把数据送给应用。只要它能处理这个帧并且保存内容。

DATAGRAM帧必须在0-RTT和1-RTT中保护。

应用协议负责定义数据字段的语意,怎么解析。如果应用协议支持在一个QUIC连接中使用数据报的多个实体共存, 它可能需要一种机制允许多路复用。比如,HTTP3中使用datagram将流标识符置于所有datagram前,见[I-D.schinazi-quic-h3-datagram].
注意当max_datagram_frame_size限制了DATAGRAM帧的最大长度,这个限制可以通过max_packet_size传输参数和MTU进一步降低, DATAGRAM帧不能分片,所以应用程序需要处理最大datagram长度被其他因素限制的场景。

5.1. 确认处理

虽然DATAGRAM帧不会在检测到丢失时重传,它是可以被回应的(ack-eliciting?)。接收者应该支持延迟ACK帧(在max_ack_delay指定限制内)回应接收仅包含DATAGRAM帧的包,
因为这些确认的时间不用于丢包修复。
如发送者检测到包含一个特定DATAGRAM帧的包可能丢了,实现可以通知应用数据丢失了。类似的,如果一个包含DATAGRAM帧的包被确认,实现可以通知应用数据已成功发送并被接收。注意,由于重排序,一个曾被认为丢失的DATAGRAM帧可能后面某个时间会被接收和确认。

5.2. 流控

DATAGRAM帧不提供任何显式流控信号,并且不会造成任何每流或者链接范围的数据限制。 不为DATAGRAM帧提供流控的风险在于接收者可能不能提供处理帧的必要资源。比如,可能不能保存帧内容。然而,由于DATAGRAM帧本质上是不可靠的,如果接收者不能处理它们可以丢掉。

5.3. 拥塞控制

DATAGRAM 帧使用QUIC链接的拥塞控制器。所以,链接在拥塞控制器允许之前可能不能发送应用产生的DATAGRAM帧。[I-D.ietf-quic-recovery]。发送者实现必须延迟发送这些帧,直到控制器允许或者丢掉这些帧不发送(可能会通知应用)。实现可以可选地支持允许应用指定一个发送超时时间,据此丢弃未发送的DATAGRAM帧。

6. 安全注意事项

DATAGRAM帧与QUIC链接中其他数据共享安全特性。所有跟DATAGRAM帧一起发送的应用数据,像STREAM帧,必须被0-RTT或者1-RTT秘钥保护。

7. IANA 注意事项

本文在QUIC传输参数注册表中注册了一个新值:
值: 0x0020 (若本文被批准)
参数名: max_datagram_frame_size
Specification: 指示链接应该支持非可靠DATAGRAM帧。提供此参数的终端可以接收长度参数范围内的datagram帧。

本文也在QUIC帧类型中注册了新值:
值: 0x30 and 0x31 (若本文被批准)
帧名: DATAGRAM
Specification: Unreliable application data

你可能感兴趣的:(quic,linux)