上节说过WebRtcTransport实例创建成功后,客户端通过服务端的nodejs主进程发送"transport.connect" 指令到c++子进程,进行建立连接的。连接的建立过程主要是完全ICE,DTLS协议等规定的相关内容,下面简单说明一下相关概念。
ICE是一种标准穿透协议,利用STUN和TURN服务器来帮助端点建立连接 ,客户端通过ice-ufrags, ice-passwords与服务器进行身份验证并建立连接。并互换fingerprint,用于双方证书的合法性。
DTLS用于保障传输数据的安全,是对TLS协议进行了扩展。
SRTP为通过IP网络交付音频和视频定义了标准的分组格式。SRTP本身并不对传输数据的及时性、可靠性或数据恢复提供任何保证机制,它只负责把数字化的音频采样和视频帧用一些元数据封装起来,以辅助接收方处理这些流。
SCTP是一种面向消息的可靠传输协议,与 TCP 一样,SCTP 提供可靠的、面向连接的数据传输和拥塞控制。 与 TCP 不同,SCTP 还提供消息边界保留、有序和无序消息传递、多流和多归属。 数据损坏、数据丢失和数据重复的检测是通过使用校验和和序列号来实现的。 应用选择性重传机制来纠正数据的丢失或损坏。对于WebRTC,SCTP是在一个安全的DTLS信道中运行,而这个信道又运行在UDP之上。由于WebRTC支持通过DataChannel API在端与端之间传输任意应用数据,而DataChannel就依赖于SCTP
首先在main.cpp中对相关的库进行初始化:
DepOpenSSL::ClassInit();//初始化一些加密相关的算法
DepLibSRTP::ClassInit(); //libSRTP库初始化,libSRTP提供了保护 RTP 和 RTCP 的功能
DepUsrSCTP::ClassInit();//一个用户级的sctp的初始化
DepLibWebRTC::ClassInit();//只是初始化webrtc试用特性 “WebRTC-Bwe-AlrLimitedBackoff/Enabled/” 暂不做了解
Utils::Crypto::ClassInit();//创建一个HMAC SHA1的HMAC_CTX上下文
RTC::DtlsTransport::ClassInit();//创建加密上下文,证书,私钥,证书指纹(摘要),与srtp绑定
RTC::SrtpSession::ClassInit();//监听会话事件,打印相关信息
我们重点看DtlsTransport的初始化代码
void DtlsTransport::ClassInit()
{
MS_TRACE();
// Generate a X509 certificate and private key (unless PEM files are provided).
// 先生成x509的证书和密钥
if (
Settings::configuration.dtlsCertificateFile.empty() ||
Settings::configuration.dtlsPrivateKeyFile.empty())
{
// 没有证书配置信息,就通过代码创建,流程与openssl命令创建过程一样
GenerateCertificateAndPrivateKey();
}
else
{
// 已经有证书配置信息,直接从配置文件指定的路径读取
ReadCertificateAndPrivateKeyFromFiles();
}
// Create a global SSL_CTX.
// 创建全局的ssl 上下文 主要使用的是一些openssl的api,初始化证书、私钥并绑定上下文.
// 与srtp绑定,设置采用srtp做为数据的传输协议
CreateSslCtx();
// Generate certificate fingerprints.
// 创建证书指纹,不同的算法可以产生不同的指纹
GenerateFingerprints();
}
相关内容初始化后,看一下Router在收到ROUTER_CREATE_WEBRTC_TRANSPORT时,创建 WebRtcTransport实例代码:
WebRtcTransport::WebRtcTransport(const std::string& id, RTC::Transport::Listener* listener,

最低0.47元/天 解锁文章
231

被折叠的 条评论
为什么被折叠?



