WebRTC 数据通道 - 最大数据大小是多少?

8
我正在使用WebRTC数据通道来发送JSON数据。对于小数据包,似乎运作良好。
但是,我试图发送一个较大的包(网页的HTML,Base64编码,可能几百KB),它从未到达另一端。
是否存在最大尺寸限制?
1个回答

12

我认为规范没有关于最大数据大小的规定。实际上,16 KB 是最大值。请看这篇博客文章,特别是吞吐量/数据包大小图表。这个结果是通过实验得出的,并且是允许webrtc实现之间最兼容的结果。

我曾经在一年前成功地在两个Firefox实例之间发送了多达256 KB(甚至更大)的数据包。自那以后,实现可能已经发生了变化,最大数据大小也随之改变。

如果你想要发送大于16K的数据包,你必须先对它们进行分片。分片必须作为你的应用程序协议的一部分来实现。


啊,糟糕!如何实现分段的任何建议? - Andy Hin
1
最简单的方法是将一个大的内存缓冲区分成16K(甚至8K,以保险起见)的块,并将块、其索引和总块数作为消息发送。在接收端,您知道总块数,只需等待从数据通道接收到这些消息的数量即可。如果您想变得更加高级,甚至可以使用DC的无序模式。此外,我建议使用类型化数组而不是base64编码。WebRTC支持二进制数据,我认为没有理由浪费时间和空间进行base64编码。 - Svetlin Mladenov
非常感谢您的帮助。我会尝试一下 :) - Andy Hin
所以,我已经按照你的建议将我的数据分块,并使用 sendData: 发送它们。然而,似乎接收方只能接收到一定数量的数据,其余部分永远无法到达。接收到的块数与块大小有关(较小的块,接收到的块数更多),因此我认为它达到了某种缓冲区最大值。我想在发送下一个块之前等待数据通道的 bufferedAmount 值变为零,但是这个值似乎总是为 0。 - Andy Hin
3
除了实验结果外,您还会在WebRTC数据通道的IETF规范第6.6章中找到类似的信息,他们也建议限制通过数据通道发送的数据大小,并提高阈值为16KB:“只要不支持消息交错,发送方应限制最大消息大小为16 KB,以避免垄断。” - christianost
@AndyHin 我使用了.match(/.{1,16000}/g)进行分段,参考了https://dev59.com/AGw05IYBdhLWcg3wxkur#7033662。如果你想发送其他数据,比如块部分编号和块结束编号,那么在16kiB(16384字节)之前会有一些空闲的字节。 - baptx

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