WebRTC通道可靠性

24
我希望确认我对WebRTC数据通道的理解是正确的,特别是通过改变orderedmaxRetransmitsmaxPacketLifeTime属性到RTCDataChannelInit字典中可以实现不同类型的通道。我的以下假设是正确的:
  1. 创建一个可靠且有序的通道,类似于TCP但基于消息而不是流:
RTCPeerConnection.createDataChannel("label", {
    ordered: true 
});
  1. 创建一个可靠无序的通道(是否需要指定maxRetransmitsmaxPacketLifeTime来实现可靠性?)
RTCPeerConnection.createDataChannel("label", {
        ordered: false    
});
创建一个不可靠和无序的通道,类似于UDP。
RTCPeerConnection.createDataChannel("label", {
    ordered: false,
    maxRetransmits: 0
});
  • 创建一个不可靠“有序”的通道,即如果早期消息在后面的消息之后到达,则会被丢弃。
RTCPeerConnection.createDataChannel("label", {
    ordered: true,
    maxRetransmits: 0
});
2个回答

24

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


对于第一和第二种情况,不设置maxRetransmitsmaxPacketLifeTime会导致根据WebRTC W3C Recommendation的6.2节RTCDataChannel,产生一个可靠的通道,内容如下(粗体和斜体为本人添加):

RTCDataChannel可以配置为以不同的可靠性模式运行。可靠的通道确保数据通过重传传递到其他对等方。不可靠的通道被配置为限制重传次数(maxRetransmits)或设置允许传输(包括重传)的时间(maxPacketLifeTime)。这些属性不能同时使用,尝试这样做将导致错误。不设置这些属性中的任何一个会产生一个可靠的通道。


第三种情况是将ordered: falsemaxRetransmits: 0设置,根据RFC8831第6.1节创建一个类似UDP的不可靠无序通道,如下所示(加粗和斜体为本人添加):
  • 必须支持[RFC3758]中定义的部分可靠性扩展。除了在[RFC3758]中定义的定时可靠性PR-SCTP策略之外,还必须支持[RFC7496]中定义的有限重传策略。 将重传次数限制为零,并与无序传递相结合,提供了类似UDP的服务,其中每个用户消息仅发送一次并按接收顺序传递。

第四种情况是将ordered: truemaxRetransmits: 0设置,创建一个不可靠的有序的("顺序的")通道。这种类型的通道根据RFC3758第1.3节中的一段存在,如下所示(粗体和斜体为本人添加):
关于第四种情况,我不确定在一个“不可靠”的数据通道上如何实现“有序”。但我认为这里的猜测https://jameshfisher.com/2017/01/17/webrtc-datachannel-reliability/是正确的。如果早期消息在后面的消息之后到达,接收器可能会丢弃早期消息。
根据RFC3758 section 3.6的最后一段,这个猜测似乎是正确的(加粗和斜体是我的):
请注意,在接收到FORWARD TSN并更新累积确认点后,如果跳过的TSN确实到达了(即由于网络重排序),则接收方将按照RFC 2960 [2]中定义的处理重复数据的常规规则进行处理。这意味着接收方将删除块并在下一个出站SACK块中报告它为重复项。 RFC3758RFC8831 section 5引用,后者又由WebRTC W3C Recommendation引用。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接