STUN客户端(101:10)向STUN服务器(404:40)发送请求,要求得到自身经NAT映射后的地址(202:20):
a,收不到服务器回复,则认为UDP被防火墙阻断,不能通信,网络类型:Blocked.
b,收到服务器回复(地址要嘛是映射地址要嘛就是源地址),对比本地地址,如果相同(直接返回的就是源地址101:10),则认为无NAT设备(没经过NAT映射转换),进入第2步,否则认为有NAT设备,进入3步.
2, (已确认无NAT设备)STUN客户端向STUN服务器发送请求,要求服务器从其他IP和PORT(505:50)向客户端回复包:
a,收不到服务器从其他IP地址的回复,认为包被前置防火墙阻断,网络类型:Symmetric UDP Firewall.(如果没有NAT的话是无论如何都能收到回复的,只有一点受到防火墙的阻断,有时候杀毒软件也阻断)
b,收到则认为客户端处在一个开放的网络上,网络类型:Opened.
3, (
已确认存在NAT设备)STUN客户端
(101:10)向STUN服务器
(404:40)发送请求,要求服务器从其他IP和PORT
(505
:50)向客户端回复包:
a,收不到服务器从其他IP地址(包括IP和Port)的回复,认为包被前置NAT设备阻断,进入第4步.(如果不是前置的就相当于全开Opened或Full Cone Nat类型,无论那个IP和端口都能接收到回复)
b,收到则认为NAT设备类型为Full Cone,即网络类型:Full Cone NAT.(此没有什么限制的基本和没有NAT一样Opened)
4, STUN客户端(101:10)向STUN服务器(404:40)的另外一个IP地址(505:40,端口不能改变)发送请求,要求得到自身经NAT映射后的地址(202:20,如果不是对称的应该返回这个映射地址),并对比之(与第一步中返回的映射地址比对)
a,地址不相同,则网络类型:Symmetric NAT.(如果是对称类型,则101:10在向一个不同的IP地址(505,端口不变)发送请求时会映射一个新的端口,此处相当于生成一个202:21,比对不相同)
b,相同则认为是Restricted NAT(受限的),进入第5步,进一步确认类型.
5, (已确认Restricted NAT设备)STUN客户端(101:10)向STUN服务器(404:40)发送请求,要求服务器从相同IP(404)的其他PORT(41)向客户端回复包:
a,收不到服务器从其他PORT地址的回复,认为包被前置NAT设备阻断,网络类型:Port Restricted cone NAT.(端口改变了,端口受限相当于我一个人A(101)向B(404)要右手(40端口)的苹果,而B左手(41端口)有个香蕉,A只要B的右手苹果,而B给了A一个左手的香蕉,A肯定是不要的,相当于收不到回复)
b,收到则认为网络类型: Restricted cone NAT.(IP受限,对端口没什么要求,只要是404
这个IP就行,无论用那个端口都行)
几种实现的NAT类型检测代码:
STUNT
STUNT (Simple Traversal of UDP Through NATs and TCP too )), which extends STUN to include TCP functionality, is a lightweight protocol that allows applications running behind a NAT to determine external IP and port-binding properties, packet filtering rules and various timeouts associated with TCP connections through the NAT. Knowing these parameters allows applications to establish TCP sessions between two NAT'ed hosts. As a result P2P and other applications can work through existing NAT infrastructure without sacrificing the benefits of TCP.
XSTUNT
XSTUNT is a C/C++ library which implements "STUNT #2" approach in "Characterization and Measurement of TCP Traversal through NAT and Firewalls". It provides programmers with a set of simple functions to create STUNT connections through cooperating with a particular XSTUNT server
实现:http://www.cis.nctu.edu.tw/~gis87577/xDreaming/XSTUNT/index.html
其他资料:
1. Characterization and Measurement of TCP Traversal through NATs and Firewalls (PDF).
2. Peer-to-Peer Communication Across Network Address Translators (翻译: google搜素"穿越NAT的p2p通信方法研究").