【问题标题】:How are data channels negotiated between two peers with WebRTC?两个对等点之间如何使用 WebRTC 协商数据通道?
【发布时间】:2017-10-02 23:40:55
【问题描述】:

WebRTC RTCPeerConnection 接口有一个createDataChannel 方法和一个ondatachannel 事件处理程序。这些如何相互作用?如何创建可用于在两个对等方之间发送/接收数据的单个数据通道?

另外,RTCDataChannelInit 构造函数有一个negotiated 字段,默认设置为false,并表示它会导致频道在带内宣布。如果设置为 true 会怎样?

【问题讨论】:

    标签: webrtc sctp rtcdatachannel


    【解决方案1】:
    【解决方案2】:

    首先:要创建任何数据通道,对等方需要交换一个 SDP 提议/答案,以协商所有数据通道使用的 SCTP 连接的属性。默认情况下不会发生这种情况。您必须先致电createDataChannel,然后再致电createOffer 以获取包含此SCTP 信息的报价(SDP 中的“m=application”部分)。

    如果您这样做,数据通道状态将永远停留在connecting

    除此之外,有两种方法可以在两个对等方之间协商数据通道:

    带内协商

    这是默认情况下发生的情况,如果 negotiated 字段未设置为 true。一个对等方调用createDataChannel,另一个连接到ondatachannelEventHandler。这是如何工作的:

    1. Peer A 调用createDataChannel
    2. 发生正常的提议/答案交换。
    3. 一旦 SCTP 连接建立,一条消息就会从对等点 A 带内发送到对等点 B,以告知它数据通道的存在。
    4. 在对等体 B 上,ondatachannel EventHandler 使用从带内消息创建的新数据通道调用。它与 Peer A 创建的数据通道具有相同的属性,现在这些数据通道可用于双向发送数据。

    这种方法的优点是可以随时动态创建数据通道,而无需应用程序执行额外的信令。

    带外协商

    数据通道也可以带外协商。使用这种方法,应用程序无需在一侧调用createDataChannel 并在另一侧侦听ondatachannel,而是在两侧调用createDataChannel

    1. Peer A 调用createDataChannel({negotiated: true, id: 0})
    2. Peer B 也调用createDataChannel({negotiated: true, id: 0})
    3. 发生正常的提议/答案交换。
    4. 一旦 SCTP 连接建立,通道将立即可用(readyState 将更改为 open)。它们由 ID 进行匹配,该 ID 是基础 SCTP 流 ID。

    这种方法的优点是,由于无需在带内发送消息即可在对等 B 上创建数据通道,因此该通道可以更快地使用。这也使应用程序代码更简单,因为您甚至不需要为ondatachannel 操心。

    因此,对于仅使用固定数量数据通道的应用程序,建议使用此方法

    请注意,您选择的 ID 不仅仅是一个任意值。它表示底层的基于 0 的 SCTP 流 ID。并且这些 ID 只能与 WebRTC 实现协商的 SCTP 流的数量一样高。因此,如果您使用的 ID 过高,您的数据通道将无法正常工作。

    原生应用程序呢?

    如果您使用native webrtc library 而不是JS API,它的工作方式相同;事物只是名称不同。

    C++:

    • PeerConnectionObserver::OnDataChannel
    • DataChannelInit::negotiated
    • DataChannelInit::id

    Java:

    • PeerConnection.Observer.onDataChannel
    • DataChannel.Init.negotiated
    • DataChannel.Init.id

    对象-C:

    • RTCPeerConnectionDelegate::didOpenDataChannel
    • RTCDataChannelConfiguration::isNegotiated
    • RTCDataChannelConfiguration::channelId

    【讨论】:

      猜你喜欢
      • 2015-02-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-18
      • 2021-09-11
      • 2013-07-03
      相关资源
      最近更新 更多