p2p网络简介

p2p的NAT研究

第一部分:NAT入门。

第二部分:NAT类型检测

第一部分:NAT入门。

各种不同类型的NAT(根据RFC)

全锥形NAT:

一个UDP套接字的建立(主机是:第一次使用套接字localport)将数据发送到外部主机的NAT分配一个公共网络(publicip:publicport),然后使用此插座外面的任何主机将使用这个发送数据(publicip:publicport)。此外,任何外部主机可以发送数据(publicip:publicport)只要知道这(publicip:publicport),及内网主机可以接收这个包。

限制Cone NAT:

一个UDP套接字的建立(主机是:第一次使用套接字localport)将数据发送到外部主机的NAT分配一个公共网络(publicip:publicport),然后使用此插座外面的任何主机将使用这个发送数据(publicip:publicport)。此外,如果任何外部主机要将数据发送到内网主机,只要我们知道这(publicip:publicport),和内部网络主机使用socket发送数据到外部主机的IP。只要满足这两个条件,外部主机可以发送数据(publicip:publicport)与自身(IP,任何端口),及内网主机可以接收数据包。

端口受限Cone NAT:

一个UDP套接字的建立(主机是:第一次使用套接字localport)将数据发送到外部主机的NAT分配一个公共网络(publicip:publicport),然后使用此插座外面的任何主机将使用这个发送数据(publicip:publicport)。此外,如果任何外部主机要将数据发送到内网主机,只要我们知道这(publicip:publicport),和内部网络主机使用socket发送数据到外部主机(IP、端口)。只要满足这两个条件,外部主机可以发送数据(publicip:publicport)与自己的(IP,Port),及内网主机可以接收数据包。

对称型NAT:

一个UDP套接字的建立(是主机,LocalPort),当使用这个套接字发送数据到外部主机1的第一时间,NAT是一个映射(publicip - 1,端口1),在所有的数据发送到外部主机1都用这个(publicip-1,端口1),如果在与插座外部主机2发送数据,同时主机第一传输,NAT分配一个(publicip-2,port-2),在主机发送到外部主机2的数据使用这(publicip-2,port-2)NAT。如果有多个公网IP,publicip-1和publicip-2不同NAT,如果只有一个公网IP,端口1和port-2必须是不同的,也就是说不能publicip-1等于publicip-2和端口1等于port-2.in之外,如果任何外部主机要发送数据给主机,所以它应该是收到他的主人的第一个数据,然后发送回来,即使他知道主机(publicip,端口)可以发送数据到主机,NAT可以实现udp-p2p通信。

第二部分:NAT类型检测

前提:有一个服务器的公网和两个公共网络IP(IP-1,IP-2)的约束。这使得服务器UDP监听(IP-1,端口1)、(IP-2,port-2)和响应客户端的请求。

第一步是检测客户端与UDP通信的能力,以及客户端是否位于NAT中。

客户的建立,然后用这个套接字UDP套接字服务器(IP-1,端口1)发送数据包的IP地址和端口的客户端要求服务器,客户端发送请求后立即开始接受数据包,设置套接字超时(毫秒),以防止无限果酱。重复这个过程好几次,如果每次都是时间不够,不能接受服务器的响应,那就意味着客户端不能进行UDP通信。可能是防火墙或NAT阻止UDP通信。这样的客户端不能P2P。

当客户端收到服务器的响应,我们需要将客户端(IP、Port)由服务器返回给客户端的socket(是的,LocalPort)。如果同一个客户是不是在NAT,这样的客户端有一个公网IP,可以直接监控UDP端口通信接收数据(检测站)。否则,客户端将做进一步的NAT类型检测(继续)经过NAT。






第二步:检查客户端NAT是否是完整的圆锥NAT

客户的建立,然后用这个套接字UDP套接字服务器(IP-1,端口1)发送数据包到另一个服务器(IP-2,port-2)响应客户端的请求发送回一个数据包,客户端发送请求后立即开始接受数据包,设置套接字超时(300ms),防止无限的果酱。这个过程重复几次,如果每次都不及时,服务器的响应就不能被接受。这表明客户端的NAT是不是一个完整的锥形NAT,与特定类型需要进一步检测。如果你可以接受的答复从服务器返回的UDP包(IP-2,port-2),这表明客户端是一个完整的锥形NAT,这样的客户端可以进行udp-p2p通信(停止检测)。

第三步:检查客户端NAT是对称NAT吗

客户的建立,然后用这个套接字UDP套接字服务器(IP-1,端口1)发送数据包的IP地址和端口的客户端要求服务器,客户端发送请求后立即开始接受数据包,设置套接字超时(毫秒),以防止无限果酱。重复这个过程直到接收到响应(必须接收,因为第一步保证客户端可以UDP通信)。

发送数据包套接字服务器(IP-2,port-2)以同样的方式要求服务器返回给客户端的IP地址和端口。

比较从服务器返回给客户端的上述两个过程(IP、端口),如果两个过程返回(IP、端口)有一对差异,那么客户端是对称NAT,这样的客户端不能udp-p2p通信(检测站)。否则,它是受限制的锥形NAT,是否端口受限制的锥形NAT是检测(续)。

第四步:检查客户端NAT是受限的圆锥NAT还是端口受限的圆锥NAT

客户的建立,然后用这个套接字UDP套接字服务器(IP-1,端口1)发送数据包请求到服务器,通过生物和不同端口1端口来响应客户端发送一个UDP数据包,客户端发送请求后立即开始接受数据包,设置套接字超时(毫秒),以防止无限果酱。在这个过程中重复多次,如果每次都不及时,服务器的响应就不能被接受。它表明客户端是端口受限的锥形NAT。如果我们能收到服务器的响应,这表明客户端是一个受限制的锥形NAT,NAT的上述两种可以与udp-p2p。

注:上述检测过程中,只有udp-p2p可以用来沟通的洞,以及如何与交会的服务器进行通信。此外,对称NAT不说是完全无法进行udp-p2p孔沟通,能进行端口预测孔,但不能保证成功。