webrtc中的DataChannel分析

您所在的位置:网站首页 PeerJS的传输速度 webrtc中的DataChannel分析

webrtc中的DataChannel分析

2023-11-06 08:17| 来源: 网络整理| 查看: 265

目录

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 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(data); return (len >= kDtlsRecordHeaderLen && (u[0] > 19 && u[0] < 64)); }

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

 

全文完。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3