 
            ICE、STUN、TURN:从候选到连通
目标:当两台设备位于局域网或各自的 NAT 背后时,弄清“连接”是怎样被提出、验证并最终确定的;能够用自己的话说明 ICE 的流程、STUN 的作用,以及在何种网络策略下 TURN 变为必需。
一、问题的根:为什么想“直连”,常常并不容易
- 家用/办公路由器广泛使用 NAT(网络地址转换),私有地址(如 - 192.168.*.*、- 10.*.*.*)不会直接暴露到公网。
- 彼此只看到对方的私有地址,很难从“外部”精确抵达目标主机。 
- 在 对称型 NAT 或 企业级防火墙 等严格策略下,来自陌生来源的探测与进入会被拦截。 
因此,问题不只是“我在哪”,还包括“哪些入口能被对方可靠访问”。这正是 ICE / STUN / TURN 的分工所在。
二、ICE 的主线:候选收集 → 连通性检查 → 提名
把 ICE(Interactive Connectivity Establishment) 想象成“连接建立期的协调员”。它不搬运业务数据,专注于三件事:
- 收集候选(Candidates) 
- Host 候选:本机局域网地址。 
- Server-Reflexive 候选:通过 STUN 获取到的“外部视角下的我”的地址与端口映射。 
- Relayed 候选:向 TURN 服务器申请的中继地址。 
- 连通性检查(Connectivity Checks) 
- 双方把可配对的候选做成“候选对”,逐一发送探测包。 
- 有明确的 优先级:通常“越直接越优先”。同一局域网内 Host↔Host 往往率先打通且延迟最低。 
- 路径提名(Nominated Pair) 
- 一旦某个候选对在检查中稳定通过,ICE 即提名其为最终工作路径,后续媒体/数据流走这条。 
要点:能直连就不绕路。ICE 不偏袒任何一方,谁延迟更低、质量更稳,就让谁上场。
三、STUN 的角色:让“外部可见的你”不再是谜
STUN(Session Traversal Utilities for NAT) 的功能很专一: 当终端在 NAT 后面时,请求 STUN 即可得到“公网看见的我的 IP:Port”(即 server-reflexive 候选)。
- STUN 不转发业务数据、也不加密;它只是给 ICE 多一条“可尝试的入口”。 
- 在策略宽松的 NAT(如 Full-Cone、Restricted-Cone)下,双方凭 server-reflexive 地址常能打洞直连。 
- 若双方同处一网段,Host↔Host 往往已足够;STUN 的意义更多在于“跨网段时提供外部路径的可能性”。 
四、TURN 的角色:当直连被策略彻底否决时
有些网络极为严格: 对称型 NAT / 企业防火墙 会拒绝“未登记来源”的探测与入站流量,即便彼此知道对方的公网映射,直连也会失败。此时需要 TURN(Traversal Using Relays around NAT):
- 双方主动与 TURN 建立连接,数据改走 “终端 A → TURN → 终端 B”。 
- 代价是多一跳,意味着更高延迟与带宽开销;因此 TURN 是兜底而非首选。 
简言之:TURN 不是“加速”,而是“保底连上”。
五、把流程串成一张“形成记忆”

阅读要领:主线始终是 先直连、后中继;STUN 提供外部入口的可能性;TURN 在“直连被政策否决”时确保连接仍然可用。
六、网络策略与可能结果(速览表)
核心认知:很多时候“技术可行”,但“策略不允许”。先判断谁在做决策(NAT/防火墙),再讨论路径方案。
七、自我检验(用自己的话说出来)
- 复述 ICE 的三步:候选收集 / 连通性检查 / 路径提名。 
- 解释为何同一 Wi-Fi 下 Host↔Host 通常最优。 
- 说出在何种策略下,拿到 server-reflexive 仍无法直连,以及此时为何必须 TURN。 
- 画一张你自己的流程小图,用不同颜色标出 Host / STUN / TURN 的尝试顺序。 
八、收束
- ICE:连接建立期的协调员,按优先级逐一验证候选,选用可达且代价最低的那条。 
- STUN:告知“外部可见的自己”,为直连创造机会。 
- TURN:当直连被严格策略否决时,提供不中断的兜底路径,但成本更高。 
当你能把这条主线顺下来,ICE/STUN/TURN 就真正“连成体系”了。
 
            
        