STUN协议,P2P通信之前,我们需要进行检测以确认它们之间能否进行P2P通信以及如何通信。这种技术通常称为NAT穿透(NAT Traversal),常见STUN协议。
STUN,简单的用UDP穿透NAT和NAT会话穿透效用
- 英文全称是Simple Traversal of UDP Through NATs,即简单的用UDP穿透NAT,首先在RFC3489中定义,作为一个完整的NAT穿透解决方案。
- 英文全称是Session Traversal Utilities for NAT,即NAT会话穿透效用。RFC5389与RFC3489除了名称变化外,最大的区别是支持TCP穿透。
NAT对待UDP的实现方式有4种
- Full Cone NAT 完全锥形NAT
- Restricted Cone NAT 限制锥形NAT
- Port Restricted Cone NAT 端口限制锥形NAT,与限制锥形NAT很相似,只不过它包括端口号。
- Symmetric NAT 对称NAT,所有从同一个内网IP和端口号发送到一个特定的目的IP和端口号的请求,都会被映射到同一个IP和端口号。
STUN客户端与服务端
客户会配置STUN服务器提供者的域名,该域名被解析为IP地址和SRV(资源记录表)过程的端口号。服务器名是“stun”,使用UDP协议发送捆绑请求,使用TCP协议发送共享私密请求。STUN协议的缺省端口号为3478。
三种STUN用途
STUN客户端可以使用DNS来发现STUN服务器的IP地址和端口。客户端必须知道服务器的域名。
STUN协议允许客户端请求服务器从收到捆绑请求的IP地址往回发捆绑响应,但是要使用不同的端口号。这可以用来检查客户端是否在Port Restricted Cone NAT的前面还是在Restricted Cone NAT的前面。
- Interactive Connectivity Establishment(ICE)[MMUSIC-ICE],交互式连接建立
- Client-initiated connections for SIP [SIP-OUTBOUND],用于SIP的客户端初始化连接
- NAT Behavior Discovery [BEHAVE-NAT],NAT行为发现
TURN 使用中继穿透NAT或STUN的中继扩展
首先在RFC5766中定义,英文全称是Traversal Using Relays around NAT:Relay Extensions to Session Traversal Utilities for NAT,即使用中继穿透NAT:STUN的扩展。简单的说,TURN与STUN的共同点都是通过修改应用层中的私网地址达到NAT穿透的效果,异同点是TURN是通过两方通讯的“中间人”方式实现穿透。
如果一个主机位于NAT的后面,在某些情况下它不能够与其他主机点对点直接连接。在这些情况下,它需要使用中间网点提供的中继连接服务。TURN协议就是用来允许主机控制中继的操作并且使用中继与对端交换数据。TURN与其他中继控制协议不同的是它能够允许一个客户端使用一个中继地址与多个对端连接。
TURN协议被设计为ICE的一部分,用于NAT穿越,虽然如此,它也可以在没有ICE的地方单独使用。
ICE
ICE的全称Interactive Connectivity Establishment(互动式连接建立),由IETF的MMUSIC工作组开发出来的,它所提供的是一种框架,使各种NAT穿透技术可以实现统一。ICE跟STUN和TURN不一样,ICE不是一种协议,而是一个框架(Framework),它整合了STUN和TURN。
如果主机A与主机B通信,业务场景与通信过程
如果A想与B通信,那么其过程如下:
1)A收集所有的IP地址,并找出其中可以从STUN服务器和TURN服务器收到流量的地址;
2)A向STUN服务器发送一份地址列表,然后按照排序的地址列表向B发送启动信息,目的是实现节点间的通信;
3)B向启动信息中的每一个地址发送一条STUN请求;
4)A将第一条接收到的STUN请求的回复信息发送给B;
5)B接到STUN回复后,从中找出那些可在A和B之间实现通信的地址;
6)利用列表中的排序列最高的地址进一步的设备间通信。
ICE技术是建立在多种NAT穿透协议的基础之上,并且提供了一个统一的框架,所以ICE具备了所有这些技术的优点,同时还避免了任何单个协议可能存在的缺陷。因此,ICE可以实现在未知网络拓扑结构中实现的设备互连,而且不需要进行对手配置。另外,由于该技术不需要为VoIP流量手动打开防火墙,所以也不会产生潜在的安全隐患。
学习总结
本文主要对入门P2P通信技术下NAT穿透做了一个宏观知识网络的形成。
在现实Internet网络环境中,大多数计算机主机都位于防火墙或NAT之后,只有少部分主机能够直接接入Internet。很多时候,我们希望网络中的两台主机能够直接进行通信(即所谓的P2P通信),而不需要其它公共服务器的中转。由于主机可能位于防火墙或NAT之后,在进行P2P通信之前,我们需要进行检测以确认它们之间能否进行P2P通信以及如何通信。这种技术通常被称为NAT穿透(NAT Traversal)。
RFC3489中定义的STUN,即简单地用UDP穿过NAT(STUN)是个轻量级的协议。它允许应用发现它们与公共互联网之间存在的NAT和防火墙及其他类型。它还为应用提供判断NAT给它们分配的公共网际协议(IP)地址。STUN可工作在许多现存NAT上,并且不需要它们做任何特别的行为。它允许广泛的各类的应用穿越现存的NAT设施。
RFC5389中对STUN协议进行了修订,将其定位于为穿透NAT提供工具,即NAT会话穿透效用是一个用于其他解决NAT穿透问题协议的协议。它可以用于终端设备检查由NAT分配给终端的IP地址和端口号。同时,它也被用来检查两个终端之间的连接性,好比是一种维持NAT绑定表项的保活协议。STUN本身并不是一种完整的NAT穿透解决方案。它相当于是一种NAT穿透解决方案中的工具。这是与先前的版本相比最重要的改变。之前的RFC3489中定义的STUN是一个完整的穿透NAT解决方案。此外,最大的区别是支持TCP穿透。
RFC5766中对STUN协议再次进行了扩展,即中继穿透NAT:STUN的扩展。TURN与STUN的共同点都是通过修改应用层中的私网地址达到NAT穿透的效用,异同点是TUN采用了两方通讯的“中间人”方式实现穿透,突破了原先STUN协议无法在两台主机不能够点对点直接连接下提供作用的限制。
NAT穿透技术仍在不断更新中,这里只对STUN/TURN协议作了简单的介绍,具体细节请参考RFC3489/5389/5766。