前言
一、STUN协议
STUN存在的目的就是进行NAT穿越。
什么是NAT穿越?
NAT穿越介绍
STUN协议详细介绍
1)Client A和Client B分别向STUN服务器发出请求,询问并注册自身的转换后地址。
2)STUN Server收到请求消息,产生响应消息,响应消息中携带请求消息的源端口,即Client A(B)在NAT上对应的外部端口,然后响应消息通过NAT发送给Client A(B)。
3)Client A将其在NAT上对应的外部地址和端口信息包含在消息中,发送给STUN Server请求要和Client B通讯。
4)STUN Server收到请求信息后,向A和B发送对方的NAT映射地址。
5)Client B接收到A的外部地址后,将A的外部地址作为目的地址发送Hole Punching UDP数据报,该数据报使得B端网络的NAT设备允许后续的以A端地址为源地址的UDP数据报进入其内部网络。
6)Client A接收到B的外部地址后,以B的外部地址为目的发送探测UDP数据报,同样该数据报也在A端网络的NAT设备上建立对应映射。
7)Client B收到Client A的探测数据报后,向A端发送确认数据报。至此,双方建立互通的UDP连接
RFC STUN规范有以下几种:
- RFC3489/STUN:
Simple Traversal of UDP through NAT - RFC5389/STUN
Session Traversal Utilies of NAT.(还可以使用TCP协议进行穿越)
二、STUN Header格式
magic cookie用来表明该消息是一个stun消息。
- 2个字节(16bit)message type类型。前2位必须是00,用来区分复用同一端口时的STUN协议。有两位用于分类,即C0和C1。剩下12位用来定义请求或者指示。
注意这里的0001,0101的位置。
如何判断请求成功还是失败呢?这就回到了我们上面说的C1 C0的判断。 - 2个字节(16bit)消息长度,不包括消息头。
- 4个字节(32bit) magic cookie. 固定值0x2112A442,通过他可以判断客户端是否可以支持某些属性。
- 12个字节(96bits)事务id,用来连接同一个事务的请求和响应
三、STUN Message Body
- 消息头后有0或多个属性
- 每一个属性进行TLV编码:type,length.value.
- RFC3489定义的属性
- 不同请求和响应中不同Attribute的使用,N/A表示没有使用,O表示Optional