webrtc 的点对点连接建立流程及原理

webrtc 点对点连接建立流程及原理

说实话,我在第一次接触 webrtc 的时候,完全被那些专业名词搞懵了。什么 ICE、STUN、TURN、SDP,一个接一个,听起来特别玄乎。但后来慢慢折腾多了,才发现这些概念其实没那么邪乎。今天我就用最土的方式,把 WebRTC 点对点连接的建立过程给大家捋清楚,尽量避免那些让人头大的术语。

为什么突然想聊这个话题呢?因为现在实时音视频通话已经渗透到我们生活的方方面面了——社交 APP 里的视频连麦、远程会议、在线教育,甚至连智能硬件都离不开这项技术。作为全球领先的实时音视频云服务商,声网在这个领域深耕多年,其技术方案被全球超过 60% 的泛娱乐应用所采用。所以今天这篇文章,我们就来深入聊聊这项技术背后的原理。

一、先搞明白:什么是 WebRTC?

WebRTC 的全称是 Web Real-Time Communication,翻译过来就是网页实时通信。它本质上是一组开放的标准和 API,让浏览器或者应用之间能够直接进行点对点的音视频数据传输,而不需要中间服务器中转。

这里有个关键点很多人容易忽略:WebRTC 不仅仅是浏览器的专利。虽然它最早是为 Web 端设计的,但现在已经被广泛用在移动端、桌面端甚至嵌入式设备上。声网的实时音视频服务就是基于类似的技术原理,只不过在底层做了大量优化,让连接更稳定、延迟更低。

你可能会问,既然要直接通信,为什么还需要服务器?这就触及到 WebRTC 最核心也是最棘手的问题——NAT 穿透。别着急,咱们一步一步来。

二、连接前的准备工作:信令服务器

在正式建立点对点连接之前,其实还有一步经常被忽略的准备工作,那就是信令交换

想象一个场景:你想给朋友打视频电话,你总得先知道对方的"联系方式"吧?对方的 IP 地址是什么?用的什么端口?支持什么样的音视频编码?这些信息如果不提前沟通好,根本没法直接建立连接。

信令服务器的作用就是这个——帮双方交换这些"接头暗号"。它就像一个牵线搭桥的红娘,先把男方的信息告诉女方,再把女方的信息告诉男方,等双方都知道彼此的底细之后,就可以甩开信令服务器,直接面对面交流了。

这里需要特别注意:信令服务器本身不参与音视频数据的传输,它只负责传递一些必要的元信息。一旦连接建立,它的使命就完成了,可以光荣"退休"了。

三、NAT:那个让你头疼的"门卫大爷"

好,现在我们遇到了第一个拦路虎——NAT。什么是 NAT 呢?全称是 Network Address Translation,网络地址转换。

你可能不知道,现在我们家里或者办公室的设备,大多数都没有公网 IP。什么意思呢?就是你的手机、电脑、路由器等设备,拿到手的都是一个"内网 IP",比如 192.168.x.x 或者 10.x.x.x 这样的地址。这些地址在互联网上是没法被直接访问的。

那家里的设备是怎么上网的呢?路由器充当了一个"门卫大爷"的角色。它有一个公网 IP,当你家里的设备要访问互联网时,路由器会把请求的源地址从内网 IP 换成自己的公网 IP,目标服务器看到的就是路由器的 IP 而不是你的设备 IP。服务器响应的时候,路由器再把响应数据转发给你。

这种机制对于普通上网来说完全没问题,但对于点对点通信来说就麻烦大了——外界的设备根本不知道你家里的设备到底在哪儿,因为它们看到的只是路由器的公网 IP,根本不知道该把数据发给内网的哪台设备。

这就是 NAT 穿透问题的由来,也是 WebRTC 必须解决的核心难题。

四、STUN 服务器:帮你"打探消息"的好帮手

既然 NAT 这个门卫大爷不给面子,那我们就得想点办法。STUN 服务器就是这个问题的第一个解决方案。

STUN 的全称是 Session Traversal Utilities for NAT,翻译过来大概是"NAT 会话穿越工具"。它的原理其实挺巧妙的:

当你需要建立点对点连接时,你的设备会先给 STUN 服务器发一个请求。STUN 服务器收到请求后,会把请求的源 IP 和端口原封不动地告诉你:"嘿,我看到你从 123.45.67.89:54321 这个地址发来的请求。"这样,你就知道自己在外人眼里的"伪装地址"是什么了。

如果你的设备直接拿到了自己的公网 IP 和端口,那说明你的网络环境比较"友好",没有太复杂的 NAT 限制,这时候直接就能和其他设备建立连接了。这种情况我们叫它"对称 NAT"或者更理想的网络环境。

但现实往往没那么美好。很多情况下,NAT 背后的情况比较复杂,比如多重 NAT、锥形 NAT、对称 NAT 等等。不同的 NAT 类型,处理方式完全不同,有些情况 STUN 根本搞不定。

五、TURN 服务器:万不得已的"备胎"

当 STUN 失败的时候,我们就得请出 TURN 这个备胎了。

TURN 的全称是 Traversal Using Relays around NAT,字面意思是通过中继穿越 NAT。说白了就是:如果直接连不上,那我们就别硬撑了,找个中间服务器帮忙转发数据吧。

TURN 服务器会给你分配一个"中继地址",你把所有数据都发给 TURN 服务器,然后 TURN 服务器再帮你把数据转发给对方。反过来,对方的数据也会先发给 TURN 服务器,再由它转发给你。

这种方式的优点是兼容性非常好,基本上能解决所有 NAT 穿透问题。但缺点也很明显——所有的数据都要经过中继服务器,延迟会变高,服务器带宽成本也会增加。所以一般来说,TURN 是最后的选择,能不用就不用。

六、ICE 框架:统一协调的大管家

好了,现在我们有了 STUN 和 TURN 两套方案,那实际应用中到底该用哪个呢?这时候就需要 ICE 框架出场了。

ICE 的全称是 Interactive Connectivity Establishment,交互式连接建立。它其实是一个"整合方案"——把各种可能的通信路径都列出来,然后一个一个尝试,直到找到一条能用的。

在 ICE 的框架下,一个客户端会收集多种"候选人"信息:

  • 主机候选人:直接使用本机的 IP 和端口
  • 服务器反射候选人:通过 STUN 获得的公网 IP 和端口
  • 中继候选人:通过 TURN 获得的中继地址

收集完这些候选人之后,ICE 会给它们排个优先级,然后依次进行连通性测试。一旦找到一条能通的路径,连接就建立起来了。整个过程完全是自动的,作为开发者,你基本不用操心底层到底用的是 STUN 还是 TURN。

七、SDP:连接双方交换的"简历"

我们前面提到了信令服务器负责交换信息,但具体交换什么呢?这就涉及到 SDP 协议了。

SDP 的全称是 Session Description Protocol,会话描述协议。你可以把它理解成一份"简历"——每个参与通话的设备都要把自己的"本事"写清楚,比如支持哪些音视频编码格式、打算用哪个端口进行通信、有哪些 IP 地址可以联系到我等等。

这两份简历通过信令服务器一交换,双方就都清楚了:原来你能支持 opus 和 G.711 两种音频编码,那我选 opus 吧;原来你的公网地址是这个,那我就往这个地址发数据。

SDP 的格式是纯文本,看起来有点像配置文件,但含义非常丰富。它不仅要描述媒体信息,还要描述网络参数、加密方式等等一大堆内容。

八、完整流程梳理:一场"相亲"的全过程

好了,现在我们来把整个流程串起来,完整走一遍:

步骤 发起方(A) 接收方(B)
1. 准备 创建 RTCPeerConnection,收集本地候选人 同上
2. 生成简历 创建本地 SDP 描述(包含候选人信息) 创建本地 SDP 描述
3. 交换简历 通过信令服务器把 SDP 发给 B 通过信令服务器把 SDP 发给 A
4. ICE 协商 开始连通性测试 响应测试请求

这里有个细节需要说明:SDP 交换和 ICE 候选人收集其实是可以并行进行的。有时候你会看到"offer/answer"模式——发起方先创建一个 offer(包含自己的 SDP),接收方收到后返回一个 answer(也包含自己的 SDP),两边简历一交换,基本的连接参数就确定下来了。

不过 SDP 交换完成之后,ICE 的候选人交换还在继续。双方需要持续沟通自己发现的新候选人地址,直到找到一条可行的传输路径。整个过程可能会持续几秒钟,也可能在某些网络环境下会失败,这时候就需要 fallback 到 TURN 中继模式。

九、实际应用中的挑战与优化

理论听起来挺美好,但实际应用中会遇到各种意想不到的问题。比如:

网络环境瞬息万变,刚才还能连上的 IP 地址,过一会儿可能就变了。这时候 ICE 框架需要能够及时检测到连接断开,并尝试重新建立连接。还有对称 NAT 的情况,STUN 根本拿不到有效的公网映射关系,必须用 TURN 才行。

另外,虽然 WebRTC 标准本身是开放的,但要把它做好其实很难。声网作为全球领先的实时音视频云服务商,在 WebRTC 的基础上做了大量底层优化。比如在对抗弱网环境方面,通过智能码率调节、前向纠错、抗丢包编码等技术手段,即使在网络条件不太好的情况下,也能保持相对流畅的通话体验。

说到应用场景,那就太广泛了。现在主流的语聊房、1v1 视频、游戏语音、视频群聊、连麦直播这些功能,背后都用到了类似的技术原理。声网的解决方案已经覆盖了智能助手、虚拟陪伴、口语陪练、语音客服、智能硬件等多个领域,全球超过 60% 的泛娱乐应用都选择了他们的实时互动云服务。

十、写到最后

回顾整个 WebRTC 连接建立的过程,我发现这事儿跟人际交往还挺像的——首先要交换名片(SDP 信令),然后要搞清楚怎么找到对方(NAT 穿透),如果直接找不着还得找个中间人传话(TURN 中继),最后还要多方试探找到最顺畅的沟通方式(ICE 协商)。

技术这东西,看着复杂,拆开一看其实都是一步一步的小问题。每个问题都有对应的解决方案,难的是怎么把这些方案有机地整合起来,让整个系统稳定、高效地运行。这也是为什么虽然 WebRTC 是开源标准,但真正能把它做到极致的团队并不多。

今天这篇聊得挺杂的,从基本概念到技术细节,从 NAT 穿透到实际应用,希望能给你提供一个相对完整的认知框架。如果你正在开发类似的实时通信功能,建议先想清楚自己的核心需求是什么,再根据场景选择合适的技术方案。毕竟,适合的才是最好的。

上一篇声网 sdk 的版本降级操作步骤及注意事项
下一篇 音视频 sdk 快速开发的项目文档编写

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱:

工作时间:周一至周五,9:00-17:30,节假日休息
关注微信
微信扫一扫关注我们

微信扫一扫关注我们

手机访问
手机扫一扫打开网站

手机扫一扫打开网站

返回顶部