• 243.52 KB
  • 2022-04-22 13:31:52 发布

NAT穿越技术研究毕业论文.doc

  • 38页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'NAT穿越技术研究毕业论文目录1 引言21.1 背景及研究目的21.2 NAT当前研究情况31.3 课题主要工作及结构安排42 NAT的工作原理42.1 NAT简介42.2 NAT使用的几种情况52.3 NAT的功能52.3.1 内部地址翻译52.3.2 内部全局地址复用62.3.3 TCP负载重分配62.4 NAT的原理62.5 NAT的工作过程62.6 NAT技术类型82.6.1 静态NAT82.6.2 动态NAT池82.6.3 NPAT83 NAT存在的缺陷及现行解决方案93.1 问题93.2 现行NAT穿越解决方案103.3 ALG方案103.5 MIDCOM方案123.6 STUN方案123.7 各种方案的简单对比154 基于UDP传输的NAT穿越解决方案164.1 目标164.2 NAT类型174.3 实际NAT测试情况204.4 解决方案原理214.4.1 通信过程214.4.2 理论分析214.4.3 试验结果234.5 与STUN解决方案的比较235 基于UDP传输的NAT穿越解决方案的简单设计255.1 基本原理255.2 实体介绍255.3 消息属性265.4 基本通信过程265.4.1 网络环境265.4.2 客户端行为26 5.4.3 服务器端行为285.5 客户端设计285.6 服务器端设计336 结束语35参考文献36致谢38 1 引言1.1 背景及研究目的当1983年1月1日TCP/IP协议成为ARPANET上唯一的正式协议以后,ARPANET上连接的网络,机器和用户快速增长,特别是NSFNET和ARPANET互连以后,数目更是以指数增长。很多的地区网络开始加入,并且开始与加拿大,欧洲和太平洋地区的网络连接。到了80年代中期,人们开始把互连的网络集成互连网,后来就是因特网。增长继续保持指数级,到了2002年巳经拥有了3000个网络和2000,000台计算机。其规模大约每年翻一翻[1]。因特网业务的发展需要它能够提供大量IP地址来满足企业和个人的访问需求。人们开始在制定的网络协议的时候,没有考虑到网络的规模能够增长的如此迅速,所以造成了现有网络协议IP地址的短缺。于是提出了大量的解决方案,例如提出了Ipv6协议来扩大IP地址的大小,改变IP地址结构,甚至提出了废弃IP地址。不幸的是,这些方案要么改变路由器的结构,要么改变PC机结构或者同时改变这两者,所以这些方案不能够马上实施。一种新的解决方案地址复用也是提出的方案之一。这种解决方案是基于这样的事实:在任意给定的时刻,私网中只有很小比例的主机和公网中的主机进行通信。基于这种思想,在私网内部没有必要为每台主机都分配一个公网的IP地址。这样整个网络就被分成了私网和公网。在私网内部,主机之间的通信地址完全可以使用可以重复利用的私网地址。如果私网内部的主机需要和公网的主机进行通信,只需要动态的把NAT设备的公网IP地址分配给需要和公网进行通信的主机,NAT作为中间转发设备,起到一个桥接作用实现二者之间的通信[2]。基于这种想法,1993年由PaulFrancis和TonyEng在ComputerCommunicationReview发表了一篇关于地址复用的论文,在这篇论文中首次提到了地址复用的思想和实现地址复用的NAT设备。IETF1994年5月提出了NAT协议,当时主要是为了解决网络地址短缺的问题;IETF又在1996年2月份提出了私有网络的概念。在1999年8月份IETF提出了NAT中使用的相关的术语。进入2000年,由于宽带城域网的兴起,传统的TCP/IP协议的应用开发更加成为研究的热点,NAT协议作为一个新协议急切的需要研究和开发,应用到实际网络中去。1.2 NAT当前研究情况 作为一类标准Internet技术,NAT能实现让内部LAN通信运用一套IP地址,而外部通信采用另一套IP地址,这在现行IPv4协议环境下意义重大。通过NAT分离Internet与LAN地址,相对于单一的全球地址分配机制来说,很多地址可以节省下来。为许多申请不到很多可全球路由公共地址的企业提供了局域网内终端都可连网的解决方案,但是,NAT的缺陷是一个不容忽视的问题[3]。内部地址在公网上没有路由,用户可以访问别人,但难以被别人访问。在我国的IP网上,目前很多用户都在用着“内部地址”,这种现象毫无疑问对我国IP业务的发展有很大的潜在危害。这种危害实际上已经逐渐显示出来。随着IP电话在技术层面也逐渐走向成熟,与之相应的一系列协议、标准的出炉,多媒体通信系列标准的组成部分H.323和IETF的SIP,以及基于这些标准协议的产品,如IP电话系统、媒体网关等得到了广泛应用,一些网络冲突也突显出来。比如当前一些网络实体限制这样端到端的分组通过,这些实体指的就是防火墙和网络地址转换器[4]。但随着我国IP电话的发展,这一系列标准,协议都将会应用到实际中去,因此当前NAT的研究方向都是基于各种标准,各种协议的NAT穿越技术。1.3 课题主要工作及结构安排本课题是在以NAT应用为基础的背景下,以穿越NAT技术为研究对象。首先介绍NAT的基本原理及常用技术类型,接下来通过对NAT在实际网络环境中的应用找出存在的缺陷,分析目前较为流行的解决方案的实现原理,最后提出了自己的解决方案,分析其理论可行性,在实际的试验中也得到证实是切实可行的,并对方案进行论证和简单的设计在第一章中简要叙述了NAT的背景及本课题的研究目的等内容;第二章主要说明NAT的定义,NAT的原理,NAT分类及NAT的技术类型等内容;第三章介绍了目前NAT应用存在的缺陷及当前各种NAT解决方案以及各自的优缺点;第四章较详细的介绍了自己的解决方案,并进行理论分析和试验验证,最后根据论证结果与现有解决方案STUN做比较;第五章给出了一个解决方案实现的例子,以及相关的程序流图;第六章是对整个课题的一个总结。 2 NAT的工作原理2.1 NAT简介NAT英文全称是“NetworkAddressTranslator”,中文意思是“网络地址转换”,它是一个IETF(InternetEngineeringTaskForce,Internet工程任务组)标准。在一个局域网中同时与外界通讯的主机数量只占域中主机总体数量的很小一部分,事实上,很多主机几乎从来不进行域外通讯,根据这种特点,可以看出实际上并不需要为每台主机都配备全局地址,只要分配少数几个全局地址给一个局域网,如果所有局域网中主机能够重用这几个公共IP地址和外界通讯,那么IP地址的需求量就会大大减少。NAT正是利用了局域网的这种特点,实现了允许专用网络上的多台PC共享单个、全局路由的IPv4地址。IPv4地址日益不足是部署NAT的一个主要原因。简言之,NAT技术就是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术[5]。如图所示:内部网络私有地址NAT公有地址外部网络图2.1 网络地址转换示意这种技术的主要优点是它可以随时在局域网中添加主机,其它主机及路由器的设置都不需要改变(除了几种特殊的应用),因此,这种解决方案可以很方便的配置和实施。2.2 NAT使用的几种情况a.连接到internet,但却没有足够的合法地址分配给内部主机;b.更改到一个需要重新分配地址的ISP;c.有相同的IP地址的两个internet;d.想支持负载均衡(主机); 2.3 NAT的功能采用NAT,可以实现以下几个功能:内部地址翻译(Translationinsidelocaladdresses);内部全局地址复用(overloadinginsideglobaladdresses);TCP负载重分配(TCPloaddistribution);处理重叠网络(Handingoverlappingnetworks)。下面分别介绍它们的工作原理:2.3.1 内部地址翻译这是NAT最通用的一种方法,功能是将网络内部局部IP一对一的翻译成内部全局地址。在内部主机连接到外部网络时,当第一个数据包到达NAT路由器时,router检查它的NAT表,因为NAT是静态配置的,故可以查询出来(simplyentry),然后router将数据包的内部局部IP(源地址)更换成内部全局地址,再转发出去。外部主机接收到数据包用接收到的内部全局地址来响应,NAT接收到外部发回来的数据包,再根据NAT表把地址翻译成内部局部IP,转发到内部网络。2.3.2 内部全局地址复用这种方法使用地址和端口将多个内部地址映射到比较少的外部地址。也就是所谓的NAPT。和内部地址翻译一样,NATrouter负责查表和翻译内部IP地址,唯一的区别就是由于使用了overloading,router将复用内部全局IP地址,并存储足够的信息以区分不同地址,这样查询出来的是extendedentry。NATrouter和外部主机的通讯采用翻译过的内部全局地址,故同一般的通讯没有差别,从外部网络经router到内部主机通讯时,同样要查NAT表[6]。2.3.3 TCP负载重分配这种方法和以上两种操作不同,这是NAT由外到内的翻译,所以那种以为WEBserver一定要放置到NAT外部的说法是错误的。工作原理:外部主机向虚拟主机(定义为内部全局地址)通讯,NATroute接受外部主机的请求并依据NAT表建立与内部主机的连接,把内部全局地址(目的地址)翻译成内部局部地址,并转发数据包到内部主机,内部主机接受包并作出响应。NATrouter再使用内部局部地址和端口查询数据表,根据查询到的外部地址和端口做出响应。此时,如果同一主机再做第二个连接,NATrouter将根据NAT表将建立与另一虚拟主机的连接,并转发数据。 2.4 NAT的原理NAT安装在内部网络和外部网络之间具有NAT功能的设备上,在内部主机需要和外部进行通讯时,NAT负责进行地址翻译工作,所以在NAT上还必须维护一个翻译表(NAT表)来存储相应的地址转换信息,如果一个域有多个出口,那么还必须保证每个NAT具有相同的翻译表。简单地说,NAT就是在局域网内部网络中使用内部地址,而当内部节点要与外部网络进行通讯时,就在网关处,将内部地址替换成公用地址,从而在外部公网(internet)上正常使用。2.5 NAT的工作过程NAT设备后面的客户端通常通过DHCP(动态主机配置协议)分配到专用的IP地址,或由管理员进行静态配置。在与该专用网络的外部进行通讯时,通常会发生下列事情:a.在客户机上:当应用程序想同服务器通讯时,它将打开与源IP地址/源端口、目标IP地址/端口及网络协议相关联的套接字。这样可以识别通讯所需的两个端点。当应用程序利用该套接字传输信息时,客户机的专用IP地址/端口将被插入数据包的源地址字段中。数据包的目标字段将包含服务器的IP地址/端口。由于该数据包的目的地是在该专用网络之外的某个位置,因此客户机将把该数据包转发给默认的网关。这种情况下的默认网关就是NAT设备。:NAT设备将截获该输出数据包,然后利用目标IP地址/端口、NAT设备的内部全局IP地址/端口、网络协议及客户机的内部局部IP地址/端口来创建端口映射。NAT设备将维护这些映射组成的表,并将该端口的映射存储在表中。内部全局IP地址/端口就是该数据通讯用于取代内部局部IP地址/端口的公共IP地址/端口。NAT设备随即将来自客户机专用内部IP地址/端口的数据包的源地址字段转换为NAT设备的公共IP地址和端口,实现对这些数据包的地址转换。然后,数据包将通过外部网络发送出去,并最终到达目标服务器。 Internal:192.168.1.1:1000External:202.13.34.56:1000Remote:334.333.234.45:80Src:192.168.1.1:1000Dest:334.333.234.45:80Src:202.13.34.56:1000Dest:334.333.234.45.80NAT服务器工作站图2.2 出站数据包转换的示例b.服务器上:当服务器接收到数据包时,它认为自己是在和一台具有可全球路由IP地址的计算机进行通讯。它会利用自己源地址字段中的护地址/端口将响应数据包定向到NAT设备的外部IP地址和端口。NAT设备从服务器那接收到这些数据包,然后将数据包与其端口映射表进行比较。如果NAT发现某个端口映射的远程主机正地址/端口、外部端口及网络协议与输入数据包的源IP地址/端口、目标端口和网络协议匹配,NAT就会进行反向转换。NAT将把数据包目标字段中的外部IP地址和外部端口替换为客户机的专用正地址和内部端口[2][7]。2.6 NAT技术类型NAT有三种类型:静态NAT(StaticNAT)、动态NAT(PooledNAT)、网络地址端口转换NAPT(Port-LevelNAT)。三种NAT方案各有利弊。其中静态NAT设置起来最为简单和最容易实现的一种,内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址。而动态地址NAT则是在外部网络中定义了一系列的合法地址,采用动态分配的方法映射到内部网络。NAPT则是把内部地址映射到外部网络的一个1P地址的不同端口上。根据不同的需要,可以选择不同的配置方式。2.6.1 静态NAT静态NAT是NAT中最简单的应用方式,内部网络IP地址和外部网络IP地址只能是一一对应的固定映射方式,且需要指定和哪个地址进行转换。如果内部网络中有E-mail服务器、FTP服务器、WEB服务器等为外部网络用户提供服务,则这些服务器的IP地址必须采用静态地址转换,以便外部网络用户可以使用这些服务。 2.6.2 动态NAT池动态NAT池(PooledNAT)是采用动态分配的方法映射内部网络的和外部网络的IP地址。采用NAT池意味着可以在内部网中定义很多的内部用户,通过动态分配的办法,共享很少的几个外部IP地址。在动态NAT环境中能够同时和外界通讯的用户个数受限于地址池中的地址个数。当远程用户连接上之后,动态地址NAT就会分配给他一个未分配给其它用户的地址池中的IP地址,用户断开时,这个IP地址就会被释放而留待以后使用,由此可见动态NAT还必需维护一个动态表格以便纪录私有IP地址和全局IP地址的对应关系,因为它们之间的对应关系不像静态NAT那样一一对应,也因此动态NAT要比静态NAT复杂得多。该引起注意的是,NAT池中动态分配的外部IP地址全部被占用后,后续的NAT翻译申请将会失败,并传回hostunreachable的ICMP包,只有当一个用户结束连接,自动释放分配给它的全局地址后,新的地址转换要求才能被执行[9]。2.6.3 NPAT网络地址端口转换NAPT(PortAddressTranslation)也称为PAT,是人们比较熟悉的一种动态地址转换方式,它可以允许多个内部本地地址共用一个内部全局地址,同时用不同的协议端口号映射不同的内部网络地址。NAPT普遍应用于接入设备中,它可以将中小型的网络隐藏在一个合法的IP地址后面。NAT与动态地址NAT不同,它将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的TCP端口号,而动态NAT是把不同的私有内部地址转换为地址池中未被使用的全局地址[9]。 3 NAT存在的缺陷及现行解决方案3.1 问题在IPv4网络中,公有IP地址的不足导致了用户网络中广泛采用了私有IP地址。为了实现用户私网中发出的IP包在公网上可路由,在用户网络与公网交界处需要专门的翻译设备----网络地址翻译器(NAT)实现IP报头公有地址和私有地址等信息的翻译。作为一类标准Internet技术,NAT能实现让内部LAN通信运用一套IP地址,而外部通信采用另一套IP地址,这在现行IPv4协议环境下意义重大。通过NAT分离Internet(公共域)与LAN(专用域)地址,相对于单一的全球地址分配机制来说,很多地址可以节省下来。这一方面为许多申请不到很多可全球路由公共地址的企业提供了局域网内终端都可连网的解决方案,另一方面,由于私网内部的终端与外界不能直接进行通信,使得外部网络看不到内网的主机的存在,从而提供了内部网络一定的安全特性,在这方面起到了防火墙的作用。但是,NAT的缺陷也是一个不容忽视的问题。内部地址在公网上没有路由,用户可以访问别人,但难以被别人访问。在我国的IP网上,目前很多用户都在用着“内部地址”,这种现象毫无疑问对我国IP业务的发展有很大的潜在危害。这种危害实际上已经逐渐显示出来。随着IP电话在技术层面也逐渐走向成熟,与之相应的一系列协议、标准的出炉,如ITU-T的H.323和IETF的SIP,以及基于这些标准协议的产品,如IP电话系统、媒体网关等得到了广泛应用,一些网络冲突也突显出来。比如当前一些网络实体限制这样端到端的分组通过,这些实体指的就是防火墙和网络地址转换器。基于H.323、SIP、MGCP和H.248等协议的语音和视频应用需通过信令消息中的IP地址和端口参数来实现目的地寻址,因此NAT穿越时不仅需要对TCP/UCP层的端口信息以及IP层的源地址和目的地址进行变换,还需对IP包载荷中的相关地址信息进行变换;但是NAT只是在数据包通过时修改数据包的源地址、源端口以及目的地址、目的端口,对IP包载荷中的任何信息包括地址信息都不进行修改,这使得通信不能正常进行,而这个问题也急需解决[3][21]。尽管NAT的应用给网络传输带来了许多的弊端,但是由于IP地址资源匾乏,而长远的解决方案IPv6又处于试验研究阶段不能在短时间内得以部署和实施的情况下,NAT仍然是必然的选择,所以当前要考虑的关键问题是解决NAT穿越这个棘手问题。 3.2 现行NAT穿越解决方案NAT穿越技术是指企业网用户和本地网用户内的终端用户采用私有IP地址通过出口的NAT/FW(防火墙)接入公网。目前关于NAT穿透问题有多种解决方案,到底采用哪种方式需要从以下角度进行综合考虑:升级要求,哪些网络元素需要做升级;网络业务量,应用这种解决方案后,是否会引入新的网络开销;在IP电话技术中还要考虑语音质量,此解决方案是否影响语音质量,增加时延或丢包率;运营商的投资,运营商是否需要做大量投资;企业投资,如果面向企业客户,企业是否需要做大量投资;确定性,此解决方案是否只能在特定的环境下生效,是否可以支持各种应用方案,是否可以穿越各种NAT;扩展性,此方案是否支持大规模应用[10][11]。目前,对于NAT穿越问题业界提出了各种解决方案,主要有应用级网关(ALG)、代理方式(Proxy)、MIDCOM协议、STUN等,各自均具有不同的优点和缺点。下面一一进行介绍:3.3 ALG方案NAT和NAPT只能对IP报文的头部地址和TCP/UDP头部的端口信息进行转换,对于报文的数据部分可能包含IP地址或端口信息的特殊协议(如H.323、SIP、MGCP等),则无法实现有效的转换,这就可能导致问题发生。解决这些特殊协议的NAT转换问题的一个方法就是在NAT实现中采用ALG(ApplicationlevelGateway,应用级网关)功能。ALG是在传统的NAT上进行协议扩展,使之具备感知SIP、H.323、H.324和MGCP等呼叫控制协议的能力,它通过与NAT交互以建立状态,使用NAT的状态信息来改变封装在IP报文数据部分中的特定数据,并完成其他必需的工作以使应用协议可以跨越不同范围运行,从而完成呼叫控制协议的解析和地址翻译功能。ALG方式是最简单也是最早出现的一种NAT穿越方案,然而其缺点也非常明显。(1)可扩展性不强,即每增加一种应用都需要对ALG设备进行升级;(2)增加了NAT设备的负担,影响地址穿越的效率和性能;(3)已部署的大量NAT的升级改造工作非常困难。因此,尽管ALG方式在某些应用环境获得了一部分应用,但随着技术的发展,ALG方式巳逐渐被其他更优的方式所取代。 WANLANABLANCDFirewall/NATwithALGFunction图3.3 ALG组网示意图3.4 代理方案代理技术是为缓解ALG方式所带来的现有NAT升级困难而出现的,也是目前比较流行的一种NAT穿越解决方案。代理方案是指通过对私网内用户呼叫的信令和媒体同时做Relay来实现出口NAT/FW的穿越。它是采用代理设备为私网内SIP、H323、MGCP和H.248用户的语音和多媒体呼叫业务提供信令通道和媒体通道的地址转换功能。代理方式在网络中部署的位置也比较灵活,既可以应用于私网内部、也可以应用于公网和私网边缘或公网。由于采用专用的IP语音和视频业务的代理设备,代理方式无需对现有的传统NAT进行协议扩展,所以不会影响数据业务的NAT穿越。然而,代理技术有着与ALG方式相同的局限性,即每增加一种新的应用需要对代理设备进行协议扩展。LANClientAClientBFullprosyFirewall/NATWAN图3.4 Proxy方式组网示意图3.5 MIDCOM方案 MIDCOM技术是为了解决ALG和代理技术所共有的可扩展性不强及代理方式中同时进行媒体和信令中继转发所带来的效率不高问题,而出现的一种NAT穿越解决方案,由IETF制定,用于代理设备分离为信令转发和媒体转发两个部分之间的接口协议。实际应用中,媒体转发功能可以集成于NAT设备完成,信令转发可采用独立的功能实体或集成于软交换设备中完成。MIDCOM技术是采用可信的第三方(MIDCOMAgent)对Middlebox(NAT)进行控制,由MIDCOMAgent控制Middlebox打开和关闭媒体端口。通常,MIDCOMAgent的功能可以集成在呼叫控制服务器之中,而Middiebox功能集成在NAT之中,MIDCOMAgent和Middlebox之间接口采用MIDCOM协议完成互通。MIDCOM技术的优势在于可扩展性强,新增应用只需对MIDCOMAgent进行扩展,而不会导致MIDB0X重新升级。另外从安全性考虑,MIDCOM方式支持控制报文和媒体流的加密,因此安全性比较高。然而,MIDCOM技术的实施需要对服务器和现有的NAT/FW需要同时进行MIDCOM协议的升级扩展以支持MIDCOM工作组开发的防火墙控制协议,且需要在运营商网络侧部署MIDCOM控制代理,这样,MIDCOM控制代理才可控制NAT/FW打开/关闭Pinhole,因此该方案的实施不可避免带来了现有设备升级的困难。但可以预见的是,随着MIDCOM协议的不断成熟和发展,该方式将获得越来越多的应用前景[12][16]。LANABLANCDFirewall/NAT/MidBox图3.5 MIDCOM方式组网示意图3.6 STUN方案STUN(simpleTraversalofUDPThroughNAT)是由IE作研制的一种UDP流协议穿透NAT的协议。STUN协议有客户端和服务器两部分协作共同完成NAT穿越功能,位于内部网络的STUNclient(NAT内)通过UDP发送请求STUN消息给外部网络的STUNServer(NAT外),STIJNServer收到请求消息后产生响应消息,响应消息通过NAT发送给STUNClient,STUNClient通过响应消息体中的内容得知其在NAT上对应的外部地址,然后将该地址填入以后的呼叫协议的UDP负载中,并且告知对端,本端的RTP接收地址和端口号为NAT外的地址和端口号。由于通过STUN协议己在NAT上预先建立媒体流的NAT映射表项,因此媒体流可顺利穿越NAT。 STUN具体工作过程如下描述:STUN是一个简单的客户—服务器协议。客户端发送请求,服务器做出相应的响应。有两种类型的请求,一种是BindingRequests,是基于UDP传输。另一种是sharedsecretRequests,是针对TSL及TCP传输。SharedSecretRequests请求服务器返回一个临时用户名和密码,随后的BindingRequests及BindingResPonse都将用到此临时用户名和密码,这样可以达到消息认证,保证消息安全。BindingRequests用于确定经过NAT时内部地址与外部地址之间的映射消息。客户端发送请求消息,服务器确定收到的请求数据包源地址和源端口,然后把这些消息封装到响应数据包中,发送给客户端。在请求数据包中有几个参数,根据这些参数的设置情况,可以指导服务器端把响应数据包发送到与源地址及端口不同的地址和端口,或是服务器用与接收数据包时的接收地址不同的地址和端口发送响应包。还有一些属性可以确保消息的认证和完整性。一般来说,客户端程序嵌入到应用程序中,应用程序可通过STUN客户端和服务器端的消息交互获得将要用来接收数据的公有地址。当应用程序启动时,应用程序中嵌入的NAT客户端向服务器端发送sharedSecretRequest,获得一个临时用户名和密码,然后发送Bindingrequest给服务器。可以通过DNSSRV纪录来发现服务器,或者仅仅假定客户端己经被配置了专门的发现过程来查询服务器所在位置。STUNBindingRequest主要用于发现NAT设备的存在,以及私有地址与公有地址之间的映射关系。它主要是通过UDP方式与服务器交互。当一个BindingRequest到达服务器端,它可能经过了多个NAT设备,所以,服务器所接收到的数据包的源地址是距离服务器最近的NAT映射的地址。服务器把源IP地址和源端口消息存入STUNBindingResponse中,然后发送响应包。不论何种前面所提到的NAT类型,响应包都回返回到STUN客户端。当客户端接收到STUNBindingResponse时,它将比较包中地址消息和发送请求时的地址消息的异同如果不匹配,说明客户端和服务器端之间有多个NAT设备。如果NAT是FullCone类型,那么响应包中的IP地址和端口消息是公有的,外部网络中的任何主机都可以使用此公有地址和端口向发送请求包的应用发送数据包,而应用也只需监听此发送请求包的地址和端口,就可以接收任何发送到此公有地址和端口的任何数据包。当然,NAT并不一定必然是Full Cone类型的NAT,实际上,我们甚至不知道我们的终端到底是处在什么类型的NAT后,为了确定终端到底处于什么类型的NAT后,我们可以多次使用STUNBindingRequest,实际的过程是很自由的,有应用程序自己确定,但一般情况都是如下所述:客户端将再次发送STUNBindingRequest,这次发送的请求数据包是从同一个地址和端口发送,但是发送的目的地却和上一次不同,如果此次接收到的响应包中地址消息与上一次接收到的响应包中的地址消息不同,则说明NAT是symmetric类型。否则,则继续发送请求数据包。为了确定内网终端是否是处于FullCone类型的NAT之后,客户端可以发送请求包,设置标志位让服务器用与接收请求包不同的IP地址和端口发送回响应包,换句话说,就是如果客户端发送请求数据包到目的IP地址/端口为A/B,而源IP地址/端口是X/Y,服务器端将用从C/D发送响应包到X/Y,而不是从A/B到X/Y,如果客户端仍然能够接收到响应数据包,说明NAT正是FullCone类型。同样的道理,如果客户端没有接收到响应包,则确定NAT也不是FullCone类型,为了进一步确定NAT类型,客户端将再次发送请求包,这次要求服务器用相同的IP地址不同的端口发送回数据包,如果客户端能够接收到响应包,则说明NAT是RestrictedCone类型,否则是PortRestrictedCone类型。值得注意的是,STUN服务器可以位于任何位置,设置可以位于另外一个客户端,唯一条件就是STUN服务器是可达的,也即客户端总是可以通过网络到达服务器。如果客户端总是试图去获得一个外部网络地址,那么服务器必然要配置在外部网络中[12][18]。STUNClientSTUNClientLANCDLANWANFirewall/NAT与SERVER连接与Server保持连接STUNServer图3.6 STUN方式组网示意图 3.7 各种方案的简单对比1.部署位置:ALG位于私网/公网边缘;STUN,MIDCOM,Proxy则不受限。2.对原有网络的影响:ALG和MIDCOM需要增加路由;其他三种对原有网络没有影响。3.对终端的需求:ALG和MIDCOM对终端没有特别需求;STUN续要实现客户端;Proxy则需要终端收发端口一致。4.对服务器的需求:ALG和STUN对服务器没有特殊要求;MIDCOM需要实现Agent;Proxy对服务器没有特殊要求[12]。 4 基于UDP传输的NAT穿越解决方案4.1 目标前面已经说过,目前已经有多种穿越NAT的解决方案,这些解决方案可以说各有优缺点,各自适合不同的应用场合,并且很多解决方案在实际的工作中己经得到了应用。近年来,多媒体业务迅速发展,并且逐渐成为IP业务发展的一个重点,热点,但是多媒体传输的特点决定了NAT将成为其发展的一个很大的障碍。另一方面,因为IP地址的短缺,使得国内企业用户普遍采用NAT来满足共享IP,实现企业内部人员都能上网的需求。因此这两个现实问题成为一个不可调和的矛盾。实际上,对于IP短缺这个不可改变的事实,在IPv6尚未成功实现部署之前,NAT的应用是必不可少的,所以只能从找到并实现穿越NAT解决方案上来解决根本问题。然而,对多媒体传输来说,现存的各种穿越NAT解决方案并不是最佳选择,也仍然没有一种较好的解决方案可以满足当前多媒体业务的发展[13][22]。基于这种现状,提出了自己的穿越NAT解决方案,这一解决方案是针对多媒体业务提出的,众所周知,多媒体业务对实时性要求较高,而对于准确性上,却不是那么严格,所以使用UDP传输是必然选择,事实上,对于多媒体传输,业界正是普遍采用的UDP传输的。所以说我们的解决方案的目标就是解决多媒体数据基于UDP的传输。要说明我们的解决方案,下面首先需要介绍一些基础知识,这是后面我们分析解决方案时所必须了解的。4.2 NAT类型STUN协议把NAT分为四种类型,也即:FullCone、RestrictedCone、PortRestrictedcone、symmetric。下面逐一介绍。a.FullCone:FunCone类型的NAT要求某个特定的私有IP地址和端口经过NAT映射后应该映射到同一个外部全球唯一的公共地址和端口。例如某个网络中有终端的私有IP是192.168.1.1,此终端在端口2000发送IP包,经过NAT后内部地址192.168.1.1:2000映射为外部地址22.22.22.22:3000,则每个从内部地址192.168.1.1:2000发送的包,经过NAT后都必定映射为外部地址22.22.22.22: 3000。任何一个外部终端向22.22.22.22:3000发送的包都会被内部终端192.168.1.1:2000接收。FunConeNAT的工作机制如图所示:一旦打开端口,就可以在此端口接受从任何主机发送过来的数据包。图4.1 FullConeNAT工作机制示意图b.RestridedCone:RestrictedCone类型的NAT要求某个特定的私有IP地址和端口经过NAT映射后应该映射到同一个外部全球唯一的公共地址和端口,这点与FunCone相同。但是,只有从接收到内网发送的包的终端才可以发送响应包到才可以为内部终端接收,而从其他外部终端发送过来的包都被拒绝。例如,从192.168.1.1:2000发送包到外部终端123.n.1.1:2222。此发送的包经过NAT映射为外部地址22.22.22.22:3000,然后通过网络发送到目的地,此后只有从123.11.1.1发送到地址22.22.22.22:3000的数据包才可以被内部终端192.168.1.1:2000接收[15][16]。StrictedNAT的工作机制如图4-2所示,只有内部向外部发送数据包,打开端口后,才可以从外界接受数据包,而且只能从内部向外部发送数据包的目的地址发送回来的数据包才可以穿越NAT,到达内部主机。这里从同一个主机,不同端口发送回来的数据包都能够为内部主机接受,但是从不同主机发送过来的数据包,无论端口是什么,都不能穿越NAT,为内部主机所接受,这一点是它与后面的PortStrictedNAT的最主要区别。箭头没有到达NAT网关,说明此方向的数据包不能穿越NAT到达目的主机,而是在NAT网关处丢弃,后面图示中箭头的意思与此处的箭头意思相同[16]。 图4.2 StrictedNAT工作机制示意图c.PortRestriCtedCone:PortRestrictedCone类型的NAT要求某个特定的私有IP地址和端口经过NAT映射后应该映射到同一个外部全球唯一的公共地址和端口,这与前两种类型相同,但是只有从接收到内网发送来数据包的终端及其相应接收端口发送回来的响应包才可以为内部网络的终端接收,例如在上例中,只有从外部地址123.n.1.1主机的端口2222发送回来的响应包才可以为内部终端192,168.1.1接收。PortStrictedNAT工作机制如图4-3所示。只能从目的地址和端口发送回的响应包可以穿越NAT。图4.3 PortStrictedNAT工作机制示意图d.Symmetricsymmetric类型的NAT与前三种类型有很大的不同,这种类型的NAT要求,即使是从同一个终端和同一个端口发送的数据包,如果目的地址不同,经过NAT映射的地址也不会相同。例如,从内部终端192.168.1.1,端口为2000 的内部地址发送数据包,目的地址为123.11.1.1,端口为2000,此时数据包经过NAT映射为22.22.22.22:3000,当目的地址改变为123.11.1.1,端口为3000,此时数据包经由NAT时,内部地址映射为22.22.22.22:4000或其它的地址,但是不可能仍然是22.22.22.22:3000。同样当目的地址是11.11.11.11:1234时,映射更要改变。Symmetric类型的NAT比其它三种类型要求严格的多,也要安全的多,因此,本协议也不能解决此种类型NAT的穿越问题。SymmetricNAT工作机制如图4-4所示,只能从目的地址和端口发送回的数据包能够通过NAT,并且发网不同目的地址的映射是不同的。图4.4 SylnmetricNAT工作机制示意图4.3 实际NAT测试情况在试验中,前面所说的无论是何种类型的NAT都不是严格意义上的完全遵照其类型定义的那样进行工作的,而是以较为类似的工作机制进行工作的。例如对于SymmetricNAT的测试出现下面的现象:假设一个网络中有两台主机A(主机地址为192.168.1.1:1000)和B(主机地址为192.168.1.2:1000),而网络外部有两台主机C(202.22.22.22:4000)和D(203.203.23.23:4000),下面对NAT类型(我们已经知道它是symmetricNAT和PortStrictedNAT中的一种)进行测试:第一个测试:现在A要向网络外部的C主机通信,假设通过NAT转换后,地址映射为215.23.n.n:1000,此时当A向D发起通信时,按照SymmctricNAT的工作机制,应该改变端口号,但是实际上并不是如此,当A向D发送数据包通过NAT转换后,地址映射仍然为215.23.n.11:1000,这时NAT的工作机制和PortStrictedNAT相同。然而,它并不是PortStrictedNAT,这可以从下面一种测试情况判断得知。 第二个测试:仍然是A要向网络外部的C主机通信,假设通过NAT转换后,地址映射为215.23.11.11:1000,此时,网络内的另外一台主机向D发起通信,数据包经过NAT转换,地址映射也是A要向网络外部的C主机通信,假设通过NAT转换后,地址映射也为215.23.11.11:1000(此处可能有人会有疑惑,这怎么可以实现正常的通信那,当有数据包发送回来时,到底会把数据包发送到A还是发送到B那?其实并不用担心,因为除了目的地址,还有源地址可以作为参考,如果源地址是C,则说明数据包是要发送到A主机的,如果源地址是B,则说明数据包是要发送到B主机的,这并不会产生冲突),然后当A也想要向D发起通信时,数据包经过NAT设备转换,它的地址映射信息为A要向网络外部的C主机通信,假设通过NAT转换后,地址映射为215.23.11.11,按照PortstrictedNAT的工作机制,应该仍然是1000,但是事实上并不是如此,端口此时改变为一个非1000的值,由此可见,此NAT也不是PortStrictedNAT类型的[16]。根据上面的测试情况可以发现,我们所测试的NAT并不属于理论上所说的任何一种NAT,而是介于PortStrictedNAT和SymmetricNAT之间的一种NAT类型。另外试验中还发现一种现象,这就是,在进行NAT地址映射时,地址转换有不改变原有端口的倾向。举例来说,一个使用地址为192.168.1.1,端口是1000的应用经由NAT设备进行地址转换时,转换后的端口取值1000的几率很大。这种现象为我们将要提出的新的解决方案有极大的影响,这将在后面介绍。有了以上的试验结果,我们在下一节中给出我们的解决方案。4.4 解决方案原理4.4.1 通信过程本解决方案中,有客户端与服务器端两类实体。客户端必须首先在服务器上进行注册,在此之后此客户端始终都要和服务器保持一条通路,以使服务器能随时了解客户端地址以及其他的一些相关信息,这些相关信息将是客户端之间相互通信时所必须了解的重要信息。客户端必须首先在服务器上进行注册,在此之后此客户端始终都要和服务器保持一条通路,以使服务器能随时了解客户端地址以及其他的一些相关信息,这些相关信息将是客户端之间相互通信时所必须了解的重要信息。[17]。 在通信之初,发起通信的客户端同时向两个地址发送数据包,一个是服务器,另外一个是另一客户端。如果另一客户端只是从服务器收到转发的数据包,则此客户端会生成两个响应数据包,并利用接收到的数据包的地址信息,把两个响应数据包分别发送到服务器和对端。这样,经过几次两路发送,最终可以实现两个客户端不经过服务器直接进行通信的能力,也即实现穿越NAT[18][25]。客户端必须首先在服务器上进行注册,在此之后此客户端始终都要和服务器保持一条通路,以使服务器能随时了解客户端地址以及其他的一些相关信息,这些相关信息将是客户端之间相互通信时所必须了解的重要信息。[17]。4.4.2 理论分析前面己经简单介绍了解决方案的基本通信过程,下面将从理论上分析其穿越NAT方面的可行性。现在假设有两台主机A和B,公网上有一台服务器S,根据A与B所处的不同网络环境,对它们之间的通信进行分析。1.如果A与B都位于公网上,那么此时两个客户端都是公有地址,无论什么情况下,这两个客户端都必然能够直接通信。2.如果A位于私网中,B处于公网中,当A向B发起通信时,由于B是公有地址,故A直接向B发送的数据包能够直接为B所接受。并且此时B向A发送的数据包也必然能咚为A所接受。反过来,如果是B首先发起通信,则不论A是位于何种NAT之后,都必然能够从服务器接收到B发送过来的数据包,在A接收到数据包后,利用收到的数据包的地址信息,向B发送数据包时,B一定能够接收到,当B从A接收到数据包时,双方就可以穿越NAT直接进行通信了。3.如果通信双方在同一个私网中,则通信情况类似于双方都在公网上的情况。下面是对A与B都位于私网中的分析,前面已经测试知道NAT类型并不是完全按照STUN总结的那样进行工作的,因此分析时我们也按照实际工作的NAT来进行分析:1.当A、B都是在FunConeNAT之后时,当A向B发起通信时,因为B一直与服务器保持连接,所以端口己经打开,并且根据FunConeNAT的工作机制,地址转换固定,并且只要端口打开,就可以从此端口接受任何外部发来的数据包,因此,A直接向B发送的数据包能够为B接受,而B接收到数据包后也可以直接向A发送数据包并为A所接收,至此,双方实现了脱离服务器直接穿越NAT进行多媒体通信。反过来,B向A发起通信的情况也是如此。 2.当A是FULLConeNAT,而B是PortstrictedNAT时,如果A先发起通信,B不能直接接受A发送过来的数据包,但是当B收到转发的数据包后再向A发送数据包时,能够为A端所接受,故最终两者可以实现直接通信。反过来,如果B首先发起通信,则B直接发送的数据包能够为A所接受,所以也能够实现双方的直接通信。3.当A是FullConeNAT,而B是类SymmetricNAT时。如果A先发起通信,则因为B打开的端口只能接收从服务器发来的信息,所以不能从A直接接收数据包,但是可以接收到经过服务器转发的数据包;当B接收到从服务器转发过来的数据包时,它了解A想要与之通信,故生成响应数据包,并把响应数据包发送到服务器进行中转,同时直接发送到A,因为A的FunConeNAT特性,必然能够接收到从B直接发送过来的数据包;A接收到直接从B发送过来的响应数据包后,再次向B直接发送数据包,此时,数据包将为B所接受,因此,也就实现了双方间的直接通信。反过来当B先发起通信时,A能直接接收到B的数据包,因此,A再向B发送数据包时,也能够为B所接受;至此,双方也实现了两者的穿越NAT直接进行通信功能。4.当A,B都是PortStrictedNAT时,A向B直接发送数据包,B也直接向A发送数据包,经过几个回合的发送之后,A会认为从B发送过来的数据包是对A在此之前发送的数据包的响应,因此接受此数据包,同理B也会接受A发送过来的数据包,因此也就实现了双方的直接通信[15][22]。经过实际的试验测得,解决方案的穿越NAT的总体穿透率约为80%;而对于双方都是类SymmetricNAT的情况,其穿透率大约是30%。4.4.3 试验结果实际上,像类symmetricNAT这种NAT类型,其工作机制是十分不稳定的,可能此时的工作机制是相当于PortStrictedNAT,下一秒钟的工作机制可能就相当于symmetricNAT,这是因为一个私有网络中与外界联系的客户随时都在发生改变,可能一时间很少有客户与外界联系,一时间用户数又激增,这是跟时间相关有一定规律的。基于这种考虑,我们可以在实现时使用特定的算法来确定用户的唯一标识ID,然后取ID或对将ID进行适当的转换得到的数据作为客户的端口号。这样,就可以使通信客户在与外界进行通信时直接实现穿越NAT进行通信的几率增加,而不是通过服务器转发的几率增加,这对于多媒体通信来说,尤为重要,因为直接通信能够大大减小延迟,而多媒体通信对延迟的要求又是非常严格的。 4.5 与STUN解决方案的比较根据前面的分析可知,本解决方案对NAT的穿越情况可总结如下表(1代表可以穿越NAT直接通信,0代表不可以直接通信,此处的PortStricted包括NAT是真正的此种类型,及其是类SymmetricNAT,但是工作机制相当于PortStrictedNAT时;而Symmetric是类symmetric的工作机制相当于symmetricNAT的情况):表1 解决方案穿越NAT情况总结nonCFullCOneStrictedPortstrictedSylnmetricnone1l,111FullCOlle1111lStrictedl11l1PortStricted1111lSymetric11110(需转发)STUN解决方案对前几种的NAT组合类型的穿越情况是相同的。这里就不再重复,对于PortStrictedNAT和symmetricNAT、SymetricNAT和symmetricNAT这两种情况进行分析。仍然假设有A、B两台主机,分别位于两个NAT后面,公网中有一台服务器。第一种情况,A在PortstrictedNAT后面,B在SymmetricNAT后面,当A与B通信时,如果是使用STUN解决方案,则在这之前,A、B都己经了解了对方跟服务器联系时的地址映射信息,所以A直接向B的内部全局地址发送数据包,但是由于B是symmetricNAT,只能接受从服务器发来的包(因为这个内部全局地址是B向服务器发送数据包时映射得到的),即使B在接收到A发送来的数据包之前向A发送了数据包,B也不会认为A发送来的数据包是A对它在此之前发送的数据包的响应,这主要是因为,如果B向A发送数据包,则根据symmetricNAT的特性,地址映射信息会和与服务器通信时的地址映射信息不同,故当A发送的数据包到达B时,B会丢弃此数据包。反过来如果B要向A发送数据包,A同样会丢弃掉数据包,这是因为A的PortStrictedNAT特性使他只能接受从服务器发送过来的数据包,即使在此之前A己经向B发送了数据包,因为B向A发送数据包时地址映射信息已经发生改变,当B发送的数据包发送到A时,A检查数据包,会发现数据包的源地址和自己在此之前发送的数据包的目的地址并不相同,所以仍然丢弃此数据包。 根据上面的分析可知,STUN解决方案不能够解决穿越PortStrictedNAT对symmetricNAT以及SymmetricNAT对SymmetricNAT进行直接通信的问题,而我们的解决方案可以解决相当一部分问题,当然,效果取决于网络中当时的用户数以及端口号确定算法的好坏。当然,由NAT产生的地址绑定是有一定是生存期的,当绑定超过生存期,仍然没有数据包通过的话,绑定自动解除,这样一方面可以解除其他终端因为等待地址空闲而长时间不能发送数据而实际上全局地址又是出于空闲状态的这种问题,另一方面又使得我们要不断的去刷新NAT的地址绑定情况,也即定期的向服务器发送数据包,以保持NAT地址绑定不会失效,在这点上,STUN解决方案和本解决方案是相同的[11][22]。所以相对于STUN协议来说,本解决方案比较简单,且解决了STUN协议不能够解决酌穿越向题。STUN对NAT的穿越情况总结如表:表2 STUN解决方案穿越NAT情况总结noneFUllColleStriCtedPortStfiCtedSylnmetricnone11111FullCone1l111Stricted11111PortStricted111l0Symmetric11100 5 基于UDP传输的NAT穿越解决方案的简单设计首先要说明的是,此处的设计只是一个简单的示例,是对解决方案的一个模拟,并不是真正的实现,真正的实现要考虑更多的细节问题,本论文中就不详细给出了,本章只作Sample使用。5.1 基本原理在通信的开始,通信双方不仅直接向对方发送数据包,还通过一个中继服务器转发数据包,这样,由于可能的NAT类型不同,最终会出现两种结果:一种是通信双方可以直接通信,这时,就不需要再通过中继服务器替发数据包;第二种情况就是通信双发必须通过中继服务器转发,此时,通信双方就不必再直接向对方发送数据包,而是直接通过中继服务器转发。5.2 实体介绍1,客户端(mdtundient),运行在终端如PC机上,用于生成请求数据包以及和其它客户端。2,服务器端(mdtunserver),位于公网上,用于接收客户端的请求数据包,分析并产生响应数据包。服务器主要有三个作用:第一,每个客户登录时都要和中继服务器保持一条连接通路,这个连接保证每个客户端都随时可以与服务器进行通信。第二,记录每个客户端的用户信息,包括用户名、IP地址、端口等相关信息。第三,对收到的数据包进行分析,根据不同的消息类型,作不同的处理,最重要的是在两个相互通信的客户之间转发数据包。5.3 消息属性MappedAddress:用于记录数据包经过NAT设备时私有地址到公有地址的映射信息。DestAddress:用于记录数据包最终要到达的目的地址。此外,消息头部还包括长度字段、消息类型字段、消息体[19][23]。 5.4 基本通信过程5.4.1 网络环境工作站A工作站B防火墙/NAT防火墙/NAT服务器图5.1 通信环境示意图客户A位于NATl后,客户B位于NAT2后,服务器位于公网上。客户端首先登录到服务器上,需要通信时,同时向服务器和对端发送数据包。5.4.2 客户端行为A,发送数据包客户登录时首先生成注册请求数据包,向服务器发送此数据包,服务器接收到请求数据包后,对数据包进行数据包分析,根据分析结果产生不同的响应数据包。客户登录时,发送注册请求数据包,请求数据包中包含客户的用户名信息。 当客户想要与另外一个客户进行通信时,首先选定一个要通信的用户,在本地查找客户的用户名及地址信息,若没有找到,则显示不存在此客户的消息,否则就生成两个数据包,一个数据包目的地址是服务器,另一个数据包目的地址就是要与之进行通信的客户端。发往服务器的数据包到达服务器后,服务器分析数据包得知是要转发到另一个客户端的数据包,则修改数据包中的部分信息,并转发此数据包到客户真正想要与之通信的另一个客户。因为两个客户与服务器总是保持通路,故如果网络不发生拥塞等情况,转发总是可以成功,也即是两个客户最少可以通过服务器进行通信。直接发往另一客户端的数据包能否被另一客户端接受,就要根据具体的情况而定。具体情况后面再详细介绍。当一个客户端要离开时,也要通知服务器,客户端生成退出注册请求数据包,然后发送给服务器,当服务器接收到此请求数据包后,分析数据包并生成数据包,并把生成的数据包发送给所有已经登录的客户,以此告知有一个客户已经下线了,其它客户不能再与之进行数据通信。前面介绍了客户端发送请求数据包及服务器端的响应情况,然而客户端不只是发送信息,同样,它也可以从网络中接收数据包。B,接收数据包当客户端接收到数据包时,首先对数据包进行类型分析:如果数据包是从服务器端发来的,则如果是对注册的响应数据包,则客户端解析数据包,分析并记录自己的地址信息以及己经在服务器登录的客户的用户名及其地址信息;如果数据包是从服务器端发来的,则如果是某个客户端下线的通知,则客户端检查本地的关于已登录客户的信息,找到并删除相应客户的信息;如果数据包是从服务器端发来的,则如果是某个客户端新登录的通知,则客户端在本地添加新登录客户的用户名及地址信息;如果数据包是从服务器端发来的,则如果是转发从另外一个客户端发送来的通信数据包,则分析数据包中的各种属性信息,并检查本地已经存贮的相关的通信信息,若不存在与此客户端的通信情况记录,则记录此通信信息并初始化各项通信信息,并生成两个数据包,分别发送到服务器和实际发送数据包的客户端;若已经存在相关的通信信息,则说明两个客户端在接收此数据包之前已经进行了若干次通信,此时就要检查本地纪录的通信情况,如果通信信息为只能通过服务器转发,则直接生成数据包,发送给服务器,通过服务器进行转发;如果两个客户端已经进行了MAXRELAY次(默认是5次)通信,仍然需要通过服务器转发才能进行通信,则说明这两个用户只能通过服务器进行中转得以通信,故不需要再试图直接向对端发送数据包,而是只生成向服务器发送的需要转发给对端的数据包,同时设置本地通信信息为只能通过服务器转发。如果需通过服务器转发的 通信的次数尚未超过MAXRELAY,则仍然生成两个数据包,一个发往服务器进行转发,另一个直接发送到对端客户,并重新设置本地的相关通信信息。当收到的不是服务器发来的数据包,而是从对端客户发送来的数据包,则说明两个客户端不需要服务器的中转就可以进行直接的通信,所以本客户端首先检查是否已经存在两个客户端通信的相关信息,如果尚未存在,则生成并初始化相关的通信信息,然后生成数据包并直接发送对端客户,同时设置通信信息为直接通信;如果已经存在相关的通信信息,则直接生成并发送发往对端客户的数据包。5.4.3 服务器端行为当服务器接收到请求数据包后,同样也是首先对请求数据包进行分析,确定数据包的类型,然后根据分析出的数据包类型进行相应的处理。当服务器端收到的是注册请求数据包,服务器生成响应数据包,响应数据包中包含注册用户的用户名、其在私网中地址经过NAT转换后的共有IP地址和端口信息,以及己经在服务器上登录的客户的相关信息:用户名,公有IP地址及端口。当所有的数据已经准备就绪,则把这些信息打包到响应数据包中,发送给客户端,然后生成另外一个包含新登录客户的用户名及公有IP地址信息的数据包,并把此数据包发送到其它己登录客户端。当服务器收到的是退出注册请求数据包,服务器检查服务器端存储的己登录用户的信息,找到并删除发出请求的客户端,然后把此已登出用户的信息发送到剩余的己登录用户的客户端。当服务器接收到的是需要转发的数据包,则服务器解析数据包的各项属性信息,并修改其中的部分属性,然后把数据包转发到实际的目的客户端。5.5 客户端设计1.启动I,初始化已登录用户信息列表(ClientsInfo),通信状态相关信息(Communicatelnfo);II,生成Socket,向服务器注册(ConnectToServer);2.接收数据包启动接收数据包线程,线程中接收数据包,解析数据包,根据数据包类型做出不同处理:I,数据包类型是OGINACK,说明是服务器对用户登录的响应,客户端解析数据包,存储其中的己登录用户的相关信息;II,数据包类型是RELAY,说明是从服务器转发而来的数据包,则解析数 据包,显示其内容,修改通信状态信息,计数器couni加一,如果通过服务器转发次数超过某个特定值(MAXTIME),则设置onlyrelay=true;III,数据包类型是CLIENT,说明数据包是从对端用户直接发送过来,说明可以不经过服务器直接进行通信,则修改通信状态信息,设置oulyrelay=true;IV,数据包类型是LOGINNOTIFY,说明有新用户登录,客户端把新登录用户信息添加到己登录用户信息列表中;V,数据包类型是LOGOUTNO双FY,说明有用户退出登录,客户端检查已登录用户信息列表删除此用户相关信息[24][25]。3.发送数据包在主线程中处理用户在终端输入数据,分析用户命令:I,如果是exit命令,则向服务器发起退出登录数据包;II,如果是send命令,则向检查通信状态,若oulydireet=true,则生成数据包,直接发送到对端客户;若oulyrelay=true,则生成数据包,发送到服务器,通过服务器转发;若两者都onlydirect=talse且onlyrelay=false,则生成数据包,同时发往服务器和对端客户。初始化用户注册启动接收程序启动发送程序图5.2 客户端主线程程序流图 初始化从终端接收信息分析用户输入命令解析通信状态信息Conut++生成响应数据包同时发向服务器和对端退出生成响应数据包通过服务器生成响应数据包直接发送到对端onlyRelay=trueonlyDirect=tureonlyRelay=false且onlyDirect=falseexit图5.3 客户端发送线程程序流图 Count>5初始化接收数据包分析数据包类型记录已登录用户信息判断通信状态信息显示客户发来的信息添加新登录用户信息LOGINACKFRCMCLIENTFROMCLIENT删除退出登录用户信息LOGINNOTIFYonlyDirect=true显示数据包内容onlyRelay=true&&onlydirect=falseCount++onlyRelay=false&&onlydirect=falseonlyRelay=true显示数据包内容onlyRelay=false&&onlydirect=true完成图5.4 客户端接收线程程序流图 5.6 服务器端设计1,启动初始化用户信息列表,打开端口,监听信息的到来。2,信息处理解析数据包,分析消息类型:如果是用户注册信息(LOGIN),则生成响应包(LOGINACK),响应包中包含所有已注册用户信息,发送给新登录用户;生成包含新登录用户信息的数据包(LOGINNOTIFY),发送给所有己登录用户;在用户列表中添加新登录用户信息。如果是用户转发信息(TRANS),修改消息类型为RELAY,修改数据包的mappedAddress值,提取数据包的目的地址属性,重新打包,以提取出的目的地址值作为数据包的目的地址,转发数据包。如果是用户退出登录信息(LOGOUT),删除用户信息,生成包含登出用户信息的数据包(LOGOUTNOTIFY) 生成LOGOUTNOTIFY数据包发送到各已登录用户TRANSLOGINLOGOUT初始化打开通讯端口接收并解析数据的类型生成响应数据包发送回给客户生成LOGOUTNOTIFY数据包发送给所有已登录用户修改地址属性生成ROMRELAYSY数据包发送目的地址删除用户信息记录新登录用户信息发送完成图5.5 服务器端程序流图 6 结束语关于穿越NAT的解决方案已经有不少,并且各有特色,各有优缺点,但是并没有一个通用的标准。本课题中,首先介绍NAT的基本原理,分析目前较为流行的解决方案的实现原理,最后提出了自己的解决方案,分析其理论可行性,在实际的试验中也得到证实是切实可行的,并且效果不错。本解决方案是在研究了诸多相关解决方案的基础上提出的一个简单可行的穿越NAT解决方案,主要是为了解决当前多媒体网络通信中穿越NAT问题而提出的。本解决方案是基于UDP的穿越,通过多次的两路传输,在传输过程中交换地址信息,最终达到通信双方直接传输数据的目的。方案的提出主要在简单性和针对性上下功夫,不需要对NAT设备有任何的修改,只需要实现客户端和服务器端,实现上十分简单。设计方案是一个模拟实现,主要包括服务器实现和客户端实现两个方面,这只是一个很简单的设计,其中很多的细节问题并没有考虑,并且也没有结合多媒体传输的具体传输过程来考虑,所以要真正的投入到使用中,还需要很多的工作要做,很多问题需要考虑。这不是本论文要解决的问题,在实际应用中,需要根据实际应用灵活的嵌入到系统中去。本解决方案重点在于思想,而文中给出的实现只是为了验证方案的实际效果与理论可行性的差异。当然本解决方案仍有很多不足。例如对于实际应用中类SymmetricNAT对类symmetricNAT之间的穿越只是部分解决,其穿透性还要取决于网络中用户的多少,以及网络中用户的端口号的分配等因素的影响,所以还不是足够稳定。另外,在分析现行解决方案的过程中发现,STUN解决不了SymmetricNAT和PortStrictedNAT之间的穿越,而不是人们认为的仅仅不能解决SymmetricNAT和symmetricNAT之间的穿越。 参考文献[1]傅坚,胡正名,杨义先.IPSec协议与网络地址转换的融合[J].计算机应用研究,2003.2.4~5;[2]高健媛,华勇,韩臻,刘吉强.网络地址转换的应用及其局限性分析[J].网络技术,2002.4.12~14;[3]田生伟,禹龙.网络地址转换(NAT)技术及其在企业网中的应用[J].微计算机信息(测控自动化),2003.11.;[4]罗军舟.网络地址转换的研究和实现[J.中国金融电脑,2001.72~6;[5]高扬,肖继民.NAT穿越技术研究[J].江苏通信技术,2005.58~14;[6]黄杰,施万青,网络地址转换及其应用[J],南京邮电学院学报(自然科学版),2001.1;[7]陈维义.NAT—网络地址翻译.中国计算机报768期,1998年10月1~4;[8]P.Srisuresh.M.HoldregeIPNetworkAddressTranslator(NAT)TerminologyandConsiderationsRFC2663NetworkWorkingGroupAugust1999.1~3;[9]袁帅.多媒体通迅中防火墙和NAT问题的解决.赛迪网,2002.123~6;[10]K.Egevang.P.FrancisTheIPNetworkAddressTranslator(NAT)RFC1631NetwotkWlrkingGroupMay19941~2;[11]P.Srisuresh.KEgevang.TraditionalIPNetworkAddressTranslator(TraditionalNAT)[S].RFC3022,2001-01;[12]林元乖.NAT技术及应用.琼州大学学报,2003.102~4;[13]J.RosenbergInteractiveConnectivityEstablishment(ICE):AMethodologyforNetworkAddressTranslator(NAT)TraversalforOffer/AnswerProtocolsMMUSICInternet-Draft.October19,2005,Expires:April22,2006;[14]吴兴.用iptables实现包过滤型防火墙.现代计算机计术,2002.625~28;[15]Rosenberg.J.Weinberger.C.Huitema,R.MahySTUN-SimpleTraversalofUDPThroughNATs.IETFRFC3489April5,2002,Expires:October2002;[16]罗军舟.网络地址转换技术的实现与发展[J].东南大学学报(自然科学版),2002.51~16; [17]张建伟,网络地址转换技术与网络安全[J],计算机应用研究,2001.23~8;[18]王相玲,穆玲玲,石磊.网络地址转换在Intranet中的应用[J].电脑开发与应用,2003.4.45~65;[19]刘风华,丁贺龙,张永平.关于NAT技术的研究与应用.中国矿业大学,计算机科学与技术学院.江苏.徐州;[20]庞向阳,欧阳柳波.防火墙计术分析用其研究进展.长沙大学学报,2005.6,第16卷,第2期67~70;[21]孙盛源.简述NAT-网络地址转换.甘肃科技,2004年5月第7期23~28;[22]W.RichardStevensTCP/IP协议详解:范建华,晋光辉,张涛等译.北京机械工业出版社,2000,524~211;[23]谢希仁.计算机网络(第二版).电子工业出版社,1999,489~110;[24]阮宜龙.NAT和IPSec相容性研究.硕士学位论文.安徽:合肥工业大学,2005.21~25;[25]黄鹂声.NAT网关的研究与实现.硕士学位论文.四川:电子科技大学,2005.615~28。 致谢我首先要感谢我的导师韩慧妍老师,在这几个月的毕业设计期间,她在学习上给了我精心的指导,在这里我要向韩老师表示深深的感谢。本文的研究工作是在我的导师附件韩老师的精心指导和悉心关怀下完成的,在我的论文的研究工作中无不倾注着导师辛勤的汗水和心血。导师的严谨治学态度、渊博的知识、无私的奉献精神使我深受启迪。从尊敬的导师身上,我不仅学到了扎实、宽广的专业知识,也学到了做人的道理。在此我要向我的导师致以最衷心的感谢和深深的敬意。另外我还要感谢我的同学,在我的学习中给予我无私的帮助。最后衷心地感谢在百忙之中评阅论文和参加答辩的各位专家、教授。'