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),至此中继地址候选者就收集完成了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椛茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值