专利名称:基于udt和tcp中转实现nat穿越的系统和方法
技术领域:
本发明涉及网络地址转换(Network Address Translator,NAT)技术领域,具体涉 及基于UDT打洞和TCP中转实现NAT穿越的系统和方法。
背景技术:
为了解决公网互联网协议(IP,Internet Protocol)地址紧缺以及安全等问题,广 域网上通信双方的两个主体常被网络地址转换(NAT,NetworkAddressTranslatiun) /防火 墙设备或软件隐藏,由处于同一 NAT设备后的多台主机共享一个公网IP地址;一个私网内 的主机通过NAT设备与公网的其他主机通信,通常都是由私网内的主机主动发起连接,数 据包经过网络地址转换后送给公网上的服务器。但是这种通信方式是不允许从公网上主动 向位于私网内的主机主动发起连接的,这也就阻隔了用户之间的直接通信。因此,到目前为止出现多种不同的解决方法,常用的穿越NAT的方法主要包括ALG 方式,MIDCOM方式、STUN方式、TURN方式、FullProxy方式、UDP打洞、TCP打洞等。其中基 于UDP协议的NAT穿越技术是目前运用得比较多的方法,其成功率比较高,但是由于UDP是 不可靠传输协议,在网络环境比较差时,发生丢包的现象比较严重,无法保证传输的质量。 而基于TCP协议的NAT穿越技术虽然是面向连接的可靠传输协议,但是由于TCP需要三次 握手,实现比较复杂,而且穿透成功率比较低,只有百分之六十多。
发明内容
本发明的首要目的在于克服现有技术的缺点与不足,提供一种基于UDT打洞和 TCP中转实现NAT穿越的系统。本发明的另一目的是提供一种基于UDT打洞和TCP中转实现NAT穿越的方法。本发明的首要目的通过下述技术方案实现基于UDT打洞和TCP中转实现NAT穿 越的系统,包括用于向NAT穿越服务器进行注册,使用UDT进行打洞或TCP中转实现NAT穿越的 终端;与终端交互的NAT穿越服务器,用于保存所述终端的注册信息,协助终端进行UDT 打洞和TCP中转;以及与终端交互的索引服务器,用于为所述终端提供包含客户节点ID的peer列 表fe息。本发明的另一目的通过下述技术方案实现步骤S10、客户节点向NAT穿越服务器发送包括客户节点ID和名称的注册请求,从 而在NAT穿越服务器上注册,建立主连接;步骤S20、NAT穿越服务器通过步骤SlO中得到的客户节点ID和名称并保存,然后 向客户节点返回注册成功信息;步骤S30、客户节点向索引服务器获取peer列表,该列表中包含每个客户节点的ID和名称;步骤S40、使用UDT打洞进行NAT穿越;若成功,则跳到步骤S60,否则转到下一步 骤;步骤S50、使用TCP中转进行NAT穿越;步骤S60、数据传输。本发明相对于现有技术具有如下的优点及效果1、简单易行。2、保证百分之百的穿透率。3、数据传输可靠性高,因为UDT是基于UDP的面向连接的基于数据流的可靠的应 用层传输协议,TCP也是面向连接的可靠传输协议。
图1是本发明的基于UDT打洞和TCP中转实现NAT穿越系统的结构示意图;图2是本发明的基于UDT打洞和TCP中转实现NAT穿越方法的流程图。
具体实施例方式下面结合实施例及附图对本发明作进一步详细的描述,但本发明的实施方式不限 于此。实施例如图1所示,本发明基于UDT打洞和TCP中转实现NAT穿越的系统,包括终端10, 以及分别与终端10相互连接的NAT穿越服务器20和索引服务器30。终端10用于向NAT 穿越服务器进行注册,使用UDT进行打洞或TCP中转实现NAT穿越。NAT穿越服务器20用 于保存所述终端10的注册信息,协助终端进行UDT打洞和TCP中转。索引服务器30用于 为终端10提供可连接的peer列表信息,当本地终端要和其他终端建立连接时,该本地终端 先向索引服务器获取在线的终端列表,该列表中包含在线终端的ID和名称。所述终端10包括TCP交互模块101,用于终端与NAT穿越服务器建立TCP连接进 行交互;UDT打洞模块102,用于除了当两个终端处于都处于Symmetric NAT后或者一方处 于Symmetric NAT后而另一方处于Port Restricted Cone NAT后的情况外,建立UDT连接 进行数据传输。TCP中转模块103,用于本地终端和对方终端都处于Symmetric NAT后或者 一方处于Symmetric NAT后而另一方处于Port Restricted Cone NAT后,建立TCP连接进 行数据传输。下面详细叙述基于UDT打洞和TCP中转实现NAT穿越系统的工作过程所述终端10进入TCP交互模块,与NAT穿越服务器建立TCP连接后,发送包括终 端ID和名称的注册请求给NAT穿越服务器,NAT穿越服务器解析该数据报文中的终端ID和 名称,并将这两项(终端ID,终端名称)信息保存。NAT穿越服务器20保存完成后,向终端10返回注册成功消息。终端10向索引服 务器30获取peer列表,其中包括每个peer的ID和名称。终端10收到peer列表之后,得到对方终端的ID和名称,并进入UDT打洞模块102。
在UDT打洞模块102中,终端10创建一个UDT套接字向NAT穿越服务器的协助打洞模块202发送打洞请求报文A,请求与对方终端进行UDT打洞,报文A的内容包含本地终 端ID和对方终端ID ;NAT穿越服务器的协助打洞模块202收到报文A后,通过网络接口得到发起NAT穿 越请求方的外部IP和端口号,接着解析报文A得到对方终端的ID,通过对方终端ID查找到 对方终端与NAT穿越服务器20的主连接,并通过该连接向对方终端发送打洞命令报文B,报 文B包含发起NAT穿越请求方客户节点的节点ID、外部IP地址和端口号;对方终端收到报文B后,解析得到发起NAT穿越请求的终端的ID、外部IP地址和 端口号,创建一个UDT套接字向NAT穿越服务器的协助打洞模块202发送打洞就绪报文C, 该报文包括两个终端各自的ID、发起NAT穿越请求方的外部IP和端口号;NAT穿越服务器协助打洞模块202收到报文C后,通过网络接口得到对方终端的外 部IP和端口号,解析得到双方节点的ID、发起NAT穿越请求方的外部IP和端口号,并向两 个终端分别发送开启打洞报文D,该报文包括对方的ID、外部IP和端口号;本地终端和对方终端收到报文D后,解析该报文得到对方的外部IP和端口号,分 别再创建一个UDT套接字,并绑定到与NAT穿越服务器的协助打洞模块交互的UDT套接字 上,接着设置打洞模式,向对方终端的外部IP地址和端口号进行连接,成功创建连接之后, 则进行数据传输,否则进入TCP中转模块103。假设终端a要和终端b通信,则a创建一个UDT套接字向NAT穿越服务器的协助 打洞模块发送打洞请求消息,请求与对方终端进行UDT打洞,消息中包括a和b在NAT穿越 服务器上注册的ID。NAT穿越服务器收到后,通过网络接口得到a的外部IP和端口号,假 设a的IP地址为218. 192. 170. 22,端口为7500,接着解析该打洞请求得到a和b的ID,根 据b的ID查找到b与NAT穿越服务器交互的主连接,并通过该连接向b发送打洞命令消息, 该消息包含a的ID、外部IP地址和端口号;b收到打洞命令消息后,解析得到a的ID、外部 IP地址和端口号,创建一个UDT套接字向NAT穿越服务器的协助打洞模块发送打洞就绪消 息,该消息中包括双方ID、a的外部IP和端口号;NAT穿越服务器收到b发来的打洞就绪消 息后,通过网络接口得到b的外部IP和端口号,假设b的IP地址为218. 192. 168. 2,端口 为7800,解析得到双方的ID、a的外部IP和端口号,并分别向a和b发送开启打洞消息,该 报文包括对方终端的ID、外部IP和端口号;a和b收到后,分别再创建一个UDT套接字,并 调用bind ()函数绑定到各自与NAT服务器的协助打洞模块交互的UDT套接字上,接着调用 setsocketopt ()函数设置打洞模式UDT_RENDEZVOUS,然后调用connect ()向NAT服务器所 指定的开启打洞消息中的对方IP地址和端口号进行连接。若其中一方的connect ()函数 成功返回,则表示打洞成功,双方均可调用recvO或sendO函数进行数据的收发,实现数 据的可靠传输。在TCP中转模块103中,终端10通过与NAT穿越服务器交互的主连接向NAT穿越 服务器发送TCP中转请求消息,该消息包含本地终端ID和对方终端ID ;NAT穿越服务器的TCP交互模块201收到报文E后,解析得到本地终端的ID和对 方终端的ID,接着创建一个TCP中转模块,并通过本地终端和对方终端与NAT穿越服务器交 互的主连接,分别向本地终端和对方终端发送开启TCP中转消息,该消息包含本地终端ID、 对方终端ID和NAT穿越服务器上的TCP中转模块的端口号;本地终端和对方终端收到开启TCP中转报文F后,解析该报文得到NAT穿越服务器的TCP中转模块的端口号,分别创建一个TCP套接字,并与NAT穿越服务的该端口建立 TCP连接,进行数据传输。如图2所示,本发明基于UDT打洞和TCP中转实现NAT穿越的方法,具体包括如下 步骤步骤S10、客户节点向NAT穿越服务器发送包括客户节点ID和名称的注册请求,从 而在NAT穿越服务器上注册,建立主连接。NAT穿越服务器主要用来登记用户的注册信息, 协助终端进行UDT打洞和TCP中转。步骤S20、NAT穿越服务器通过步骤SlO中得到的客户节点ID和名称并保存,然后 向客户节点返回注册成功信息;步骤S30、客户节点向索引服务器获取peer列表,该列表中包含每个客户节点的 ID和名称;步骤S40、使用UDT打洞进行NAT穿越;若成功,则跳到步骤S60,否则转到下一步 骤;本步骤S40中,使用UDT进行NAT穿越,具体包括如下步骤步骤401、本地客户节点创建一个UDT套接字向NAT穿越服务器的协助打洞模块发 送打洞请求报文A,请求与对方客户节点进行UDT打洞,报文A的内容包含本地客户节点ID 和对方客户节点ID ;步骤402、NAT穿越服务器收到报文A后,通过网络接口得到发起NAT穿越请求方 的外部IP和端口号,接着解析报文A得到对方节点的ID,通过对方客户节点ID查找到对方 节点与NAT穿越服务器的主连接,并通过该连接向对方节点发送打洞命令报文B,报文B包 含发起NAT穿越请求方客户节点的节点ID、外部IP地址和端口号;步骤403、对方节点收到报文B后,解析得到发起NAT穿越请求的客户节点的ID、 外部IP地址和端口号,创建一个UDT套接字向NAT穿越服务器的协助打洞模块发送打洞就 绪报文C,该报文包括双方节点ID、发起NAT穿越请求方的外部IP和端口号;步骤404、NAT穿越服务器收到报文C后,通过网络接口得到对方节点的外部IP和 端口号,解析得到双方节点的ID、发起NAT穿越请求方的外部IP和端口号,并分别向双方发 送开启打洞报文D,该报文包括对方节点的ID、外部IP和端口号;步骤405、本地客户节点和对方客户节点收到报文D后,解析该报文得到对方的外 部IP和端口号,分别再创建一个UDT套接字,并绑定到与NAT穿越服务器的协助打洞模块 交互的UDT套接字上,接着设置打洞模式,向对方客户节点的外部IP地址和端口号进行连 接,成功创建连接之后,跳转到步骤S60进行数据传输,否则转到步骤S50。其中打洞模式是 通过调用setsocketopt函数设置UDT_RENDEZVOUS模式来实现。步骤S50、使用TCP中转进行NAT穿越;本步骤S50中,使用TCP中转进行NAT穿越,具体包括如下步骤步骤501、本地客户节点通过与NAT穿越服务器交互的主连接向NAT穿越服务器发 送TCP中转请求E,报文E的内容包含本地客户节点ID和对方客户节点ID ;步骤502、NAT穿越服务器收到报文E后,解析得到本地客户节点ID和对方客户节 点ID,接着创建一个TCP中转模块,并通过客户端节点和对方节点与NAT穿越服务器交互的 主连接,分别向客户端节点和对方节点发送开启TCP中转报文F,该报文包含双方节点ID、
7NAT穿越服务器上的TCP中转模块的端口号;步骤503、客户端节点和对方节点收到开启TCP中转报文F后,解析该报文得到 NAT穿越服务器的TCP中转模块的端口号,分别创建一个TCP套接字,并与NAT穿越服务的 该端口建立TCP连接,转到步骤S60进行数据传输;步骤S60、数据传输。上述实施例为本发明较佳的实施方式,但本发明的实施方式并不受上述实施例的 限制,其他的任何未背离本发明的精神实质与原理下所作的改变、修饰、替代、组合、简化, 均应为等效的置换方式,都包含在本发明的保护范围之内。
权利要求
基于UDT打洞和TCP中转实现NAT穿越的系统,其特征在于包括用于向NAT穿越服务器进行注册,使用UDT进行打洞或TCP中转实现NAT穿越的终端;与终端交互的NAT穿越服务器,用于保存所述终端的注册信息,协助终端进行UDT打洞和TCP中转;以及与终端交互的索引服务器,用于为所述终端提供包含在线终端ID的peer列表信息。
2.根据权利要求1所述的基于UDT打洞和TCP中转实现NAT穿越的系统,其特征在于 所述终端包括UDT打洞模块,用于除了当两个终端处于都处于Symmetric NAT后或者一方处于 SymmetricNAT后而另一方处于Port Restricted Cone NAT后的情况外,建立UDT连接进行 数据传输。TCP中转模块,用于本地终端和对方终端都处于Symmetric NAT后或者一方处于 SymmetricNAT后而另一方处于Port Restricted Cone NAT后,建立TCP连接进行数据传输。
3.基于UDT打洞和TCP中转实现NAT穿越的方法,其特征在于包括以下步骤步骤S10、客户节点向NAT穿越服务器发送包括客户节点ID和名称的注册请求,从而在 NAT穿越服务器上注册,建立主连接;步骤S20、NAT穿越服务器通过步骤SlO中得到的客户节点ID和名称并保存,然后向客 户节点返回注册成功信息;步骤S30、客户节点向索引服务器获取peer列表,该列表中包含每个客户节点的ID和 名称;步骤S40、使用UDT打洞进行NAT穿越;若成功,则跳到步骤S60,否则转到下一步骤; 步骤S50、使用TCP中转进行NAT穿越; 步骤S60、数据传输。
4.根据权利要求3所述的基于UDT打洞和TCP中转实现NAT穿越的方法,其特征在于 所述步骤S40包括步骤401、本地客户节点创建一个UDT套接字向NAT穿越服务器的协助打洞模块发送打 洞请求报文A,请求与对方客户节点进行UDT打洞,报文A的内容包含本地客户节点ID和对 方客户节点ID ;步骤402、NAT穿越服务器收到报文A后,通过网络接口得到发起NAT穿越请求方的外 部IP和端口号,接着解析报文A得到对方节点的ID,通过对方客户节点ID查找到对方节点 与NAT穿越服务器的主连接,并通过该连接向对方节点发送打洞命令报文B,报文B包含发 起NAT穿越请求方客户节点的节点ID、外部IP地址和端口号;步骤403、对方节点收到报文B后,解析得到发起NAT穿越请求的客户节点的ID、外部 IP地址和端口号,创建一个UDT套接字向NAT穿越服务器的协助打洞模块发送打洞就绪报 文C,该报文包括双方节点ID、发起NAT穿越请求方的外部IP和端口号;步骤404、NAT穿越服务器收到报文C后,通过网络接口得到对方节点的外部IP和端口 号,解析得到双方节点的ID、发起NAT穿越请求方的外部IP和端口号,并分别向双方发送开 启打洞报文D,该报文包括对方节点的ID、外部IP和端口号;步骤405、本地客户节点和对方客户节点收到报文D后,解析该报文得到对方的外部IP 和端口号,分别再创建一个UDT套接字,并绑定到与NAT穿越服务器的协助打洞模块交互的 UDT套接字上,接着设置打洞模式,向对方客户节点的外部IP地址和端口号进行连接,成功 创建连接之后,跳转到步骤S60进行数据传输,否则转到步骤S50。
5.根据权利要求3所述的基于UDT打洞和TCP中转实现NAT穿越的方法,其特征在于 所述步骤S50包括步骤501、本地客户节点通过与NAT穿越服务器交互的主连接向NAT穿越服务器发送 TCP中转请求E,报文E的内容包含本地客户节点ID和对方客户节点ID ;步骤502、NAT穿越服务器收到报文E后,解析得到本地客户节点ID和对方客户节点 ID,接着创建一个TCP中转模块,并通过客户端节点和对方节点与NAT穿越服务器交互的主 连接,分别向客户端节点和对方节点发送开启TCP中转报文F,该报文包含双方节点ID、NAT 穿越服务器上的TCP中转模块的端口号;步骤503、客户端节点和对方节点收到开启TCP中转报文F后,解析该报文得到NAT穿 越服务器的TCP中转模块的端口号,分别创建一个TCP套接字,并与NAT穿越服务的该端口 建立TCP连接,转到步骤S60进行数据传输。
全文摘要
本发明涉及基于UDT打洞和TCP中转实现NAT穿越的系统和方法,其系统包括用于向NAT穿越服务器进行注册,使用UDT进行打洞或TCP中转实现NAT穿越的终端;与终端交互的NAT穿越服务器,用于保存所述终端的注册信息,协助终端进行UDT打洞和TCP中转;以及与终端交互的索引服务器,用于为所述终端提供包含在线终端工D的peer列表信息。本发明简单易行,穿透成功率高,数据传输可靠性高。
文档编号H04L29/12GK101883056SQ201010237088
公开日2010年11月10日 申请日期2010年7月23日 优先权日2010年7月23日
发明者伍明彰, 吴宗泽, 吴润凯, 林光华, 谢胜利 申请人:华南理工大学