STUN原理

在点对点(P2P)网络环境中,参与者需能够互相直接连接,但网络地址转换(NAT)的存在常常阻碍了这种直接连接的建立,这对P2P应用的正常运作构成了挑战。会话穿越工具协议(STUN)是一种广泛采用的技术,旨在解决NAT对P2P应用的影响。STUN协议使得网络设备能够识别它们经由NAT设备映射后的公网IP地址和端口号,并利用这些信息在两个P2P节点间建立一个数据通道,使它们能够跨越NAT设备进行通信。

为何STUN至关重要?

随着IPv4地址资源的日益紧张,NAT的部署变得更加普遍。NAT在解决IP地址不足的同时,也增强了网络安全,通过阻止外部网络的未经请求的流量进入内部网络。然而,NAT同时也打破了P2P网络的点对点通信模型,因为P2P通信要求每个节点都能够主动建立连接。

为了克服NAT对P2P网络的限制,开发了多种NAT穿越技术,包括反向链接、应用层网关(ALG)、打洞技术以及中间件方法。

STUN(Session Traversal Utilities for NAT)是一种在RFC标准中定义的协议,它能够探测NAT的存在,并帮助获取经NAT映射的IP地址和端口号。通过STUN,可以在两个P2P节点间建立一条穿越NAT的连接,这个过程也常被称作“打洞”。STUN的优势在于它不要求对现有的NAT设备进行任何修改,仅需要在网络中部署一个STUN服务器即可轻松实现。

STUN服务器/客户端

STUN遵循客户端/服务器模型,包括STUN服务器和STUN客户端两部分:

STUN服务器:这是一个在公网上运行的实体,例如路由器或者专用服务器,负责接收STUN绑定请求并发送STUN绑定响应。
STUN客户端:这是一个在私网内运行的实体,负责发送STUN绑定请求并接收STUN绑定响应。

STUN典型组网

STUN的工作机制

STUN协议通过在STUN客户端和STUN服务器之间交换消息来探测NAT,并建立数据通道。STUN的消息交换过程包括NAT探测和打洞两个阶段,具体如下:

NAT探测阶段:

  • STUN客户端向STUN服务器发送绑定请求(Binding Request)。
  • STUN服务器接收请求并发送绑定响应(Binding Response),携带MAPPED-ADDRESS、XOR-MAPPED-ADDRESS和RESPONSE-ORIGIN等属性。
  • STUN客户端通过比较绑定响应中的地址属性和原始请求的源地址,确定是否存在NAT,并将结果反馈给应用。

打洞阶段:

  • STUN客户端向服务器请求其它STUN客户端的接口信息。通过交换NAT映射的地址信息来尝试建立直接的P2P连接。
  • 客户端交替发送绑定请求,以在各自的NAT设备上创建会话表项。
  • 当两端的NAT设备都建立了会话表项后,P2P通信可以直接进行,无需通过STUN服务器。
  • 这种方法允许P2P节点之间在NAT的干扰下也能够建立稳定的通信链路,从而使P2P应用能够在各种网络环境下正常运作。