webrtc中的DataChannel分析

目录

1.DataChannel简介

2.DataChannel的使用

3.DataChannel数据的传输

4.DataChannel数据解析


1.DataChannel简介

在webrtc中通过DataChannel,可以实现点对点的消息通信,这些消息和音视频数据是通过同一udp socket被发送给对方的,因此也是具备NAT穿透功能的。DataChannel可以用来进行聊天消息的发送、点对点传送文件等,作为音视频通信外的另一种通信方式,DataChannel的意义还是很重要的。

2.DataChannel的使用

在创建PeerConnection后可以通过调用CreateDataChannel来启用DataChannel,代码如下:

  peer_connection_ = peer_connection_factory_->CreatePeerConnection(
      config, nullptr, nullptr, this);

  data_channel_ = peer_connection_->CreateDataChannel("hello_datachannel", nullptr);

 

创建DataChannel后需要重写OnDataChannel函数,在此函数中注册DataChanneObserver,这样才能获取DataChannel的消息以及状态变化。

void Conductor::OnDataChannel(rtc::scoped_refptr<webrtc::DataChannelInterface> channel)
{
	channel->RegisterObserver(this);
}

 

需要说明一点,在给对方发送消息的时候,应该使用CreateDataChannel返回的对象,而不是OnDataChannel函数参数中的对象,否则的话消息会发送失败。创建DataChannel后,本端的sdp消息中会多一个媒体消息字段m,例如:m=application 9 UDP/DTLS/SCTP webrtc-datachannel,这样对方就得知自己支持数据通道消息的发送。

3.DataChannel数据的传输

DataChannel的数据通过boringssl加密后再通过udp发送给对端,发送datachannel数据和音视频数据的是同一个socket。音视频数据传输使用了RTP协议,通过NACK和FEC的策略来抗丢包,而DataChannel底层使用了SCTP(stream control transmission protocol)协议,SCTP和TCP类似,是一个具备流量控制、拥塞控制的可靠性传输协议,因此无需再采取其它措施即可实现DataChannel数据的可靠传输。webrtc采用了第三方开源库usrsctplib来实现SCTP协议。

注意:datachannel的数据在经过boringssl加密后,会直接发送到网络,不会再经过pacing模块。

4.DataChannel数据解析

既然DataChannel数据和音视频数据都是通过同一udp socket进行传输,那么必然需要有区分DataChannel和RTP数据的方法。文件dtls_transport.cc中的OnReadPacket函数会在收到网络数据后被调用,在此函数中会调用 IsDtlsPacket 函数来判断此数据包是否是DataChannel的消息,IsDtlsPacket的实现比较简单:

static bool IsDtlsPacket(const char* data, size_t len) {
  const uint8_t* u = reinterpret_cast<const uint8_t*>(data);
  return (len >= kDtlsRecordHeaderLen && (u[0] > 19 && u[0] < 64));
}

其中kDtlsRecordHeaderLen为常量13,拿数据包的第一个字节进行判断,至于为什么是19、64,没看到有相关注释,应该就是一个内部协定吧。如果是DataChannel的消息则此数据包会被送到boringssl进行解密再传给上层,否则当作RTP数据包进行处理。

 

全文完。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebRTC DataChannel 通信丢包问题可以通过以下方法进行优化: 1. 使用可靠性传输模式:DataChannel 有两种传输模式:可靠性传输和不可靠性传输。如果您的应用程序需要确保数据的完整性和正确性,则应使用可靠性传输模式。这种模式下,数据包会被自动重传,以确保数据的可靠传输。 2. 减少数据包大小:减少数据包的大小可以降低数据包丢失的概率。这可以通过将数据分成多个小块来实现,并将它们逐个发送。这样,即使一个数据块丢失,其他数据块也能够正常传输。 3. 实现 FEC 纠错:FEC(Forward Error Correction)是一种数据纠错技术,可以通过添加冗余数据来使数据包更容易被恢复。通过实现 FEC 纠错技术,即使数据包丢失,接收方仍然可以通过冗余数据恢复数据包。 4. 实现 NACK 重传机制:NACK(Negative Acknowledgment)是一种重传机制,可以在接收方检测到数据包丢失时要求发送方重新发送数据包。通过实现 NACK 重传机制,可以在数据包丢失时快速地重新发送数据包,从而提高数据传输的可靠性。 5. 优化网络环境:网络环境对 DataChannel 通信的影响很大。如果网络环境不稳定或者带宽不足,那么数据包丢失的概率也会增加。因此,您可以通过优化网络环境来提高数据传输的可靠性,例如使用更快的网络连接或者减少网络负载。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值