当前位置: 代码迷 >> 综合 >> 流媒体学习之路(mediasoup)——各业务类初始化(5)
  详细解决方案

流媒体学习之路(mediasoup)——各业务类初始化(5)

热度:10   发布时间:2023-12-13 23:40:58.0

流媒体学习之路(mediasoup)——各业务类初始化(5)

文章目录

  • 流媒体学习之路(mediasoup)——各业务类初始化(5)
  • 一、OpenSSL
  • 二、LibSRTP
    • 2.1 SRTP的协议格式
    • 2.2 SRTCP的协议格式
  • 三、UsrSCTP
  • 四、WebRTC
  • 五、DtlsTransport
  • 六、SRTPSession
  • 七、Channel——Notifier


main函数中,各个模块初始化:

try{
    // Initialize static stuff.DepOpenSSL::ClassInit();DepLibSRTP::ClassInit();//DepUsrSCTP::ClassInit();DepLibWebRTC::ClassInit();Utils::Crypto::ClassInit();RTC::DtlsTransport::ClassInit();RTC::SrtpSession::ClassInit();Channel::Notifier::ClassInit(channel);PayloadChannel::Notifier::ClassInit(payloadChannel);// Ignore some signals.IgnoreSignals();// Run the Worker.Worker worker(channel, payloadChannel);// Free static stuff.DepLibUV::ClassDestroy();DepLibSRTP::ClassDestroy();Utils::Crypto::ClassDestroy();DepLibWebRTC::ClassDestroy();RTC::DtlsTransport::ClassDestroy();DepUsrSCTP::ClassDestroy();// Wait a bit so peding messages to stdout/Channel arrive to the Node// process.uv_sleep(200);std::_Exit(EXIT_SUCCESS);}

一、OpenSSL

??WebRTC是附带加密通话的,因此在使用WebRTC时服务中必须配套SSL模块。这个类非常简单,仅仅调用了RAND_poll函数来初始化。而在RAND_poll函数中就包含了DRBG静态实例的初始化(确定性(伪随机)数产生器(Deterministic Random Bit Generators))。

void DepOpenSSL::ClassInit()
{
    MS_TRACE();MS_DEBUG_TAG(info, "openssl version: \"%s\"", OpenSSL_version(OPENSSL_VERSION));// Initialize some crypto stuff.RAND_poll();
}

??OpenSSL的官方wiki中提到,如果想要在子进程中安全的使用随机函数,那么必须先调用RAND_poll()。
在这里插入图片描述

二、LibSRTP

??SRTP为安全实时传输协议。它与RTP协议所不同的是,它增加了数据加密、消息认证、完整性保护等内容。

2.1 SRTP的协议格式

在这里插入图片描述
??加密部分 Encrypted Portion:对payload、padding、padding count进行了加密。
??校验部分 Authenticated Portion:对RTP头、RTP拓展头和加密部分组成,也就是对整个数据包进行了全面的校验。

??通常情况下只需要对 RTP 负载数据进行加密,如果需要对 RTP header extension 进行加密,RFC6904 给出了详细方案,在 libsrtp 中也完成了实现。

2.2 SRTCP的协议格式

在这里插入图片描述

??加密部分 Encrypted Portion:RTCP头部之后的部分。
??新增标识 E-flag:标志是否进行加密。
??SRTCP的偏移量:用于防止重放攻击。
??待校验部分 Authenticated Portion:由头部和加密部分组成。

class WebRtcTransport : public RTC::Transport,public RTC::UdpSocket::Listener,public RTC::TcpServer::Listener,public RTC::TcpConnection::Listener,public RTC::IceServer::Listener,public RTC::DtlsTransport::Listener

??LibSRTP的初始化如下:

void DepLibSRTP::ClassInit()
{
    MS_TRACE();//初始化分级日志MS_DEBUG_TAG(info, "libsrtp version: \"%s\"", srtp_get_version_string());srtp_err_status_t err = srtp_init();if (DepLibSRTP::IsError(err))MS_THROW_ERROR("srtp_init() failed: %s", DepLibSRTP::GetErrorString(err));
}

??调用srtp_init()函数初始化srtp部分。函数内部进行了加密内核的初始化。

三、UsrSCTP

??SCTP 是一种面向消息的可靠传输协议,直接支持运行在 IP 或 UDP 之上,并支持 ipv4 和 ipv6 版本。

void DepUsrSCTP::ClassInit()
{
    MS_TRACE();MS_DEBUG_TAG(info, "usrsctp");usrsctp_init_nothreads(0, onSendSctpData, sctpDebug);// Disable explicit congestion notifications (ecn).usrsctp_sysctl_set_sctp_ecn_enable(0);#ifdef SCTP_DEBUGusrsctp_sysctl_set_sctp_debug_on(SCTP_DEBUG_ALL);
#endifDepUsrSCTP::checker = new DepUsrSCTP::Checker();
}

四、WebRTC

??WebRTC模块的初始化:

void DepLibWebRTC::ClassInit()
{
    MS_TRACE();webrtc::field_trial::InitFieldTrialsFromString(FieldTrials);
}

五、DtlsTransport

??DtlsTransport模块的初始化:

void DtlsTransport::ClassInit(){
    MS_TRACE();//产生证书以及私钥// Generate a X509 certificate and private key (unless PEM files are provided).if (Settings::configuration.dtlsCertificateFile.empty() ||Settings::configuration.dtlsPrivateKeyFile.empty()){
    GenerateCertificateAndPrivateKey();}else{
    ReadCertificateAndPrivateKeyFromFiles();}// 创建数据安全传输协议上全局下文// Create a global SSL_CTX.CreateSslCtx();//产生证书指纹// Generate certificate fingerprints.GenerateFingerprints();}

六、SRTPSession

??SRTPSession模块的初始化:

	void SrtpSession::ClassInit(){
    // Set libsrtp event handler.srtp_err_status_t err =srtp_install_event_handler(static_cast<srtp_event_handler_func_t*>(OnSrtpEvent));if (DepLibSRTP::IsError(err)){
    MS_THROW_ERROR("srtp_install_event_handler() failed: %s", DepLibSRTP::GetErrorString(err));}}

七、Channel——Notifier

??Channel::Notifier 和 PayloadChannel::Notifier 模块的初始化:

	void Notifier::ClassInit(Channel::UnixStreamSocket* channel){
    MS_TRACE();Notifier::channel = channel;}
	void Notifier::ClassInit(PayloadChannel::UnixStreamSocket* payloadChannel){
    MS_TRACE();Notifier::payloadChannel = payloadChannel;}