STUN详细文档看 https://tools.ietf.org/html/rfc3489
UDP网络穿透, 实现两个设备之间的点对点的UDP通信, 主要应用在视频传输上.
如今, 这已经是很偏门的东西了, 现在都流行采用云的模式.
应用: ICE
协议 https://tools.ietf.org/html/rfc5245
webrtc
, pjsip
, linphone
等开源即时通信工具, 都实现了ICE协议
如果你不懂基本原理, 先阅读后面章节的内容.
Full Cone(全锥型)
: 内部地址(IP1, PORT1)映射到外部地址(IP2, PORT2), 任意外部主机都可以通过(IP2, PORT2)发送数据给内部主机(IP1, PORT1);Restricted Cone(IP限制型)
: 内部地址(IP1, PORT1)映射到外部地址(IP2, PORT2), 且内部主机(IP1, PORT1)向外部主机(IP3, 任意端口)发送过数据, 外部主机(IP3, 任意端口)才能通过(IP2, PORT2)发送数据给内部主机(IP1, PORT1); 可以看出, 限制型是在全锥型的基础上, 添加了IP限制;Port Restricted Cone(端口限制型)
: 内部地址(IP1, PORT1)映射到外部地址(IP2, PORT2), 且内部主机(IP1, PORT1)向外部主机(IP3, PORT3)发送过数据, 外部主机(IP3, PORT3)才能通过(IP2, PORT2)发送数据给内部主机(IP1, PORT1); 端口限制型是在IP限制型的基础上, 又增加了端口限制;Symmetric(对称型)
: 最严格的类型, 内部地址(IP1, PORT2)所映射的外部地址是动态的, 向不同的外部主机发送数据, NAT将分配不同的IP和端口. 如果内部主机不向外部主机发送数据, 那么外部主机完全无法连接到内部主机.对于对称型的NAT, 外部地址的IP和PORT都可能是变化, 比如长城宽带, 打开不同地址的网站, 运营商可能会为你分配不同的IP, 这种情况本文暂不讨论.
PORT的映射规则可能有以下几种:
服务器需要两个公网地址ip1
, ip2
, 需要两个端口port1
, port2
创建4个服务端socket, 分别监听 (ip1, port1)
, (ip1, port2)
, (ip12, port1)
, (ip2, port2)
;
(ip1, port1)
发送数据(ip2, port2)
回复数据, 如果客户端能够收到消息, 则为全锥型, 否则, 继续判断(ip2, port1)
回复数据, 如果客户端能够收到消息, 则为IP限制型, 否则, 继续判断(ip1, port2)
发送数据, 如果服务端发现客户端的端口发生变化, 则为对称型, 否则为端口限制型首先双方通过stun服务器及sip服务器, 或其它手段, 拿到自己的和对方的内部地址和外部地址
以下的穿透过程都是不区分先后顺序的, 因此同一个操作会多次执行.
这个过程很简单
第一次: A给B发消息, 不通
因为B还没有向A发送过消息, 所以A的消息被NAT-B拒绝
第二次: B给A发消息, 通过
最终A-B双向都能通
以下设A
为IP限制型, B
为对称型
第一次: A给B发消息, 不通
因为B还没有向A发送过消息, 所以A的消息被B的NAT拒绝
第二次: B给A发消息, 通过
第二次: A纠正信息, 再次给B发消息, 通过
设A为端口限制型, B为对称型.
这一次需要预测B的映射端口是多少 (说直白点, 就是靠猜)
第一次: A给B发消息, 不通
很显示, 因为B还没有向A发送过消息, 所以A的消息被B的NAT拒绝
第二次: B给A发消息, 仍不通
因为B给A发消息时, B的映射端口变了, A不认这个端口.
第三次: A预测出B的端口, 再次给B发消息, 仍不通
如果预测的不对, 那怎么都不通. 这里假设猜对了
第四次: B给A发消息, 通了
因为A给Y端口发过消息, 所以通过Y端口发给A的消息被认可
条件比上一节还苛刻, 双方都需要预测对方的端口, 都预测成功, 才能穿透成功
下次再写