webrtc中的transport

各个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​​​​​​​


版权声明:本文为airmanisvip原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。