基于UDP协议的NAT穿透技术研究与仿真

时间:2022-08-18 05:15:02

基于UDP协议的NAT穿透技术研究与仿真

摘 要: NAT穿透技术能够有效解决由于IP地址短缺和路由表增大造成的用户接入困难的问题,可缓解因网络地址的严重消耗造成的IPv4资源稀缺的情况。针对这种情况进行了基于UDP协议的NAT穿透技术研究与仿真。首先分析NAT穿透的类型及各自的原理,提出对于NAT穿透相对有效的UDP打洞方案,然后通过穿透原理得出算法结构流程,最后在VC++环境下进行仿真实验。实验结果表明,该算法结构能够有效地实现NAT穿透目的,而且具有可拓展性,可在较多情况下适用。

关键词: 网络地址; NAT穿透; NAT类型; UDP打洞

中图分类号:TP393.02 文献标志码:A 文章编号:1006-88228(2014)06-12-03

0 引言

NAT又名网络地址转换,在如今IP地址越来越稀缺的情况下产生,主要为了解决地址重用的问题。众所周知,在TCP/IP协议中,有三个IP地址区域作为私有地址而被专门保留。

1 NAT分类

1.1 基本的NAT

由于内网的IP地址不允许在网络上出现,内部数据包的 IP地址需转换后才能对外发送,所以在同一时间内,全子网内只有小部分IP地址能够对应到外部全球惟一的IP地址[2]。基本的NAT设备将会改变数据包中的原IP地址,但是不会改变数据包中相应的端口数据。

1.2 NAPT

NAPT全名为网络地址/端口转换器,由其名称可以看出凡是经过此设备的IP数据包,不仅数据包内的IP地址会被修改,而且数据包内的TCP/UDP端口数据也会被修改。它可允许内网多个计算机对应一个全球惟一的IP地址[3]。由于端口修改的方法不同,因而又可分为圆锥型和对称型两种。

⑴ Cone NAT(圆锥型)

在一个客户机(拥有私有地址与端口号)与另一个客户机(拥有公有地址与端口号)建立端口映射之后,只要是当前仍然存在会话在利用此端口映射,那么它就可以用这个端口映射继续处理后续的会话。然而,当位于NAT后的主机与外网的主机建立连接之后,NAT接受外部连接的自由程度是不同的,由此可以把此类型进一步分类。但是要注意这个分类一般只适用于UDP传输,因为对于TCP连接,只有在有专门的配置情况下才会建立。Cone NAT分类之后为下面三种情况。

① Full Cone NAT(完全圆锥型)

2 NAT穿透原理分析

若想用软件实现NAT技术,一种方法是通过扩展应用层协议,使其具有NAT路由的功能;另一种方法则是把应用层协议中的私有地址直接修改为公网地址。但是,由于NAT类型的不同,通过修改应用层协议地址[4]的方法并不能通用,尤其当是Symmetric NAT类型的时候,其预先获得的公网地址与实际转换后的公网地址有可能不相同[5]。

NAT穿透需要分析下面三种情况。首先,双方都是Symmetric NAPT。此情况由于端口号分配的不同,不支持穿透。其次,双方都是Cone NAPT。这种情况是我们所期望的,可以进行穿透。最后,两方分别是Symmetric NAPT和Cone NAPT。这种情况稍复杂些,假设A是Symmetric NAT,B是Cone NAT,由文献分析[6]可知,不管是A先连接B还是B先连接A,在一方的NAT接收到数据包后,由于查询自己的映射表无法找到相对应映射项而会将包丢弃,从而导致连接失败。

因此,根据上述分析可以得出,只有当连接两端的设备都为Cone NAT的情况下,才能实现基于UDP协议的内网穿透。

3 UDP打洞技术

当前发展较快的穿透技术是一种借助于公网服务器来完成NAT穿透的技术,称为Hole Punching技术[7]。此技术属于一种中继方案,主要用来解决通信两端都在NAT设备之后的情况,如今这类情况比较常见。与其他解决方案相比,此技术比较简单通用,穿透原理如图5所示。

从图5可以看出,客户机A和客户机B(下面简称A和B)分别向服务器S注册,因此服务器知道了它们的私网地址和转换后的公网地址。在A希望与B建立连接时,A会先向服务器S发送连接请求,服务器S会把B的公网、私网的地址都返回给A,同时还会把A的连接请求和A的公网与私网地址发给 B。至此A和B都能知道彼此的公、私网地址。可知A、B与服务器之间的通讯仅仅是为了打开通往服务器的通道,并通过不断发送消息保持通道的存在。

接下来,当A得知B的公网、私网地址后,A会同时向这两个地址发起连接。如果A和B同在一个NAT之后,B会先在私网地址上收到A的连接请求,这样A与B之间的通讯就不会有NAT的介入;而如果A和B处在不同NAT之后,那么A发往B私网地址的连接将会无法路由或者被错误路由到不相关的终端,从而被丢弃,而A发往B公网地址的连接会顺利到达B所在的NAT。同样,在B得知A的公网、私网地址之后也会发起连接,情况与A相同。

此时,A和B前的NAT设备已经记住了对方的IP地址和端口信息,对彼此处于敞开状态,即被在内部打洞,因此可建立新的对话,建立连接。由于发送的连接数据包都为UDP包,因此被称为UDP打洞技术。而且,建立连接之后,双方的NAT还可以作为中介将对方“介绍”给其他设备[8],从而降低S的工作量。

综上所述,Hole Punching技术是通过公网Server保存的地址从而使客户机之间能够直接通信。但是,Server只帮助建立连接,而在建立连接之后就不会再介入了。

4 编程测试

既然上述基于UDP协议的穿透主要是靠公网服务器作为连接中介,那么,通信协议是必不可少的。根据上节所述的穿透原理可编写通信协议。我们需要自定义以下几种STRUCT:Client登录时向服务器发送的消息格式、Client注销时发送的消息格式、Client向服务器请求另外一个Client向自己方向发送UDP打洞消息格式、Client向服务器发送的消息格式、客户节点信息格式、Server向Client发送的消息格式、客户端之间发送消息格式。

关于所编写的Server部分,由穿透原理可知,Server端主要负责两件事,一是循环读取客户机登录和注销消息,并记录客户列表;二是循环转发客户P2P连接请求。这里要注意的是,我们应事先定义一个循环最大值(MAXC),防止丢包之后进入无限死循环,下面的Client部分也一样。Client端则主要有三部分:第一,登录服务端,并接收服务器端发送的已登录消息;第二,向外网IP发送消息,若发送超时,则发送一个请求打洞信息到服务器端,此过程循环(MAXC)次;第三,循环读取当前服务器用户。

我们选用Visual C++6.0作为编程环境,进行此穿透实验的仿真实验。

5 实验运行结果

由于此程序只是为了实现穿透通信,因此功能并不是很完善。部分源程序参考相关资料改编。首先需运行服务器端,如图6所示,由图6可见,服务器端可以将已登录用户记录在案,中转连接功能则由后台运行。

由于编程条件的限制,现将服务器端与两个客户机端在同一台电脑上运行,因此要指向的服务器IP为同一个地址。将客户机端分别命名为11和22,先模拟登录客户端主机11,然后模拟登录客户端主机22,所发送信息为“hello!”,两个客户机端的运行结果分别如图7、图8所示。

由图7、图8可见,两个客户端主机已连接成功,并且发送的信息也已送达目的客户机。

根据此实验结果分析,UDP穿透的目的已经达到。根据多次实验分析,由于客户端主机运行背景不同,同一局域网内可能需要在路由器端开通端口映射功能。

6 结束语

本文浅析了NAT的相关分类以及基于UDP协议穿透NAT的相关技术,并根据研究结果将其进行编程实现。该程序主要是根据UDP打洞技术来实现有关NAT穿透的基本功能,程序具有一定的适应性(针对Cone NAT),若结合硬件设施,可实现远程操控,因此有扩展开发空间。NAT穿透技术涉及很多内容,就传输层的穿透而言,本文只限于UDP协议,但就实际而言是不够的。目前网络上使用最多的传输层协议是TCP协议,而在实际应用中,基于TCP协议的穿透比基于UDP协议的穿透复杂的多。综上所述,本文所研究的NAT穿透技术还有待进一步开发与完善。

参考文献:

[1] 余以胜.P2P网络的NAT穿越技术研究[J].微型电脑应用,2012.1:34-36

[2] 张静颐,赵雪岩,陈爱网.基于NAT穿透P2P即时通讯系统的设计与实现[J].电子设计工程,2011.7:96-98

[3] 杜经纬,王春红.在P2P网络环境下基于UDP协议穿越NAT的研究[J].吉林师范大学学报(自然科学版),2012.1:93-94

[4] 刘健,周仲文,刘洋.基于P2P的TCP穿透NAT技术研究[J].网络安全技术与应用,2011.3:40-41

[5] Guha S, Francis P. Characterization and Measurement of TCPTaversal through NATs and Firewalls [EB/0L].http://nutss.gforge.cis.cornell.edu/pub/imc05-tcp nat.pdf.

[6] 孔令旺.NAT技术及应用浅析[J].科技资讯,2011.32:26-26

[7] 张知青,王碧玉.浅谈网络地址转换(NAT)的三种方式[J].中小企业管理与科技(上旬刊),2011.10:206-207

[8] 刘泽阳,徐武平.P2P应用中一种多层NAT穿透解决方案的设计与实现[J].计算机应用,2011.7:1980-1983

上一篇:基于Android和网页解析的教务系统设计与实现 下一篇:自组织能力:传统企业的组织进化愿景