大家好,又见面了,我是你们的朋友全栈君。
STUN 原理理解
STUN简介
Simple Traversal of UDP over NATs, NAT的UDP的简单穿越,是一种网络协议。是客户机-服务器的一种协议,由RFC 3489 定义。该协议定义了一些消息格式,大体上分为Request/Response。这个协议主要作用就是可以用来在两个处于NAT路由器之后的主机之间建立UDP通信。它允许位于NAT后的客户端找出自己的公网地址,确定自己位于的NAT是哪种类型,以及NAT为这个客户端的本地端口所绑定的对外端口。
譬如,一个软件包可能会包括一个STUN客户端A,这个客户端A会向STUN服务器发送请求,之后,服务器就会向STUN客户端A发送NAT路由器的公网IP地址以及NAT为这个客户端A开通的端口号,这个端口号是允许从别的客户端B传入流量传回到这个客户端A的。
为什么需要STUN?
一般情况下,通信的两个客户端主机往往是位于NAT之后的,用传统的方法时无法建立连接的。
STUN主要功能
STUN主要有3个功能,分别是检测是否位于NAT后面,检测NAT的类型,获取经过NAT转换后的地址和端口。
在内网安装一个STUN Client,在公网上安装一个STUN Server。client 向server 发送request,server 发送response给client。
(1)检测是否位于NAT后面
Server 在收到client 发送的UDP包以后,Server 将接收该包的地址和端口利用UDP再传回给client,client把Server发送过来的地址和端口信息与本机的ip地址和端口进行比较,如果不同,说明在NAT后面;如果相同就说明client位于NAT前面,client也是公网。
(2)检测NAT的类型
这个主要发送响应的时候使用不同IP地址和端口或者改变端口等等。这个检测是对NAT一般情况下有效,但是对防火墙就无能为力了,因为防火墙可能不会打开UDP端口。
NAT 主要分为4种类型,即Full Cone、Restricted Cone、Port Restricted Cone和Symmetric。其中Full Cone、Restricted Cone、Port Restricted Cone可以统称为Cone NAT,它们有一个共同点就是,只要是从同一个内网的地址和端口出来的包,NAT转换后的公网地址和端口一定是相同的。Symmetric 是如果是同一个内网的地址和端口出来的包,到同一个外部目标地址和端口,那么NAT转换后的公网地址和端口号也是相同的,但是如果如果到不同的外部目标地址和端口,NAT会转换成不同的端口号(公网地址是不变的,因为只有一个)
1.Full Cone NAT
从内网主机 in ipx和端口in portx发送的数据会映射为相同的公网ip x 和端口 port x。从其他机器上如果通过UDP发送数据到公网ip x和端口 port x上,最终数据都会被转发到内网主机上(in ipx :in portx)。 发送给内网的ip 和 port 都不受限。
2.Restricted Cone
从内网主机 in ipx和端口in portx发送的数据会映射为相同的公网ip x 和端口 port x。外部机器主动请求通信的源IP地址必须和内部主机主动向这个外部机器发送请求时的外部机器接收ip地址一致。即ip地址受限,端口不限。内网能接收信息的外部机器必须是内网主动发送请求过的外部机器。
3.Port Restricted Cone
从内网主机 in ipx和端口in portx发送的数据会映射为相同的公网ip x 和端口 port x。外部机器主动请求通信的源IP地址、端口必须和内部主机主动向这个外部机器发送请求时外部机器接收的ip地址、端口一致。即ip地址受限,端口都受限。内网能接收信息的外部机器必须是内网主动发送请求过的外部机器(ip相同),同时外网给内网发送数据包的端口还必须是接收内网数据包时所采用的端口号(端口相同)。
4.对称NAT
发送包的目的ip和port 相同,那么NAT 映射的ip和port会相同。如果目的地址不同,即使同一台内网机器、同一个端口,mapping的端口也不同,但是ip还是相同(因为同一个公网ip)。所以只有它主动连的服务器才会知道它的端口。
例子:
A机器在内网(192.168.0.4)
NAT服务器 (210.21.12.140)
B机器在公网(210.15.27.166)
C机器在公网(210.15.27.140)
如果 A 连接过机器B,假设是如下:A(192.168.0.4:5000)-> NAT(转换后210.21.12.140:8000)-> B(210.15.27.166:2000)。A和C从来没有通讯过。
不同类型的NAT,分析:
1.Full Cone NAT
C 将数据发送到 210.21.12.140:8000,NAT 会将数据包送到A(192.168.0.4:5000)。因为NAT上已经有192.168.0.4:5000到210.21.12.140:8000的映射。也就是说只要机器A与任何公网上机器通讯过,其它任何公网上机器都能发送数据给A,通过发送数据包给NAT上转换后的ip和端口之后,NAT会自动将数据包送到机器A。NAT 对发送给A的数据包来者不拒,不过滤。
2.Restricted Cone
C无法和A进行通信,因为A从来没有和C通信过,NAT会拒绝C试图与A连接的动作,但是B可以通过发送数据到210.21.12.140:8000和A的192.168.0.4:5000通信,这里机器B自己可以使用任何端口和A通信,譬如210.15.27.166:2001 -> 210.21.12.140:8000,NAT会将数据送到A的5000端口上。注意这里B使用的端口是2001 不是初始A连接B时,B接收A数据使用的端口2000。即只能是通信过的机器才能够进行通信,但是再通信时端口不需要固定。
3.Port Restricted Cone
C无法和A进行通信,因为A从来没有和C通信过,NAT会拒绝C试图与A连接的动作,而且机器B只能用它的210.15.27.166:2000与A的192.168.0.4:5000通信。即只有曾经收到内网地址A发送过数据包的公网机器,才能通过NAT映射后的地址向内网机制发送UDP包。
4.Symmetric NAT
如果A机器还想连接C机器,则NAT上产生一个新的映射,对应的转换可能为A(192.168.0.4:5000)-> NAT(转换后210.21.12.140:8001)-> C(210.15.27.140:2000)。
B与A通信:B(210.15.27.166:2000)-> NAT(转换后210.21.12.140:8000)-> C(192.168.0.4:5000)。
C与A通信:B(210.15.27.140:2000)-> NAT(转换后210.21.12.140:8001)-> C(192.168.0.4:5000)。
stun 的NAT 类型探测流程
参考资料
stun
https://baike.baidu.com/item/stun/3131387?fr=aladdin
STUN
https://en.wikipedia.org/wiki/STUN
图
https://upload.wikimedia.org/wikipedia/commons/6/63/STUN_Algorithm3.svg
STUN解决的过程
https://blog.csdn.net/carry1314lele/article/details/2420494
STUN简介
https://www.cnblogs.com/idignew/p/7357731.html
P2P通信标准协议(一)之STUN
https://www.cnblogs.com/pannengzhi/p/5041546.html
STUN服务器
https://baike.baidu.com/item/STUN服务器/2173892
STUN详解
https://segmentfault.com/a/1190000008056434
XMAPP
https://baike.baidu.com/item/XMPP/3430617
xmpp协议详解一:xmpp基本概念
https://www.jianshu.com/p/a94749385755
HTTP协议和XMPP协议
https://blog.csdn.net/southernriver/article/details/52038607
xmpp学习
https://blog.csdn.net/CHIHUN_LOVE/article/details/51860406
XMPP
https://blog.csdn.net/wwh19940131/article/details/51188693
XMPP协议的原理介绍
https://blog.csdn.net/wbw1985/article/details/5502272
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/160548.html原文链接:https://javaforall.cn