P2P之UDP穿透的简单实现方式

NAT类型

Full Cone NAT:

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

Restricted Cone NAT:

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

Port Restricted Cone NAT:

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

Symmetric NAT:

    内网主机建立一个UDPsocket(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分为两类,ConeNAT和SymmetricNAT。

NAT检测

设定A为内网设备,S为公网服务器,S开放两个端口A1和A2用于NAT检测,检测实现过程如下:

1)   A向S1发送UDP消息,S1记录收到UDP消息的A1(IP,PORT),将UDP消息IP和PORT发送给A

2)   A向S2发送UDP消息,S2记录收到UDP消息的A2(IP,PORT),将UDP消息IP和PORT发送给A

3)   比较A1和A2,若相同,则为ConeNAT;不同,则为SymmetricNAT

NAT类型判断成功之后,就可按照下面的方式进行通信了

通信方式

A.   ConeNAT借助服务器采用P2P方式

设定A和B为不同内网设备,S为公网服务器,P2P实现过程如下:

1)   A,B定时向S发送心跳包,间隔为50秒,S取得A和B的网络信息A(IP:PORT),B(IP,PORT)

2)   A向B发送UDP消息(此消息B无法收到)

3)   B向A发送UDP消息(此消息A可以收到)

4)   A,B通信建立,保持50秒内有相互的UDP信息交流,即需要建立A和B之间的心跳

B.   SymmetricNAT采用服务器中转方式

设定A和B为内网设备,S为中转服务器,中转实现方式如下

1)   A,B定时向S发送心跳包,间隔为50秒,S取得A和B的网络信息A(IP:PORT),B(IP,PORT)

2)   A发送UDP信息给S,S发送到B(IP,PORT)

3)   B发送UDP信息给S,S发送到A(IP:PORT)

4)   通信成功

展开阅读全文

没有更多推荐了,返回首页