一、预备知识
<1>STUN消息格式
STUN 消息都是由消息头与数据构成的,STUN消息头格式:
包括消息类型和消息长度(除了消息头长度)都为 2 字节,而事务 ID 为16 字节。消息类型许可的值如下
(1)捆绑请求
(STUN 捆绑请求使用UDP协议发送到STUN服务器,当捆绑请求消息到达服务器的时候它可能经过了一个或者多个NAT)
(2)捆绑响应
*(server产生捆绑响应 。并把得到的公网IP和端口。返回到client, client比较公网IP和端口是否和本机地址同样。假设是说明是本机也是公网,否则将会推断NAT的类型)
(3)捆绑错误响应
(4)共享私密请求
(5)共享私密响应
(6)共享私密错误响应(
<2>STUN属性
STUN协议也定义了很多的STUN属性,跟在STUN消息头的后面
STUN属性有很多的类型:
(1)MAPPED-ADDRESS属性:它是一个映射的IP地址和端口对,捆绑响应消息里面一直都有它,它代表了服务器在捆绑请求中看到的源IP地址和源端口号
(2)RESPONSE-ADDRESS属性:RESPONSE-ADDRESS可以被放到捆绑请求中,它告诉服务器捆绑请求消息将会被发送到哪里(响应的目的地)。它是可选的,当不填写的时候,捆绑响应会被默发送到捆绑请求的源IP地址和源端口号。(当填写的时候,捆绑响应会发送到填写的IP地址和端口)
(3)CHANGE-REQUEST属性:它包含了两个flag,这两个flag控制用来发送响应的IP地址和端口号。这两个标志被称为“change IP”和“change port”标志,CHANGE-REQUEST标志只允许在捆绑请求中出现,在确定客户端是在限制性 NAT之前还是端口限制型 NAT之前的时候,这两个标志是很有用的。它们指示Server从不同的源地址和源端口发送捆绑响应(请求服务器从不同的地址响应数据包)。在捆绑请求中CHANGE-REQUEST属性是可选的
(4)CHANGED-ADDRESS属性:它出现在捆绑响应中。如果客户端请求使用”change IP”和”change port”行为,它会通知客户端将会使用的源IP地址和源端口号
(5)SOURCE-ADDRESS属性出现在捆绑响应中,它表示服务器发送响应的源IP地址和端口
<3>STUN协议的交互过程
(1)客户会配置STUN服务器提供者的域名,该域名被解析为IP地址,使用UDP协议发送捆绑请求,使用TCP协议发送共享私密请求。
(2)客户通过发现过程获得它将与之建立TCP连接的IP地址和端口号。客户打开该地址和端口的连接,开始TLS协商,客户发送共享私密请求