本发明涉及nat类型探测技术、udp穿透领域,尤其涉及一种基于kcp协议的nat穿透方法。
背景技术:
nat英文全称是“networkaddresstranslation”,中文意思是“网络地址转换”,它是一个ietf(internetengineeringtaskforce,internet工程任务组)标准,允许一个整体机构以一个公用ip(internetprotocol)地址出现在internet上。顾名思义,它是一种把内部私有网络地址(ip地址)翻译成合法网络ip地址的技术。nat可以让那些使用私有地址的内部网络连接到internet或其它ip网络上。
传统的穿透方法有基于tcp穿透和基于udp穿透的方法,这两者都有一定程度上的缺陷;其中,基于tcp的穿透方法有tcp协议基于连接的模式导致成功率不高的问题,而基于udp协议的穿透方法虽然成功率高,但是存在udp协议不可靠的问题。
kcp是一个快速可靠协议,它主要的设计目的是为了解决在网络拥堵的情况下tcp协议网络速度慢的问题,增大网络传输速率,但相当于tcp而言,会相应的牺牲一部分带宽。kcp没有规定下层传输协议,一般用udp作为下层传输协议。
在使用udp协议进行nat穿透成功的前提下,使用kcp协议进行连接的方案相比于tcp穿透方案的成功率要高上不少,相比于udp穿透方案可靠性也得到一定的保障。
技术实现要素:
针对tcp进行nat穿透难度大和udp穿透可靠性不高的技术问题,本发明提供一种基于kcp协议的nat穿透方法,能够保障更高的nat穿透成功率和不错的可靠性,具体技术方案如下:
一种基于kcp协议的nat穿透方法,其特征在于,该方法中需要得到nat穿透协助的客户端为c1,c1想要连接的客户端为c2,该方法具体包括如下步骤:
s1:c1向服务端发起nat穿透c2的请求;
s2:服务端根据客户端c1的情况作出如下回复:
(1)如果c2不存在,则服务端向c1回复c2不存在的消息,c1结束本次nat穿透;
(2)如果c2存在,且c1是公网节点,服务端则通知c2去反连c1,c1持续一段时间等待对方的连接,如果连接成功,此次穿透成功;否则,穿透失败;
(3)如果c2存在,且c1不是公网节点,且c2不是对称型nat,则服务端通知c1进行nat穿透,连接c2,c1首先判断c2是否存在upnp端口,如果存在,则c1先使用c2的upnp端口进行tcp连接,如果连接成功,则此次穿透成功,否则,c1使用udp协议进行nat穿透,如果穿透失败,则此次穿透失败;如果穿透成功,则使用kcp协议进行连接,如果连接成功,则此次穿透成功,否则穿透失败;
(4)如果c2存在且是对称型nat,但c1不是公网节点也不是对称型nat,则服务端通知c1进行nat穿透,c1使用udp协议进行nat穿透,然后持续一段时间等待c2的连接,如果连接成功,那么此次nat穿透成功,否则失败;
(5)如果都不是上面的情况,则服务端通知c1和c2进行中继服务。
进一步地,所述的客户端c1在启动时通过stun协议探测自己的nat类型,并向服务端注册自己的nat类型,所述的服务端根据这些nat信息进行策略选择;所述的nat类型包括对称型、端口限制型、地址限制型和全锥型。
进一步地,所述的客户端c1启动时,向自己的网关设备绑定upnp端口。
进一步地,如果存在客户端c2不存在或者没有注册的情况,则由服务端连接上该客户端c2并通知它进行注册。
进一步地,所述的步骤(5)中,如果c2存在upnp端口,那么c1需要尝试使用该upnp端口去连接c2,如果连接成功,那么此次nat穿透成功,否则还需c1判断自己有没有upnp端口,如果没有,那么此次nat穿透失败,否则,c1需要等待c2的连接,如果连接成功,那么此次nat穿透成功,否则失败。
本发明的有益效果如下:
本发明基于kcp协议的nat穿透方法相比于基于tcp的穿透方法,成功率得到一定程度的提高;而相比于基于udp的穿透方法,可靠性又得到了一定程度的保障。
附图说明
图1为本发明的基于kcp协议的nat穿透方法的流程图。
具体实施方式
下面根据附图和具体实施例详细描述本发明,本发明的目的和效果将变得更加明显。
如图1所示,本发明的基于kcp协议的nat穿透方法,该方法中需要得到nat穿透协助的客户端为c1,c1想要连接的客户端为c2,该方法具体包括如下步骤:
s1:c1向服务端发起nat穿透c2的请求;
s2:服务端根据客户端c1的情况作出如下回复:
(1)如果c2不存在,则服务端向c1回复c2不存在的消息,c1结束本次nat穿透;
(2)如果c2存在,且c1是公网节点,服务端则通知c2去反连c1,c1持续一段时间等待对方的连接,如果连接成功,此次穿透成功;否则,穿透失败;
(3)如果c2存在,且c1不是公网节点,且c2不是对称型nat,则服务端通知c1进行nat穿透,连接c2,c1首先判断c2是否存在upnp端口,如果存在,则c1先使用c2的upnp端口进行tcp连接,如果连接成功,则此次穿透成功,否则,c1使用udp协议进行nat穿透,如果穿透失败,则此次穿透失败;如果穿透成功,则使用kcp协议进行连接,如果连接成功,则此次穿透成功,否则穿透失败;
(4)如果c2存在且是对称型nat,但c1不是公网节点也不是对称型nat,则服务端通知c1进行nat穿透,c1使用udp协议进行nat穿透,然后持续一段时间等待c2的连接,如果连接成功,那么此次nat穿透成功,否则失败;
(5)如果都不是上面的情况,则服务端通知c1和c2进行中继服务。
优选地,所述的客户端c1在启动时通过stun协议探测自己的nat类型,并向服务端注册自己的nat类型,所述的服务端根据这些nat信息进行策略选择;所述的nat类型包括对称型、端口限制型、地址限制型和全锥型。
优选地,所述的客户端c1启动时,向自己的网关设备绑定upnp端口。
优选地,如果存在客户端c2不存在或者没有注册的情况,则由服务端连接上该客户端c2并通知它进行注册。
优选地,所述的步骤(5)中,如果c2存在upnp端口,那么c1需要尝试使用该upnp端口去连接c2,如果连接成功,那么此次nat穿透成功,否则还需c1判断自己有没有upnp端口,如果没有,那么此次nat穿透失败,否则,c1需要等待c2的连接,如果连接成功,那么此次nat穿透成功,否则失败。