流媒体学习之路(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;}