具体实施方式
本发明实施例提供的穿越网络地址转换设备/防火墙的方法、系统及客户端,用于在P2P网络中需要可靠数据传输的场合,建立TCP直接连接(TCP直连),本发明实施例提供的方法也可以简称为TCP打洞方法。
为使本发明实施例的目的、技术方案、及优点更加清楚明白,以下结合附图对本发明实施例进行详细说明。
以下以穿越网络地址转换设备的方法为例说明本发明实施例提供的方法,该方法也能够用于穿越防火墙。
请参见图2,为本发明实施例提供的穿越网络地址转换设备的系统组成示意图,该系统包括:客户端A(第一客户端)201,客户端B(第二客户端)202,打洞辅助服务器203;
其中,测打洞辅助服务器203,用于协助客户端A201和客户端B202穿越NAT设备建立图2中虚线所示的TCP直连,打洞辅助服务器203在协助客户端A201和客户端B202建立TCP直连以后,不会介入数据传输过程,数据传输由客户端A201和客户端B202独立完成。
在本发明实施例中,在穿越NAT设备,建立TCP直连前,客户端需要测试打洞环境,并保存测试结果,打洞环境测试包括:测试操作系统版本是否符合打洞要求、测试用户是否有超级用户权限(一般Windows用户都具有超级用户权限)、测试是否可以使用操作系统接口设置公网IP地址的TTL值,以及测试表1所示的TCP包序列是否为可用于打洞的TCP包序列,其中,可用于打洞的TCP包序列是指未被TNAT设备过滤的TCP包序列。
其中,操作系统版本是否符合打洞要求、用户是否有超级用户权限、以及是否可以使用操作系统接口设置IP地址的TTL值的测试由客户端使用操作系统提供的接口独立完成。并且,在本发明实施例中,客户端的操作系统版本为WinXP SP2及以上的版本,则符合打洞要求。
为了完成对表1所示TCP包序列过滤情况的测试,图2所示的系统中进一步包括:测试服务器A204,测试服务器B205;
其中,测试服务器A204,用于协助客户端A201测试客户端A的NAT设备(NAT-A)对表1所示TCP包序列的过滤情况,即测试客户端A可用表1中的哪些TCP包序列打洞;测试服务器B205,用于协助客户端B202测试客户端B的NAT设备(NAT-B)对表1所示TCP包序列的过滤情况,即测试客户端B可用表1中的哪些TCP包序列打洞。
值得注意的是,为了节约网络资源,在本发明实施例中,如果打洞环境没有改变,则客户端可以直接获取已保存的测试结果,并按照该结果进行打洞,并不影响本发明实施例的实现。
以下对表1所示的TCP包序列进行介绍。表1每一行表示一个TCP包序列,其中,第一个包表示客户端向测试服务器发送的数据包,第二个包和第三个包表示测试服务器在收到第一个包后,向客户端返回的数据包。
| 1 |
SYNout |
SYNin |
无 |
| 2 |
SYNout |
ICMPin |
SYNin |
| 3 |
SYNout |
ICMPin |
SYNACKin |
| 4 |
SYNout |
RSTin |
SYNin |
| 5 |
SYNout |
RSTin |
SYNACKin |
表1
以下结合图2所示的系统对本发明实施例提供的方法进行详细介绍。
请参见图3,为本发明实施例提供的穿越网络地址转换设备的方法,该方法包括:
步骤301:客户端A通过打洞辅助服务器向客户端B发起TCP直接连接请求;
步骤302:打洞辅助服务器将客户端A的公网IP地址及端口号发送给客户端B,并将客户端B的公网IP地址及端口号发送给客户端A;
步骤303:客户端A获取已测试得到的打洞可采用的TCP包序列;
步骤304:客户端A和客户端B在打洞辅助服务器的协助下,按照步骤303获得的打洞可采用的TCP包序列,向对方的公网IP地址和端口号发送数据包,直到成功建立TCP直接连接。
若客户端是第一次进行TCP打洞,则上述方法进一步包括如下步骤:
客户端A和客户端B在测试服务器的协助下,测试打洞环境;
客户端A保存自身的打洞环境测试结果及客户端B通过打洞辅助服务器向其返回的打洞环境测试结果。
举例说明客户端和测试服务器如何测试哪些TCP包序列是可以用于打洞的TCP序列。比如,客户端A向测试服务器A发送第一个包SYNout后,客户端收到了测试服务器返回的第二个包ICMPin和第三个包SYNin,这说明序号为2的TCP包序列未被NAT设备过滤,则客户端A记录序号为2的TCP包序列为可用打洞的TCP包序列,反之,若客户端A未收到测试服务器返回的数据包,说明TCP包序列被NAT设备过滤,则该序列不能用于打洞。
以上介绍了本发明实施例提供的穿越NAT设备的方法,在本发明其他实施例中,客户端可以在步骤304之前的任意一个位置执行步骤303,并不影响本发明实施例的实现。
具体实现时,会存在多种不同的打洞环境测试结果,以下针对不同的打洞环境测试结果对本发明实施例的具体实现过程进行详细介绍。
请参见图4,为本发明第一实施例提供的穿越NAT设备的方法流程图,该方法包括:
步骤401:客户端A连接打洞辅助服务器的协助打洞端口,并发送TCP直接连接请求;
步骤402:打洞辅助服务器收到所述请求后,通过主连接向客户端B发送TCP连接通知,并将客户端A经过NAT-A设备转换的公网IP地址和端口号通过主连接发送给客户端B;
客户端B在收到TCP连接通知后,与打洞辅助服务器的协助打洞端口连接,随便发送一些数据至打洞辅助服务器后立即断开,以使得打洞辅助服务器记录客户端B经NAT-B设备转换后的公网IP地址和端口号;
步骤403:打洞辅助服务器通过主连接将客户端B的公网IP地址和端口号发送给客户端A;
此时,客户端A知道了客户端B的公网IP地址和端口号,客户端B也知道了客户端A的公网IP地址和端口号;
步骤404:客户端A获取已测试得到的打洞可采用的TCP包序列,若所述TCP序列是表1中序号为㈠勺TCP包序列,则客户端A获取已存的环境测试结果,若环境测试结果为系统版本为WinXP SP2及以上,则进入步骤405;
步骤405:客户端A通过打洞辅助服务器向客户端B发送通知消息,该通知消息用于通知客户端B向客户端A的公网IP地址和端口号发送SYN包;
步骤406:客户端A和客户端B向对方的公网IP地址和端口号,发送SYN包;
步骤407:客户端A和客户端B在收到SYN包后,返回同步数据包确认消息(SYNACK)至对方;
至此TCP直连已建立,按照TCP协议的规定,上述方法进一步包括:
步骤408:客户端A和客户端B在收到SYNACK后,向对方返回确认消息(ACK)。
请参见图5,为本发明第二实施例提供的穿越网络地址转换设备的方法流程图,该方法与第一实施例的区别在于:
步骤504:客户端A获取已测试得到的打洞可采用的TCP包序列,若所述TCP序列是表1中序号为2的TCP包序列,则客户端A获取已存的环境测试结果,若环境测试结果为系统版本为能够使用操作系统接口设置公网IP地址的TTL值,则进入步骤505;
步骤505:客户端A通过打洞辅助服务器向客户端B发送第一SYN包,第一SYN包携带客户端B的公网IP地址的TTL值被设置为低;
其中,低TTL值的要求是:TTL值可以使第一SYN包穿过NAT-A设备,但是不能到达客户端B;
并且,第一SYN包由客户端A利用底层网络函数自己构造。
步骤506:打洞辅助服务器向客户端A返回Internet控制消息协议包(Internet Control Message Protocol,ICMP),ICMP包携带客户端A的公网IP地址的TTL值设置为过期;
步骤507:打洞辅助服务器向客户端B发送通知消息;
步骤508:客户端B在收到所述通知消息后,向客户端A的公网IP地址和端口号发送第二SYN包;
步骤509:客户端A在收到客户端B发送来的第二SYN包后,向客户端B发送SYNACK包,至此TCP直连已建立。
请参见图6,为本发明第三实施例提供的穿越NAT设备的方法流程图,该方法与前文已述实施例的区别在于:
步骤604:客户端A获取已测试得到的打洞可采用的TCP包序列,若所述TCP序列是表1中序号为3的TCP包序列,则客户端A获取已存的环境测试结果,若环境测试结果为系统版本为操作系统版本为Win XP SP2及以上,用户具有超级用户权限,并且,能够使用操作系统接口设置公网IP地址的TTL值,则进入步骤605;
步骤605:客户端A和客户端B通过打洞辅助服务器向对方发送SYN包,该SYN包携带公网IP地址的TTL值被设置为低TTL值;
具体的,客户端A向客户端B发送的第一SYN包携带客户端B的公网IP地址,该公网IP地址的TTL值被设置为低TTL值,同理,客户端B向客户端A发送的第二SYN包携带客户端A的公网IP地址,该公网IP地址的TTL值被设置为低TTL值;
并且,低TTL值的要求请参见第二实施例相关部分,此处不再赘述。
步骤606:打洞辅助服务器向客户端A和客户端B分别发送ICMP包;
其中,发给客户端A的ICMP包携带客户端A的公网IP地址,该公网IP地址的TTL被设置为过期,同理,发给客户端B的ICMP携带客户端B的公网IP地址,该公网IP地址的TTL值被设置为过期;
步骤607:客户端A和客户端B在收到ICMP包后,通过打洞辅助服务器向对方发送自己的TCP序列号;
其中,TCP序列号是客户端A和客户端B在向对方发送SYN包的同时自己监听到的;
步骤608:客户端A和客户端B在收到对方的TCP序列号后,向对方发送SYNACK包,至此TCP直连已建立。
以上介绍了本发明第三实施例,该实施例中所有数据包均是由客户端A和客户端B利用底层网络函数自己构造的。
请参见图7,为本发明第四实施例提供的穿越NAT设备的方法流程图,该方法与前文已述方法的区别在于:
步骤704:客户端A获取已测试得到的打洞可采用的TCP包序列,若所述TCP序列是表1中序号为4的TCP包序列,则进入步骤705;
步骤705:客户端A向客户端B的公网IP地址和端口号对应的NAT-B设备发送第一SYN包;
其中,第一SYN包是客户端A利用底层网络函数自己构造的数据包;
步骤706:NAT-B设备向客户端A返回RST消息,RST消息是NAT-B设备自动生成的;
其中,客户端A发送第一SYN包到NAT-B时,由于NAT-B设备上没有客户端A的记录,所以NAT-B设备会自动生成一个RST消息,并返回给客户端A,要求客户端A和NAT-A设备复位。
步骤707:客户端A通过打洞辅助服务器向客户端B发送通知消息;
步骤708:客户端B接收倒所述通知消息后,向客户端A的公网IP地址和端口号发送第二SYN包;
步骤709:客户端A在收到第二SYN包后,向客户端B返回SYNACK包,至此TCP直连已建立。
请参见图8,为本发明第五实施例提供的穿越NAT设备的方法流程图,该方法与前文已述实施例的区别在于:
步骤804:客户端A获取已测试得到的打洞可采用的TCP包序列,若所述TCP序列是表1中序号为5的TCP包序列,则客户端A获取已存的环境测试结果,若环境测试结果为操作系统版本为WinXP SP2及以上,用户具有超级用户权限,则进入步骤805;
步骤805:客户端A和客户端B的分别向对方的公网IP地址和端口号对应的NAT设备发送SYN包;
步骤806:NAT-A设备和NAT-B设备在收到SYN包后,返回RST消息至客户端A和客户端B;
步骤807:客户端A和客户端B通过打洞辅助服务器将自己的TCP序列发送给对方;
步骤808:客户端A和客户端B在收到对方的TCP序列号后,分别向对方返回SYNACK包,至此TCP直连已建立。
以上为本发明第五实施例提供的方法,该方法中除RST消息外,其他的数据包均是由客户端A和客户端B分别利用底层网络函数自己构造的。
以上针对不同的打洞环境对本发明实施例进行了介绍。
进一步,在本发明实施例中,上述五个实施例提供的方法可以运行在同一个客户端上,在开始打洞前,获取TCP包序列的测试结果,如果表1中序号为N(N=1,2,,5)的TCP包序列未被NAT设备过滤,则选择第N实施例提供的方法,然后,测试表2所列信息的测试结果是否满足第N实施例的要求,如果满足,则使用第N实施例提供的方法开始打洞,如果不满足,则不能进行TCP打洞。表2所示是前文已述5个实施例各自需要测试及不需要测试的信息,其中,“√”表示需要测试的信息,“×”表示不需要测试的信息。
通常情况下,客户端B需要将自己打洞环境测试结果通过打洞辅助服务器发送给客户端A,客户端A通过已保存自己的打洞环境测试结果和客户端B的打洞环境测试结果,选择打洞方法。
| TCP打洞方法 |
操作系统版本 |
设置TTL值 |
超级用户权限 |
| 实施例一 |
√ |
× |
× |
| 实施例二 |
× |
√ |
× |
| 实施例三 |
√ |
√ |
√ |
| 实施例四 |
× |
× |
× |
| 实施例五 |
√ |
× |
√ |
表2
以上介绍了本发明实施例提供的穿越NAT设备的方法,为了保证更高的成功率,可以将本发明实施例提供的方法和现有的UDP打洞方法,以及超级节点中转数据的方法相融合。
请参见图9,为本发明实施例提供的融合了多种打洞方式的穿越NAT设备的方法流程图,该方法包括:
步骤901:客户端A和客户端B利用测试服务器A和测试服务器B使用STUN协议测试自己的NAT类型;
NAT类型有四种:全双工锥型NAT,IP受限型NAT,端口受限型NAT及对称型NAT。
步骤902:若客户端A判断得到UDP不通或者业务层要求必须使用TCP打洞,则进入步骤903,否则,进入步骤904;
步骤903:客户端A获取已存的打洞环境测试结果,根据所述测试结果,使用本发明实施例提供的TCP打洞方法进行TCP打洞;
步骤904:客户端A判断是否可以进行打洞,如果可以,则进入步骤905,否则,进入步骤906;
步骤905:客户端A根据NAT设备的类型,使用UDP打洞;
步骤906:客户端A触发超级节点中转数据。
本发明实施例还提供了一种第一客户端,该客户端包括:
直连请求发送单元,用于通过打洞辅助服务器向客户端B发起TCP直接连接请求;
公网IP地址接收单元,用于接收打洞辅助服务器返回的客户端B的公网IP地址及端口号;
包序列获取单元,用于获取已测试得到的打洞可采用的传输控制协议包序列;
直连建立单元,用于在打洞辅助服务器的协助下,按照所述打洞可采用的传输控制协议包序列,向客户端B的公网IP地址和端口号发送数据包,直到成功建立TCP直接连接。
若第一客户端是第一次进行TCP打洞,则上述第一客户端进一步包括:
环境测试单元,用于测试打洞环境,并保存第一客户端保存自身的打洞环境测试结果及客户端B通过打洞辅助服务器向其返回的打洞环境测试结果。
本发明实施例针对不同的打洞环境测试结果,提供了几种第一客户端的具体实现方式,以下进行详细介绍。
1、若表1中序号为1的TCP包序列是可用于打洞的TCP序列,则所述客户端进一步包括:
测试结果获取单元,用于获取已存的环境测试结果,若测试结果为操作系统版本符合预置的版本条件,则触发所述直连建立单元;
在具体实现时,直连建立单元包括:同步数据包发送单元,同步数据包接收单元,确认消息发送单元;
同步数据包发送单元,用于向客户端B的公网IP地址和端口号,发送第一同步数据包;
通知消息发送单元,用于通过打洞辅助服务器向客户端B发送通知消息,该通知消息用于通知客户端B向客户端A的公网IP地址和端口号发送SYN包;
同步数据包接收单元,用于接收客户端B在收到所述通知消息后,发送的第二同步数据包;
确认消息发送单元,用于在收到所述第二同步数据包后,向客户端B发送同步数据包确认消息;
确认消息接收单元,用于接收客户端B在收到第一同步数据包后,返回的同步数据包确认消息。
2、若表1中序号为2的TCP包序列是可用于打洞的TCP序列,则所述客户端进一步包括:
测试结果获取单元,用于获取已存的环境测试结果,若测试结果为能够使用操作系统接口设置公网IP地址的TTL值,则触发所述直连建立单元;
在具体实现时,直连建立单元包括:
同步数据包发送单元,用于通过打洞辅助服务器向客户端B发送第一同步数据包,所述第一同步数据包携带客户端B的公网IP地址的TTL值被设置为低;
协议包接收单元,用于接收打洞辅助服务器返回的互联网控制消息协议包,所述协议包携带第一客户端的公网IP地址的TTL值被设置为过期;
同步数据包接收单元,用于接收客户端B发送的第二同步数据包;
确认消息发送单元,用于在同步数据包接收单元收到所述第二同步数据包后,向客户端B发送同步数据包确认消息。
3、若表1中序号为3的TCP包序列是可用于打洞的TCP序列,则所述客户端进一步包括:
测试结果获取单元,用于获取已存的环境测试结果,若测试结果为操作系统版本为WinXP SP2及以上,能够使用操作系统接口设置公网IP地址的TTL值,并且用户具有超级用户权限,则触发所述直连建立单元;
在具体实现时,直连建立单元包括:
同步数据包发送单元,用于通过打洞辅助服务器向客户端B发送同步数据包,所述同步数据包携带客户端B的公网IP地址的TTL值被设置为低;
协议包接收单元,用于接收打洞辅助服务器返回的互联网控制消息协议包,所述协议包携带第一客户端的公网IP地址的TTL值被设置为过期;
序列号发送单元,用于通过打洞辅助服务器向客户端B发送第一传输控制协议序列号;
序列号接收单元,用于接收打洞服务器发送来的客户端B的第二传输控制协议序列号;
确认消息发送单元,用于在收到第二传输控制协议序列号后,向客户端B发送同步数据包确认消息;
确认消息接收单元,用于接收客户端B在收到第一传输控制协议序列号后,返回的同步数据包确认消息。
4、若表1中序号为4的TCP包序列是可用于打洞的TCP序列,则在具体实现时,直连建立单元包括:
同步数据包发送单元,用于向客户端B的公网IP地址和端口号对应的网络地址转换设备发送第一同步数据包;
复位消息接收单元,用于接收所述网络地址转换设备返回的复位消息;
通知消息发送单元,用于通过打洞辅助服务器向客户端B发送通知消息;
同步数据包接收单元,用于接收客户端B在收到通知消息后,发送的第二同步数据包;
确认消息发送单元,用于在收到所述第二同步数据包后,向客户端B返回同步数据包确认消息。
5、若表1中序号为5的TCP包序列是可用于打洞的TCP序列,则所述客户端进一步包括
测试结果获取单元,用于获取已存的环境测试结果,若测试结果为操作系统版本为WinXP SP2,并且用户具有超级用户权限,则触发所述直连建立单元;
在具体实现时,直连建立单元包括:
同步数据包发送单元,用于向客户端B的公网IP地址和端口号对应的网络地址转换设备发送第一同步数据包;
复位消息接收单元,用于接收所述网络地址转换设备返回的复位消息;
序列号发送单元,用于向客户端B的公网IP地址和端口号发送第一传输控制协议序列号;
序列号接收单元,用于接收客户端B发送的第二传输控制协议序列号;
确认消息发送单元,用于在收到第二传输控制协议序列号后,向客户端B返回同步数据包确认消息;
确认消息接收单元,用于接收客户端B在收到第一传输控制协议序列号后,返回的同步数据包确认消息。
按照TCP协议的要求,在上述五种直连建立单元都进一步包括:
响应消息发送单元,用于在收到第二客户端返回的同步数据包确认消息后,向第二客户端发送响应消息(ACK);
响应消息接收单元,用于接收第二客户端在收到第一客户端发送的同步数据包确认消息后,返回的响应消息。
在本发明实施例提供的第一客户端中,进一步包括:测试数据包发送单元,测试数据包接收单元,序列记录单元;
测试数据包发送单元,用于向测试服务器发送第一同步数据包,
测试数据包接收单元,用于接收测试服务器返回的数据包;
若测试数据包接收单元接收到的数据包是第二同步数据包,则序列记录单元,用于记录由所述第一同步数据包和第二同步数据包构成的序列为可用于打洞的传输控制协议包序列;
若测试数据包接收单元接收到数据包是互联网控制消息协议包和第二同步数据包,则序列记录单元,用于记录由所述第一同步数据包,互联网控制消息协议包,及第二同步数据包构成的序列为可用于打洞的传输控制协议包序列;
若测试数据包接收单元接收到数据包是互联网控制消息协议包和同步数据包确认消息,则序列记录单元,用于记录由所述第一同步数据包,互联网控制消息协议包,及同步数据包确认消息构成的序列为可用于打洞的传输控制协议包序列;
若测试数据包接收单元接收到数据包是复位消息以及第二同步数据包,则序列记录单元,用于记录由所述第一同步数据包,复位消息以及第二同步数据包构成的序列为可用于打洞的传输控制协议包序列;
若测试数据包接收单元接收到数据包是复位消息和同步数据包确认消息,则序列记录单元,用于记录由所述第一同步数据包,复位消息和同步数据包确认消息构成的序列为可用于打洞的传输控制协议包序列。
为了保证更高的穿越NAT设备的成功率,本发明实施例提供的第一客户端进一步包括:
网络地址转换设备类型测试单元,用于利用测试服务器测试网络地址转换设备的类型;
打洞方法选择单元,若判断得到用户数据报协议包无法通过或者业务层要求使用传输控制协议打洞,则触发测试结果获取单元,否则,判断是否能够进行打洞,若能,则触发用户数据报直连建立单元,否则,触发超级节点中转数据;
用户数据报直连建立单元,用于根据网络地址转换设备的类型,使用用户数据报协议打洞。
以上对本发明所提供的一种穿越网络地址转换设备/防火墙的方法、系统及客户端进行了详细介绍,对于本领域的一般技术人员,依据本发明实施例的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。