WebRTC 通道可靠性

dbo*_*tha 17 webrtc rtcdatachannel rtcpeerconnection

我想检查一下我对 WebRTC 数据通道的理解是否正确,特别是通过改变字典的ordered&maxRetransmitsmaxPacketLifeTime属性可以实现的不同类型的通道RTCDataChannelInit。我的以下假设是否正确:

  1. 创建一个可靠有序的通道,如 TCP,但基于消息而不是流:
RTCPeerConnection.createDataChannel("label", {
    ordered: true 
});
Run Code Online (Sandbox Code Playgroud)
  1. 创建一个可靠无序的通道(也应该maxRetransmits或被maxPacketLifeTime指定以实现可靠性?)
RTCPeerConnection.createDataChannel("label", {
        ordered: false    
});
Run Code Online (Sandbox Code Playgroud)
  1. 创建一个不可靠无序的通道,如 UDP
RTCPeerConnection.createDataChannel("label", {
    ordered: false,
    maxRetransmits: 0
});
Run Code Online (Sandbox Code Playgroud)
  1. 产生不可靠“有序”的通道,即如果较晚的消息到达,则较早的消息将被丢弃
RTCPeerConnection.createDataChannel("label", {
    ordered: true,
    maxRetransmits: 0
});
Run Code Online (Sandbox Code Playgroud)

Gor*_*son 12

你所有的假设都是正确的。


对于第一种和第二种情况,根据WebRTC W3C Candidate Recommendation 的 6.2 RTCDataChannel 部分,未设置maxRetransmitsmaxPacketLifeTime导致可靠的通道,如下所示(粗体和斜体是我的):

一个RTCDataChannel可被配置成在不同的可靠性模式中操作。可靠的通道确保数据通过重传在另一个对等点传送。不可靠信道被配置为限制重传次数(maxRetransmits)或设置允许传输(包括重传)的时间(maxPacketLifeTime)。这些属性不能同时使用,尝试这样做会导致错误。不设置任何这些属性会导致可靠的通道。


第三种情况,即设置ordered: falseand maxRetransmits: 0,根据draft-ietf-rtcweb-data-channel-13第6.1节创建不可靠无序的通道,如UDP,如下(粗体和斜体我的):

o 必须支持 [RFC3758] 中定义的部分可靠性扩展。除了[RFC3758]中定义的定时可靠性PR-SCTP策略外,必须支持[ID.ietf-tsvwg-sctp-prpolicies]中定义的有限重传策略。 将重传次数限制为零并结合无序传递提供了一种类似 UDP 的服务,其中每个用户消息只发送一次并按接收顺序传递。


第四种情况是设置ordered: trueand maxRetransmits: 0,它创建了一个不可靠有序“有序”)的通道。根据RFC 3758 第 1.3 节的一段,这种类型的通道存在,如下(我的粗体和斜体):

  1. PR-SCTP除了像UDP那样提供无序、不可靠的数据传输外,还可以提供有序、不可靠的数据传输服务。

关于第四种情况,我不知道在“不可靠”的数据通道上究竟是如何实现“有序”的。但我认为这里https://jameshfisher.com/2017/01/17/webrtc-datachannel-reliability/的猜测是正确的。如果较晚的消息到达,接收方可能会丢弃较早的消息。

根据RFC 3758 第 3.6 节的最后一段,这个猜测似乎是正确的,如下(我的粗体和斜体):

请注意,在接收到 FORWARD TSN 并更新累积确认点后,如果被跳过的 TSN 确实到达(即,由于网络重新排序),则接收器将遵循 RFC 2960 [2] 中定义的正常规则来处理重复数据. 这意味着接收器将丢弃该块并将其报告为下一个出站 SACK 块中的重复项。

RFC 3758draft-ietf-rtcweb-data-channel-13 第5 节引用,而后者又由WebRTC W3C 候选推荐书引用