0

WebRTC源码级深度解析(完结)

FDDGFDG
1天前 2

获课:xingkeit.top/6667/


WebRTC 网络层源码拆解:Socket 收发数据包的底层实现逻辑

WebRTC 能在复杂网络环境下打穿 NAT、建立 P2P 连接,靠的不是什么魔法,而是一套层层嵌套、分工精密的 Socket 收发体系。从最底层的 UDP Socket 创建,到 STUN 交互、ICE 候选收集,再到 SRTP 加密封装,每一层都有明确的职责边界。搞懂这套逻辑,才算真正摸到了 WebRTC 网络层的骨头。

一切从 BasicPacketSocketFactory 开始

WebRTC 内部创建 Socket 的入口,是 BasicPacketSocketFactory。它在 PeerConnectionFactory::Initialize() 阶段被实例化,依赖一个 network_thread_——这个线程本质上是一个携带了 SocketServer 的消息队列。

network_thread_ 的创建方式值得注意:调用 rtc::Thread::CreateWithSocketServer(),内部会实例化 PhysicalSocketServer(非 NaCl 平台)。这个 SocketServer 继承自 MessageQueue,后续所有 Socket 操作最终都通过它调度回调。

Socket 的创建与绑定:CreateUdpSocket 内部做了什么

BasicPacketSocketFactory::CreateUdpSocket 是真正干活的地方。流程非常清晰:

第一步,调用 socket_factory()->CreateAsyncSocket,这一步落到 PhysicalSocketServer::CreateAsyncSocket,内部新建一个 SocketDispatcher,再通过 PhysicalSocket::Create 调用系统级 socket() 接口,创建一个 UDP Socket。

第二步,调用 BindSocket 绑定地址和端口范围,本质是系统调用 bind()

第三步,把读写事件绑定到 AsyncUDPSocket::OnReadEvent  OnWriteEvent,最终返回一个 AsyncUDPSocket 包装对象。

这个包装对象是异步的——读事件触发时,数据从内核拷贝到用户态缓冲区,再通过 OnReadEvent 回调向上层投递。写操作同理,非阻塞,靠事件驱动。

STUN 收发:Socket 怎么和 STUN 服务器对话

ICE 框架需要先向 STUN 服务器发起请求,获取自己的公网 IP 和端口(即 srflx 候选)。这个过程完全走刚才创建的 UDP Socket。

STUN 请求是一个简单的 UDP 数据包,通过 AsyncUDPSocket::Send 发出。STUN 服务器收到后,在响应包的 XOR-MAPPED-ADDRESS 属性中填入你的公网地址,原样返回。

WebRTC 收到响应后,解析出公网 IP 和端口,生成一个 srflx 类型的 ICE Candidate。这个 Candidate 会通过信令服务器(通常是 WebSocket)交换给对端。

整个过程中,Socket 只负责"发出去、收回来",STUN 协议的编解码由 ICE 模块的 StunPort 完成。

数据包的真正归宿:从 Socket 到 RTP 传输链路

音视频数据不会直接从 Socket 发出。完整链路是:音视频引擎编码后生成 RTP 包,交给 RtpTransport,再通过 DtlsSrtpTransport 加密封装为 SRTP 包,最终由底层 IceTransport 调用 Socket 的 Send 接口发出。

接收端反向操作:Socket 收到 UDP 包 → IceTransport 接收 → 解包 → SRTP 解密 → RTP 解复用 → 送入对应的 AudioReceiveStream  VideoReceiveStream

RtpTransport 内部维护了一个 RtpDemuxer,根据 SSRC、MID 等标识符把收到的包路由到正确的接收流,这就是"解复用"的核心逻辑。

为什么设计成异步 + 工厂模式

WebRTC 的 Socket 体系之所以用工厂类 + 异步事件驱动,而不是同步阻塞,根本原因是实时通信对延迟极其敏感。同步 Socket 收发会阻塞线程,而 WebRTC 的音频采集、编码、发送是流水线作业,任何一环阻塞都会导致累积延迟。

工厂模式则让 Socket 的创建和生命周期管理与业务逻辑解耦,不同平台(Windows/Linux/Android)可以替换不同的 Socket 实现,而上层调用接口完全一致。

总结

WebRTC 网络层的 Socket 收发,本质上是三层协作:PhysicalSocketServer 负责创建和管理底层 Socket,BasicPacketSocketFactory 封装创建逻辑,ICE 和 RTP 模块负责决定"发什么、怎么发"。Socket 本身不关心内容,它只保证数据包在网络上可靠地送出去、收回来。真正的智慧,在 Socket 之上。


本站不存储任何实质资源,该帖为网盘用户发布的网盘链接介绍帖,本文内所有链接指向的云盘网盘资源,其版权归版权方所有!其实际管理权为帖子发布者所有,本站无法操作相关资源。如您认为本站任何介绍帖侵犯了您的合法版权,请发送邮件 [email protected] 进行投诉,我们将在确认本文链接指向的资源存在侵权后,立即删除相关介绍帖子!
最新回复 (0)

    暂无评论

请先登录后发表评论!

返回
请先登录后发表评论!