在当下的互联网场景中,实时音视频通信早已融入日常------网页版视频通话、在线会议、直播连麦、甚至浏览器内的点对点互动,这些功能背后,往往离不开一项核心技术:WebRTC。它无需我们安装任何插件,仅凭浏览器就能实现高效的实时音视频传输与数据交互,堪称前端实时通信领域的"黑科技"。
但很多开发者只知道WebRTC能实现实时通话,却不清楚它背后的核心逻辑:为什么不同网络下的设备(比如家里的电脑和公司的手机)能通过浏览器直接连通?NAT穿透是怎么解决的?STUN服务器又在其中扮演了什么角色?今天,我们就从基础概念入手,一步步拆解WebRTC的核心原理,结合通俗案例,让你彻底搞懂它的工作机制。
一、WebRTC 是什么?------浏览器内置的"实时通信神器"
WebRTC 的全称是 Web Real-Time Communication(网页实时通信),顾名思义,它是一套浏览器原生支持的实时通信技术标准,无需安装任何插件、APP,只要打开网页,就能直接实现音视频通话、点对点数据传输等功能。
举个最直观的例子:我们用网页版微信进行视频通话、用在线会议工具(如腾讯会议网页版)加入会议、甚至在某些直播平台进行连麦互动,这些场景中,若没有额外安装客户端,本质上都是通过 WebRTC 技术实现的。
WebRTC 的核心优势的就是"原生"和"便捷"------它被主流浏览器(Chrome、Firefox、Edge 等)内置支持,开发者只需调用相关 API,就能快速实现实时通信功能,无需关注底层的音视频编码、网络传输等复杂细节;同时,它支持跨平台,无论是电脑、手机,只要浏览器兼容,就能实现互联互通。
WebRTC 的关键的是"连接建立后直接接管音视频传输",当两个客户端通过相关协商完成后,WebRTC 会直接在两者之间建立一条 P2P(点对点)连接,将摄像头、麦克风采集到的音视频数据,通过这条直接连接发送给对方,无需经过第三方服务器中转,传输效率更高、延迟更低。
二、核心前提:为什么 WebRTC 离不开 ICE 和 STUN?
了解了 WebRTC 的基本定义后,我们会遇到一个关键问题:两个设备要通过 WebRTC 建立 P2P 连接,前提是"能找到彼此"。但我们日常使用的设备,大多处于 NAT(网络地址转换)环境下,根本没有直接的公网 IP------这就是 WebRTC 必须解决的核心难题:NAT 穿透。
而 ICE 和 STUN,就是 WebRTC 中专门解决这个问题的"关键工具",两者分工明确、相辅相成,我们先分别搞懂它们的核心作用。
1. ICE:WebRTC 的"NAT 穿透框架"
ICE 的全称是 Interactive Connectivity Establishment(交互式连接建立),它并不是某一种具体的技术,而是 WebRTC 中用于解决 NAT 穿透的"框架"------简单说,它的作用就是"协调各种工具",帮助两个处于不同 NAT 环境下的设备,找到彼此并建立稳定的连接。
而 iceServers(ICE 服务器配置),就是给这个框架提供"辅助工具"的配置项------这些辅助工具,最核心的就是我们接下来要讲的 STUN 服务器,除此之外,还有用于复杂 NAT 穿透的 TURN 服务器(本文重点讲解 STUN,TURN 可作为延伸了解)。
一句话总结:ICE 是"总指挥",负责统筹协调,而 STUN 服务器是"核心执行者",负责帮设备获取公网地址,实现基础的 NAT 穿透。
2. STUN 服务器:帮设备"找到自己的公网地址"
STUN 的全称是 Session Traversal Utilities for NAT(NAT 会话穿透工具),它是一种轻量级的网络服务器,核心作用非常明确:帮助处于 NAT 后的设备(比如我们的电脑、手机、平板),获取自己的公网 IP + 端口,以及 NAT 设备的类型,从而让不同 NAT 后的设备,能找到彼此,最终建立 P2P 连接。
结合参考资料中的描述:STUN 服务器的核心价值,就是解决"设备不知道自己公网 IP 和端口"的问题------很多设备处于内网环境中,只知道自己的内网 IP(比如 192.168.1.100),却不知道自己对外暴露的公网 IP 和端口,就像一个人只知道自己家里的门牌号,却不知道自己所在的小区地址,无法让外界找到自己。而 STUN 服务器,就是帮设备"查询小区地址和对外出入口"的工具。
三、通俗理解:STUN 服务器如何帮设备"找到彼此"?
为了让大家更易理解,我们用"打电话"的场景,结合 WebRTC 的通信流程,一步步拆解 STUN 服务器的工作过程,同时融入参考资料中信令交互的核心逻辑:
前提铺垫:为什么需要 STUN?
我们日常使用的网络,无论是家里的宽带、公司的内网,还是手机的移动数据,设备拿到的都是"内网 IP"------内网 IP 是局域网内的"专属地址",只能在同一个局域网内使用(比如家里的电脑和手机,用内网 IP 可以互相访问),但无法被外网设备直接访问。
当两个设备(比如设备 A 在家、设备 B 在公司)要通过 WebRTC 建立 P2P 连接时,它们都只有内网 IP,不知道对方的公网地址,就像两个人在不同的小区里,只知道自己的门牌号,却不知道小区的对外地址,根本无法联系上彼此。这时候,STUN 服务器就派上用场了。
STUN 工作流程(结合 WebRTC 通信)
假设设备 A 和设备 B 要通过 WebRTC 进行音视频通话,整个过程分为"获取公网地址"和"交换地址并建立连接"两步,其中 STUN 负责第一步,信令服务器(比如我们之前讲过的 WebSocket)负责第二步,具体如下:
-
设备 A(内网设备)向 STUN 服务器发送请求:"请告诉我,你看到的我的公网 IP 和端口是什么?"------此时,设备 A 只知道自己的内网 IP,不知道对外暴露的公网地址。
-
STUN 服务器收到请求后,会记录下"请求来源的公网 IP + 端口"------这个公网 IP 和端口,并不是设备 A 本身的,而是设备 A 所在的 NAT 设备(比如路由器)分配给它的"对外出入口",相当于小区的"对外大门地址 + 专属通道"。
-
STUN 服务器将记录的"公网 IP + 端口"返回给设备 A,设备 A 由此获取到自己对外暴露的公网地址(即 NAT 分配的地址)。
-
同理,设备 B(另一个内网设备)也会向 STUN 服务器发送请求,获取自己的公网 IP + 端口。
-
此时,设备 A 和设备 B 都有了自己的公网地址,但它们还不知道对方的公网地址------这时候,就需要"信令服务器"(比如 WebSocket)帮忙:设备 A 通过信令服务器,将自己的公网 IP + 端口(即 STUN 返回的信息)发送给设备 B;设备 B 也通过信令服务器,将自己的公网 IP + 端口发送给设备 A(这一步对应参考资料中的"信令交互",即 A、B 互相发送公网 IP + 端口的信令)。
-
设备 A 和设备 B 交换公网地址后,在 ICE 框架的协调下,尝试用彼此的公网地址建立 P2P 连接;连接建立成功后,WebRTC 就会接管实际的音视频传输工作,将摄像头、麦克风采集到的音视频数据,通过这条直接的 P2P 连接发给对方,实现实时通信。
关键补充:信令服务器的作用
这里需要特别注意:STUN 服务器只负责"帮设备获取自己的公网地址",不负责"交换地址";而 WebRTC 本身不提供"信令交互"功能------所谓信令,就是设备之间交换"连接所需信息"的过程(比如公网地址、音视频编码格式等)。
参考资料中反复提到 A、B 信令交互(互相发送公网 IP + 端口),而实现这种信令交互的,通常是我们之前讲过的 WebSocket 服务器------因为 WebSocket 支持客户端和服务器的双向实时通信,能快速传递信令信息,确保设备 A 和设备 B 能及时交换公网地址,为 P2P 连接的建立打下基础。
四、实现视频聊天的基本流程

- 服务端初始化(Spring Boot)
基于 Spring Boot 搭建服务端,集成 Netty 作为底层通信框架来保证高并发 IO 性能。
实现 WebSocket 服务,用于客户端与服务端的长连接,主要作用是:
转发双方的信令(SDP、ICE 候选信息)
作为用户进入 / 离开房间的通知通道
- 客户端连接与信令准备
客户端 A 和 B 分别通过 WebSocket 连接到服务端
双方都建立长连接,确保后续信令能实时传输。
获取公网 IP 和端口(STUN 服务器)
A 和 B 各自向 STUN 服务器发送请求,获取自己在 NAT 后的公网 IP 和端口,解决 P2P 穿透问题。
进入同一个房间
A 和 B 通过 WebSocket 向服务端发送 "加入房间" 请求,服务端将两者关联起来,后续信令只在这个房间内转发。
- WebRTC 信令交换
A 发起通话
A 调用 createOffer() 生成自己的 SDP Offer(包含音视频编码、网络等信息),并通过 WebSocket 发送给服务端。
服务端转发信令给 B
服务端将 A 的 SDP Offer 和公网信息转发给 B。
B 响应通话
B 收到后调用 setRemoteDescription() 保存 A 的 SDP,再调用 createAnswer() 生成自己的 SDP Answer,通过 WebSocket 发回服务端。
服务端转发响应给 A
服务端将 B 的 SDP Answer 和公网信息转发给 A,A 调用 setRemoteDescription() 保存 B 的 SDP。
ICE 候选信息交换
双方在收集到 ICE 候选(网络地址)后,通过 WebSocket 互相转发,直到找到一条可以直接通信的 P2P 链路。
- P2P 连接建立与音视频传输
当 ICE 候选交换完成,WebRTC 会自动建立一条 P2P 连接。
双方通过 getUserMedia() 获取摄像头和麦克风的音视频流。
音视频数据直接通过 P2P 连接传输,无需经过服务端,实现低延迟的实时通信。
- 通话结束
任意一方断开 WebSocket 连接或调用 close() 方法,服务端通知对方,双方释放资源,关闭音视频流和 P2P 连接。
五、总结:WebRTC 核心逻辑梳理
看到这里,相信大家已经理清了 WebRTC、ICE、STUN 以及信令服务器之间的关系,我们用一句话总结 WebRTC 实现实时音视频通信的核心逻辑:
WebRTC 是"主角",负责实现音视频数据的实时传输(建立 P2P 连接后直接接管传输);ICE 是"协调者",负责解决 NAT 穿透问题,统筹各种辅助工具;STUN 是"核心工具",负责帮内网设备获取公网 IP + 端口;信令服务器(如 WebSocket)是"桥梁",负责设备之间交换公网地址等信令信息,最终实现两个设备的点对点实时通信。
核心要点回顾
-
WebRTC:浏览器原生实时通信技术,无需插件,支持音视频通话、P2P 数据传输。
-
ICE:NAT 穿透框架,协调 STUN 等工具,帮助设备建立连接。
-
STUN:轻量级服务器,核心是帮内网设备获取公网 IP + 端口,解决"找不到彼此"的问题。
-
信令交互:通过 WebSocket 等服务器,实现设备之间公网地址的交换,是 P2P 连接建立的前提。