Mediasoup库的架构(C++部分)
文章目录
Mediasoup库介绍
Mediasoup基本概念
-
Worker:代表一个结点,下图的每一块就是一个Worker。假设操作系统是双核的,每一核都会创建一个进程,这个进程就是一个Worker
-
Router:房间或路由器
-
Producer:生产者
-
Consumer:消费者
-
Transport:客户端与服务端的一条连接线,这条线上可以有多个消费者和生产者
Mediasoup包括的特性
- 支持IPv6
- ICE/DTLS/RTP/RTCP over UDP and TCP
- 支持 Simulcast 和 SVC
- 支持拥塞控制
- 带宽评估
- 支持STCP协议
- 多流使用同一个ICE+DTLS传输通道
- 底层采用进程+libuv,异步I/O的处理方式
Mediasoup C++核心类图
Consumer
-
SimpleConsumer:普通的RTP数据消费者,对于音频和视频都一样,都是最简单的消费者
-
PipeConsumer:Pipe是用作于不同的Worker与Worker之间进行数据的流转,所以PipeConsumer就是用来接受不同的Worker传输过来的数据
-
SvcConsumer:SVC按照分层的方式分为核心层、扩展层、边缘层,这个类的作用就是用来传输不同层的数据的
-
SimulcastConsumer:当共享者传输多路流的时候,使用的是Simulcast,对于接收者来说,也要使用Simulcast进行消费
Transport
- WebRTCTransport:主要用于浏览器之间或与其他终端之间的通信,这种数据一般都是加密的,为了保证数据不被窃取掉,它有很多的安全机制,且非常复杂
- PlainRTPTransport:主要用于普通的非加密的RTP数据的传输
- PipeTransport:用于不同Worker/Router之间的传输
Router
对于Router来说,一个Router对应了多个Consumer、多个Producer、多个Transport,所以它是1对多的关系
Mediasoup C++详细类图
RtpStreamSend
可能会有人疑惑,消费者为什么会发送数据呢,不应该是接收数据吗?其实这里需要想通一点,Mediasoup是作为流媒体服务器,真正的消费者是客户端,所以服务器的Consumer需要把数据发送给客户端
RtpStreamSend继承自RtpStream,这个类处理Rtp数据流的收发。RtpStream使用到了RtpPacket,这个包是用于对Rtp数据包的分析,Rtp数据有数据包头,对于包头每一个字段的定义都是在这个Packet里面操作的
SeqManager
服务端推送给客户端的数据流是会重新排序的,排序的时候便会依靠这个SeqManager,它会记录某个SSRC所对应的Sequence,以此为起始位置,然后后面的每个包都向下递增一个数
Producer
Producer作为服务端的生产者,它是用来接收共享者发送的数据流,所以它里面包含多个RtpStreamRecv,是一对多的关系(为什么是多个RtpStreamRecv呢?因为数据的接收有可能会丢包,丢包重传的也算作一路流,对应的音频的丢包也是需要重传)
NackGenerator
作为数据的接收端,RtpStreamRecv使用到了NackGenerator丢包产生器
接收端能够知道有没有丢包,因为数据包有Sequence,比如发送了100个数据,前50个数据是连续的,但假设当50之后是55,Recv端就知道丢了 51、52、53、54 这4个包了。丢包之后如何解决呢,有两种方式:
- Fec:在每个包增加一些冗余,它能计算 出丢失的音频包或视频包
- Nack:它会告诉发送端丢了哪些包,发送端会根据策略,若时间比较短的话,会把丢失的包补上来,具体补哪些包就是根据NackGenerator产生的
PortManager
端口管理器,对于Mediasoup来说,默认是从40000到49999共一万个端口号。UdpSocket和TcpServer通过PortManager进行对端口号的管理,首先确定端口号有没有被占用,没有被占用就使用该端口号对数据传输;若被占用,就根据PortManager的策略往后跳。注意Udp和Tcp的使用是互斥的
DtlsTransport
使用tls对Rtp包进行数据加密的协议,同时在这里面还使用到了Srtp协议,Srtp协议分为数据的收与发,所以在WebRTCTransport中有Srtp send和recv这两个Session
RembClient/RembServer
这两个主要用于对带宽的评估,既可用于client端也可用于server端。对于共享者来说,Mediasoup的WebRTCTransport就是RembClient端;对于消费者来说,就是RembServer端
IceCandidate
候选者包括Host、Server reflexive、Relay reflexive三种,对于WebRTC一般设置成Host,最高优先级
IceServer
包括证书验证、指纹识别等一系列安全验证机制,它里面也包含了多个TransportTuple
TransportTuple
如果使用TCP连接,它里面便含有TcpConnection