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

时间:2017-07-02 09:30:25

标签: webrtc

有人可以澄清 iceConnectionstate:已完成 iceConnectionstate:已连接之间的区别。

当我使用webrtc连接到浏览器时,我能够使用datachannel交换数据,但由于某种原因,浏览器上的iceConnectionstate完成了要约扩孔,接受要约的浏览器更改为已连接。

知道这是否正常?

2 个答案:

答案 0 :(得分:2)

简而言之:

  • 已连接:找到一个有效的候选对,但仍然会执行连接检查以找到更好的一对。
  • 已完成:找到了一个有效的候选对,并完成了连接检查。

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

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

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

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

答案 1 :(得分:0)

ICE连接状态转换有点棘手,下面的流程图可以清楚地了解可能的转换。

ICE Transport State Diagram

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

阅读完整摘要here

WebRTC团队仍在努力使其稳定和稳定。符合规范。
当前的Chrome行为令人困惑,因此我提交了bug,您可以将其加星标以获得通知。