毕业论文范文——基于Netty的高性能NAT穿透通信系统_第1页
毕业论文范文——基于Netty的高性能NAT穿透通信系统_第2页
毕业论文范文——基于Netty的高性能NAT穿透通信系统_第3页
毕业论文范文——基于Netty的高性能NAT穿透通信系统_第4页
毕业论文范文——基于Netty的高性能NAT穿透通信系统_第5页
免费预览已结束,剩余43页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ABSTRACT摘 要伴随着网络环境的发展,网络通信所遇到的问题也越发明显。而最根本的问题仍旧是通信双方能否互相通信。在当前网络环境中,大多采用了网络地址转换(NAT),出现了私有地址和公网地址等概念。解决了地址不足的问题。却又引申了另一个问题的出现跨局域网通信问题。不同局域网中的主机彼此无法直接通信,而本文通过UDP打洞的NAT穿透方法,阐述了实现跨局域网通信的解决方案。该方案使得处在不同局域网NAT设备后面的主机能够借助中介服务器穿透彼此的NAT设备,实现直接通信。并且,对于不同类型的NAT设备采取了各自不同的针对性的解决办法。本文所阐释的技术能够基本解决跨局域网主机间的通信问题。通过采用Netty这款高性能NIO通信框架,也使得服务器的性能方面得到了保证。将跨局域网通信与Netty通信框架相结合,这正是本文的核心技术。关键词:NettyUDP打洞跨局域网通信ABSTRACTWith the development of the internet,the problem we face up to emerges. But the most essential problem is still that the computers in internet communication could receive message from each other.In modern internet environment,we use the Network Address Translator(NAT),and we can also heard of the concept of private address and public address.Although NAT makes IP address enough to use.It also lead to another pronlemcommunication across the LAN.Host machine in different LAN can not communicate directly.This paper introduces UDP punch to strike the NAT device,and it also states the solution to achieve communication across the LAN.The solution make sure that Host machine in different LAN could communicate directly with each other with the help of mediation server.What is more,we could take different approaches to strike the NAT when we face diverse NAT device.The technology in this paper we discuss could almost solve the problem of communication across the LAN.It also take Netty into use which is a kind of high-performance NIO communication framework.Netty makes sure the performance of the server.The combination between Netty and the communication across the LAN is also indeed core technology stated in the paper.Keywords:Netty UDP punch communication across the LAN目 录 i目 录第一章 绪论11.1项目背景11.2国内外研究现状1第二章 相关概念32.1NAT32.2Netty的高性能42.2.1异步非阻塞通信42.2.2高效的Reactor线程模型4第三章 需求分析73.1局域网环境73.2公网环境83.2.1客户端83.2.2物联网网关93.2.3公网服务器9第四章 总体设计114.1系统结构114.2局域网环境124.3公网环境134.3.1直接通道设计154.3.2转发通道设计16第五章 详细设计与实现195.1公网服务器195.1.1局域网环境195.1.2公网环境195.1.3类的设计205.1.4方法接口225.2物联网网关225.2.1局域网环境235.2.2公网环境235.2.3类的设计235.2.4方法接口255.3客户端265.3.1局域网环境265.3.2公网环境265.3.3类的设计265.3.4方法接口28第六章 部署与测试296.1系统部署296.1.1公网环境模拟296.1.2运行环境部署306.2系统测试316.2.1功能测试316.2.2性能测试34第七章 总结与展望377.1工作总结377.2未来展望37致谢39参考文献41参考文献41第一章 绪论本文主要讨论基于Netty的高性能NAT穿透通信系统即跨局域网通信系统。采用了目前最流行的Netty高性能通信框架 蒋思佳,杨志义,张兵.基于模式的通信服务器设计与实现.西北工业大学计算机学院,西安,710129.科学技术与工程2012年3期。1.1项目背景随着物联网2 刘强,崔莉,陈海明.物联网关键技术与应用.中国科学院计算技术研究所,北京,100190.计算机科学2010年6期。的兴起与发展,智能家居有关的项目也随之逐渐出现。智能家居是利用先进的计算机技术、网络通讯技术、综合布线技术、医疗电子技术依照人体工程学原理,融合个性需求,将与家居生活有关的各个子系统如安防、灯光控制、窗帘控制、煤气阀控制、信息家电、场景联动、地板采暖、健康保健、卫生防疫、安防保安等有机地结合在一起,通过网络化综合智能控制和管理,实现“以人为本”的全新家居生活体验。其项目的总体思想是使用户在日常生活中获得更大的方便。用户能够通过自己身边随身携带的移动通信设备,与自己家中的智能家居设备远程通信,实现远程访问、监测与控制等功能。而这就需要一套适应于不同网络环境的通信系统。另一方面由于用户集群庞大,通信系统为了追求系统效率和性能,通过采用Netty等高性能的通信框架为基础,开发出了多种跨局域网通信系统。而本文要介绍的正式以此为背景,研究并实现的一套基于Netty的高性能NAT穿透通信系统。实现了局域网环境与公网环境两种通信方式。基本解决了人们日常生活中,对于智能家居的远程访问等功能的需求。大大方便了人们的日常工作和生活。1.2国内外研究现状虽然物联网还是一个新兴产业,然而就其系统中所采用的通信系统而言,国内目前在跨局域网通信方面的研究已经相对成熟。下面介绍一些国内外开发的两个成功案例。首先是Maze 代亚非,IPv6技术与应用例举之三P2P分布式文件系统Maze.北京大学.中国教育网络2005年10期。 系统,它是由北京大学的实验室研究并且提出的一款基于中心控制和对等网络连接相结合的文件资源共享互传系统,其架构与Napster4 LuaEK, Crowcroft J, Pias M, et al. A survey and comparison of peer-to-peer overlay network schemes J. Journal of IEEE Communications Survey and Tutorial, 2005,7(2):72-93.相类似,采用了类似于Gnutella的对等计算搜索方法。任何连入互联网的一台计算机,不论是连入了内部局域网还是外部公共网络,都能够通过配置并且启动Maze客户端来随时随地的接入或者断开Maze系统。任何一个节点都能够本机上的多个文件传输到接入Maze系统的其他客户端主机,同样也能够从其他客户端主机上获取自己所需要的资源。另外,Maze系统还支持基于关键字的资源搜索和查找,甚至还能够通过网络好友关系直接获得资源的共享权。另外就是BitTorrent软件,用户首先从Web服务器上获得下载文件的种子文件,种子文件中包含下载文件名及数据部分的哈希值,还包含一个或者多个的索引(Tracker)服务器地址。它的工作过程如下:客户端向索引服务器发一个超文本传输协议(HTTP)的GET请求,并把它自己的私有信息和下载文件的哈希值放在GET的参数中;索引服务器根据请求的哈希值查找内部的数据字典,随机地返回正在下载该文件的一组节点,客户端连接这些节点,下载需要的文件片段。因此可以将索引服务器的文件下载过程简单地分成两个部分:与索引服务器通信的HTTP,与其他客户端通信并传输数据的协议,称为BitTorrent对等协议。BitTorrent协议也处在不断变化中,可以通过数据报协议(UDP)和DHT的方法获得可用的传输节点信息,而不是仅仅通过原有的HTTP,这种方法使得BitTorrent应用更加灵活,提高BitTorrent用户的下载体验。第二章 相关概念2.1NAT常说的NAT 闫爽.基于NAT穿越的网络可视教学安全性研究.东北大学.2014年02月25日。的全称叫做“网络地址转换”(Network Address Translator)。一般是应用于路由器设备上。NAT分两大类,一类是NAT,通常只进行网络地址的转换;而另一类则是NAPT 陈行,陶军,吴强.基于混合映射机制的NAPT-PT的研究与实现.东南大学计算机网络和信息集成教育部重点实验室,南京,210096;东南大学计算机科学与工程学院,南京,210096.计算机科学2009年5期。(Network Address Port Translator)更为复杂些,不仅会转换网络地址,并且还会将端口进行转换,如今大多使用的是NAPT。NAT设备的工作方式如图2.1所示。 图2.1 NAT设备地址转换根据NAT设备的地址转换方式可分为不同的类型。最常见的四种类型的NAT 郭明熙,赵彦凯.防火墙几个基本问题的探讨.兰州商学院长青学院计算机科学与技术专业,甘肃,兰州.科技资讯2006年2期。设备完全圆锥型的NAT、地址限制型的NAT、端口限制型的NAT以及对称型NAT。这几种类型各有特点。完全圆锥型的NAT设备,将自己局域网下的每一台主机映射为NAT设备的某一个随机端口,无论是局域网内部主机还是局域网外的主机,对彼此间的数据来往没有任何的限制。因为这种类型的NAT设备对外部请求的来源并没有任何的限制,所以这种方式的NAT设备特别的简单,但是另一方面也就造成了内部主机极其不安全。地址限制型的NAT设备,它是完全圆锥型的受限版本,顾名思义,不再是对内外部互相访问毫无限制,而是对其地址进行了识别与判断。相对于完全圆锥型的NAT设备,该类型的NAT设备的安全性有所提高。事实上NAT设备只会向内部主机转发那些来自于目前已经访问过的外部主机的数据包,在一定程度上也保证了外部主机的数据来源的安全性。端口限制型的NAT设备,它是地址受限圆锥型设备的更进一步的受限版本。它的限制更加严格,限制到了端口层次。这一限制更进一步的加强了对外部主机发送来的数据报的源地址的限制,和地址限制型NAT设备比较而言其更具安全性。对称型NAT8 Zhangm,Luo j g, Zhao l, et al. Donet/CoolStreaming: A data-driven overlay network for live media streaming C/Proceedings of IEEE Conference on Computer Communications (INFOCOM05), Mar 13-17, 2005, Miami, FL,USA. Piscataway, NJ,USA: IEEE, 2005:2102-2111.设备,这种NAT设备比之前任何圆锥型NAT设备的地址转换方式都要更为灵活,限制作用也更强:任何圆锥型NAT设备,内部主机的内部私有地址和外网地址的转换映射关系都是独立于内部主机发送出来的数据包的目的地址的,也就是说这种转换方式与目的地址并无任何关联;然而对于对称型NAT设备来说,目的地址却成了NAT设备实施地址转换时的一个主要辨识方法,即对于来自于相同内网地址并且拥有相同目的地址的数据访问发生的时候,NAT设备才会将内网地址转换成同一个外网地址,如果不是这样,NAT设备将会转换为一个新的外网地址。2.2Netty的高性能2.2.1异步非阻塞通信在IO编程过程中,当需要同时处理多个客户端接入请求时,可以利用多线程或者IO多路复用技术进行处理。IO多路复用技术通过把多个IO的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。与传统的多线程/多进程模型比,I/O多路复用的最大优势是系统开销小,系统不需要创建新的额外进程或者线程,也不需要维护这些进程和线程的运行,降低了系统的维护工作量,节省了系统资源 周建国,晏蒲柳,郭成城.Linux下Client/Server异步通信的研究及实现.武汉大学电子信息学院,湖北,武汉,430072.计算机应用研究2002年11期。2.2.2高效的Reactor线程模型常用的Reactor线程模型有三种,分别为Reactor单线程模型、Reactor多线程模型以及主从Reactor多线程模型。Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程在作为服务端,接收客户端的连接;作为客户端,向服务端发起连接;读取通信对端的请求或者应答消息并且能够向通信对端发送消息请求或者应答消息。Reactor单线程模型如图2.2所示。图2.2 Reactor单线程模型但是对于高负载、大并发的应用单线程模型并不合适,为了解决这个问题,演进出了Reactor多线程模型。Rector多线程模型与单线程模型最大的区别就是有一组NIO线程处理IO操作,它的原理如图2.3所示。图2.3 Reactor多线程模型在绝大多数场景下,Reactor多线程模型都可以满足性能需求;但是,在极特殊应用场景中,一个NIO线程负责监听和处理所有的客户端连接可能会存在性能问题。例如百万客户端并发连接,或者服务端需要对客户端的握手消息进行安全认证,认证本身非常损耗性能。在这类场景下,单独一个Acceptor线程可能会存在性能不足问题,为了解决性能问题,产生了主从Reactor多线程模型。主从Reactor线程模型的服务端用于接收客户端连接的不再是单独的NIO线程,而是一个独立的NIO线程池。Acceptor接收到客户端TCP连接请求处理完成后,将新创建的SocketChannel注册到IO线程池(sub reactor线程池)的某个IO线程上,由它负责SocketChannel的读写和编解码工作。Acceptor线程池仅仅只用于客户端的登陆、握手和安全认证,一旦链路建立成功,就将链路注册到后端subReactor线程池的IO线程上,由IO线程负责后续的IO操作。它的线程模型如图2.4所示。图2.4 Reactor主从多线程模型利用主从NIO线程模型,可以解决一个服务端监听线程无法有效处理所有客户端连接的性能不足问题。因此,在Netty的官方示例中,推荐使用该线程模型。事实上,Netty的线程模型并非固定不变,通过在启动辅助类中创建不同的EventLoopGroup实例并通过适当的参数配置,就可以支持上述三种Reactor线程模型。正是因为Netty 对Reactor线程模型的支持提供了灵活的定制能力,所以可以满足不同业务场景的性能诉求。第三章 需求分析对于Netty通道通信系统,整个系统分为三个模块,分别为公网服务器、物联网网关以及客户端。而系统所要达到的主要目标则是在不同的网络环境之下,实现客户端与物联网网关之间的通信功能,并不需要关注通信的内容,也不需要关注内容如何处理。只需要构建出可供通信的通道,并维持通道的状态与相关信息。根据系统中三个模块所处的网络环境不同,可分为两种网络情况,一种是客户端与物联网网关在同一个局域网中,这种情况较为简单,可直接通信,并没有太多环境限制;然而另外一种则是客户端和物联网网关不在共同的局域网内,即两者处在了公网环境 侯家振.基于NAT公网客户端访问私网Server的实现分析.南昌工程学院,江西南昌,330022.科技经济市场2012年4期。下,彼此都隐藏在各自的局域网网关之后。由于这种网络情况下不能直接进行通信,故此需要借助系统中的第三个模块公网服务器来帮助客户端和物联网网关进行通信。3.1局域网环境所谓的局域网环境主要是指客户端和物联网网关同处在一个局域网中。由于此时两者之间的通信过程完全是局域网内部通信过程,不需要借助公网服务器,客户端与物联网网关之间能够根据局域网内部地址进行直接通信,支持收发消息功能。其用例模型如图3.1所示。图3.1 局域网环境用例3.2公网环境公网环境中的情况远远比局域网环境复杂的多,还可以细分为很多种情况,一种为情况为公网服务器,物联网网关以及客户端三个功能模块均拥有公网IP地址,全都处在公网环境的最顶层,虽然这种情况基本不会出现,但是这种情况的下的通信就和局域网环境相类似了,只不过是一个更大的被称为公网的局域网。彼此的通信只需要指明目的地址(公网IP地址)即可;而第二种情况则是客户端或者物联网网关两个模块中只有一个模块处在公网最顶层,而另外的一个模块处在一层或者多层局域网之后。这种情况下客户端和物联网网关两个模块是不能进行通信的;最后第三种情况,客户端和物联网网关两个模块均处在一层或者多层局域网之后并且不在相同的局域网中。同样也是不能进行通信的。事实上,前两种情况可以归结为第三种情况的特殊情况,故此,本文将第三种的情况作为普遍情况进行需求分析,用例分析如图3.2所示。图3.1 公网环境用例3.2.1客户端公网环境下的客户端功能模块相对局域网环境更为复杂些,客户端这时候并不能知道物联网网关的具体地址,因为此时物联网网关和客户端处在了不同的局域网环境中,彼此之间是不可见的,也不能知道彼此处在哪一个局域网中。所以客户端需要拥有与公网服务器通信的功能,通过与公网服务器的通信,客户端能够获取到物联网网关所处的网络环境信息,通过此信息尝试与物联网网关建立直接的通信通道。而这时会出现两种情况,根据本文上一个章节关于NAT的相关介绍,如果不存在对称型NAT设备,那么客户端完全可以和物联网网关建立直接通信通道,客户端需要通过公网服务器接入物联网网关设备,由公网服务器提取对应物联网网关设备的IP地址信息发送给客户端,客户端向获取的IP地址发送通道请求(UDP协议包),物理网网关设备同时接收公网服务器发送的客户端IP地址信息,向客户端发送通道响应数据(UDP协议包)。客户端与物联网网关建立直接通信通道;但是若网络环境中存在对称型NAT设备,那么客户端与物联网网关无法建立直接通信,这时候客户端需要发送消息给物联网网关的话,客户端需要将消息发送给公网服务器,由公网服务器负责转发给物联网网关模块。客户端向公网服务器发送转发通道请求,公网服务器获取对应的物联网网关通道状态,当物联网网关状态为在线时,公网服务器向客户端发送转发通道响应,建立转发通道。在通信通道正常状态下,相互发送信息和接收应答信息,实现客户端与物联网网关设备之间的通信信道功能。3.2.2物联网网关物联网网关在公网环境中与客户端也很类似,实际上也可以将物联网网关看作是特殊的客户端,这样系统的功能就可以近似的看作是客户端之间的跨局域网通信,就正是P2P通信的模式。在公网环境中,物联网网关模块启动后,提取本机IP地址和端口号、设备ID等数据。会先公网服务器发出消息,公网服务器可以通过此类型的消息知道物联网网关是否在线。当有客户端接入时,维护客户端地址信息与通道信息,并向客户端发送通道响应数据。接收客户端与公网服务器发来的消息,能检测到客户端的接入与退出,当有数据需要发送到客户端时,根据当前接入的客户端信息进行消息发送。若有过多的客户端同时接入一个物联网网关的时候,物联网网关会对后来的客户端接入请求回应拒绝消息。3.2.3公网服务器在公网网络环境下,公网服务器模块在整个系统中扮演着重要的角色。在这里公网服务器相当于P2P通信模式中的中介服务器。由于客户端与物联网网关模块都隐藏在了不同的局域网环境里,彼此之间的通信很困难,无法知道彼此的地址。而此时通过公网服务器的中介作用,而客户端和物联网网关模块均会与公网服务器进行通信来往,而公网服务器作为中介者,转告彼此的地址信息。这就帮助两者进行通道通信,客户端和物联网网关借助公网服务器首先尝试建立直接通信通道,客户端需要通过公网服务器来接入物联网网关设备,由公网服务器提取对应物联网网关设备的IP地址信息发送给客户端,客户端向获取的IP地址发送通道请求(UDP协议包),物理网网关设备同时接收公网服务器发送的客户端IP地址信息,向客户端发送通道响应数据(UDP协议包)。如果直接通信通道建立失败,那么两者间的数据来往将需要借助公网服务器转发消息。则客户端向公网服务器发送转发通道请求,公网服务器获取对应的物联网网关通道状态,当物联网网关状态为在线时,公网服务器向客户端发送转发通道响应,建立转发通道。除此之外,公网服务器还需要检测物联网网关模块是否在线,时时更新物联网网关在线状态。对客户端的数据请求做出数据应答。第四章 总体设计在综合考虑了上一章节中所提出的各种网络情况下的需求,这里提出了基于Netty的高性能NAT穿透通信系统的总体结构。本文接下来将会分析公网服务器、物联网网关以及客户端之间通信过程和其中使用的关键技术与设计方法。本文在这里将总体了解系统的结构特点。针对不同的网络环境,系统中的三个功能模块(公网服务器、物联网网关与客户端)所处的网络位置的不同,依旧分为局域网环境与公网环境两种情况进行分析与设计。对于不同的网络环境状况,提出了针对性的设计方案。4.1系统结构整个通信系统分为三个功能模块,就是本文之前提到的公网服务器、物联网网关与客户端三个模块。而这三个功能模块将会分别部署在不同的通信设备上,根据这些通信设备所处在网络环境中的位置,总体可以分为局域网通信与公网通信两种模式。其总体架构分别如图4.1与图4.2所示。图4.1 公网环境总体架构图4.2 局域网环境总体架构4.2局域网环境在局域网网络环境中,本文将分别分析三个功能模块彼此之间的交互的流程关系,分别是公网服务器与客户端、公网服务器与物联网网关、物联网网关与客户端三个交互过程。那么首先是公网服务器与客户端之间的交互过程。图4.3 局域网环境下客户端与公网服务器交互过程局域网环境下,客户端与公网服务器之间并没有太多的交互过程。客户端模块会在启动后立即向公网服务器发送心跳数据包,这个心跳数据包的作用有二。其一是通过心跳方式告知公网服务器,该客户端模块启动并且连入网络中,以供公网服务器随时检测客户端在线状态与何时退出;而其二的作用是通过固定时间间隔的心跳数据包,能够维持客户端与公网服务器之间的通信通道畅通,防止由于长时间没有数据往来导致NAT设备屏蔽数据,截断通信通道。保持了客户端与公网服务器的长连接状态。交互过程如图4.3所示。图4.4 局域网环境下物联网网关与公网服务器交互过程而接下来则是物联网网关于公网服务器之间的交互过程,对于处在局域网环境下的物联网网关,其与公网服务器的交互一样很简单,和客户端与公网服务器的交互过程颇为类似。物联网网关模块同样会在启动后立即向公网服务器发送心跳数据包,这个心跳数据包的作用与客户端所发送的心跳数据包的作用相同,供公网服务器检测物联网网关的在线状态。当物联网网关模块启动时,公网服务器会检测到心跳,并且将数据库中对应的物联网网关状态更新为已上线。并且将其心跳数据包的源地址(即物联网网关的外网地址)也同样更新到数据库中,以备查询。而当物联网网关模块退出之后,公网服务器则会检测到心跳数据包的终止,并将数据库中对应的物联网网关状态更新为已下线。交互过程如图4.4所示。那么最后则是客户端与物联网网关模块之间的交互过程,在局域网中两者之间可直接进行数据往来,直接通过彼此的局域网内的内网地址发送消息。从而简洁地完成了交互过程。4.3公网环境公网环境下,本文依旧对系统中的三个功能模块之间的交互过程进行分析与设计,那么首先公网服务器与客户端之间的交互过程如图4.5所示。图4.5 公网环境下客户端与公网服务器交互过程在这个过程中,客户端模块在启动之后依旧会向公网服务器发送心跳数据包,该心跳数据包的作用与前文所介绍的功能一致,客户端通过心跳的方式告知公网服务器该客户端模块启动上线。公网服务器检测心跳数据包的信息,保持并且维护在线客户端的地址信息与通道信息。客户端与公网服务器能够进行有效的数据往来,发送消息以及消息应答。与局域网环境不同的是,公网环境里客户端不知道物联网网关的网络地址,这时候客户端模块会向公网服务器发送查询物联网网关状态的消息。如果物联网网关不在线,公网服务器会回复一个不在线的消息给客户端模块。如果物联网网关在线,公网服务器则会回复物联网网关的地址信息给客户端模块。图4.6 公网环境下物联网网关与公网服务器交互过程如图4.6是物联网网关与公网服务器之间的交互过程,此过程基本与局域网环境中的相一致。公网服务器检测到物联网网关的状态,并将信息更新到数据库中。彼此间同样可以进行消息的发送与应答。而当客户端模块向公网服务器查询了物联网网关状态之后,公网服务器会将获取到的客户端地址信息发送给物联网网关。而物联网网关模块将对此地址信息进一步处理。图4.7 公网环境下客户端与物联网网关交互过程最后是物联网网关与客户端的交互过程。如图4.7所示,在前两个过程的基础上,如果物联网网关与客户端模块当前状态为在线,那么物联网网关和客户端都已经通过公网服务器获取到了彼此的网络地址信息。接下来两者彼此都会向对方发送多次通道建立请求。如果能建立起直接的通道,客户端模块会向公网服务器发送存活数据包,其性质和心跳数据包作用相同。一是为了让物联网网关能够检测到当前接入的客户端的在线状态;二是为了满足客户端模块与物联网网关模块的长连接状态。那么两者之间就可以直接的进行消息往来。但是如果说两者之间没能建立起直接通信通道的话,则需要借助两者各自与公网服务器的通信通道进行转发消息。4.3.1直接通道设计就不同局域网的主机间通信而言,是无法进行直接通道通信的。那么针对这一问题,设计提出了直接通信通道的解决方案。参考的方法是UDP穿透方法。首先,本文将介绍一下什么是UDP穿透。UDP穿透方法是指在UDP协议下的通信框架中,通过打洞的方法来实现对NAT设备的穿透,从而实现跨局域网通信,建立直接通信通道。根据前文关于NAT设备的介绍,可以了解到NAT设备从不同程度上限制了内网主机与外网主机之间的自由通信。而对于圆锥型NAT设备而言,是可以实现NAT穿透的。其原理归结为,一个外层网络中的主机需要将消息发送到内层网络的主机上的前提,必须是内层网络的主机早已经访问过该外层网络主机。图4.8 直接通信通道建立过程那么在基于Netty的高性能NAT穿透通信系统中,根据这一原理设计出直接通信通道建立过程。由前文介绍的,当客户端与物联网网关两个模块都获取到彼此的网络地址信息后,两者同时向对方发送直接通信通道建立请求,并且都进行多次尝试。本身这种请求是无法发送到目的地址的,因为会被对方的局域网NAT设备视为外层网络发来的消息而屏蔽掉。而由于双方都进行了多次请求尝试,虽然外层网络发送的消息无法穿透NAT设备到达局域网内部,但是局域网内部同时也主动发送消息到外层网络的话,就满足了之前所说的原理,即当内网主机访问过外网主机后,外网主机的消息才能发送到内网主机上。这样彼此的NAT设备不再屏蔽消息往来,则可以建立起直接的通信通道。而这时候虽然建立起直接通信通道,但是需要解决另外一个问题如何维持通信通道。因为NAT设备对于长时间没有消息往来的外层网络主机仍然会屏蔽掉,对于UDP协议通信而言,这个时间的长短也不能确定,从几分钟到几小时不等。所以为了维持通信通道的畅通,客户端在建立起通道之后会不断的向物联网网关发送存活数据包,用以保证短时间内一直有消息往来,实现与物联网网关模块的长连接,维持了通信通道的畅通。整个直接通信通道建立过程如图4.8所示。4.3.2转发通道设计客户端与公网服务器模块不能建立直接通信通道的时候,就需要采用转发通道。对于转发通道的设计比较简单,客户端与物联网网关两者彼此发送消息的时候,将消息发送给公网服务器,由公网服务器从消息中解析出待转发的目的地址信息,并将其转发出去,将消息送达。第五章 详细设计与实现本部分内容将在总体分析与设计的基础之上,再度深入详细分析设计与实现,并将相关功能实现。对整个通道通信系统依旧分为公网服务器、物联网网关与客户端三个功能模块进行设计实现工作。5.1公网服务器公网服务器在整个通信通道系统中充当着一个中介者的功能。在局域网环境中,公网服务器所存在的意义并不是很大;然而在公网环境下的时候,公网服务器却起到了举足轻重的作用。5.1.1局域网环境客户端和物联网网关在同一局域网中的时候,即处在局域网环境中。公网服务器的作用不大。当物联网网关模块启动并且连入网络的情况下,公网服务器会接收到来自物联网网关的心跳数据包,公网服务器会更新数据库,将物联网网关状态更新到数据库里,将在线状态更新为在线,将物联网网关的外网地址也更新到数据库中。当物联网网关模块退出的时候,物联网网关模块将停止向公网服务器发送心跳数据包,公网服务器会检测到物联网网关掉线。并且将数据库更新,即将物联网网关的在线状态更新为下线。当客户端模块启动并且连入网络的情况下,公网服务器同样会接收到来自客户端的心跳数据包,检测到客户端上线。当客户端模块退出的时候,客户端模块将停止向公网服务器发送心跳数据包,公网服务器会检测到物联网网关掉线。5.1.2公网环境客户端和物联网网关不在同一个局域网里,这时候两者之间的通信需要借助公网服务器来建立直接通信通道,或者借助公网服务器进行转发通信。当两者所处的局域网环境中,有一方的路由设备所采用的NAT类型为对称型NAT的话,根据前文的介绍,这种类型的NAT的限制作用最为严苛。无法通过UDP打洞的方式来建立直接通信通道,故需要公网服务器进行转发。客户端和物联网网关模块都可以通过发送转发类型的数据到公网服务器上,而公网服务器模块会识别发来的消息类型,检测出是转发数据,并且从中解析出来待转发的目的地址,将消息转发到目的地。而当客户端和物联网网关模块能够建立直接的通信通道的时候,公网服务器模块起到了中介作用,首先客户端模块向公网服务器模块查询需要访问的物联网网关的在线状态,公网服务器模块接收到请求之后,获取待查询的物联网网关设备的设备ID,通过设备ID到数据库查询物联网网关设备的在线状态。若物联网网关状态为不在线,公网服务器发送消息告知客户端;若物联网网关状态为在线。则公网服务器将获取到的物联网网关的外网地址发送给客户端模块。同时,公网服务器模块也将获取到的客户端外网地址,并将其地址发送给物联网网关模块。这样客户端和物联网网关模块就都知道了彼此的外网地址。公网服务器的任务就完成了。5.1.3类的设计主类设计为PublicServer,在这里封装了各种方法,以满足对公网服务器的功能的需求。而通过主类来创建其它功能类。各个类的相互关系如图5.1所示。图5.1 公网服务器模块类图首先介绍主类PublicServer,如图5.2所示。它的内部需要提供多种供用户使用的函数方法,下图是对于该类的详细类图。PublicServer类中包含三个内部类。这三个内部类的作用各不相同,而之所以将其设计为内部类是为了方便在运行时读取PublicServer中的成员属性。这些成员属性的值通常会在运行过程发生变化。比如说,timeAfter这一成员属性,在公网服务器模块中负责存储当前时间,公网服务器模块通过这一属性定时记录当前时间,计算在线客户端或物联网网关模块最近一次心跳数据包与当前时间的间隔,来检测状态为在线还是已退出。而这些检测过程都是在内部类里完成的。图5.2 公网服务器模块主类类图PublicServer类里面的三个内部类当中,PublicServerHandler类则是一个输入输出事件的处理类。实际上这种设计方式是Netty通信框架中所采用的,是基于Netty通信框架的。而在本系统中,将只针对输入事件进行相应处理操作。每当有输入事件发生时,通过Netty的事件处理机制,直接调用PublicServerHandler类中消息接收方法。在该方法中,将各种消息类型进行识别与分析,从而在通道创建过程中进行不同的响应。另外一个内部类CheckClientHeartBeat类,这个类的作用是要检测客户端发来的心跳数据包。对于不同的客户端,同时进行分别检测。当客户端模块启动的时候,该内部类开始执行并检测客户端在线状态。通过刚刚举的timeAfter的例子,以这样的方式来固定间隔时间的去判断客户端是否已经退出。当有多个客户端模块同时启动的时候,公网服务器会创建多个CheckClientHeartBeat类的实例,一对一的检测每一个客户端的状态。而最后一个内部类,CheckGatewayHeartBeat类的功能和CheckClientHeartBeat类相类似,不同的是该内部类检测的是物联网网关所发送来的心跳数据包。其检测方法和过程也和上一段介绍的CheckClientHeartBeat类相一致,本文在这里不再重复介绍。5.1.4方法接口对于公网服务器所需求的各种功能,将其以方法接口的方式提供出来,供用户使用以及在此基础上二次开发。为了方便使用与简便开发,将公网服务器的一系列方法都封装在主类PublicServer中。主要方法如下表5.1所示。表5.1 公网服务器模块接口序号接口函数函数名称函数说明1构造函数PublicServer初始化PublicServer类2runInLocal启动公网服务器,监听端口3sendMessage发送消息到指定IP和端口的设备公网服务器对外提供的方法接口并不是很多,事实上大部分功能都不对外提供,即大部分方法接口都是在客户端或者物联网网关构建通信通道的过程中,公网服务器内部调用执行,并不对外提供过多的方法接口。对外只提供表格中的三个方法。其中第一个方法是公网服务器模块的主类PublicServer的构造函数,为多个成员属性提供初始化,创建内部事件处理类,用来监听消息输入事件。而下一个方法接口runInLocal则是启动公网服务器模块函数,该方法的主要作用是启动公网服务器模块的线程池,多线程处理通信消息,绑定服务器物理机端口,该端口通过参数传递给runInLocal方法接口,监听端口的连接请求。该方法启动成功返回布尔值为真,否则为假。表格中的最后一个方法接口为sendMessage,该方法的作用是发送消息到指定IP和端口的设备。待发送的数据与待发送的目的地址通过参数传递到方法接口中,通过该方法可实现消息的发送。5.2物联网网关物联网网关在整个系统中实际上是一些固定的特殊的客户端,物联网网关通常处在局域网NAT设备后面。公网环境下无法与之进行通信活动。对此前文总体设计中已经提出了解决方案与设计方法。本节将会对物联网网关的各种功能提出更加详细的设计方案。仍旧考虑两种网络情况,首先提出局域网环境下的解决办法。5.2.1局域网环境在局域网中,物联网网关模块启动后会向公网服务器发送心跳数据包。对局域网内的客户端访问不做任何限制,对局域网内的客户端不再维护通道信息。客户端仅需知道物联网网关的局域网IP和端口号就可以直接访问。物联网网关也可以对客户端的访问做出相应。5.2.2公网环境公网环境下,当客户端与物联网网关模块直接建立通道通信时,物联网网关模块对接入的客户端的地址信息进行维护,最多接收5个客户端的同时接入。当有更多的客户端尝试建立直接通信通道的时候,物联网网关会发送拒绝信息给客户端模块,不再维护更多接入的客户端通道信息。5.2.3类的设计在公网服务器模块当中,本文的设计思路与公网服务器模块一样,本着方便使用与简便开发的目的,将所需要提供的功能以方法接口的方式提供出来,并且将所有方法封装在主类Gateway中,使功能集中在一个类中,如图5.3所示。图5.3 物联网网关模块类图而在其主类Gateway中,如图5.4所示。包含着另外两个内部类。分别是GatewayHandler类与checkHeartBeat类其设计为内部类的思想也是为了能够实时访问主类中的成员属性的值。以保证通信通道在建立过程中,准确无误。ClientOnline和HashMapTable两个类是负责维护当前接入该物联网网关的客户端的信息。另外的EnumSerializer、MessageItem、以及GatewayMessageType和客户端与公网服务器部分相同,均为系统建立通道时,系统内部运作的服务类。图5.4 物联网网关模块主类类图内部类GatewayHandler是Netty通信框架中事件处理类的子类,继承自SimpleChannelInboundHandler输入事件处理类。该类会对所有物联网网关模块的消息输入事件进行处理。而GatewayHandler通过重写事件处理类的内部方法,识别通道建立过程中的各种不同类型的消息,以满足物联网网关模块的消息处理功能。而另外一个内部类checkHeartBeat的作用则是检测公网环境下接入物联网网关的客户端在线状态信息。其原理与公网服务器检测客户端在线状态相一致。当同时接入的客户端的数量不超过五个的时候,检测客户端在线并且维护在线客户端通道信息和地址信息;当有更多客户端尝试接入同一个物联网网关的时候,拒绝接入而且也不进行在线状态检测。5.2.4方法接口本部分介绍物联网网关模块对外提供的方法与接口,这些方法与接口的作用也是为了供用户使用以及在此基础上二次开发。本着方便使用与简便开发的思想,物联网网关模块的一系列方法全部封装在主类Gateway中,主要方法如表5.2所示。表5.2 物联网网关模块接口序号接口函数函数名称函数说明1构造函数Gateway提供公网服务器地址(公网IP与端口)以及该物联网网关的设备ID2runInLocal启动物联网网关,绑定随机端口并监听3sendMessage发送消息到指定IP和端口的设备4sendMsgToClient发送消息到指定IP和端口的客户端5sendMsgToPublicServer发送消息到公网服务器6sendTransponderMessagePackageGtoC发送转发消息到指定IP和端口的客户端相对于公网服务器模块而言,物联网网关模块对外提供的接口要多一些。而主要的接口方法是对外发送消息的方法。在这些方法接口中,本文介绍了几个相对重要的接口的作用。首先要提到的是物联网网关模块构造函数,需要将公网服务器地址(公网IP与端口),以及该物联网网关的设备ID作为参数提供。该构造方法的功能性不是很强,但为其他接口方法提供了巨大的便利。接下来是启动物联网网关模块的runInLocal函数,该函数的功能主要是为物联网网关模块启动线程池,绑定随机端口,监听端口连接。如果物联网网关模块启动失败,该方法将会返回一个值为假的布尔变量。最后介绍一下最为常用的接口,sendMsgToClient方法的作用是发送消息到客户端模块。需要将待发送的消息与待接收的客户端外网地址作为参数提供给该方法。该方法将向目标地址的客户端模块通过通信通道发送消息。5.3客户端客户端模块负责与物联网网关模块与公网服务器模块进行通信,是部署在普通用户的客户端设备上。用户通过客户端模块所提供的功能与另外两个模块进行消息往来。满足各种查询需求。使用户实时掌握远端的消息。而对于客户端的功能设计同样分为两种网络环境。5.3.1局域网环境局域网环境中,客户端模块在启动后会立即向公网服务器模块发送心跳数据包,每一个心跳数据包的间隔时间为两秒。如果超过一定时间公网服务器端仍然没有接收到客户端模块发来的心跳数据包的话,公网服务器模块那边将会认定该客户端已经下线。除此之外,在局域网环境中,客户端模块可以直接通过局域网内网IP地址和端口号与物联网网关进行局域网内部通信。5.3.2公网环境公网环境中,客户端向公网服务器模块查询到物联网网关的外网地址后会发送打洞数据包(即多次的通道请求消息)到物联网网关模块。同时物联网网关模块也会尝试向客户端的外网地址发送打洞数据包。若能建立直接通信通道,客户端会立即发送客户端存活数据包,该数据包的作用有二。其一是便于物联网网关模块随时检测客户端是否断开连接;其二是维持客户端与物联网网关模块之间的长链接,防止长时间无数据来往后,通道被NAT设备屏蔽截断。但是如果不能建立直接通信通道的时候(这种情况通常是由于NAT设备为对称型的,不支持UDP打洞),客户端可以将消息发送给公网服务器模块,再由公网服务器模块将消息转发到物联网网关上。然而不论是建立了直接通信通道还是建立了转发通道,客户端都能够借助建立起的通道与物联网网关模块进行消息往来。5.3.3类的设计客户端的方法与主要功能都封装在其主类C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论