发明内容
本发明提出一种Kademlia网络的节点标识符生成方法,节点之间计算出来的距离跟现实网络环境更为接近,从而提高效率。
本发明的技术方案是这样实现的:
一种Kademlia网络的节点标识符生成方法,具体包括以下步骤:
(1)在Kademlia网络设置若干节点,获取节点的内网IP地址和占用的内网端口;
(2)获取节点的公网IP地址和NAT类型;
(3)判断节点是否处于内网,得出节点的内网标志;
(4)判断节点是否处于防火墙后,得出节点的防火墙标志;
(5)对公网IP地址进行SHA1运算,得到节点的原始节点标识符,原始节点标识符占用160bit;
(6)根据公网IP地址从公网IP地址数据库查询该公网IP地址所属的ICP信息和区域信息;
(7)测试节点分别到各网络运营商的节点的网速,得到节点的路由信息;
(8)设定节点的级别信息;
(9)将级别信息、内网IP地址、内网端口、公网IP地址、NAT类型、ICP信息、内网标志、防火墙标志、区域信息和路由信息与原始节点标识符进行或运算,得到节点的节点标识符;
节点标识符包括依次排列的ICP信息、区域信息、路由信息、级别信息、内网标志、公网IP地址、NAT类型、内网IP地址和内网端口,节点标识符占用160bit,ICP信息占用2bit,区域信息占用10bit,路由信息占用3bit,级别信息占用2bit,内网标志占用1bit,公网IP地址占用90bit,NAT类型占用3bit,内网IP地址占用32bit,内网端口占用16bit;
路由信息描述了节点到电信、网通、教育网的网速。
进一步的,步骤(2)中获取节点的NAT类型具体包括以下步骤:
(201)节点所处的公网中设有一个Stun服务器,Stun服务器设有两个公网IP地址;
(202)判断节点是否能够进行UDP通信,若节点不能进行UDP通信,则停止流程;否则,进入下一步;
(203)判断节点是否位于NAT后,若否,则停止流程,若是,则进入下一步;
(204)判断节点的NAT类型是否是全通型NAT,若是,则停止流程,若否,则进入下一步;
(205)判断节点的NAT类型是否是对称型NAT,若是,则停止流程,若否,则进入下一步;
(206)判断节点的NAT类型是受限型NAT还是端口受限型NAT。
进一步的,步骤(202)中,若节点不能进行UDP通信,则节点的NAT类型为未知类型。
进一步的,步骤(203)中,停止流程后,得出节点的NAT类型为公网型。
进一步的,步骤(202)、(203)、(204)、(205)和(206)中,节点通过建立UDP socket进行判断。
进一步的,步骤(3)中判断节点是否处于内网的步骤为,比较内网IP地址和公网IP地址是否相同,若是,则处于公网,若否,则处于内网。
进一步的,步骤(7)具体包括以下步骤:
(701)从节点的路由表中选出M个已知节点,M为整数,M大于等于3,已知节点是各网络运营商的节点;
(702)节点分别向已知节点发送RCP TEST指令;
(703)已知节点收到RCP TEST指令后,向节点返回一个响应命令;
(703)节点在有效时间内,根据接收到的响应命令,得出到已知节点的网速与带宽;
(704)根据节点到已知节点的网速和带宽确定路由信息。
本发明的有益效果在于:节点之间计算出来的距离跟现实网络环境更为接近,从而提高效率。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
一、主流程
如图1所示,本发明提出了一种Kademlia网络的节点标识符生成方法,具体包括以下步骤:
(1)在Kademlia网络设置若干节点,获取节点的内网IP地址和占用的内网端口;内网端口是用于将节点连接Kademlia网络的UDP端口;
(2)获取节点的公网IP地址和NAT类型;
步骤(2)中获取节点的NAT类型具体包括以下步骤:
(201)节点所处的公网中设有一个Stun服务器,Stun服务器设有两个公网IP地址;Stun服务器做UDP监听(IP-1,Port-1),(IP-2,Port-2)并根据客户端的要求进行应答。
(202)判断节点是否能够进行UDP通信,若节点不能进行UDP通信,则停止流程;否则,进入下一步;
(203)判断节点是否位于NAT后,若否,则停止流程,若是,则进入下一步;
节点建立UDP socket然后用这个socket向Stun服务器的(IP-1,Port-1)发送数据包要求Stun服务器返回节点的IP和Port,节点发送请求后立即开始接收数据包,要设定socket Timeout(200ms),防止无限堵塞.重复这个过程若干次。如果每次都超时,无法接收到Stun服务器的回应,则说明节点无法进行UDP通信,可能是防火墙或NAT阻止UDP通信,这样的节点也就不能P2P了,停止流程。当节点能够接收到Stun服务器的回应时,需要把Stun服务器返回的节点(IP,Port)和这个节点socket的(LocalIP,LocalPort)比较。如果完全相同则节点不在NAT后,这样的节点具有公网IP可以直接监听UDP端口接收数据进行通信,检测停止。否则节点在NAT后,要进入下一步。
(204)判断节点的NAT类型是否是全通型NAT,若是,则停止流程,若否,则进入下一步;
节点建立UDP socket然后用这个socket向Stun服务器的(IP-1,Port-1)发送数据包要求Stun服务器用另一对(IP-2,Port-2)响应节点的请求往回发一个数据包,节点发送请求后立即开始接收数据包,要设定socket Timeout(200ms),防止无限堵塞.重复这个过程若干次。如果每次都超时,无法接收到Stun服务器的回应,则说明节点的NAT不是一个Full Cone NAT,需进入下一步。如果能够接收到Stun服务器从(IP-2,Port-2)返回的应答UDP包,则说明节点是一个Full Cone NAT,这样的节点能够进行UDP-P2P通信,停止流程。
(205)判断节点的NAT类型是否是对称型NAT,若是,则停止流程,若否,则进入下一步;
节点建立UDP socket然后用这个socket向Stun服务器的(IP-1,Port-1)发送数据包要求Stun服务器返回节点的IP和Port,节点发送请求后立即开始接收数据包,要设定socket Timeout(200ms),防止无限堵塞.重复这个过程直到收到回应,一定能够收到,因为前面保证了这个节点可以进行UDP通信。
用同样的方法用一个socket向Stun服务器的(IP-2,Port-2)发送数据包要求Stun服务器返回节点的(IP,Port)。
比较上面两个过程从Stun服务器返回的节点(IP,Port),如果两个过程返回的(IP,Port)有一对不同则说明节点为Symmetric NAT,这样的节点无法进行UDP-P2P通信,停止流程。否则是Restricted Cone NAT(受限型NAT),是否为Port Restricted Cone NAT(端口受限型NAT),需进入下一步。
(206)判断节点的NAT类型是受限型NAT还是端口受限型NAT。
节点建立UDP socket然后用这个socket向Stun服务器的(IP-1,Port-1)发送数据包要求Stun服务器用IP-1和一个不同于Port-1的端口发送一个UDP数据包响应节点,节点发送请求后立即开始接收数据包,要设定socket Timeout(200ms),防止无限堵塞.重复这个过程若干次。如果每次都超时,无法接收到Stun服务器的回应,则说明节点是一个PortRestricted Cone NAT(端口受限型NAT),如果能够收到Stun服务器的响应则说明节点是一个Restricted Cone NAT(受限型NAT)。以上两种NAT都可以进行UDP-P2P通信。
(3)判断节点是否处于内网,得出节点的内网标志;步骤(6)中判断节点是否处于内网的步骤为,比较内网IP地址和公网IP地址是否相同,若是,则处于公网,若否,则处于内网。
(4)判断节点是否处于防火墙后,得出节点的防火墙标志;如果节点只能单向通行,则处于防火墙后,防火墙标志为1,即该节点的内网可以访问外网,外网不能访问内网。
(5)对公网IP地址进行SHA1运算,得到节点的原始节点标识符,原始节点标识符占用160bit;
(6)根据公网IP地址从公网IP地址数据库查询该公网IP地址所属的ICP信息和区域信息;
(7)测试节点分别到各网络运营商的节点的网速,得到节点的路由信息;
步骤(7)具体包括以下步骤:
(701)从节点的路由表中选出M个已知节点,M为整数,M大于等于3,已知节点是各网络运营商的节点;
(702)节点分别向已知节点发送RCP TEST指令;
(703)已知节点收到RCP TEST指令后,向节点返回一个响应命令;
(703)节点在有效时间内,根据接收到的响应命令,得出到已知节点的网速与带宽;
(704)根据节点到已知节点的网速和带宽确定路由信息。
(8)设定节点的级别信息;
(9)将级别信息、内网IP地址、内网端口、公网IP地址、NAT类型、ICP信息、内网标志、防火墙标志、区域信息和路由信息与原始节点标识符进行或运算,得到节点的节点标识符。
二、节点标识符的定义
如图2所示,节点标识符包括依次排列的ICP信息、区域信息、路由信息、级别信息、内网标志、公网IP地址、NAT类型、内网IP地址和内网端口。
ICP信息:占用2个bit,代表节点所在的网络的运营商,其中10代表电信,01代表网通,00代表教育网,11代表其它。
区域信息:占用10个bit,代表节点所在的城节,以区号代替,比如深圳的区号为0755,则以1011110011表示。
路由信息:占用3个bit,描述了节点到电信、网通、教育网的网速;100表示到电信的速度很好,010表示到网通的速度很好,001表示到教育网的速度很好,可以组合,比如到电信与网通的速度都很好,则以110表示。
级别信息:占用2个bit,描述了节点的系统级别;00表示普通节点(以CN表示),01表示在线时间比较长的节点(以LN表示),10表示带宽比较好的节点(以WN表示),11表示服务器级别的节点(以SN表示,节点标识符由运营该网络的运营商布署)。
内网标志:占用1个bit,指明该节点是否处于局域网内部。
防火墙标志:占用1个bit,指明该节点是否处于防火墙背后。
公网IP地址:占用90个bit,这个值是由节点所处的公网IP地址,经过SHA1哈希运算后,去掉高位29bit,去掉低位51bit,所剩的90bit。
NAT类型:占用3个bit,含义如下,不同的NAT类型,可以用来表示不同节点的通信优先级。
000:未知类型(无法检查或不认识的类型)
001:公网(节点直接暴露在公网环境中,直接使用公网IP地址)
010:Full Cone NAT(全通型NAT),内网主机建立一个UDP socket(内网IP地址:内网端口)第一次使用这个socket给外部主机发送数据时,会给其分配一个(公网IP地址:公网端口),以后用这个socket向外面任何主机发送数据都将使用这对(公网IP地址:公网端口)。此外,任何外部主机只要知道这个(公网IP地址:公网端口)就可以发送数据给内网主机的(公网IP地址:公网端口),内网的主机就能收到这个数据包。
011:Restricted Cone NAT(受限型NAT),内网主机建立一个UDP socket(内网IP地址:内网端口),第一次使用这个socket给外部主机发送数据时NAT会给其分配一个(公网IP地址:公网端口),以后用这个socket向外面任何主机发送数据都将使用这对(公网IP地址:公网端口)。此外,如果任何外部主机想要发送数据给这个内网主机,只要知道这个(公网IP地址:公网端口)并且内网主机之前用这个socket曾向这个外部主机发送过数据。只要满足这两个条件,这个外部主机就可以用其(IP,任何端口)发送数据给内网主机的(公网IP地址:公网端口),内网的主机就能收到这个数据包。
100:Port Restricted Cone NAT(端口受限型NAT),内网主机建立一个UDPsocket(内网IP:端口)第一次使用这个socket给外部主机发送数据时NAT会给其分配一个(公网IP地址:公网端口),以后用这个socket向外面任何主机发送数据都将使用这对(公网IP地址:公网端口)。此外,如果任何外部主机想要发送数据给这个内网主机,只要知道这个(公网IP地址:公网端口)并且内网主机之前用这个socket曾向这个外部主机(IP,Port)发送过数据。只要满足这两个条件,这个外部主机就可以用该(IP,Port)发送数据给内网主机的(公网IP地址:公网端口),内网的主机就能收到这个数据包
101:Symmetric NAT(对称型NAT),内网主机建立一个UDP socket(内网IP:端口),当用这个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通信。
内网IP:占用32个bit,描述了节点所处的局域网内的IP地址,如果没有,节点直接处于公网环境中,则为公网的IP地址。
内网端口:占用16个bit,描述了节点为了加入Kademlia网络所使用的UDP端口。
三、总结
根据Kademlia网络的路由算法,两个节点标识符之间的“异或”运算结果为“距离”,那么相同ICP信息的两点之间的“距离”更短,如果两个节点在同一城市(区域信息相同),则计算出来的“距离”更短,如果两个节点在同一个局域网内,则由于公网IP是一样的,不同的只是内网IP,则计算出来的“距离”最短。基于这样的基础,当一个节点需要搜索其它节点或资源时,总是在距自己实际上最近的节点开始搜索起,搜索到的节点有很大的概念都是离自己比较近的,这样节点获取资源的速度得到了很大的提高。
一个典型的例子,在一个局域网NET1内(公网环境为电信网)的一个节点A,发布了一首MP3,经过一段时间的传播后,有可能该MP3存在于局域网NET1内,也有可能存在于其它局域网NET2内,甚至可能存在于公网环境为网通的其它节点NET3上。同在一个局域网NET1内的一个节点B,它需要搜索这首MP3,如果按照普通的节点标识符生成算法,那么节点B按照Kademlia搜索算法,优先定位到的存在这道MP3的节点有可能是NET1,也有可能是NET2或NET3,随机性很大,这将造成这样一种情况,明明在同一域局网NET1上就有这首MP3,可节点B却跑到其它网络NET3上去下载,这样可能会影响下载速度,也浪费了公网带宽。如果按照本发明所提出的标识符生成算法,只要同在NET1上的存在这道MP3的节点仍然在网络上,则节点B在搜索这首MP3的时候,会先搜索到节点A,从而在节点A上下载这首MP3,很明显,在局域网内下载文件的速度,远远要大于在公网上下载文件的速度。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。