冰连接状态,已完成与已连接

use*_*650 4 webrtc

有人可以澄清iceConnectionstate:completediceConnectionstate:connected之间的区别。

当我使用 webrtc 连接到浏览器时,我能够使用数据通道交换数据,但由于某种原因,浏览器上的 iceConnectionstate 使报价扩孔完成,其中接受报价的浏览器更改为连接。

知道这是否正常吗?

Aja*_*jay 6

ICE Con​​nection 状态转换有点棘手,通过下面的流程图您可以清楚地了解可能的转换。

ICE 传输状态图

简单来说:
新建/检查:未连接 已
连接/已完成:媒体路径可用
断开/失败:媒体路径不可用(您在数据通道上发送的任何数据都不会到达另一端)

在此处阅读完整摘要

WebRTC 团队仍在努力使其稳定且符合规范。
当前的 chrome 行为令人困惑,所以我提交了一个错误,你可以给它加星号以获得通知。


Tay*_*ter 6

简而言之:

  • 连接的:找到了一个工作候选对,但仍在执行连接检查以找到更好的候选对。
  • 完全的:找到工作候选对并完成执行连接检查。

对于大多数目的,您可以将连接/完成状态视为同一事物。

请注意,正如 Ajay 所提到的,标准定义状态的方式与 Chrome 中实现状态的方式之间存在一些显着差异。我想到的主要是:

  • 没有“候选结束”信号,因此候选状态定义的这些部分都没有实现。这意味着如果远程候选人迟到,可以从“已完成”回到“已连接”,而无需重新启动 ICE。尽管我认为这在实践中很少见。
  • ICE 状态实际上是 ICE+DTLS 状态的组合(参见: https: //bugs.chromium.org/p/webrtc/issues/detail ?id =6145)。这是因为它是在“RTCPeerConnectionState”这样的东西出现之前实现的。如果确实存在 DTLS 级别的问题,这可能会导致混乱,因为真正注意到的唯一方法是查看本机 Chrome 日志。

我们绝对计划修复所有差异。但有一段时间我们推迟了它,因为标准仍在不断变化。现在我们的首要任务更多的是实施统一计划 SDP 和 RtpSender/RtpReceiver API。