流媒体学习之路(mediasoup)——各业务类初始化(5)
文章目录
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_DEBUG
usrsctp_sysctl_set_sctp_debug_on(SCTP_DEBUG_ALL);
#endif
DepUsrSCTP::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;
}