P2P的NAT研究

P2P的NAT研究 
第一部分:NAT介绍 
第二部分:NAT类型检测服务器

第一部分: NAT介绍socket

各类不一样类型的NAT(according to RFC)spa

Full Cone NAT:请求

内网主机创建一个UDP socket(LocalIP:LocalPort) 第一次使用这个socket给外部主机发送数据时NAT会给其分配一个公网(PublicIP:PublicPort),之后用这个socket向外面任 何主机发送数据都将使用这对(PublicIP:PublicPort)。此外,任何外部主机只要知道这个(PublicIP:PublicPort)就 能够发送数据给(PublicIP:PublicPort),内网的主机就能收到这个数据包防火墙

Restricted Cone NAT:方法

内网主机创建一个UDP socket(LocalIP:LocalPort) 第一次使用这个socket给外部主机发送数据时NAT会给其分配一个公网(PublicIP:PublicPort),之后用这个socket向外面任 何主机发送数据都将使用这对(PublicIP:PublicPort)。此外,若是任何外部主机想要发送数据给这个内网主机,只要知道这个 (PublicIP:PublicPort)而且内网主机以前用这个socket曾向这个外部主机IP发送过数据。只要知足这两个条件,这个外部主机就可 以用本身的(IP,任何端口)发送数据给(PublicIP:PublicPort),内网的主机就能收到这个数据包im

Port Restricted Cone NAT:通信

内网主机创建一个UDP socket(LocalIP:LocalPort) 第一次使用这个socket给外部主机发送数据时NAT会给其分配一个公网(PublicIP:PublicPort),之后用这个socket向外面任 何主机发送数据都将使用这对(PublicIP:PublicPort)。此外,若是任何外部主机想要发送数据给这个内网主机,只要知道这个 (PublicIP:PublicPort)而且内网主机以前用这个socket曾向这个外部主机(IP,Port)发送过数据。只要知足这两个条件,这 个外部主机就能够用本身的(IP,Port)发送数据给(PublicIP:PublicPort),内网的主机就能收到这个数据包数据

Symmetric NAT:客户端

内网主机创建一个UDP socket(LocalIP,LocalPort),当用这个socket第一次发数据给外部主机1时,NAT为其映射一个(PublicIP- 1,Port-1),之后内网主机发送给外部主机1的全部数据都是用这个(PublicIP-1,Port-1),若是内网主机同时用这个socket给 外部主机2发送数据,第一次发送时,NAT会为其分配一个(PublicIP-2,Port-2), 之后内网主机发送给外部主机2的全部数据都是用这个(PublicIP-2,Port-2).若是NAT有多于一个公网IP,则PublicIP-1和 PublicIP-2可能不一样,若是NAT只有一个公网IP,则Port-1和Port-2确定不一样,也就是说必定不能是PublicIP-1等于 PublicIP-2且Port-1等于Port-2。此外,若是任何外部主机想要发送数据给这个内网主机,那么它首先应该收到内网主机发给他的数据,然 后才能往回发送,不然即便他知道内网主机的一个(PublicIP,Port)也不能发送数据给内网主机,这种NAT没法实现UDP-P2P通讯。

第二部:NAT类型检测

前提条件:有一个公网的Server而且绑定了两个公网IP(IP-1,IP-2)。这个Server作UDP监听(IP-1,Port-1),(IP-2,Port-2)并根据客户端的要求进行应答。

第一步:检测客户端是否有能力进行UDP通讯以及客户端是否位于NAT后?

客户端创建UDP socket而后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后当即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。若是每次都超时,没法接受到服务器的回应,则说明客户端没法进行UDP通讯,多是防火墙或NAT阻止UDP通讯,这样的客户端也就 不能P2P了(检测中止)。 
当 客户端可以接收到服务器的回应时,须要把服务器返回的客户端(IP,Port)和这个客户端socket的(LocalIP,LocalPort)比较。 若是彻底相同则客户端不在NAT后,这样的客户端具备公网IP能够直接监听UDP端口接收数据进行通讯(检测中止)。不然客户端在NAT后要作进一步的 NAT类型检测(继续)。

第二步:检测客户端NAT是不是Full Cone 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通讯(检测中止)。

第三步:检测客户端NAT是不是Symmetric NAT?

客户端创建UDP socket而后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后当即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程直到收到回应(必定可以收到,由于第一步保证了这个客户端能够进行UDP通讯)。 
用一样的方法用一个socket向服务器的(IP-2,Port-2)发送数据包要求服务器返回客户端的IP和Port。 
比 较上面两个过程从服务器返回的客户端(IP,Port),若是两个过程返回的(IP,Port)有一对不一样则说明客户端为Symmetric NAT,这样的客户端没法进行UDP-P2P通讯(检测中止)。不然是Restricted Cone NAT,是否为Port Restricted Cone NAT有待检测(继续)。

第四步:检测客户端NAT是不是Restricted Cone NAT仍是Port Restricted Cone NAT?

客户端创建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达洞通讯,能够进行端口预测打洞,不过不能保证成功。

相关文章
相关标签/搜索