不经过服务器,两个人怎么直接通话?
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
今天,用对讲机的故事,来讲讲浏览器里的 P2P 通信。 从打电话说起传统电话是怎么打的?想象一下,你要给远在北京的朋友打电话。 传统电话的流程是这样的: 所有的声音数据,都要经过电话交换机的"总机"。如果总机挂了,所有人都会断线。 这有什么问题?
如果不想经过总机呢?有一种设备叫对讲机: 你 ════════════ 朋友 按住按钮说话 松开按钮听对方说 对讲机不需要任何中间设备,两个人可以直接通话。 那如果把这个概念搬到互联网上呢? P2P:互联网上的"对讲机"什么是 P2P?P2P(Peer to Peer)= 点对点直连。 简单说,就是两个人直接交换数据,不经过中间服务器: 就像两个人用两根竹竿直接连起来——敲敲竹竿,对方就能听到。 P2P 的优势
WebRTC:浏览器里的 P2P 神器什么是 WebRTC?WebRTC(Web Real-Time Communication)= 网页实时通信。 它是浏览器内置的 P2P 通信 API,让网页可以直接进行音视频通话、数据传输,不需要安装任何插件。 WebRTC 能做的事: ┌───────────────────────────────┐ │ 📞 视频通话 - 像微信视频一样 │ │ 📁 文件传输 - P2P 传大文件 │ │ 🎮 游戏数据 - 实时对战游戏 │ │ 📝 实时协作 - 白板、文档协作 │ └───────────────────────────────┘ WebRTC 核心 APIWebRTC 有三个核心 API:
举个好理解的例子: 三个人要视频通话,就像这样分工: 兼容性
P2P 的难点:NAT 是什么?故事:为什么找不到你?假设你想和朋友 P2P 通话,你知道朋友的电脑 IP 是 发不到。 因为 🏢 大楼前台 = NAT(网络地址转换) 你的房间号:888(内网 IP:192.168.1.100) 前台改成了:大厅 555(公网 IP:118.123.45.67) 外面的人只知道大厅 555,怎么知道你在 888 房间? NAT 就像一堵墙,挡住了外面的人直接找到你。 NAT 的四种类型NAT 有四种"严格程度",就像不同的前台规则:
对称型 NAT 最难穿透,因为 STUN 探测出来的地址,换个人可能就用不了了。 解决方案:STUN / TURN / ICESTUN:探测自己在外的"长相"STUN = NAT 会话遍历工具。 它的作用很简单:告诉你,你在外面看起来是什么地址。 就像你问前台:"我在外面看起来是多少号?" STUN 是怎么工作的?
STUN 能解决什么问题?
TURN:最后的"中转站"TURN = 通过中继绕过 NAT。 当 STUN 穿透失败时,TURN 服务器充当中转站: 用户A ────> TURN 服务器 <───> 用户B 数据中转 ⚠️ TURN 只是保底方案,所有数据都要经过它,会产生带宽成本——就像打电话都要经过总机一样。 ICE:自动选择最优方案 ICE = 交互式连接建立。 WebRTC 会同时尝试多种连接方式,自动选择最优的:
简单说:能直连就直连,不能直连就穿透,穿不透就中转,WebRTC 自动搞定一切。信令机制:通话前的"暗号交换"好,现在假设 A 和 B 都知道对方的公网地址了。 可以直接打电话了吗? 还不行。 在真正通话之前,他们还需要交换一些"暗号"——比如用什么编码、怎么加密等。这个交换"暗号"的过程,就叫做信令(Signaling)。 Offer 和 Answer 是什么?Offer 和 Answer 里装的是 SDP(Session Description Protocol,会话描述协议)。 SDP 就是一份"自我介绍清单": SDP 包含的内容: ├── 我支持什么音视频编码?(H.264、VP8、VP9、OPUS...) ├── 我的音视频轨道信息(有几路视频、几路音频) ├── 我的网络地址候选(IP:端口) ├── 带宽限制(最多能用多少带宽) └── 安全加密方式(用什么加密算法)
信令交换流程💡 WebRTC 没有定义信令服务器——你可以用 WebSocket、HTTP、甚至 Email,什么方式都行。因为信令只是"暗号",不需要特殊协议。 核心代码:最小示例WebRTC 代码比较复杂,这里展示最核心的部分:
const pc = new RTCPeerConnection({ iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] }); 这行代码做了三件事:
2. 交换 Offer/Answer这里的关键是:
3. 处理 ICE 候选ICE 候选就是"候选的网络地址",可能来自 STUN 探测,也可能来自 TURN 分配。
DataChannel:不仅仅是通话WebRTC 不只能传输音视频,还能传输任意数据。 DataChannel 和 WebSocket 的区别
举个例子:
DataChannel 能做什么
总结WebRTC 连接流程代码高亮:
完整流程: ┌──────────────────────────────────────┐ │ 1. 双方交换公网地址(STUN 探测) │ │ 2. 交换 Offer/Answer(SDP 信令) │ │ 3. 交换 ICE 候选 │ │ 4. NAT 穿透建立连接 │ │ 5. 开始 P2P 传输 │ └──────────────────────────────────────┘ 为什么 WebRTC 延迟低?
使用建议写在最后现在你知道了:
下次你用微信视频时,可以想想:这么低的延迟,背后就是 P2P 和 WebRTC 在起作用——两个人就像拿着对讲机,直接喊到对方。 阅读原文 该文章在 2026/5/8 9:03:28 编辑过 |
关键字查询
相关文章
正在查询... |