1、STUN协议概述
STUN(Session Traversal Utilities for NAT)NAT会话穿透工具,STUN是一个Client/Server协议,支持请求/响应类型、指示类型两种类型。STUN作为ICE(Interactive Connectivity Establishment,交互式连接建立)解决方案的一种工具使用,STUN协议本身没有穿透等能力,只是为穿透提供反射地址,穿透不成功时,需要使用TURN协议。
1.1 请求/响应类型(request/response)
由客户端给服务器发送请求,并等待服务端返回响应,用于确定一个NAT给客户端分配的具体绑定。客户端通过事务ID将请求响应连接起来。
1.2 指示类型(indication transaction)
由服务器或者客户端发送指示,另一方不产生响应,用于保持绑定的激活状态。
2、STUN交互过程
2.1 交互过程
(1)在WebRTC中,STUN客户端内置在浏览器用户代理中,在会话建立之前,先发送stun测试报文,以便浏览器确定其是否位于NAT之后并发现映射地址和端口。
(2)当STUN服务器收到STUN Binding请求时,它会记录Binding请求来自哪个IP地址和端口号,此地址和端口号随后将以STUN Binding响应的形式返回客户端。(通过XOR-MAPPED-ADDRESS属性)。
(3)客户端将响应中发来的IP地址和端口与其发送的IP地址和端口进行比较,以此来判断客户端和服务器之间有没有NAT,若不同,则说明至少有一个NAT,客户端能够识别由最外层的NAT分配的IP地址和端口。存在多个NAT时,STUN只能识别最外层NAT的相关信息。
(4)STUN服务器将源传输地址复制到STUN Binding响应中XOR-MAPPED-ADDRESS属性中,并将绑定响应发送回STUN客户端。当这个数据包通过NAT返回时,NAT将修改IP报头中的目的传输地址,但是STUN响应主体中XOR-MAPPED-ADDRESS属性中的传输地址将保持不变。通过这种方式,客户端可以了解最外面的NAT相对于STUN服务器分配的反射传输地址。
2.2 保活机制
在ICE中,STUN协议用于连通性检查和ICE保活,客户端需要按固定间隔以指示形式发送STUN Binding请求,防止NAT映射超时,指示型请求可使NAT重置其UDP定时器,发送间隔短于NAT UDP定时器设置,就可以保持NAT映射。
2.3 身份验证机制
2.3.1 短期身份验证
短期身份验证采用用户名/密码方式,此机制适用于单个会话。ICE使用此方法对每组连接检查应用不同的身份验证。短期身份验证机制假设在STUN事务之前,客户端和服务器已经使用了其他协议来交换了