Skip to main content

2. Evolution from RFC 3489 (从RFC 3489的演进)

STUN最初定义在 RFC 3489 [RFC3489] 中。该规范有时被称为"经典STUN (classic STUN)",将自身表示为NAT穿透问题的完整解决方案。在该解决方案中,客户端会发现它是否在NAT后面,确定其NAT类型,发现其在最外层NAT公共侧的IP地址和端口,然后在协议体内(如会话发起协议 (Session Initiation Protocol, SIP) [RFC3261])使用该IP地址和端口。然而,自 RFC 3489 发布以来的经验发现,经典STUN根本无法作为可部署的解决方案充分工作。通过经典STUN学到的地址和端口有时可用于与对等方的通信,有时则不可用。经典STUN没有提供方法来发现它是否会实际工作,并且在它不工作的情况下也没有提供补救措施。此外,经典STUN的NAT类型分类算法被发现是有缺陷的,因为许多NAT不能清晰地归入那里定义的类型。

经典STUN还有一个安全漏洞——在某些拓扑和约束下,攻击者可以向客户端提供不正确的映射地址,而这在根本上无法通过任何加密手段解决。尽管本规范仍存在此问题,但通过使用更完整的、利用STUN的解决方案,现在可以缓解这些攻击。

由于这些原因,本规范废止 RFC 3489,转而将STUN描述为作为完整NAT穿透解决方案的一部分使用的工具。ICE [MMUSIC-ICE] 是基于提供/应答 (offer/answer) [RFC3264] 方法的协议(如SIP)的完整NAT穿透解决方案。SIP出站 (SIP Outbound) [SIP-OUTBOUND] 是用于SIP信令穿透的完整解决方案,它以非常不同的方式使用STUN。尽管协议可能能够单独使用STUN(经典STUN)作为穿透解决方案,但这里不描述此类用法,并且出于上述原因强烈不鼓励这样做。

本文描述的线上协议与经典STUN相比仅有轻微变化。该协议现在除UDP外还可以在TCP上运行。以更结构化的方式为协议添加了可扩展性。通过窃取 RFC 3489 中定义的128位事务ID (transaction ID) 的32位来添加魔术饼干 (magic cookie) 机制,用于将STUN与应用协议解复用,这允许该变化向后兼容。映射地址使用新的异或 (exclusive-or) 格式进行编码。还有其他一些较小的变化。更完整的列表请参见第19节。

由于范围的变化,STUN也从"通过NAT的UDP简单穿透 (Simple Traversal of UDP through NAT)"重命名为"NAT会话穿透工具 (Session Traversal Utilities for NAT)"。缩写仍然是STUN,这是人们唯一会记住的。