各个transport的关系和创建过程
A 最底层是 P2PTransportChannel 负责纯ice连接的建立
B 往上一层 DtlsTransport 基于已建立的ice连接进行dtls连接的建立,根据是否启用加密有不同的行为,即:
1 启用dtls则走dtls连接建立的流程
2 未启用则走正常ice数据收发流程
C 往上一层 两种情况:
1 如果非加密,则直接创建RtpTransport对象,RtpTransport对象中直接能获取到P2PTransportChannel的数据,见 RtpTransport::SetRtpPacketTransport()中的信号槽连接
2 如果为加密,则创建RtpTransport的子类DtlsSrtpTransport对象
启用加密:用DtlsSRTPTransport
未启用加密:用RtpTransport
SrtpTransport负责真正的数据加密解密
DtlsSrtpTransport负责从DtlsTransport提取加解密相关的信息
SrtpTransport负责加密解密rtp数据,那么数据是怎么到达这一层的?
我们先看一下其父类RtpTransport,加密或者不加密时 RtpTransport::SetRtpPacketTransport()这个函数都会被调用,其内容如下
new_packet_transport->SignalReadPacket.connect(this, &RtpTransport::OnReadPacket);
即底层收到数据后要触发SignalReadPacket从而调用OnReadPacket,在RtpTransport::OnReadPacket()中又会调用其虚函数OnRtpPacketReceived(),虚函数,那么在实际调用中会使用其子类即SrtpTransport的OnRtpPacketReceived(),在里面进行解密,见 SrtpTransport::OnRtpPacketReceived()
那数据又是怎么从网络到达RtpTransport的呢?
在DtlsTransport::ConnectToIceTransport(),将P2PTransportChannel的
ice_transport_->SignalReadPacket.connect(this, &DtlsTransport::OnReadPacket);
DtlsTransport::OnReadPacket中 如果没有启用dtls则直接传给上层,即直接返给RtpTransport;
如果启用dtls则先建立dtls连接,建立dtls连接后收到数据也是直接抛给了RtpTransport
transport的创建过程?
见JsepTransportController::MaybeCreateJsepTransport中,
1 创建P2PTransportChannel
2 用P2PTransportChannel作为参数创建DtlsTransport
3 根据是否启用加密创建RtpTransport或DtlsSrtpTransport