三、mediasoup之WebRtcTransport 创建流程(2)

WebRTC传输连接与DTLS/SRTP安全机制解析

        上节说过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, 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值