由人工编写审核,非AI生成内容,请放心观看!
{getToc} $title={文章目录}
## 什么NAT 类型
特征 | P2P 穿透难度 | |
---|---|---|
Full Cone NAT(完全锥型) | 内网任意端口映射到固定公网 IP:端口,外部任意主机都能访问这个映射。 | 容易穿透 |
Restricted Cone NAT(限制锥型) | 外部主机只有在曾经被内网主机发送过数据的情况下才能访问该映射。 | 中等难度 |
Port Restricted Cone NAT(端口限制锥型) | 外部主机必须使用之前通信的 IP+端口 才能访问该映射。 | 较难穿透 |
Symmetric NAT(对称 NAT) | 每个外部目标 IP:端口 映射不同的公网端口,严格限制外部访问。 | 非常难穿透,通常需要 TURN 中继 |
stun stun.l.google.com
STUN client version 0.97
Primary: Independent Mapping, Independent Filter, random port, will hairpin
Return value is 0x000002
stun stun.l.google.com -v
........
Received stun message: 32 bytes
MappedAddress = 117.90.172.248:42163
Received message of type 257 id=2
Received stun message: 32 bytes
MappedAddress = 117.90.172.248:42163
Received message of type 257 id=3
Received stun message: 32 bytes
MappedAddress = 117.90.172.248:42163
Received message of type 257 id=2
Received stun message: 32 bytes
MappedAddress = 117.90.172.248:42163
Received message of type 257 id=3
test I = 1
test II = 1
test III = 1
test I(2) = 0
is nat = 1
mapped IP same = 1
hairpin = 1
preserver port = 0
Primary: Independent Mapping, Independent Filter, random port, will hairpin
Return value is 0x000002
## NAT 设置 什么是 NAT 穿透?
NAT(Network Address Translation,网络地址转换):家庭路由器、公司网关常用的机制,把内网的私有 IP(例如 192.168.x.x)映射到公网 IP。
这样做的结果是:外部主机无法直接知道、也无法主动连接到你在内网的设备。
NAT 穿透就是想办法让两个都在 NAT 后面的设备,能够点对点(P2P)直接通信,比如 WebRTC 里的语音、视频通话。
## STUN 服务器的作用
STUN(Session Traversal Utilities for NAT):是一种协议,客户端通过向 STUN 服务器发送请求,得到自己在公网的 映射 IP 和端口。简单说,STUN 告诉你:在外网别人看到的你是谁(公网地址+端口),从而帮助两端设备建立点对点连接。
## 为什么要用 Google 的 STUN?
这些服务器分布全球,稳定性和可用性高。
对于开发者来说,配置 WebRTC 的 ICE(交互式连接建立)时,可以直接使用 Google 的 STUN,而不用自己搭建服务器。
## 使用常见举例子:
- 浏览器 A 向 STUN 服务器请求公网映射地址。
- 浏览器 B 也向 STUN 请求公网映射地址。
- 双方通过信令服务器交换这些地址。
- ICE 算法尝试直接 P2P 连接。
TURN 数据中继:
当两个通信方(通常是WebRTC客户端)由于位于不同的网络、受制于防火墙或存在复杂的NAT时,它们无法直接建立连接。TURN 服务器就像一个中介,接收一个客户端的数据,并将其转发给另一个客户端,从而完成数据传输。{alertInfo}
## google STUN 服务器
- stun.l.google.com 有地址 74.125.192.127
- stun1.l.google.com 有地址 172.217.192.127
- stun2.l.google.com 有地址 142.250.15.127
- stun3.l.google.com 有地址 108.177.15.127
- stun4.l.google.com 有地址 108.177.119.127
## WebRTC
WebRTC(Web 实时通信)是一套标准的开放源代码项目,它允许Web 浏览器和移动应用程序之间进行点对点(P2P)的音视频通信和任意数据传输,无需用户安装额外的插件或软件。WebRTC 主要通过JavaScript API 来实现。## 参考文章
## 实际用处
1)基于 WebRTC 的应用 / 服务
示例: 浏览器直接 P2P 的视频/语音应用、Whereby、许多嵌入式网页视频组件。
工作方式: WebRTC 使用 ICE 流程(STUN 用于候选地址发现;TURN 用作中继回退)。当双方能直连时采用 P2P;无法直连时使用 TURN 中继。
服务器作用: 信令服务器交换 SDP/ICE,STUN 提供反射地址,TURN 作中继。STUN/TURN 本身不负责持久保存媒体。
2)Jitsi Meet
工作方式: 1:1 时可以 P2P;多方通常走 SFU(Jitsi Videobridge)。使用 STUN/TURN 做 NAT 穿透;无法直连时用 TURN。
注意: 使用 SFU 时媒体经过服务器转发,但这不是长期备份。
3)WebTorrent / BitTorrent
工作方式: 纯 P2P 文件分发。WebTorrent 在浏览器侧使用 WebRTC 数据通道(因此会涉及 STUN/ICE/TURN);传统 BitTorrent 客户端使用 TCP/UDP 打洞、tracker/DHT 做发现。
服务器作用: tracker/DHT 仅保存索引信息,文件数据在 peers 之间。
4)P2P 同步/传输工具
Resilio Sync(BitTorrent Sync): P2P 文件同步,使用打洞,必要时走中继。
Syncthing: P2P 文件同步,使用全局发现和打洞,必要时回退到中继。
5)去中心化消息/语音项目
Tox(qTox/uTox): 使用 UDP 打洞 / NAT 穿透,目标是直接 P2P 消息与通话;使用 DHT 之类的引导。
Briar / Matrix: Briar 是面向直接 P2P 的(基于 Tor/Bluetooth/Wi‑Fi Direct);Matrix 则是联邦式客户端-服务器模型(不是 P2P),但其 VoIP 部分可能采用 WebRTC。
6)用于构建 P2P 的库 / 技术栈
前端 JS: simple-peer, peerjs, 直接使用 WebRTC API(RTCPeerConnection)。
原生库: libnice(ICE 实现)、pjnath/pjlib(PJSIP)、coturn(TURN 服务实现)、libwebrtc(Google 的实现)。
基础设施: STUN 服务与 TURN 服务(coturn 等)主要是网络穿透/中继基础设施,不是备份存储。
7)VPN / 虚拟 LAN / 网状覆盖(类似 P2P 的传输)
ZeroTier、Tailscale(基于 WireGuard)、Nebula: 优先尝试直接连通,无法直连时使用中继/relay(实现方式与 STUN/TURN 类似但协议不同)。
工程要点(总结)
STUN 只做地址发现,TURN 做中继;两者都不是备份服务。
P2P 并不等同于“无服务器”:一般仍需信令/发现服务器和(必要时的)中继。
服务器是否保存数据 取决于产品策略:默认情况下 TURN/中继只做短时转发,不作为持久备份;只有用户开启云录制或上传才会产生持久存储。