STUN协议解析 | 您所在的位置:网站首页 › 游戏5780什么意思 › STUN协议解析 |
文章目录
引用Message HeaderMessage AttributesMAPPED-ADDRESSRESPONSE_ADDRESSCHANGE-REQUESTERROR-CODERESPONSE-ORIGINOTHER-ADDRESS
RFC3489 VS RFC5780RFC3489 NAT类型定义完全圆锥形NAT(Full cone NAT)受限圆锥形NAT(Address-Restricted cone NAT)端口受限圆锥形NAT(Port-Restricted cone NAT)对称NAT(Symmetric NAT)
RFC5780 NAT类型Full coneRestricted conePort-Restricted coneSymmetric
RFC3489 探测算法RFC5780 探测算法NAT隐射方式探测没有NAT端点无关的隐射NAT地址相关的隐射NAT地址和端口相关的隐射NAT
NAT过滤方式探测端点无关的过滤NAT地址相关的过滤NAT地址和端口相关的过滤NAT
和STUN协议相关的文档一共有三个:
RFC 3489,
RFC 5389和
RFC 5780
引用
nat-behavior-discovery-using-stun-rfc-5780stun-rfc-3489-vs-stun-rfc-5389-5780网络地址转换STUN
Message Header
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| STUN Message Type | Message Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Transaction ID
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
STUN消息主要分为两种: Header说明 类型说明STUN Message TypeSTUN类型Message Lenght去除固定头部(20Byte)的剩余的长度Transaction ID一个128位的标识符,客户端随机生成的,然后服务端要回复相同的标识符 STUN Message Type说明 MessageType值类型0x0001Binding Request0x0101Binding Response0x0111Binding Error Response Message Attributes 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Value .... +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+一个STUN消息可以包含0个或者多个STUN属性,属性有一个通用的头部,如上。 Message Attributes说明 类型说明Type一个uint16长度的类型,用不同的值区分不同的属性Lenght表示Value的长度,不包括固定头部的大小(4Byte)Value不固定长度,表示属性的内容 Type说明 值类型0x0001MAPPED-ADDRESS0x0002RESPONSE-ADDRESS0x0003CHANGE-REQUEST0x0004SOURCE-ADDRESS0x0005CHANGED-ADDRESS0x0006USERNAME0x0007PASSWORD0x0008MESSAGE-INTEGRITY0x0009ERROR-CODE0x000aUNKNOWN-ATTRIBUTES0x000bREFLECTED-FROM0x802bRESPONSE-ORIGIN0x802cOTHER-ADDRESS MAPPED-ADDRESS用于表示客户端外部IP地址,如果没有NAT,那么外部IP地址和内部IP地址是相同的。前8位保留,之后8位用于表示IP类型(IPV4/6)。之后16位表示端口号。这里强制使用IPV4版本,所以Address是32位。 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |x x x x x x x x| Family | Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ RESPONSE_ADDRESS用于标示哪一个服务端的IP和Port发送发送的数据。数据格式参考MAPPED-ADDRESS。 CHANGE-REQUEST请求服务端使用不同的IP或者Port来给客户端发送消息。A表示“改变IP”标志,B表示“改变端口”标志。 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 A B 0| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ERROR-CODE 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 0 |Class| Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Reason Phrase (variable) .. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ERROR-CODE说明 类型说明Class用于存储100的倍数,这个值只能是1~6Number100的余数,值的范围是0~99,Error Code的计算是:Class * 100 + NumberReason PhraseByteString类型,用于描述错误信息 Error Code说明 Error Code说明400请求格式不正确401请求消息不包含MESSAGE-INTEGRITY属性420服务器不理解请求中的强制属性430请求消息包含MESSAGE-INTEGRITY属性,但是却使用了一个过期的共享密钥431请求消息包含MESSAGE-INTEGRITY属性,但是HMAC校验失败。500服务器遇到了一个临时错误。客户端应该重试600服务器拒绝满足该请求。 客户端不应重试 RESPONSE-ORIGIN用于标示哪一个服务端的IP和Port发送的数据。数据格式参考MAPPED-ADDRESS。 OTHER-ADDRESS用于标示服务端另一个IP和Port发送的数据。数据格式参考MAPPED-ADDRESS。 RFC3489 VS RFC5780RFC3489和RFC5780主要区别在于:NAT类型和探测方式。RFC5780细化NAT类型,采用新的探测方式,为了新类型和新探测方式新增了几种对应的属性。 RFC3489 NAT类型定义RFC3489 NAT Variations中定义了四种NAT类型:Full cone、Restricted cone、Port-Restricted cone和Symmetric。 完全圆锥形NAT(Full cone NAT) 一旦一个内部地址(iAddr:port)映射到外部地址(eAddr:port),所有发自iAddr:port的包都经由eAddr:port向外发送。任意外部主机都能通过给eAddr:port发包到达iAddr:port(注:port不需要一样)![]() ![]() 类似受限制锥形NAT(Restricted cone NAT),但是还有端口限制。 一旦一个内部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有发自iAddr:port1的包都经由eAddr:port2向外发送。在受限圆锥型NAT基础上增加了外部主机源端口必须是固定的。![]() ![]() RFC5780 NAT类型主要分为两类:地址和端口隐射,地址和端口过滤。 Full cone下图显示了RFC 5780中定义的九种NAT类型和RFC 3489中定义的四种NAT类型,以及RFC 3489中的NAT类型如何与RFC 5780中的对应类型匹配。 RFC3489 Binding Lifetime Discovery 一旦路经通过红色箱子的终点时,UDP的沟通是没有可能性的。一旦通过黄色或是绿色的箱子,就有连线的可能。 RFC5780 探测算法RFC5780探测分为两种方式:NAT隐射和NAT过滤。 NAT隐射方式探测 |
CopyRight 2018-2019 实验室设备网 版权所有 |