WebRTC收集服务器反射地址候选者 源码剖析

一. 前言

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

        服务器反射候选者是通过发送 STUN Binding Request 给 STUN 服务器,STUN 服务器返回客户端 NAT 映射后的外网地址得到的。

二. 源码剖析

1. 发送STUN Binding Request

        如下所示,UDPPort::OnLocalAddressReady 首先调用 MaybeSetDefaultLocalAddress,然后调用 AddAddress 添加 host 类型 candidate,接下来调用 MaybePrepareStunCandidate() 准备收集 STUN 类型候选者(服务器反射地址候选者)。

         如果配置了 STUN 服务器地址则进入执行 SendStunBindingRequests() 的分支。

        如果配置的 STUN 服务器地址是域名则执行 ResolveStunAddress,等待域名解析成 IP 后再往 STUN 服务器发送 StunBindingRequest,否则进入 else if 分支,通过 StunRequestManager::Send 发送 Binding Request。

        StunRequestManager::Send 会调用 StunRequestManager::SendDelayed,该函数内部会执行 StunRequest::Construct 构造 Message,然后将消息事件塞入网络线程处理。

2. 接收解析STUN Binding Response

        当 UDP 收到网络数据包后会调用 UDPPort::OnReadPacket,如果对端地址是我们配置过的 STUN 服务器地址,说明这可能是 STUN 服务器往本端发送的 STUN 报文,则进入 StunRequestManager::CheckResponse 处理。

        StunRequestManager::CheckResponse 先检查 UDP 数据大小,如果小于 20 个字节说明不可能是 STUN 报文,直接 return false,接下来再按 STUN 报文格式读取 TransactionId,如果本端没有发送过这个 TransactionId 的请求则 return false,接下来构造 StunMessage 进入 StunRequestManager::CheckResponse(StunMessage* msg) 继续处理。

        StunRequestManager::CheckResponse 检查 STUN 消息类型,如果是成功响应则执行 StunRequest::OnResponse(StunRequest 是个基类,对于 StunBindingRequest 会调用 StunBindingRequest::OnResponse),如果是错误响应则执行 StunRequest::OnErrorResponse。

         StunBindingRequest::OnReponse 检查 STUN Message 的 STUN_ATTR_MAPPED_ADDRESS 属性,取出后获取 ipaddr 和 port,并回调 UDPPort::OnStunBindingRequestSucceeded。

         UDPPort::OnStunBindingRequestSucceeded 通过 AddAddress 添加 stun_reflected_addr 为 Server Reflexive Address 候选者,至此服务器反射候选者就收集完成了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

椛茶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值