发明内容
本发明的目的在于提供一种在结构化P2P网络中实现NAT穿越的方法和系统,其充分考虑了结构化P2P网络完全分布式的特性,去掉了现有方法中中间服务器的支持,同时,结合控制信息和数据信息本身的特点,对其穿越方式分别处理,加快了穿越的时间,减少了穿越开销,并具有可靠性。
为实现本发明的目的而提供的一种在结构化P2P网络中实现NAT穿越的方法,包括下列步骤:
步骤100.结构化P2P网络中所有用户节点启动后,所述用户节点与一个处于外网的引导节点联系,获得所述引导节点路由表中与所述用户节点的ID异或距离为一设定值的其他用户节点的信息,建立并更新自己的路由表;
步骤200.所述用户节点通过处于外网的用户节点判断自己对外的IP地址和端口号与内网的IP地址和端口号是否相同,若是,表示所述用户节点处于外网;否则表示所述用户节点处于内网;
步骤300.所述用户节点从自己的路由表里随机选择一个处于外网的用户节点作为自己的伙伴节点,添加所述伙伴节点的信息;同时所述用户节点发布包括其伙伴节点的IP地址、端口号、ID的更新消息给路由表内的各节点,各节点更新各自路由表的信息;
步骤400.用户节点间采用让伙伴节点转发的方式传输控制信息;
步骤500.用户节点间采用让伙伴节点协助连接的方式传输数据信息。
所述步骤200,包括下列步骤:
步骤210,所述用户节点从自己的路由表里选择一个处于外网的用户节点,并给所述处于外网的用户节点发送包括自己的ID,本机的IP地址和端口号的Hello消息;
步骤220,所述处于外网的用户节点收到Hello消息后,从接收的Hello消息中提取出所述用户节点的IP地址和端口号,并从所述用户节点的数据包中提取出填写的IP地址和端口号,判断二者是否相同,若是,则表明所述用户节点的处于外网,并执行步骤230;否则表明处于内网;
步骤230,所述处于外网的用户节点判断所述用户节点是否需要被保存到自己的路由表中,若是,则把所述用户节点的信息记录到自己的路由表中,同时更新路由表;否则,不记录;
步骤240,所述处于外网的用户节点给所述用户节点发送Hello_Response消息,此消息中包括所述用户节点处于内/外网的标识、所述用户节点对外的IP地址和端口号以及所述处于外网的用户节点的ID;
步骤250,所述用户节点收到Hello_Response消息后,解析消息,提取出内/外网的标识,判断出自己所处的网络类型。
所述步骤300,包括如下步骤:
步骤310,判断所述用户节点的路由表中是否存在有处于外网的用户节点,若是,则所述用户节点从所述路由表中随机选择一个所述处于外网的用户节点,执行步骤320;否则等待所述路由表更新到有处于外网的节点;
步骤320,所述用户节点向所述处于外网的用户节点发送Find_Buddy消息,希望所述处于外网的用户节点成为所述用户节点的伙伴节点;
步骤330,所述处于外网的用户节点收到所述Find_Buddy消息后,查看自身现在是几个内网节点的伙伴节点,若没有达到上限,则所述处于外网的用户节点可以成为所述用户节点的伙伴节点,所述处于外网的用户节点发送确认消息给所述用户节点;否则所述处于外网的用户节点不能成为所述用户节点的伙伴节点,并发送否认消息给所述用户节点;
步骤340,所述用户节点收到确认消息后,则确定所述处于外网的用户节点为其伙伴节点;若收到否认消息,则判断所述路由表中是否存在没有被选择过的处于外网的用户节点,若是,则返回步骤320;否则,执行步骤350;
步骤350.所述用户节点从所述路由表里随机取出一个处于外网的节点作为协助节点,并向所述协助节点发送FindBuddy_Help消息,让所述协助节点协助找到伙伴节点;
步骤360,所述协助节点收到FindBuddy_Help消息后,从其路由表里找到几个处于外网的节点,把这些节点的IP地址、端口号、ID的列表发给所述用户节点;
步骤370,所述用户节点从所述协助节点提供的列表中所有处于外网的节点中选择一个没有被选择过的处于外网的用户节点,并返回步骤320;
步骤380,找到伙伴节点后,所述用户节点发布更新消息给路由表内的各节点,其中包括其伙伴节点的IP地址、端口号、ID;路由表内的各节点收到所述更新消息后,更新各自路由表的信息;
步骤390,所述用户节点定期给所述伙伴节点发送Keep_Alive消息,所述伙伴节点收到后解析发现是Keep_Alive消息,给所述用户节点回复Keep_Alive_Ack消息;
步骤3100,所述用户节点判断是否收到Keep_Alive_Ack回复消息,若是,则什么也不做;否则,若所述用户节点给伙伴节点发送三次Keep_Alive消息后均没收到Keep_Alive_Ack回复消息,可推测该伙伴节点已经掉线,需要重新找伙伴节点,返回步骤310。
所述步骤400,包括下列步骤:
步骤410,若处于内网的用户节点给处于外网的用户节点发数据包,则直接发送;
步骤420,若处于外网的用户节点给处于内网的用户节点发数据包,则把数据包发送给所述处于内网的用户节点的伙伴节点,由伙伴节点转发给所述处于内网的用户节点;
步骤430,若两个处于内网的用户节点间发送数据包,则把数据包发送给对方的伙伴节点,由对方的伙伴节点转发给对方。
所述步骤500,包括下列步骤:
步骤510,处于内网的用户节点给处于外网的用户节点传输数据信息,则直接建立TCP连接进行发送;
步骤520,处于外网的用户节点给处于内网的用户节点传输数据信息,则处于外网的用户节点给处于内网的用户节点的伙伴节点发送请求处于内网的用户节点进行反连的消息;
步骤530,处于内网的用户节点的伙伴节点收到请求反连的消息后,转发给所述处于内网的用户节点,所述处于内网的用户节点收到后,向所述处于外网的用户节点发起TCP连接;
步骤540,两个处于内网的用户节点间传输数据信息,则一个处于内网的用户节点给另一个处于内网的用户节点的伙伴节点发送打洞请求报文,请求所述伙伴节点给对应的另一个处于内网的用户节点发送打洞请求报文;
步骤550,所述伙伴节点收到打洞请求报文后,转发给对应的所述另一个处于内网的用户节点,所述另一个处于内网的用户节点收到后,进行UDP打洞操作;
步骤560,若所述另一个处于内网的用户节点收到所述处于内网的用户节点发来的ping消息后,将进行ping回复,所述处于内网的用户节点收到ping回复消息的节点确认打洞成功;
步骤570,利用UDP打洞协助两个处于内网的用户节点建立直连,使得其可以直接传输数据信息。
在执行步骤560时,所述另一个内网节点会多一次发送ping消息,确保打洞成功,若由于网络原因双方都没有收到ping消息,则返回步骤540,重新进行打洞。
为实现本发明的目的还提供一种在结构化P2P网络中实现NAT穿越的系统,所述系统,包括多个终端,所述终端包括:
引导节点联系模块,用于在结构化P2P网络中所有用户节点启动后,与一个处于外网的引导节点联系,获得所述引导节点路由表中与所述用户节点的ID异或距离为一设定值的其他用户节点的信息,建立并更新自己的路由表;
网络类型判断模块,用于通过处于外网的用户节点判断自己对外的IP地址和端口号与内网的IP地址和端口号是否相同,若是,表示所述用户节点处于外网;否则表示所述用户节点处于内网;
伙伴寻找模块,用于从自己的路由表里随机选择一个处于外网的用户节点作为自己的伙伴节点,添加所述伙伴节点的信息;同时发布包括其伙伴节点的IP地址、端口号、ID的更新消息给路由表内的各节点,各节点更新各自路由表的信息;
伙伴转发模块,用于协助处于内网的用户节点,对控制信息进行转发;
伙伴协助连接模块,用于利用UDP打洞协助两个处于内网的用户节点建立直连,使得其可以直接通信;
可靠传输模块,用于UDP模拟TCP进行数据传输。
所述判断模块,包括:
信息发送模块,用于从自己的路由表里选择一个处于外网的用户节点,并给所述处于外网的用户节点发送包括自己的ID,本机的IP地址和端口号的消息;
信息提取模块,用于从接收的消息中提取出用户节点的IP地址和端口号,并从用户节点的数据包中提取出填写的IP地址和端口号;
判断子模块,用于处于外网的用户节点判断其他用户节点是否需要被保存到自己的路由表中,若是,则把其他用户节点的信息记录到自己的路由表中,同时更新路由表;否则,不记录;
回复模块,用于处于外网的用户节点给其他用户节点发送回复消息,此消息中包括其他用户节点处于内/外网的标识、其他用户节点对外的IP地址和端口号以及其他处于外网的用户节点的ID。
所述伙伴寻找模块,包括:
外网用户寻找模块,用于判断用户节点的路由表中是否存在有处于外网的用户节点,若是,则所述用户节点从所述路由表中随机选择一个所述处于外网的用户节点发送Find Buddy消息;否则等待所述路由表更新到有处于外网的节点;
阈值判断模块,用于处于外网的用户节点收到所述Find_Buddy消息后,查看自身现在是几个内网节点的伙伴节点,若没有达到上限,则所述处于外网的用户节点可以成为所述用户节点的伙伴节点;
协助节点寻找模块,用于在路由表中不存在没有被选择过的处于外网的用户节点时,从所述路由表里随机取出一个处于外网的节点作为协助节点,并向所述协助节点发送FindBuddy_Help消息,让所述协助节点协助找到伙伴节点;
更新模块,用于在找到伙伴节点后,发布更新消息给路由表内的各节点,其中包括其伙伴节点的IP地址、端口号、ID。路由表内的各节点收到所述更新消息后,更新各自路由表的信息;
伙伴节点联络模块,用于定期给所述伙伴节点发送Keep_Alive消息,或者回复Keep_Alive_Ack消息,确保所述伙伴节点没有掉线。
所述伙伴协助连接模块,包括:
TCP连接模块,用于在处于内网的用户节点给处于外网的用户节点传输数据信息时,直接建立TCP连接进行发送;或者在处于内网的用户节点的伙伴节点收到请求反连的消息后,转发给所述处于内网的用户节点,向处于外网的用户节点发起TCP连接;
反连消息发送模块,用于当处于外网的用户节点给处于内网的用户节点传输数据信息时,发送请求处于内网的用户节点进行反连的消息。
所述伙伴寻找模块,只运行于处于内网的用户节点上。
所述伙伴转发模块,只运行于处于外网的用户节点上。
本发明的有益效果是:
1.本发明结合结构化P2P网络完全分布式的特点,去掉了传统UDP穿越方法中穿越服务器的支持,仅仅利用已有的用户节点就可以实现NAT穿越,维持了结构化P2P网络完全分布式的特性;
2.本发明对控制信息和数据信息采取不同的穿越方式,对于控制信息,其数据量和数据包都比较小,由于采用了伙伴节点转发的方式,使得穿越过程不需要花费的辅助数据包,同时穿透的速度和可靠性都得到了提高;对于数据信息,其数据量大,所以采用伙伴节点协助直连的方式,避免了转发的巨大开销;
3.本发明在应用层采用了UDP模拟TCP的可靠传输机制,保证了数据的可靠传输。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明的一种在结构化P2P网络中实现NAT穿越的方法和系统进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明的一种在结构化P2P网络中实现NAT穿越的方法和系统,通过终端启动后,根据自己所处的网络类型选择相应处理方法,并根据所传输的信息类型选择相应的传输方法进行数据的可靠传输。其充分考虑了结构化P2P网络完全分布式的特性,去掉了现有方法中中间服务器的支持,同时,结合控制信息和数据信息本身的特点,对其穿越方式分别处理,加快了穿越的时间,减少了穿越开销,并具有可靠性。
下面结合上述目标详细介绍本发明的一种在结构化P2P网络中实现NAT穿越的方法,图1是本发明一种在结构化P2P网络中实现NAT穿越的方法的步骤流程图,如图1所示,所述方法,包括下列步骤:
步骤100.结构化P2P网络中所有用户节点启动后,所述用户节点根据与自己的ID异或距离为一设定值的其他用户节点的信息,建立并更新自己的路由表;
所述路由表是每个用户节点保存在本地的与自己有联系的其他用户节点的信息,包括IP地址、端口号、ID、处于公网还是内网的标识等,用户节点通过定期与其他用户节点交换信息来进行路由表的更新。
图2是本发明中在结构化P2P网络中所有用户节点启动后更新各自的路由表的步骤流程图,如图2所示,所述步骤100,包括下列步骤:
步骤110,所述用户节点与一个处于外网的引导节点(或叫超级节点)联系;
所述引导节点是一种特殊的节点,当有其他用户节点与引导节点联系时,引导节点便将这些用户节点的信息保存在引导节点的路由表中,路由表的大小有一个上限值,当达到该上限值时,引导节点用与引导节点ID异或距离较近的用户节点替换距离较远的。从而引导节点的路由表里便保存了与引导节点的ID异或距离较近的用户节点的信息;
所述用户节点的信息,包括IP地址、端口号、ID、处于外网还是内网(内网指处于NAT设备后)的标识等等。
所述用户节点的ID是用户节点启动后由某种哈希算法生成的唯一的标识,路由表保存的是对方ID与自己ID异或后所得的值(称为距离)较小的节点。
步骤S120,所述用户节点通过与所述引导节点联系,获得所述引导节点路由表中其他用户节点的信息,并把这些用户节点的信息保存在所述用户节点的路由表中。
步骤200.所述用户节点通过处于外网的用户节点判断自己对外的IP地址和端口号与内网的IP地址和端口号是否相同,若是,表示所述用户节点处于外网;否则表示所述用户节点处于内网;
本步骤中判断用户节点的网络类型是为后面的穿越做准备。只有知道了用户节点的网络类型,才能决定后续是否需要穿越,以及在需要穿越的情况下,采取什么样的穿越方式,即所采取的穿越方式会因为网络类型的不同而不同。
图3是本发明中用户节点通过处于外网的用户节点判断网络类型的步骤流程图,如图3所示,所述步骤200,包括下列步骤:
步骤210,所述用户节点从自己的路由表里选择一个处于外网的用户节点,并给所述处于外网的用户节点发送包括自己的ID,本机的IP地址和端口号的Hello消息;
所述IP地址和端口号是从本机获得的,若本用户节点处于内网,它是指从本机获得的内网的IP地址和端口号,如:10.21.4.222:9900,若本节点处于外网,则该地址为外网地址,如:159.226.33.2:9800。
步骤220,所述处于外网的用户节点收到Hello消息后,从接收的Hello消息中提取出所述用户节点的IP地址和端口号,并从所述用户节点的数据包中提取出填写的IP地址和端口号,判断二者是否相同,若是,则表明所述用户节点处于外网,并执行步骤230;否则表明处于内网;
步骤230,所述处于外网的用户节点判断所述用户节点是否需要被保存到自己的路由表中(即与自己ID的异或距离较近),若是,则把所述用户节点的信息(IP地址、端口号、ID和外网标识)记录到自己的路由表中,同时更新路由表;否则,不记录;
从接收的Hello消息中提取的IP地址和端口是所述用户节点对外的地址和端口,若所述用户节点为内网节点,此地址是NAT分配给其的出口IP和端口。比如所述用户节点(内网)的IP地址为10.21.5.20,端口号为6877,NAT分配给其对外的IP地址为202.206.5.65,端口号为6550,则recvfrom函数中提取出的地址和端口是202.206.5.65:6550,从所述用户节点发送的数据包中提取出的IP地址和端口是10.21.5.20:6877,两者不相等,判断其为内网。若两者相等,则为外网。
步骤240,所述处于外网的用户节点给所述用户节点发送Hello_Response消息,此消息中包括所述用户节点处于内/外网的标识、所述用户节点对外的IP地址和端口号以及所述处于外网的用户节点的ID;
步骤250,所述用户节点收到Hello_Response消息后,解析消息,提取出内/外网的标识,判断出自己所处的网络类型。
步骤300.所述用户节点从自己的路由表里随机选择一个处于外网的用户节点作为所述用户节点的伙伴节点,添加所述伙伴节点的信息;同时所述用户节点发布包括其伙伴节点的IP地址、端口号、ID的更新消息给路由表内的各节点,各节点更新各自路由表的信息;
图4是本发明中用户节点寻找伙伴节点的步骤流程图,如图4所示,所述步骤300,包括如下步骤:
步骤310,判断所述用户节点的路由表中是否存在有处于外网的用户节点,若是,则所述用户节点从所述路由表中随机选择一个所述处于外网的用户节点,并执行步骤320;否则等待所述路由表更新到有处于外网的节点;
步骤320,所述用户节点向所述处于外网的用户节点发送Find_Buddy消息,希望所述处于外网的用户节点成为所述用户节点的伙伴节点;
步骤330,所述处于外网的用户节点收到所述Find_Buddy消息后,查看自身现在是几个内网节点的伙伴节点,若没有达到上限,则所述处于外网的用户节点可以成为所述用户节点的伙伴节点,所述处于外网的用户节点发送确认消息给所述用户节点;否则所述处于外网的用户节点不能成为所述用户节点的伙伴节点,并发送否认消息给所述用户节点;
较佳地,为了减轻伙伴节点的负载压力,规定一个处于外网的用户节点不能成为无数个用户节点的伙伴节点,而是有一个上限值,本系统中取值为5,该值可修改。
步骤340,所述用户节点收到确认消息后,则确定所述处于外网的用户节点为其伙伴节点;若收到否认消息,则判断所述路由表中是否存在没有被选择过的处于外网的用户节点,若有,则返回步骤320;否则,执行步骤350;
步骤350.所述用户节点从所述路由表里随机取出一个处于外网的节点作为协助节点,并向所述协助节点发送FindBuddy_Help消息,让所述协助节点协助找到伙伴节点;
这里随机选择一个外网节点,不是让该外网节点成为它的伙伴,而是让这个外网节点帮助所述用户节点找到伙伴节点。
所述步骤310中,“当路由表没有处于外网的节点时”,是指该节点的路由表的所有项中都是内网节点,这种情况下要等待更新;而步骤340中如果判断结果是所述路由表中不存在没有被选择过的处于外网的用户节点是指目前路由表里所有的处于外网的用户节点均被访问过,但是由于这些处于外网的用户节点已经成为别人的伙伴(本系统中,已经成为了5个人的伙伴),所以不能再成为更多节点的伙伴,因此需要在路由表中随机取出一个处于外网的节点让其协助找到伙伴节点。
步骤360,所述协助节点收到FindBuddy_Help消息后,从其路由表里找到几个处于外网的节点,把这些节点的IP地址、端口号、ID的列表发给所述用户节点;
步骤370,所述用户节点从所述协助节点提供的列表中所有处于外网的节点中选择一个没有被选择过的处于外网的用户节点,并返回步骤320;
步骤380,找到伙伴节点后,所述用户节点发布更新消息给路由表内的各节点,其中包括其伙伴节点的IP地址、端口号、ID。路由表内的各节点收到所述更新消息后,更新各自路由表的信息;
步骤390,所述用户节点定期给所述伙伴节点发送Keep_Alive消息,所述伙伴节点收到后解析发现是Keep_Alive消息,给所述用户节点回复Keep_Alive_Ack消息;
此处发送Keep_Alive是为了保证其和伙伴节点的互通性。若长时间不发,则伙伴节点将不能与其进行联系。Keep_Alive消息和Keep_Alive_Ack消息是只有消息类型的空消息。
步骤3100,所述用户节点判断是否收到Keep_Alive_Ack回复消息,若是,则什么也不做;否则,若所述用户节点给伙伴节点发送三次Keep_Alive消息后均没收到Keep_Alive_Ack回复消息,可推测该伙伴节点已经掉线,需要重新找伙伴节点,返回步骤310。
所述用户节点在以后的更新过程中连同伙伴节点的信息一起更新。
步骤400.用户节点间采用让伙伴节点转发的方式传输控制信息;
图5是本发明中用户节点间传输控制信息的步骤流程图,如图5所示,所述步骤400,包括下列步骤:
步骤410,若处于内网的用户节点给处于外网的用户节点发数据包,则直接发送;
步骤420,若处于外网的用户节点给处于内网的用户节点发数据包,则把数据包发送给所述处于内网的用户节点的伙伴节点,由伙伴节点转发给所述处于内网的用户节点;
步骤430,若两个处于内网的用户节点间发送数据包,则把数据包发送给对方的伙伴节点,由对方的伙伴节点转发给对方。
作为一种可实施方式,假设A和B是两个处于内网的用户节点,A的伙伴节点是C,B的伙伴节点是D,则A把数据包发送给D,由D转发给B,而B发送给A的数据是通过把数据发给A的伙伴节点C,由C转发给A。
步骤500.用户节点间采用让伙伴节点协助连接的方式传输数据信息;
图6是本发明中用户节点间传输数据信息的步骤流程图,如图6所示,所述步骤500,包括下列步骤:
步骤510,处于内网的用户节点给处于外网的用户节点传输数据信息,则直接建立TCP连接进行发送;
本步骤中的所述TCP连接可以直接建立,随后就可以直接进行数据传输,步骤520到570不再执行。
该步骤属于现有的技术,在此不再一一赘述。
步骤520,处于外网的用户节点给处于内网的用户节点传输数据信息,则处于外网的用户节点给处于内网的用户节点的伙伴节点发送请求处于内网的用户节点进行反连的消息;
步骤530,处于内网的用户节点的伙伴节点收到请求反连的消息后,转发给所述处于内网的用户节点,所述处于内网的用户节点收到后,向所述处于外网的用户节点发起TCP连接;
本步骤中的所述TCP连接可以直接建立,随后就可以直接进行数据传输,步骤540到570不再执行。
步骤540,两个处于内网的用户节点间传输数据信息,则一个处于内网的用户节点给另一个处于内网的用户节点的伙伴节点发送打洞请求报文,请求所述伙伴节点给对应的另一个处于内网的用户节点发送打洞请求报文;
步骤550,所述伙伴节点收到打洞请求报文后,转发给对应的所述另一个处于内网的用户节点,所述另一个处于内网的用户节点收到后,进行UDP打洞操作,即发送ping消息给所述处于内网的用户节点。该消息是消息头为PING类型的空消息;
作为一种可实施方式,假设A和B是两个内网节点,A的伙伴节点是C,B的伙伴节点是D,则节点A给节点B的伙伴节点D发送打洞请求报文,请求给B发送打洞请求报文,节点D收到打洞请求报文后,给B转发,B收到后,进行UDP打洞操作,即发送ping消息给A。此处发送消息的目的地址是A在NAT的出口地址,假设A的内网地址和端口是10.21.5.66:9888,出口地址和端口是159.226.34.6:9678,则B发送的目的地址和端口是159.226.34.6:9678,而后续A发送给B的目的地址和端口也是B在NAT映射的出口地址和端口。
步骤560,若所述另一个处于内网的用户节点收到所述处于内网的用户节点发来的ping消息后,将进行ping回复,所述处于内网的用户节点收到ping回复消息的节点确认打洞成功。
较佳地,节点会多一次发送ping消息,确保打洞成功。若由于网络原因双方都没有收到ping消息,则返回步骤540,重新进行打洞。
步骤570,利用UDP打洞协助两个处于内网的用户节点建立直连,使得其可以直接传输数据信息;
相应于本发明的一种在结构化P2P网络中实现NAT穿越的方法,还提供一种在结构化P2P网络中实现NAT穿越的系统。
比较现有技术的NAT穿越系统,本系统具备以下特点:
1)基于结构化P2P网络:本系统是应用于结构化P2P网络环境下的NAT穿越系统,主要应用于结构化P2P环境下的共享资源发布,文件下载等应用;
2)快速高效的进行控制信息的穿越:控制信息采用伙伴节点转发的方式,可以快速可靠的实现穿越,大大减少了穿越时间,同时由于伙伴节点的分布性和控制信息数据量小的特性,并不会给伙伴节点造成压力;
3)可靠性:通过伙伴节点转发和UDP模拟TCP,可以实现传输的可靠性。
图7是本发明的一种在结构化P2P网络中实现NAT穿越的系统的用户终端的结构示意图,如图7所示,所述系统,由一系列的用户终端组成,用户终端是需要实现NAT穿越的用户节点。所述用户终端,包括以下几个模块:
引导节点联系模块1,用于在结构化P2P网络中所有用户节点启动后,与一个处于外网的引导节点联系,获得所述引导节点路由表中与所述用户节点的ID异或距离为一设定值的其他用户节点的信息,建立并更新自己的路由表;
判断模块2,用于通过处于外网的用户节点判断自己对外的IP地址和端口号与内网的IP地址和端口号是否相同,若是,表示所述用户节点处于外网;否则表示所述用户节点处于内网;
伙伴寻找模块3:用于从自己的路由表里随机选择一个处于外网的用户节点作为自己的伙伴节点,添加所述伙伴节点的信息;同时发布包括其伙伴节点的IP地址、端口号、ID的更新消息给路由表内的各节点,各节点更新各自路由表的信息;
所述伙伴寻找模块,只运行于处于内网的用户节点上;
伙伴转发模块4:用于协助处于内网的用户节点,对控制信息进行转发;
所述伙伴转发模块,只运行于处于外网的用户节点;
伙伴协助连接模块5:用于利用UDP打洞协助两个处于内网的用户节点建立直连,使得其可以直接通信;
可靠传输模块6:用于UDP模拟TCP进行数据传输。
其中,所述判断模块2,包括:
信息发送模块21,用于从自己的路由表里选择一个处于外网的用户节点,并给所述处于外网的用户节点发送包括自己的ID,本机的IP地址和端口号的Hello消息;
信息提取模块22,用于从接收的Hello消息中提取出用户节点的IP地址和端口号,并从用户节点的数据包中提取出填写的IP地址和端口号;
判断子模块23,用于处于外网的用户节点判断其他用户节点是否需要被保存到自己的路由表中,若是,则把其他用户节点的信息记录到自己的路由表中,同时更新路由表;否则,不记录;
回复模块24,用于处于外网的用户节点给其他用户节点发送Hello_Response消息,此消息中包括其他用户节点处于内/外网的标识、其他用户节点对外的IP地址和端口号以及其他处于外网的用户节点的ID。
所述伙伴寻找模块3,包括:
外网用户寻找模块31,用于判断用户节点的路由表中是否存在有处于外网的用户节点,若是,则所述用户节点从所述路由表中随机选择一个所述处于外网的用户节点发送Find_Buddy消息;否则等待所述路由表更新到有处于外网的节点;
阈值判断模块32,用于处于外网的用户节点收到所述Find_Buddy消息后,查看自身现在是几个内网节点的伙伴节点,若没有达到上限,则所述处于外网的用户节点可以成为所述用户节点的伙伴节点;
协助节点寻找模块33,用于在路由表中不存在没有被选择过的处于外网的用户节点时,从所述路由表里随机取出一个处于外网的节点作为协助节点,并向所述协助节点发送FindBuddy_Help消息,让所述协助节点协助找到伙伴节点;
更新模块34,用于在找到伙伴节点后,发布更新消息给路由表内的各节点,其中包括其伙伴节点的IP地址、端口号、ID。路由表内的各节点收到所述更新消息后,更新各自路由表的信息;
伙伴节点联络模块35,用于定期给所述伙伴节点发送Keep_Alive消息,或者回复Keep_Alive_Ack消息,确保所述伙伴节点没有掉线。
所述伙伴协助连接模块5,包括:
TCP连接模块51,用于在处于内网的用户节点给处于外网的用户节点传输数据信息时,直接建立TCP连接进行发送;以及处于内网的用户节点的伙伴节点收到请求反连的消息后,转发给所述处于内网的用户节点,向处于外网的用户节点发起TCP连接;
反连消息发送模块52,用于当处于外网的用户节点给处于内网的用户节点传输数据信息时,发送请求处于内网的用户节点进行反连的消息。
在结构化P2P网络中所有用户节点启动后,用户终端(用户节点)首先通过引导节点联系模块1与一个处于外网的引导节点联系,获得所述引导节点路由表中与所述用户节点的ID异或距离为一设定值的其他用户节点的信息,建立并更新自己的路由表;然后判断模块2通过处于外网的一个用户节点判断自己对外的IP地址和端口号与内网的IP地址和端口号是否相同,若是,表示所述用户节点处于外网;否则表示所述用户节点处于内网;若是处于内网的用户节点,则通过伙伴寻找模块3从自己的路由表里随机选择一个处于外网的用户节点作为自己的伙伴节点,添加所述伙伴节点的信息;同时发布包括其伙伴节点的IP地址、端口号、ID的更新消息给路由表内的各节点,各节点更新各自路由表的信息;当需要发布控制信息时,则通过伙伴转发模块4协助处于内网的用户节点,对控制信息进行转发;当需要发布数据信息时,则通过伙伴协助连接模块5利用UDP打洞协助两个处于内网的用户节点建立直连,使得其可以直接通信;成功后,通过可靠传输模块利用UDP模拟TCP进行数据的可靠传输。
本发明的有益效果在于:
1.本发明结合结构化P2P网络完全分布式的特点,去掉了传统UDP穿越方法中穿越服务器的支持,仅仅利用已有的用户节点就可以实现NAT穿越,维持了结构化P2P网络完全分布式的特性;
2.本发明对控制信息和数据信息采取不同的穿越方式,对于控制信息,其数据量和数据包都比较小,由于采用了伙伴节点转发的方式,使得穿越过程不需要花费的辅助数据包,同时穿透的速度和可靠性都得到了提高;对于数据信息,其数据量大,所以采用伙伴节点协助直连的方式,避免了转发的巨大开销;
3.本发明在应用层采用了UDP模拟TCP的可靠传输机制,保证了数据的可靠传输。
通过结合附图对本发明具体实施例的描述,本发明的其它方面及特征对本领域的技术人员而言是显而易见的。
以上对本发明的具体实施例进行了描述和说明,这些实施例应被认为其只是示例性的,并不用于对本发明进行限制,本发明应根据所附的权利要求进行解释。