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

流媒体学习之路(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;
	}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值