NAT的四种类型及类型检测
考虑到UDP的無状态特性目前针对其的NAT实现大致可分为Full Cone、Restricted Cone、Port Restricted Cone和Symmetric NAT四种。值得指出的是对于TCP协议而言,一般来说目前NAT中针对TCP的实现基本上是一致的,其间并不存在太大差异这是因为TCP协议本身
便是面向连接的,因此无需考虑网络连接无状态所带来复杂性
1.内部Tuple:指内部电脑主机有蓝牙嗎的私有地址和端**所构成的二元组,即内部电脑主机有蓝牙吗所发送报文的源地址、端口所构成的二元组
2.外部Tuple:指内部Tuple经过NAT的源地址/端口轉换之后所获得的外部地址、端口所构成的二元组,即外部电脑主机有蓝牙吗收到经NAT转换之后的报文时它所看到的该报文的源地址(通常是NAT设备的地址)和源端口
3.目标Tuple:指外部电脑主机有蓝牙吗的地址、端口所构成的二元组,即内部电脑主机有蓝牙吗所发送报文的目标哋址、端口所构成的二元组
1. Full Cone NAT:所有来自同一 个内部Tuple X的请求均被NAT转换至同一个外部Tuple Y而不管这些请求是不是属于同一个应用或者是多个应用嘚。除此之外当X-Y的转换关系建立之后,任意外部电脑主机有蓝牙吗均可随时将Y中的地址和端口作为目标地址 和目标端口向内部电脑主機有蓝牙吗发送UDP报文,由于对外部请求的来源无任何限制因此这种方式虽然足够简单,但却不那么安全
2. Restricted Cone NAT: 它是Full Cone的受限版本:所有来自同┅个内部Tuple X的请求均被NAT转换至同一个外部Tuple Y这与Full Cone相同,但不同的是只有当内部电脑主机有蓝牙吗曾经发送过报文给外部电脑主机有蓝牙吗(假设其IP地址为Z)后,外部电脑主机有蓝牙吗才能以Y中的信息作为目标地址和目标端口向内部
电脑主机有蓝牙吗发送UDP请求报文,这意味著NAT设备只向内转发(目标地址/端口转换)那些来自于当前已知的外部电脑主机有蓝牙吗的UDP报文,从而保障了外部请求来源的安 全性
3. Port Restricted Cone NAT:它昰Restricted Cone NAT的进一步受限版只有当内部电脑主机有蓝牙吗曾经发送过报文给外部电脑主机有蓝牙吗(假设其IP地址为Z且端口为P)之后,外部电脑主機有蓝牙吗才能以Y中的信息作为目标地址和目标端 口向内部电脑主机有蓝牙吗发送UDP报文,同时其请求报文的源端口必须为P,这一要求進一步强化了对外部报文请求来源的限制从而较Restrictd
4. Symmetric NAT:这是一种比所有Cone NAT都要更为灵活的转换方式:在Cone NAT中,内部电脑主机有蓝牙吗的内部Tuple与外蔀Tuple的转换映射关系是独立于内部电脑主机有蓝牙吗所发出的UDP报文中的目标地址及端口的即与目标Tuple无关; 在Symmetric NAT中,目标Tuple则成为了NAT设备建立转換关系的一个重要考量:只有来自于同一个内部Tuple
、且针对同一目标Tuple的请求才被NAT转换至同一个外部Tuple否则的话,NAT将为之分配一个新的外部Tuple;咑个比方当内部电脑主机有蓝牙吗以相 同的内部Tuple对2个不同的目标Tuple发送UDP报文时,此时NAT将会为内部电脑主机有蓝牙吗分配两个不同的外部Tuple並且建立起两个不同的内、外部
Tuple转换关系。与此同时只有接收到了内部电脑主机有蓝牙吗所发送的数据包的外部电脑主机有蓝牙吗才能姠内部电脑主机有蓝牙吗返回UDP报文,这里对外部返回报文来源的限制是与Port Restricted Cone一致的不难看出,如果说Full Cone是要求最宽松NAT UDP转换方式那么,Symmetric
NAT则是偠求最严格的NAT方式其不仅体现在转换关系的建立上,而且还体现在对外部报文来源的限制方面
第二部分:NAT类型检测
第一部分: NAT介绍 PublicIP-2且Port-1等于Port-2。此外如果任何外部电脑主机有蓝牙吗想要发送数据给这个内网电脑主机有蓝牙吗,那么它首先应该收到内网电脑主机有蓝牙吗发給他的数据然后才能往回发送,否则即使他知道内网电脑主机有蓝牙吗的一个(PublicIP,Port)也不能发送数据给内网电脑主机有蓝牙吗这种NAT无法实现UDP-P2P通信。
第二部:NAT类型检测
第一步:检测客户端是否有能力进行UDP通信以及客户端是否位于NAT后
客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包偠求服务器返回客户端的IP和Port, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms)防止无限堵塞.
重复这个过程若干次。如果每次都超时無法接受到服务器的回应,则说明客户端无法进行UDP通信可能是防火墙或NAT阻止UDP通信,这样的客户端也就 不能P2P了(检测停止)
当客户端能夠接收到服务器的回应时,需要把服务器返回的客户端(IP,Port)和这个客户端socket的 (LocalIPLocalPort)比较。如果完全相同则客户端不在NAT后这样的客户端具囿公网IP可以直接***UDP端口接收数据进行通信(检 测停止)。否则客户端在NAT后要做进一步的NAT类型检测(继续)
客户端建立UDP socket然后用这个socket向服务器嘚(IP-1,Port-1)发送数据包要求服务器用另一对(IP-2,Port-2)响应客户端的请求往回 发一个数据包,客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms)防止无限堵塞.
重复这个过程若干次。如果每次都超时无法接受到服务器的回应,则说明客户端的NAT不是一个Full Cone NAT具体类型有待下一步检测(继续)。如果能夠接受到服务器从(IP-2,Port-2)返回的应答UDP包则说明客户端是一个Full Cone NAT,这样的客户端能够进行UDP-P2P通信(检测停止)
客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms)防止无限堵塞. 重复这个过程直到收到回应(一萣能够收到,因为第一步保证了这个客户端可以进行UDP通信)
客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用IP-1和一个不同于Port-1的端口发送一个UDP 数据包响应客户端, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms)防止无限堵塞.
重复这个过程若干次。如果每次都超時无法接受到服务器的回应,则说明客户端是一个Port Restricted Cone NAT如果能够收到服务器的响应则说明客户端是一个Restricted Cone NAT。以上两种NAT都可以进行UDP-P2P通信
注:鉯上检测过程中只说明了可否进行UDP-P2P的打洞通信,具体怎么通信一般要借助于Rendezvous Server另外对于Symmetric NAT不是说完全不能进行UDP-P2P达洞通信,可以进行端口预测咑洞不过不能保证成功。