webrtc中的DataChannel分析

本文详细介绍了WebRTC中的DataChannel,包括其功能、使用方法、数据传输过程及数据解析。DataChannel允许点对点的消息通信,具备NAT穿透,用于聊天、文件传输等场景。数据通过SCTP协议进行可靠传输,且与音视频数据共用同一UDP socket。在数据解析过程中,通过特定的判断逻辑区分DataChannel和RTP数据包。
摘要由CSDN通过智能技术生成

目录

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数据包进行处理。

 

全文完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值