本文主要是介绍[网络管理员之路]STUN协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
原出处:http://blogger.org.cn/blog/more.asp?name=airclh&id=18585
STUN 协议的全称是 Simple Traversal of User Datagram Protocol Through Network Address Translators ,主要功能是检测是否位于 NAT 后面,如果位于 NAT 后面,经过 NAT 转换后的地址和端口是什么,另外可以检测 NAT 的类型。
基本思想
在私网内部安装一个 STUN client ,在公网上安装一个 STUN Server , STUN 协议定义了一些消息格式,大体上分成 Request/Response , client 向 server 发送 request , server 发送 response 给 client 。如何检测 STUN client 是否在 NAT 后面呢?原理很简单, Server 在收到 client 的 UDP 包以后, Server 将接收到该包的地址和端口利用 udp 传回来给 client , client 把这些地址和端口与本机的 ip 地址和端口进行比较,如果不同,说明在 NAT 后面,否则就位于 NAT 后面。为了检测不同类型的 NAT , STUN 协议定义了一些消息属性,要求 Server 有不同的动作,比如发送响应的时候使用不同的 IP 地址和端口,或者改变端口等等。 STUN 协议对 NAT 可能有效,但是对防火墙就无能为力了,因为防火墙可能不会打开 UDP 端口。
NAT 分类
STUN 协议将 NAT 粗略分为 4 种类型,即 Full Cone 、 Restricted Cone 、 Port Restricted Cone 和 Symmetric 。举个实际例子来说明这四种 NAT 的区别:
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 ,有下列不同的结果:
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 的映射。
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 端口上。
Port Restricted Cone : C 无法与 A 通信,因为 A 从来没有和 C 通信过。而 B 也只能用它的 210.15.27.166:2000 与 A 的 192.168.0.4:5000 通信,因为 A 也从来没有和 B 的其他端口通信过。该类型 NAT 是端口受限的。
Symmetric NAT :上面 3 种类型,统称为 Cone NAT ,有一个共同点:只要是从同一个内部地址和端口出来的包, NAT 都将它转换成同一个外部地址和端口。但是 Symmetric 有点不同,具体表现在:只要是从同一个内部地址和端口出来,且到同一个外部目标地址和端口,则 NAT 也都将它转换成同一个外部地址和端口。但如果从同一个内部地址和端口出来,是到另一个外部目标地址和端口,则 NAT 将使用不同的映射,转换成不同的端口(外部地址只有一个,故不变)。而且和 Port Restricted Cone 一样,只有曾经收到过内部地址发来包的外部地址,才能通过 NAT 映射后的地址向该内部地址发包。
现针对 Symmetric NAT 举例说明:
A 机器连接过 B 机器,假使是 A ( 192.168.0.4:5000 ) -> NAT (转换后 210.21.12.140:8000 ) -> B ( 210.15.27.166:2000 )
如果此时 A 机器( 192.168.0.4:5000 )还想连接 C 机器( 210.15.27.140:2000 ),则 NAT 上产生一个新的映射,对应的转换可能为 A ( 192.168.0.4:5000 ) -> NAT (转换后 210.21.12.140:8001 ) -> C ( 210.15.27.140:2000 )。此时, B 只能用它的 210.15.27.166:2000 通过 NAT 的 210.21.12.140: 8000 与 A 的 192.168.0.4:5000 通信, C 也只能用它的 210.15.27.140:2000 通过 NAT 的 210.21.12.140:8001 与 A 的 192.168.0.4:5000 通信,而 B 或者 C 的其他端口则均不能和 A 的 192.168.0.4:5000 通信。
这篇关于[网络管理员之路]STUN协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!