WebRTC是如何在两个对等端之间协商数据通道的?

13

WebRTC的RTCPeerConnection接口有一个createDataChannel方法和一个ondatachannel事件处理程序。它们如何交互?我该如何创建一个单一的数据通道,以便在两个对等方之间发送/接收数据?

此外,RTCDataChannelInit构造函数有一个negotiated字段,默认设置为false,表示通道将在带内宣布。如果将其设置为true会发生什么?

2个回答

41
  • 首先:要创建任何数据通道,对等方需要交换SDP offer/answer来协商所有数据通道使用的SCTP连接的属性。这不是默认情况下发生的;您必须在调用createOffer之前调用createDataChannel,以便于offer包含此SCTP信息(SDP中的“m=application”部分)。
  • 如果您不这样做,则数据通道状态将永远停留在connecting
  • 有两种方法可以在两个对等方之间协商数据通道:
  • 带内协商
  • 如果未将negotiated字段设置为true,则默认情况下会发生这种情况。一方调用createDataChannel,而另一方连接到ondatachannel EventHandler。如何工作:

    1. Peer A调用createDataChannel
    2. 进行正常的offer/answer交换。
    3. 一旦建立了SCTP连接,就会从对等方A向对等方B发送带内消息,告诉它该数据通道的存在。
    4. 在对等方B上,使用从带内消息创建的新数据通道调用ondatachannel EventHandler。它具有与对等方A创建的数据通道相同的属性,现在这些数据通道可以用于双向发送数据。

    此方法的优点是,数据通道可以动态地在任何时候创建,而无需应用程序进行其他信令。

  • 带外协商
  • 也可以通过带外协商来协商数据通道。使用该方法时,应用程序只需在两端调用createDataChannel,而不是在一侧调用createDataChannel并在另一侧侦听ondatachannel

    1. Peer A调用createDataChannel({negotiated: true, id: 0})
    2. Peer B也调用createDataChannel({negotiated: true, id: 0})
    3. 正常的Offer/Answer交换过程发生
    4. 一旦SCTP连接建立,通道将立即可用(readyState将更改为open)。它们通过ID匹配,该ID是底层的SCTP流ID。

    这种方法的优点是,在Peer B上不需要发送任何消息来创建数据通道,因此通道可以更快地使用。这也使应用程序代码更简单,因为您甚至不需要烦恼ondatachannel

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

    请注意,您选择的ID不仅仅是任意值。它代表底层基于0的SCTP流ID。这些ID只能高达WebRTC实现协商的SCTP流数。因此,如果您使用的ID过高,则数据通道将无法工作。

    原生应用程序怎么办?

    如果您使用本地WebRTC库而非JS API,则工作方式相同,只是名称不同。

    C++:

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

    Java:

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

    Obj-C:

    • RTCPeerConnectionDelegate::didOpenDataChannel
    • RTCDataChannelConfiguration::isNegotiated
    • RTCDataChannelConfiguration::channelId
    • RTCDataChannelConfiguration::isNegotiated 表示数据通道是否已经协商好,RTCDataChannelConfiguration::channelId 则表示数据通道的唯一标识符。

    谢谢,它有效。这些步骤必须包含在Mozilla Web API文档中(Mozilla)。 - Erlang Parasu


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