2. 从 RFC 3489 演进 (Evolution from RFC 3489)
STUN 最初在 RFC 3489 [RFC3489] 中定义. 该规范有时被称为 "classic STUN", 并将自身表述为 NAT 穿越问题的完整解决方案. 在该方案中, 客户端会发现自己是否位于 NAT 后方, 确定其 NAT 类型, 发现其在最外层 NAT 公网侧的 IP 地址和端口, 然后在协议正文中使用该 IP 地址和端口, 例如 Session Initiation Protocol (SIP) [RFC3261]. 然而, RFC 3489 发布以来的经验表明, classic STUN 的效果不足以成为可部署的解决方案. 通过 classic STUN 学到的地址和端口有时可用于与对等方通信, 有时则不可用. classic STUN 无法发现它实际上是否可用, 并且在不可用时也没有补救手段. 此外, classic STUN 用于 NAT 类型分类的算法被证明存在缺陷, 因为许多 NAT 无法清晰地归入其中定义的类型.
classic STUN 还存在一个安全漏洞 -- 在某些拓扑和约束条件下, 攻击者可以向客户端提供错误的映射地址, 而这个问题从根本上无法通过任何密码学手段解决. 尽管本规范中该问题仍然存在, 但现在可通过使用更完整且利用 STUN 的解决方案来缓解这些攻击.
基于这些原因, 本规范废止 RFC 3489, 并改为将 STUN 描述为完整 NAT 穿越解决方案的一部分所使用的工具. ICE [MMUSIC-ICE] 是面向基于 offer/answer [RFC3264] 方法的协议的完整 NAT 穿越解决方案, 例如 SIP. SIP Outbound [SIP-OUTBOUND] 是 SIP 信令穿越的完整解决方案, 并以一种非常不同的方式使用 STUN. 尽管某个协议可能能够单独使用 STUN (classic STUN) 作为穿越解决方案, 但此类用法不在本文档中描述, 并且基于上述原因强烈不建议采用.
本文描述的线上协议 (on-the-wire protocol) 相比 classic STUN 只做了少量修改. 该协议现在除 UDP 外也运行在 TCP 之上. 协议以更结构化的方式加入了可扩展性. 通过从 RFC 3489 定义的 128-bit transaction ID 中取出 32 bit, 加入了用于在 STUN 与应用协议之间进行解复用的 magic cookie 机制, 从而使该变化具备向后兼容性. 映射地址使用新的 exclusive-or 格式进行编码. 还有其他一些较小的修改. 更完整的列表见 Section 19.
由于范围发生变化, STUN 也已从 "Simple Traversal of UDP through NAT" 更名为 "Session Traversal Utilities for NAT". 缩写仍为 STUN, 毕竟大家真正记住的也正是这个缩写.