为什么通过 WebRTC 发送的消息有时会以不同的顺序接收?

Why are the messages sent over WebRTC received in a different order sometimes?

我将 ordered 设置为 true,但是当在短时间内(< 1 秒)发送许多(1000 条或更多)消息时,接收到的消息并非全部按相同顺序接收。

rtcPeerConnection.createDataChannel("app", {
   ordered: true,
   maxPacketLifeTime: 3000
});

如有必要,我可以提供一个最小示例来重现这种奇怪的行为。

我还使用 bufferedAmountLowThreshold 和关联的事件在发送缓冲量太大时进行延迟。我选择了 2000,但我不知道最佳数字是多少。我之所以短时间内有这么多消息,是因为我不想溢出一次发送的最大数据量。所以我将数据分成 800 字节的包并发送。同样,我不知道 1 条消息的最大大小是多少。

const SEND_BUFFERED_AMOUNT_LOW_THRESHOLD = 2000; //Bytes
rtcSendDataChannel.bufferedAmountLowThreshold = SEND_BUFFERED_AMOUNT_LOW_THRESHOLD;
const MAX_MESSAGE_SIZE = 800;

对于没有拆分成太多消息的小数据,一切正常。错误仅针对大文件随机发生。

在 2016/11/01 中,有一个错误让 dataChannel.bufferedAmount 值在事件循环任务执行期间发生变化。因此,依赖此值可能会导致意外结果。可以手动缓存 dataChannel.bufferedAmount,并使用它来防止此问题。

https://bugs.chromium.org/p/webrtc/issues/detail?id=6628