WebRTC收集中继地址候选者 源码剖析

一. 前言

        在这篇博客中我们介绍了 WebRTC candidate,重点分析了 WebRTC 收集 host candidate 的流程,本文将介绍 WebRTC 如何收集中继地址候选者(Relayed Address)。

        如果你对 Relay 的概念或者 TURN 工作原理不太熟悉,建议先阅读这篇博客后再继续往下阅读。

二. 源码剖析

1. 发送Allocate Request

        如下所示,首先调用 AllocationSequence::CreateRelayPorts,如果禁用 relay 候选者或者没有配置 TURN 服务器地址则直接 return,否则进入 CreateTurnPort。

        AllocationSequence::CreateTurnPort 主要是创建 TurnPort,然后通过 BasicPortAllocatorSession::AddAllocatedPort 将 TurnPort 添加到 std::vector<PortData> ports_ 对象中,并执行 TurnPort::PrepareAddress() 开始准备收集地址。

 

         TurnPort::PrepareAddress 函数中首先判断如果 TURN 服务器地址是域名则先进行域名地址解析,否则进入 else 分支,先与 TURN Server 创建连接(CreateTurnClientSocket),TURN Client 与 TURN Server 的连接可以是 UDP,也可以是 TCP 或者 TLS over TCP,连接创建完成后通过 SendRequest(new TurnAllocateRequest(this), 0) 发送 AllocateRequest 请求。

        AllocateRequest 实际上就是 Message Type=0x0003 的 STUN 报文。

2. 接收解析Allocate Response

        接收到响应报文后会回调 AllocationSequence::OnReadPacket,它检查收到的数据包的发送者地址在我们配置的 TURN Server 地址中,如果是则调用 TurnPort::HandleIncomingPacket 进行处理。

        TurnPort::HandleIncomingPacket 会判断如果这是一个 ChannelData 报文则调用 HandleChannelData 处理,如果是 Data Indication 报文则调用 HandleDataIndication 处理,这两者都是 Peer 通过 turn server 给 turn client 发送数据时 turn client 端的处理逻辑。

        之后再调用 StunRequestManager::CheckResponse 检查该报文是否为本端发送过的请求的响应,对于成功响应会执行 StunRequest::OnResponse 进行处理,对于 AllocationRequest 则是调用 TurnAllocateRequest::OnResponse 处理。

         收到 Allocation Response 后取出响应报文的 XOR_RELAYED_ADDRESS,调用 TurnPort::OnAllocateSuccess 添加 Relayed Address(中继地址候选者),再调用 TurnPort::ScheduleRefresh 开启连接保活(发送 TurnRefreshRequest),至此中继地址候选者就收集完成了。

猜你喜欢

转载自blog.csdn.net/weixin_38102771/article/details/124535830
今日推荐