STUN TURN ICE
STUN
STUN 协议为终端提供一种方式能够获知自己经过 NAT 映射后的地址,从而替代位于应用层中的私网地址,达到 NAT 穿透的目的。STUN 协议是典型的 Client-Server 协议,各种具体应用通过嵌入 STUN 客户端与 STUN Server 端通讯来完成交互。
在典型的运用 STUN 进行 NAT 穿透的场景中,STUN 客户端首先向位于公网上的 STUN 服务器 发送 Binding Request 消息,STUN 服务器接收到请求消息后识别出经过 NAT 转换后的公网地址 60.1.1.1:12345,将其附加在 Binding Response 消息中返回给客户端。客户端得到这个地址 后用它替换 SDP 中的私网地址与终端 B 完成媒体协商。使用 STUN 进行 NAT 穿透对应用的要 求是必须使用同样的端口与 STUN 服务器交互和进行应用层通讯,比如当希望使用端口 37000 进行 RTP 包的 NAT 穿透时,必须同样使用 37000 端口与 STUN 服务器通讯,否则从 STUN 服务器获得的 NAT 映射后的地址一般与实际地址时不一样的。另一个要求是 STUN 客户端与 服务器端的通讯和应用使用获得的 NAT 映射地址进行应用层通讯在时间上必须有连贯性, 这源于 NAT 设备建立的绑定有生存时间,当原绑定消亡后,NAT 设备为同一个私网地址建 立的新绑定往往不同,因此转换后的公网地址是不同的。
STUN 方案的特性如下表:
| 特性 | 说明 |
|---|---|
| 实现复杂度 | 实现简单 |
| TCP 穿透支持 | 不支持 |
| 对现有设备的要求 | 要求客户端支持,对现有 NAT 设备无改动要求,需增加 STUN 服务器 |
| 可扩展性 | 可扩展性好,与具体协议无关 |
| 安全性 | 一般 |
| 健壮性 | 差,不支持 symmentric 型 NAT |
| 其他 | 支持自动检测 NAT 类型,使用户即使在使用 STUN 协议无法实现 NAT 穿透时还可以根据 NAT 类型自主选择其他可使用的 NAT 穿透方案 |
TURN
TURN 解决 NAT 穿透的思路与 STUN 类似,都是通过修改应用层中的私网地址达到 NAT 穿透。 与 STUN 不同的是,TURN 是通过两方通讯的“中间人”的方式实现穿透,在这种方式下, 要进行通讯的两方分别与位于公网上的 TURN 服务器建立各自的连接进行通讯,由服务器负 责在两方之间进行数据转发。要达到这个目的,实现 TURN 客户端的终端必须在通讯开始前 与 TURN 服务器进行交互,得到服务器为其临时分配的位于 TURN 服务器上的公网地址,客户端使用它替换位于应用层中的私网地址。
TURN 方案的特性如下表:
| 特性 | 说明 |
|---|---|
| 实现复杂度 | 难于实现。TURN 的安全性设计增加终端设置的复杂度 |
| TCP 穿透支持 | 支持 |
| 对现有设备的要求 | 对现有 NAT 设备无要求,要求客户端支持,需增加 TURN 服务器 s |
| 可扩展性 | 可扩展性好,与具体协议无关 |
| 安全性 | 一般 |
| 健壮性 | 好,支持所有类型的 NAT |
| 其他 | 与 P2P 穿透方式相比,性能时 relay 穿透方式的弱点。另外 TURN 无法实现负载分担,解决的方式是把 media relay 服务器的分配工作放在 SIP proxy 完成 |
ICE
与 STUN 和 TURN 相比,ICE 并非是解决 NAT 穿透问题的协议,而是一个框架,在这个框架中, 可以整合其他现存的 NAT 穿透协议,如 STUN、TURN、RSIP 等。区别于其他的 NAT 穿透解 决方案,ICE 是一种探索和更新式的解决方案,通过搜集自身和对端尽可能多的网络信息(各种网络地址),尝试在这些地址间建立数据通道,并在这一过程中不断更新先前收集到的信息,从而找出和选择能够进行 NAT 穿透的数据通道。
ICE 方案的特性如下表:
| 特性 | 说明 |
|---|---|
| 实现复杂度 | 一般 |
| TCP 穿透支持 | 支持 |
| 对现有设备的要求 | 对 NAT 设备无要求,支持所有类型的 NAT 设备。客户端必须支持,网路结构中需增加 STUN/TURN 服务器 |
| 可扩展性 | 可扩展性好,与具体协议无关 |
| 安全性 | 较好 |
| 健壮性 | 好,适用与所有 NAT 及 NAT 拓扑类型,且由于存在中继服务器,NAT 穿透一般总是能成功 |
| 其他 |
参考资料
-
No backlinks found.