一种P2P网络中穿透NAT建立覆盖网的方法和系统
技术领域
本发明涉及一种P2P网络中穿透NAT建立覆盖网的方法及系统。
背景技术
随着音视频等大带宽数据交换的迅猛发展,传统的C/S架构由于服务器带宽及处理能力等瓶颈很难适应大规模的数据交换。点对点P2P(Peer-To-Peer)技术能够很好的解决这个问题,在P2P系统中,节点之间通过直接建立通道来传输数据,同时将很多数据处理放在节点本地进行,能够很大地降低服务器的带宽和处理能力压力,因而得到广泛的应用。
P2P网络是指通过P2P系统中节点间互联通道建立起来的网络。中心化P2P网络是指在整个P2P网络中有一个中心节点负责管理所有节点,这种结构特点是所有节点都和中心节点保持连接,中心节点保存所有在线节点的相关信息,同时对节点进行必要的管理。
覆盖网是指建立在已有网络之上的网络,通过节点间增加虚拟的、额外的连接来达到某种网络性能。P2P覆盖网是指在现有的INTERNET网之上搭建一层网络,用来传输所需的P2P数据,P2P覆盖网的建立关系到整个P2P网络的性能和承载能力。
NAT(网络地址转换器)是一种把内部网络(简称内网)私有IP及端口转换为外部网络(简称公网)IP及端口的一种技术。它是由于目前IPv4网络环境中,网络地址匮乏而产生的,位于NAT之后的多台主机可以通过一个或几个公网IP连接到INTERNET,这在某种程度上缓解了目前IPv4环境中IP地址紧张的状况,但是NAT的存在会使得位于NAT之后的两个节点之间建立连接非常困难。NAT穿透就是采用某种技术使得位于NAT之后的两台主机之间能够互联。目前常用的UDP穿透方法包括STUN协议、TRUN协议和UDP打洞等。
NAT地址转换一般有两种策略,静态转换和动态转换。包含NAT的设备(路由器、交换机或者防火墙等,以下简称NAT设备)一般会保存一个地址映射表,该表项记录一对内网地址和对应的转换后的公网地址。NAT设备收到数据包后会查找该表项决定发送的目标地址。静态转换是指地址映射表中记录几条固定的映射表项。动态转换是指当内网向外网发送数据时,查询地址映射表项未找到对应表项时,NAT会采用一定的算法临时为该连接分配一个公网端口,并在影射表中临时添加一项映射关系,当目标公网主机返回数据时,NAT设备会查找到映射表中刚才的映射表项,将数据转发给刚才的内网主机。
NAT设备具有如下特点:1)会丢弃一些外部主动发送来的映射表中没有的数据包。2)NAT设备会删除映射表中长期不活动的动态映射表项,所以动态映射有生存周期,也就是说当位于NAT之后的主机向外部地址发送数据包,隔太久时间后,NAT设备也会丢弃该外部地址发送来的数据包。3)同时根据2)的原因,NAT之后的主机向外网地址发送数据包,产生一个映射表项,如果隔太久时间后该主机利用相同端口向外发送数据包,可能会产生另一个映射表项,映射为另一个公网端口。4)由于不同的NAT设备采用的地址转换算法不同,穿透NAT建立连接有可能失败。5)目前大部分NAT穿透技术采用UDP打洞技术,由于网络的波动性,当网络状况差时会产生UDP丢包,降低穿透的成功率。6)位于多级NAT网关之后节点之间的穿透问题。
由于这些原因,目前的穿透方法存在可靠性差、穿透率低等特点,不能在各种复杂网络状况下,建立高效的、高可靠的P2P覆盖网络。
发明内容
针对现有的上述问题,本发明提供一种中心化P2P网络中,能够适应各种网络环境,提高NAT穿透的成功率,建立高效的、可靠的P2P覆盖网的方法和系统。
本发明的方案如下:
一种P2P网络中穿透NAT建立覆盖网的方法,步骤是:
步骤10)节点获取自己的最内层子网的IP,并TCP连接公网中心服务器,注册ID,
步骤20)当节点要向目标节点打洞时,先和公网UDP打洞服务器交互获取自己的公网IP和UDP端口,
步骤30)节点将包含自己公网和最内层子网IP和UDP端口的通知,通过公网中心服务器转发给目标节点,
步骤40)目标节点收到上述通知后,按上述方法获取其公网IP和UDP端口,通过公网中心服务器转发给本节点自己的公网和最内层子网IP和UDP端口。同时判断对方公网IP是否和本节点的公网IP相同,如果相同开始周期性向对方最内层子网地址UDP打洞,否则开始周期性向对方公网地址UDP打洞,
步骤50)本节点收到中心服务器发送来的打洞应答后,判断对方公网IP是否和本节点的公网IP相同,如果相同开始周期性向对方最内层子网地址UDP打洞,否则开始周期性向对方公网地址UDP打洞,
步骤60)本节点和目标节点在收到对方UDP打洞后,修改对方的IP和端口,并应答一个UDP包。收到打洞应答消息后认为打洞成功,建立UDP通道,打洞持续一定时间,不管有没有收到UDP打洞包或UDP应答包,
步骤70)打洞持续时间结束后,如果仍未收到UDP打洞包或则UDP打洞应答包,认为打洞失败。本节点和目标节点间的数据通过中心服务器进行转发。
其中步骤10)包括:
步骤110)节点获取自己的最内层子网的IP,同时绑定一个本地UDP端口,
步骤120)节点TCP连接到中心服务器,并注册自己的ID。
其中步骤20)包括:
步骤210)通过本地UDP端口向公网UDP打洞服务器发送一个获取公网IP和UDP端口的UDP包,该UDP包只包含获取公网地址标示,
步骤220)UDP打洞服务器收到请求公网地址的UDP包之后,提取该UDP包的IP和PORT,将包含该IP和PORT的UDP包返回给节点,不做任何记录,
步骤230)节点收到UDP返回包后,记录自己的公网IP和PORT,
步骤240)为避免UDP包丢失,节点周期执行步骤1)直至获取公网IP、PORT成功。
其中步骤30)包括:
步骤310)节点获取自己UDP端口对应的公网IP和PORT后,向中心服务器发送一个TCP打洞请求消息,该请求包含自己的公网IP和PORT、自己的ID、目标节点的ID,
步骤320)中心服务器收到上述TCP打洞请求后,提取其中的目标节点的ID,查找该ID对应的连接,并将该TCP打洞请求转发给目标节点。
其中步骤40)包括:
步骤410)目标节点收到公网TCP转发服务器发送来的TCP打洞请求后,按照步骤30)所述方法获取自己的公网UDP端口,
步骤420)目标节点向公网TCP转发服务器发送一个TCP打洞应答包,该包包含自己的最内层子网的IP-PORT和公网IP-PORT及自己的ID和对方的ID,
步骤430)目标节点判断对方的公网IP是否和自己的公网IP相等。若相等,开始周期向本节点的最内层子网IP-PORT发送UDP打洞包;若不等,开始周期向本节点的公网IP-PORT发送UDP打洞包,
步骤440)TCP转发服务器收到打洞应答后,根据其中的IDKEY将该应答转发给本节点。
其中步骤50)包括:
步骤510)本节点收到打洞应答后,记录对方的公网IP-PORT及最内层子网IP-PORT,
步骤520)本节点判断对方的公网IP是否和自己的公网IP相等。若相等,开始周期向对方的最内层子网IP-PORT发送UDP打洞包;若不等,开始周期向对方的公网IP-PORT发送UDP打洞包。
本发明同时又提供一种P2P网络中穿透NAT建立覆盖网的系统,包括:
公网TCP转发服务器、公网UDP打洞服务器、客户终端;
其中,客户终端用于连接公网TCP转发服务器,并注册自己的ID;获取并记录自己的公网IP-PORT及最内层子网的IP-PORT;及向目标节点打洞或响应对方节点的打洞请求;
公网TCP转发服务器主要功能是记录注册的PEER列表;转发打洞请求消息和打洞应答消息UDP打洞失败后,转发节点之间的数据;
公网UDP打洞服务器用于为客户终端获取自己的公网IP-PORT,不记录任何信息。
本发明有益效果:
本发明可以很好的解决复杂网络状况下,P2P网络中节点间穿透NAT建立覆盖网问题,能够解决NAT映射的生命周期问题、udp丢包造成的穿透成功率下降问题、多层子网后的节点间打洞问题。
附图说明
图1为本发明P2P网络中节点间穿透NAT建立覆盖网的消息时序图。
图2为本发明P2P网络中节点间穿透NAT建立覆盖网的流程图。
图3为本发明P2P网络中节点间穿透NAT建立覆盖网的系统示意图。
具体实施方式
下面以具体实施例对本发明作进一步的阐述,但实施例仅用于说明,并不限制发明的范围。
下面结合附图对本发明的方法和系统作详细描述:
实施例1
如图1描述了整个方法的消息时序图,下面主要结合图1和图2对整个发明的方法进行阐述。
在步骤S110中,节点PEER1绑定一个本地UDP端口号,然后获取自己的最内层子网的IP,并将该UDP端口和该IP记作LOCALIP-PORT。
在步骤S120中,节点PEER1连接公网TCP转发服务器,并向该服务器注册自己的ID。TCP转发服务器记录该ID及对应的连接SOCKET。
在步骤S210中,节点PEER1向公网UDP服务器发送获取公网IP端口UDP包。
在步骤S220中,公网UDP服务器提取出UDP包中的IP和PORT,并将其返回给节点PEER1,PEER1记录自己的PUBLICIP-PORT。
考虑到在网络状况比较差的时候,UDP丢包比较严重PEER1在获取自己的PUBLICIP-PORT时,通过周期反复发送请求直到获取返回的UDP包为止,提高了成功率。
在步骤S310中,PEER1向TCP转发服务器发送打洞请求消息,该消息包括PEER1的LOCALIP-PORT、PUBLICIP-PORT、PEER1ID及目标PEER2ID。
在步骤S320中,TCP转发服务器收到打洞消息后,根据其中的PEER2ID找到对应的SOCKET,将该消息发送给PEER2。
在此需要举例说明一下NAT映射的生命周期问题,假设PEER1在T1时刻的LOCALIP-PORT为192.168.200.3:2000向PEER2发送UDP包,映射出去的公网地址PUBLICIP-PORT为218.83.243.94:8005,此时PEER2发送往218.83.243.94:8005的UDP包也能够到达PEER1。如果PEER1很久没有通过2000端口向PEER2发送UDP包,该映射关系可能已经被删除。在T2时刻,如果PEER2向218.83.243.94:8005发送UDP包,由于映射关系已经不存在,该UDP包浆被丢弃。同时PEER1通过2000端口向PEER2发送UDP包将有可能产生另一个映射218.83.243.94:29008。
如果通过UDP打洞服务器转发该打洞请求,而不是通过TCP转发服务器转发该消息,一方面当网络拥挤时可能会造成该命令丢包,另一方面由于发送该UDP打洞命令包时,由于映射关系已经被删除导致UDP打洞命令包根本到达不了PEER2。利用TCP的可靠性,可以消除这些问题。
在步骤S410中,PEER2收到TCP转发服务器发送来的打洞请求消息后,按照步骤S210和S220方法,获取自己的PUBLICIP-PORT。
这样做的目的也是考虑的NAT映射的生命周期问题,获取最新的映射关系,提高打洞成功率。
在步骤S420和S440中,通过和步骤S310、S320类似的操作,PEER2将自己的LOCALIP-PORT、PUBLICIP-PORT发送给PEER1。
在步骤S430中,节点PEER2判断PEER1的PUBLICIP是否和自己的PUBLICIP相等,如果相等说明PEER1和PEER2在一个公网IP之后,可能PEER1和PEER2在不同的子网之后,由于PEER1经过公网到PEER2路径所经过的NAT个数一定会比PEER1经内网到PEER2要多,限制的更多,所以如果PEER1和PEER2经过内网不能穿透,经过外网更不能穿透。鉴于这个原因我们采取PEER2向PEER1内网地址打洞,这样可以解决处于多层子网之后的节点间的打洞。
在步骤S510中,采取和步骤S430相同的操作。
步骤S510和S430中为了减少丢包原因造成的打洞成功率低,同时也为了增加各种类型NAT的穿透成功率,降低TCP传输打洞应答延时造成的打洞成功率的降低,PEER1和PEER2节点间周期性对发UDP包,并持续一定时间。
步骤S510和步骤S430中,PEER1节点收到PEER2节点的UDP打洞包后,修改PEER2的IP-PORT,如果PEER1的PUBLICIP等于PEER2的PUBLICIP,修改PEER2的LOCALIP-PORT否则修改PEER2的PUBLICIP-PORT。然后继续向修改后的地址发送UDP打洞包。PEER2收到PEER1的UDP打洞包后,采取相同的操作。
如果PEER1收到PEER2的打洞消息,认为打洞成功,PEER2节点相同,以后PEER1和PEER2之间可以直接发送消息。
在步骤S70中,当节点PEER1和PEER2打洞时间结束,仍未收到打洞消息,PEER1和PEER2会认为它们之间不能直接建立连接,PEER1和PEER2之间的数据,通过公网TCP转发服务器来转发。具体的,为每个要发送的数据加上目标节点ID,TCP转发服务器收到后,提取出来目标节点ID,然后将数据转发给目标节点。
当PEER1和PEER2打洞成功时,当网络拥挤时,在节点间发送一些可靠性要求高的消息时,也可以通过TCP转发服务器转发。
实施例2
如图3所示,本发明的系统示意图,一种P2P网络中穿透NAT建立覆盖网的系统,包括公网TCP转发服务器10,公网UDP打洞服务器20及客户终端30,其中客户终端维护一个TCP连接并绑定一个UDP端口。
其中,客户终端用于连接公网TCP转发服务器,并注册自己的ID;获取并记录自己的公网IP-PORT及最内层子网的IP-PORT;及向目标节点打洞或响应对方节点的打洞请求。
公网TCP转发服务器主要功能是记录注册的PEER列表;转发打洞请求消息和打洞应答消息;UDP打洞失败后,转发节点之间的数据。
公网UDP打洞服务器用于为客户终端获取自己的公网IP-PORT,不记录任何信息。
本发明可以很好的解决复杂网络状况下,P2P网络中节点间穿透NAT建立覆盖网问题,能够解决NAT映射的生命周期问题、UDP丢包造成的穿透成功率下降问题、多层子网后的节点间打洞问题。