


























STUN 服务器是帮助浏览器发现自己的公网 IP 和端口,并判断 NAT 类型的服务。它是 WebRTC P2P 能够“打洞”成功的核心基础设施。
你在家上网时,设备被分配的是内网 IP(比如 192.168.1.5)。当你想跟洛杉矶的朋友直连,你需要知道:“在公网上,别人看到我的地址是什么?”
STUN 就像是一个“镜子服务器”:
浏览器 A:“STUN 服务器,告诉我,在你眼里我长什么样?”
STUN:“我看到的你是 203.0.113.45:52134,你的 NAT 类型是锥形。”
浏览器 A:“好,我把我这个公网身份告诉信令服务器,让 B 来连我。”
如果没有 STUN,浏览器没法知道自己的公网地址,P2P 直连就无从谈起。
在 WebRTC 的配置里,STUN 服务器是这样设置的:
const peerConnection = new RTCPeerConnection({
iceServers: [
{
urls: 'stun:stun.l.google.com:19302' // Google 的免费 STUN
}
]
})
只需要这样一行,浏览器就会自动在建立连接时查询 STUN,获取自己的公网地址。
常用的免费 STUN 服务器:
stun:stun.l.google.com:19302(Google)stun:stun1.l.google.com:19302stun:stun.cloudflare.com:3478(Cloudflare)| 对比维度 | STUN 服务器 | TURN 服务器 |
|---|---|---|
| 作用 | 告诉浏览器“你的公网地址是什么” | 当 P2P 打洞失败时,中转数据 |
| 数据流 | 不传数据,只回答一个问题 | 传输数据,所有流量经过它 |
| 成本 | 几乎免费,轻量 | 贵,需要带宽和服务器性能 |
| 成功率 | 配合其他机制,85%-92% 的 P2P 能建立 | 兜底方案,100% 能连,但走中转 |
一个完整的 WebRTC ICE 配置通常同时配 STUN 和 TURN:
const peerConnection = new RTCPeerConnection({
iceServers: [
{ urls: 'stun:stun.l.google.com:19302' }, // 免费 STUN
{
urls: 'turn:turn.example.com:3478', // 自建或付费 TURN
username: 'user',
credential: 'password'
}
]
})
这里有一个很关键的认知:STUN 服务器也是服务器。虽然它极轻量、不传数据、只回答一个查询,但它依然需要一个公网可达的地址来提供服务。
所以,即使你用了 WebRTC + STUN 实现 P2P 直连,你依然依赖 STUN 服务器的存在。只不过这个服务器:
这是你之前在追求“完全不依赖服务器”时遇到的那个“最后一公里”——STUN 是必须有的,但它已经是你能找到的代价最小、最无感的“服务器”了。
之前聊到 Bugout 和 WebRTC 方案时,底层其实都在用 STUN。当你写 new RTCPeerConnection() 时,浏览器默认就会用自己的 STUN 服务器列表去查询公网地址。
所以整个链路是:
这样,你们的数据真正实现了端到端直传,而 STUN 这个“服务器”只在最初帮了你们一把。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。