收藏 分享(赏)

基于Netty的高性能NAT穿透通信系统.doc

上传人:wo7103235 文档编号:6152613 上传时间:2019-03-30 格式:DOC 页数:48 大小:1.11MB
下载 相关 举报
基于Netty的高性能NAT穿透通信系统.doc_第1页
第1页 / 共48页
基于Netty的高性能NAT穿透通信系统.doc_第2页
第2页 / 共48页
基于Netty的高性能NAT穿透通信系统.doc_第3页
第3页 / 共48页
基于Netty的高性能NAT穿透通信系统.doc_第4页
第4页 / 共48页
基于Netty的高性能NAT穿透通信系统.doc_第5页
第5页 / 共48页
点击查看更多>>
资源描述

1、摘 要摘 要伴随着网络环境的发展,网络通信所遇到的问题也越发明显。而最根本的问题仍旧是通信双方能否互相通信。在当前网络环境中,大多采用了网络地址转换(NAT ) ,出现了私有地址和公网地址等概念。解决了地址不足的问题。却又引申了另一个问题的出现跨局域网通信问题。不同局域网中的主机彼此无法直接通信,而本文通过 UDP 打洞的 NAT 穿透方法,阐述了实现跨局域网通信的解决方案。该方案使得处在不同局域网 NAT设备后面的主机能够借助中介服务器穿透彼此的 NAT 设备,实现直接通信。并且,对于不同类型的 NAT 设备采取了各自不同的针对性的解决办法。本文所阐释的技术能够基本解决跨局域网主机间的通信问

2、题。通过采用Netty 这款高性能 NIO 通信框架,也使得服务器的性能方面得到了保证。将跨局域网通信与 Netty 通信框架相结合,这正是本文的核心技术。关键词:Netty UDP 打洞 跨局域网通信基于 Netty 的高性能 NAT 穿透通信系统ABSTRACTABSTRACTWith 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 co

3、uld 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 machin

4、e 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 media

5、tion 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 frame

6、work.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基于 Netty 的高性能 NAT 穿透通信系统目 录 i目 录第一章 绪论 11.1 项目背景 .11.2 国内外研究现状 .1第二章 相关概念 32.

7、1 NAT.32.2 Netty 的高性能 .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 物联网网

8、关 .225.2.1 局域网环境 235.2.2 公网环境 23ii 目 录5.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第一章 绪论 1第一章 绪论本文主要讨论基于 Netty 的

9、高性能 NAT 穿透通信系统 即跨局域网通信系统。采用了目前最流行的 Netty 高性能通信框架 1。1.1 项目背景随着物联网 2的兴起与发展,智能家居有关的项目也随之逐渐出现。智能家居是利用先进的计算机技术、网络通讯技术、综合布线技术、医疗电子技术依照人体工程学原理,融合个性需求,将与家居生活有关的各个子系统如安防、灯光控制、窗帘控制、煤气阀控制、信息家电、场景联动、地板采暖、健康保健、卫生防疫、安防保安等有机地结合在一起,通过网络化综合智能控制和管理,实现“以人为本”的全新家居生活体验。其项目的总体思想是使用户在日常生活中获得更大的方便。用户能够通过自己身边随身携带的移动通信设备,与自己

10、家中的智能家居设备远程通信,实现远程访问、监测与控制等功能。而这就需要一套适应于不同网络环境的通信系统。另一方面由于用户集群庞大,通信系统为了追求系统效率和性能,通过采用Netty 等高性能的通信框架为基础,开发出了多种跨局域网通信系统。而本文要介绍的正式以此为背景,研究并实现的一套基于 Netty 的高性能 NAT 穿透通信系统。实现了局域网环境与公网环境两种通信方式。基本解决了人们日常生活中,对于智能家居的远程访问等功能的需求。大大方便了人们的日常工作和生活。1.2 国内外研究现状虽然物联网还是一个新兴产业,然而就其系统中所采用的通信系统而言,国内目前在跨局域网通信方面的研究已经相对成熟。

11、下面介绍一些国内外开发的两个成功案例。首先是 Maze3 系统,它是由北京大学的实验室研究并且提出的一款基于中心控制和对等网络连接相结合的文件资源共享互传系统,其架构与 Napster4相类似,采用了类似于 Gnutella 的对等计算搜索方法。任何连入互联网的一台计算机,不论是连入了内部局域网还是外部公共网络,都能够通过配置并且启动 Maze 客户端来随2 基于 Netty 的高性能 NAT 穿透通信系统时随地的接入或者断开 Maze 系统。任何一个节点都能够本机上的多个文件传输到接入 Maze 系统的其他客户端主机 ,同样也能够从其他客户端主机上获取自己所需要的资源。另外,Maze 系统还

12、支持基于关键字的资源搜索和查找,甚至还能够通过网络好友关系直接获得资源的共享权。另外就是 BitTorrent 软件,用户首先从 Web 服务器上获得下载文件的种子文件,种子文件中包含下载文件名及数据部分的哈希值,还包含一个或者多个的索引(Tracker)服务器地址。它的工作过程如下:客户端向索引服务器发一个超文本传输协议(HTTP) 的 GET 请求,并把它自己的私有信息和下载文件的哈希值放在GET 的参数中;索引服务器根据请求的哈希值查找内部的数据字典,随机地返回正在下载该文件的一组节点,客户端连接这些节点,下载需要的文件片段。因此可以将索引服务器的文件下载过程简单地分成两个部分:与索引服

13、务器通信的HTTP,与其他客户端通信并传输数据的协议,称为 BitTorrent 对等协议。BitTorrent 协议也处在不断变化中,可以通过数据报协议(UDP) 和 DHT 的方法获得可用的传输节点信息,而不是仅仅通过原有的 HTTP,这种方法使得 BitTorrent应用更加灵活,提高 BitTorrent 用户的下载体验。第二章 相关概念 3第二章 相关概念2.1 NAT常说的 NAT5的全称叫做 “网络地址转换”(Network Address Translator) 。一般是应用于路由器设备上。NAT 分两大类,一类是 NAT,通常只进行网络地址的转换;而另一类则是 NAPT6(N

14、etwork Address Port Translator)更为复杂些,不仅会转换网络地址,并且还会将端口进行转换,如今大多使用的是NAPT。 NAT 设备的工作方式如图 2.1 所示。图 2.1 NAT 设备地址转换根据 NAT 设备的地址转换方式可分为不同的类型。最常见的四种类型的NAT7设备完全圆锥型的 NAT、地址限制型的 NAT、端口限制型的 NAT 以及对称型 NAT。这几种类型各有特点。完全圆锥型的 NAT 设备,将自己局域网下的每一台主机映射为 NAT 设备的某一个随机端口,无论是局域网内部主机还是局域网外的主机,对彼此间的数据来往没有任何的限制。因为这种类型的 NAT 设备

15、对外部请求的来源并没有任何的限制,所以这种方式的 NAT 设备特别的简单,但是另一方面也就造成了内部主机极其不安全。地址限制型的 NAT 设备,它是完全圆锥型的受限版本,顾名思义,不再是对内外部互相访问毫无限制,而是对其地址进行了识别与判断。相对于完全圆锥4 基于 Netty 的高性能 NAT 穿透通信系统型的 NAT 设备,该类型的 NAT 设备的安全性有所提高。事实上 NAT 设备只会向内部主机转发那些来自于目前已经访问过的外部主机的数据包,在一定程度上也保证了外部主机的数据来源的安全性。端口限制型的 NAT 设备,它是地址受限圆锥型设备的更进一步的受限版本。它的限制更加严格,限制到了端口

16、层次。这一限制更进一步的加强了对外部主机发送来的数据报的源地址的限制,和地址限制型 NAT 设备比较而言其更具安全性。对称型 NAT8设备,这种 NAT 设备比之前任何圆锥型 NAT 设备的地址转换方式都要更为灵活,限制作用也更强:任何圆锥型 NAT 设备,内部主机的内部私有地址和外网地址的转换映射关系都是独立于内部主机发送出来的数据包的目的地址的,也就是说这种转换方式与目的地址并无任何关联;然而对于对称型NAT 设备来说,目的地址却成了 NAT 设备实施地址转换时的一个主要辨识方法,即对于来自于相同内网地址并且拥有相同目的地址的数据访问发生的时候,NAT设备才会将内网地址转换成同一个外网地址

17、,如果不是这样,NAT 设备将会转换为一个新的外网地址。2.2 Netty 的高性能2.2.1 异步非阻塞通信在 IO 编程过程中,当需要同时处理多个客户端接入请求时,可以利用多线程或者 IO 多路复用技术进行处理。IO 多路复用技术通过把多个 IO 的阻塞复用到同一个 select 的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。与传统的多线程/多进程模型比,I/O 多路复用的最大优势是系统开销小,系统不需要创建新的额外进程或者线程,也不需要维护这些进程和线程的运行,降低了系统的维护工作量,节省了系统资源 9。2.2.2 高效的 Reactor 线程模型常用的 Reacto

18、r 线程模型有三种,分别为 Reactor 单线程模型、Reactor 多线程模型以及主从 Reactor 多线程模型。第二章 相关概念 5Reactor 单线程模型,指的是所有的 IO 操作都在同一个 NIO 线程上面完成,NIO 线程在作为服务端,接收客户端的连接;作为客户端,向服务端发起连接;读取通信对端的请求或者应答消息并且能够向通信对端发送消息请求或者应答消息。Reactor 单线程模型如图 2.2 所示。图 2.2 Reactor 单线程模型但是对于高负载、大并发的应用单线程模型并不合适,为了解决这个问题,演进出了 Reactor 多线程模型。Rector 多线程模型与单线程模型最

19、大的区别就是有一组 NIO 线程处理 IO 操作,它的原理如图 2.3 所示。图 2.3 Reactor 多线程模型在绝大多数场景下,Reactor 多线程模型都可以满足性能需求;但是,在极特殊应用场景中,一个 NIO 线程负责监听和处理所有的客户端连接可能会存在性能问题。例如百万客户端并发连接,或者服务端需要对客户端的握手消息进行安全认证,认证本身非常损耗性能。在这类场景下,单独一个 Acceptor 线程可能会存在性能不足问题,为了解决性能问题,产生了主从 Reactor 多线程模型。6 基于 Netty 的高性能 NAT 穿透通信系统主从 Reactor 线程模型的服务端用于接收客户端连

20、接的不再是单独的 NIO 线程,而是一个独立的 NIO 线程池。Acceptor 接收到客户端 TCP 连接请求处理完成后,将新创建的 SocketChannel 注册到 IO 线程池( sub reactor 线程池)的某个IO 线程上,由它负责 SocketChannel 的读写和编解码工作。Acceptor 线程池仅仅只用于客户端的登陆、握手和安全认证,一旦链路建立成功,就将链路注册到后端 subReactor 线程池的 IO 线程上,由 IO 线程负责后续的 IO 操作。它的线程模型如图 2.4 所示。图 2.4 Reactor 主从多线程模型利用主从 NIO 线程模型,可以解决一个服

21、务端监听线程无法有效处理所有客户端连接的性能不足问题。因此,在 Netty 的官方示例中,推荐使用该线程模型。事实上,Netty 的线程模型并非固定不变,通过在启动辅助类中创建不同的EventLoopGroup 实例并通过适当的参数配置,就可以支持上述三种 Reactor 线程模型。正是因为 Netty 对 Reactor 线程模型的支持提供了灵活的定制能力,所以可以满足不同业务场景的性能诉求。第三章 需求分析 7第三章 需求分析对于 Netty 通道通信系统,整个系统分为三个模块,分别为公网服务器、物联网网关以及客户端。而系统所要达到的主要目标则是在不同的网络环境之下,实现客户端与物联网网关

22、之间的通信功能,并不需要关注通信的内容,也不需要关注内容如何处理。只需要构建出可供通信的通道,并维持通道的状态与相关信息。根据系统中三个模块所处的网络环境不同,可分为两种网络情况,一种是客户端与物联网网关在同一个局域网中,这种情况较为简单,可直接通信,并没有太多环境限制;然而另外一种则是客户端和物联网网关不在共同的局域网内,即两者处在了公网环境 10下,彼此都隐藏在各自的局域网网关之后。由于这种网络情况下不能直接进行通信,故此需要借助系统中的第三个模块公网服务器来帮助客户端和物联网网关进行通信。3.1 局域网环境所谓的局域网环境主要是指客户端和物联网网关同处在一个局域网中。由于此时两者之间的通

23、信过程完全是局域网内部通信过程,不需要借助公网服务器,客户端与物联网网关之间能够根据局域网内部地址进行直接通信,支持收发消息功能。其用例模型如图 3.1 所示。图 3.1 局域网环境用例8 基于 Netty 的高性能 NAT 穿透通信系统3.2 公网环境公网环境中的情况远远比局域网环境复杂的多,还可以细分为很多种情况,一种为情况为公网服务器,物联网网关以及客户端三个功能模块均拥有公网 IP 地址,全都处在公网环境的最顶层,虽然这种情况基本不会出现,但是这种情况的下的通信就和局域网环境相类似了,只不过是一个更大的被称为公网的局域网。彼此的通信只需要指明目的地址(公网 IP 地址)即可;而第二种情

24、况则是客户端或者物联网网关两个模块中只有一个模块处在公网最顶层,而另外的一个模块处在一层或者多层局域网之后。这种情况下客户端和物联网网关两个模块是不能进行通信的;最后第三种情况,客户端和物联网网关两个模块均处在一层或者多层局域网之后并且不在相同的局域网中。同样也是不能进行通信的。事实上,前两种情况可以归结为第三种情况的特殊情况,故此,本文将第三种的情况作为普遍情况进行需求分析,用例分析如图 3.2 所示。图 3.1 公网环境用例3.2.1 客户端公网环境下的客户端功能模块相对局域网环境更为复杂些,客户端这时候并不能知道物联网网关的具体地址,因为此时物联网网关和客户端处在了不同的局域网环境中,彼

25、此之间是不可见的,也不能知道彼此处在哪一个局域网中。第三章 需求分析 9所以客户端需要拥有与公网服务器通信的功能,通过与公网服务器的通信,客户端能够获取到物联网网关所处的网络环境信息,通过此信息尝试与物联网网关建立直接的通信通道。而这时会出现两种情况,根据本文上一个章节关于 NAT 的相关介绍,如果不存在对称型 NAT 设备,那么客户端完全可以和物联网网关建立直接通信通道,客户端需要通过公网服务器接入物联网网关设备,由公网服务器提取对应物联网网关设备的 IP 地址信息发送给客户端,客户端向获取的 IP 地址发送通道请求(UDP 协议包) ,物理网网关设备同时接收公网服务器发送的客户端 IP 地

26、址信息,向客户端发送通道响应数据( UDP 协议包) 。客户端与物联网网关建立直接通信通道;但是若网络环境中存在对称型 NAT 设备,那么客户端与物联网网关无法建立直接通信,这时候客户端需要发送消息给物联网网关的话,客户端需要将消息发送给公网服务器,由公网服务器负责转发给物联网网关模块。客户端向公网服务器发送转发通道请求,公网服务器获取对应的物联网网关通道状态,当物联网网关状态为在线时,公网服务器向客户端发送转发通道响应,建立转发通道。在通信通道正常状态下,相互发送信息和接收应答信息,实现客户端与物联网网关设备之间的通信信道功能。3.2.2 物联网网关物联网网关在公网环境中与客户端也很类似,实

27、际上也可以将物联网网关看作是特殊的客户端,这样系统的功能就可以近似的看作是客户端之间的跨局域网通信,就正是 P2P 通信的模式。在公网环境中,物联网网关模块启动后,提取本机 IP 地址和端口号、设备 ID 等数据。会先公网服务器发出消息,公网服务器可以通过此类型的消息知道物联网网关是否在线。当有客户端接入时,维护客户端地址信息与通道信息,并向客户端发送通道响应数据。接收客户端与公网服务器发来的消息,能检测到客户端的接入与退出,当有数据需要发送到客户端时,根据当前接入的客户端信息进行消息发送。若有过多的客户端同时接入一个物联网网关的时候,物联网网关会对后来的客户端接入请求回应拒绝消息。3.2.3

28、 公网服务器10 基于 Netty 的高性能 NAT 穿透通信系统在公网网络环境下,公网服务器模块在整个系统中扮演着重要的角色。在这里公网服务器相当于 P2P 通信模式中的中介服务器。由于客户端与物联网网关模块都隐藏在了不同的局域网环境里,彼此之间的通信很困难,无法知道彼此的地址。而此时通过公网服务器的中介作用,而客户端和物联网网关模块均会与公网服务器进行通信来往,而公网服务器作为中介者,转告彼此的地址信息。这就帮助两者进行通道通信,客户端和物联网网关借助公网服务器首先尝试建立直接通信通道,客户端需要通过公网服务器来接入物联网网关设备,由公网服务器提取对应物联网网关设备的 IP 地址信息发送给

29、客户端,客户端向获取的 IP 地址发送通道请求(UDP 协议包) ,物理网网关设备同时接收公网服务器发送的客户端 IP地址信息,向客户端发送通道响应数据(UDP 协议包) 。如果直接通信通道建立失败,那么两者间的数据来往将需要借助公网服务器转发消息。则客户端向公网服务器发送转发通道请求,公网服务器获取对应的物联网网关通道状态,当物联网网关状态为在线时,公网服务器向客户端发送转发通道响应,建立转发通道。除此之外,公网服务器还需要检测物联网网关模块是否在线,时时更新物联网网关在线状态。对客户端的数据请求做出数据应答。第四章 总体设计 11第四章 总体设计在综合考虑了上一章节中所提出的各种网络情况下

30、的需求,这里提出了基于Netty 的高性能 NAT 穿透通信系统的总体结构。本文接下来将会分析公网服务器、物联网网关以及客户端之间通信过程和其中使用的关键技术与设计方法。本文在这里将总体了解系统的结构特点。针对不同的网络环境,系统中的三个功能模块(公网服务器、物联网网关与客户端)所处的网络位置的不同,依旧分为局域网环境与公网环境两种情况进行分析与设计。对于不同的网络环境状况,提出了针对性的设计方案。4.1 系统结构整个通信系统分为三个功能模块,就是本文之前提到的公网服务器、物联网网关与客户端三个模块。而这三个功能模块将会分别部署在不同的通信设备上,根据这些通信设备所处在网络环境中的位置,总体可

31、以分为局域网通信与公网通信两种模式。其总体架构分别如图 4.1 与图 4.2 所示。图 4.1 公网环境总体架构12 基于 Netty 的高性能 NAT 穿透通信系统图 4.2 局域网环境总体架构4.2 局域网环境在局域网网络环境中,本文将分别分析三个功能模块彼此之间的交互的流程关系,分别是公网服务器与客户端、公网服务器与物联网网关、物联网网关与客户端三个交互过程。那么首先是公网服务器与客户端之间的交互过程。图 4.3 局域网环境下客户端与公网服务器交互过程局域网环境下,客户端与公网服务器之间并没有太多的交互过程。客户端模块会在启动后立即向公网服务器发送心跳数据包,这个心跳数据包的作用有二。其

32、一是通过心跳方式告知公网服务器,该客户端模块启动并且连入网络中,以供公网服务器随时检测客户端在线状态与何时退出;而其二的作用是通过固定时间第四章 总体设计 13间隔的心跳数据包,能够维持客户端与公网服务器之间的通信通道畅通,防止由于长时间没有数据往来导致 NAT 设备屏蔽数据,截断通信通道。保持了客户端与公网服务器的长连接状态。交互过程如图 4.3 所示。图 4.4 局域网环境下物联网网关与公网服务器交互过程而接下来则是物联网网关于公网服务器之间的交互过程,对于处在局域网环境下的物联网网关,其与公网服务器的交互一样很简单,和客户端与公网服务器的交互过程颇为类似。物联网网关模块同样会在启动后立即

33、向公网服务器发送心跳数据包,这个心跳数据包的作用与客户端所发送的心跳数据包的作用相同,供公网服务器检测物联网网关的在线状态。当物联网网关模块启动时,公网服务器会检测到心跳,并且将数据库中对应的物联网网关状态更新为已上线。并且将其心跳数据包的源地址(即物联网网关的外网地址)也同样更新到数据库中,以备查询。而当物联网网关模块退出之后,公网服务器则会检测到心跳数据包的终止,并将数据库中对应的物联网网关状态更新为已下线。交互过程如图 4.4 所示。那么最后则是客户端与物联网网关模块之间的交互过程,在局域网中两者之间可直接进行数据往来,直接通过彼此的局域网内的内网地址发送消息。从而简洁地完成了交互过程。

34、4.3 公网环境公网环境下,本文依旧对系统中的三个功能模块之间的交互过程进行分析与设计,那么首先公网服务器与客户端之间的交互过程如图 4.5 所示。14 基于 Netty 的高性能 NAT 穿透通信系统图 4.5 公网环境下客户端与公网服务器交互过程在这个过程中,客户端模块在启动之后依旧会向公网服务器发送心跳数据包,该心跳数据包的作用与前文所介绍的功能一致,客户端通过心跳的方式告知公网服务器该客户端模块启动上线。公网服务器检测心跳数据包的信息,保持并且维护在线客户端的地址信息与通道信息。客户端与公网服务器能够进行有效的数据往来,发送消息以及消息应答。与局域网环境不同的是,公网环境里客户端不知道

35、物联网网关的网络地址,这时候客户端模块会向公网服务器发送查询物联网网关状态的消息。如果物联网网关不在线,公网服务器会回复一个不在线的消息给客户端模块。如果物联网网关在线,公网服务器则会回复物联网网关的地址信息给客户端模块。图 4.6 公网环境下物联网网关与公网服务器交互过程如图 4.6 是物联网网关与公网服务器之间的交互过程,此过程基本与局域网环境中的相一致。公网服务器检测到物联网网关的状态,并将信息更新到数据库第四章 总体设计 15中。彼此间同样可以进行消息的发送与应答。而当客户端模块向公网服务器查询了物联网网关状态之后,公网服务器会将获取到的客户端地址信息发送给物联网网关。而物联网网关模块

36、将对此地址信息进一步处理。图 4.7 公网环境下客户端与物联网网关交互过程最后是物联网网关与客户端的交互过程。如图 4.7 所示,在前两个过程的基础上,如果物联网网关与客户端模块当前状态为在线,那么物联网网关和客户端都已经通过公网服务器获取到了彼此的网络地址信息。接下来两者彼此都会向对方发送多次通道建立请求。如果能建立起直接的通道,客户端模块会向公网服务器发送存活数据包,其性质和心跳数据包作用相同。一是为了让物联网网关能够检测到当前接入的客户端的在线状态;二是为了满足客户端模块与物联网网关模块的长连接状态。那么两者之间就可以直接的进行消息往来。但是如果说两者之间没能建立起直接通信通道的话,则需

37、要借助两者各自与公网服务器的通信通道进行转发消息。4.3.1 直接通道设计就不同局域网的主机间通信而言,是无法进行直接通道通信的。那么针对这一问题,设计提出了直接通信通道的解决方案。参考的方法是 UDP 穿透方法。首先,本文将介绍一下什么是 UDP 穿透。UDP 穿透方法是指在 UDP 协议下的通信框架中,通过打洞的方法来实现对NAT 设备的穿透,从而实现跨局域网通信,建立直接通信通道。根据前文关于NAT 设备的介绍,可以了解到 NAT 设备从不同程度上限制了内网主机与外网主16 基于 Netty 的高性能 NAT 穿透通信系统机之间的自由通信。而对于圆锥型 NAT 设备而言,是可以实现 NA

38、T 穿透的。其原理归结为,一个外层网络中的主机需要将消息发送到内层网络的主机上的前提,必须是内层网络的主机早已经访问过该外层网络主机。图 4.8 直接通信通道建立过程那么在基于 Netty 的高性能 NAT 穿透通信系统中,根据这一原理设计出直接通信通道建立过程。由前文介绍的,当客户端与物联网网关两个模块都获取到彼此的网络地址信息后,两者同时向对方发送直接通信通道建立请求,并且都进行多次尝试。本身这种请求是无法发送到目的地址的,因为会被对方的局域网 NAT设备视为外层网络发来的消息而屏蔽掉。而由于双方都进行了多次请求尝试,虽然外层网络发送的消息无法穿透 NAT 设备到达局域网内部,但是局域网内

39、部同时也主动发送消息到外层网络的话,就满足了之前所说的原理,即当内网主机访问过外网主机后,外网主机的消息才能发送到内网主机上。这样彼此的 NAT 设备不再屏蔽消息往来,则可以建立起直接的通信通道。而这时候虽然建立起直接通信通道,但是需要解决另外一个问题如何维持通信通道。因为 NAT 设备对于长时间没有消息往来的外层网络主机仍然会屏蔽掉,对于 UDP 协议通信而言,这个时间的长短也不能确定,从几分钟到几小时不等。所以为了维持通信通道的畅通,客户端在建立起通道之后会不断的向物联网网关发送存活数据包,用以保证短时间内一直有消息往来,实现与物联网网关模块的长连接,维持了通信通道的畅通。整个直接通信通道

40、建立过程如图 4.8所示。第四章 总体设计 174.3.2 转发通道设计客户端与公网服务器模块不能建立直接通信通道的时候,就需要采用转发通道。对于转发通道的设计比较简单,客户端与物联网网关两者彼此发送消息的时候,将消息发送给公网服务器,由公网服务器从消息中解析出待转发的目的地址信息,并将其转发出去,将消息送达。18 基于 Netty 的高性能 NAT 穿透通信系统第五章 详细设计与实现 19第五章 详细设计与实现本部分内容将在总体分析与设计的基础之上,再度深入详细分析设计与实现,并将相关功能实现。对整个通道通信系统依旧分为公网服务器、物联网网关与客户端三个功能模块进行设计实现工作。5.1 公网

41、服务器公网服务器在整个通信通道系统中充当着一个中介者的功能。在局域网环境中,公网服务器所存在的意义并不是很大;然而在公网环境下的时候,公网服务器却起到了举足轻重的作用。5.1.1 局域网环境客户端和物联网网关在同一局域网中的时候,即处在局域网环境中。公网服务器的作用不大。当物联网网关模块启动并且连入网络的情况下,公网服务器会接收到来自物联网网关的心跳数据包,公网服务器会更新数据库,将物联网网关状态更新到数据库里,将在线状态更新为在线,将物联网网关的外网地址也更新到数据库中。当物联网网关模块退出的时候,物联网网关模块将停止向公网服务器发送心跳数据包,公网服务器会检测到物联网网关掉线。并且将数据库

42、更新,即将物联网网关的在线状态更新为下线。当客户端模块启动并且连入网络的情况下,公网服务器同样会接收到来自客户端的心跳数据包,检测到客户端上线。当客户端模块退出的时候,客户端模块将停止向公网服务器发送心跳数据包,公网服务器会检测到物联网网关掉线。5.1.2 公网环境客户端和物联网网关不在同一个局域网里,这时候两者之间的通信需要借助公网服务器来建立直接通信通道,或者借助公网服务器进行转发通信。当两者所处的局域网环境中,有一方的路由设备所采用的 NAT 类型为对称型 NAT 的话,根据前文的介绍,这种类型的 NAT 的限制作用最为严苛。无法通过 UDP 打洞的方式来建立直接通信通道,故需要公网服务

43、器进行转发。客户端20 基于 Netty 的高性能 NAT 穿透通信系统和物联网网关模块都可以通过发送转发类型的数据到公网服务器上,而公网服务器模块会识别发来的消息类型,检测出是转发数据,并且从中解析出来待转发的目的地址,将消息转发到目的地。而当客户端和物联网网关模块能够建立直接的通信通道的时候,公网服务器模块起到了中介作用,首先客户端模块向公网服务器模块查询需要访问的物联网网关的在线状态,公网服务器模块接收到请求之后,获取待查询的物联网网关设备的设备 ID,通过设备 ID 到数据库查询物联网网关设备的在线状态。若物联网网关状态为不在线,公网服务器发送消息告知客户端;若物联网网关状态为在线。则

44、公网服务器将获取到的物联网网关的外网地址发送给客户端模块。同时,公网服务器模块也将获取到的客户端外网地址,并将其地址发送给物联网网关模块。这样客户端和物联网网关模块就都知道了彼此的外网地址。公网服务器的任务就完成了。5.1.3 类的设计主类设计为 PublicServer,在这里封装了各种方法,以满足对公网服务器的功能的需求。而通过主类来创建其它功能类。各个类的相互关系如图 5.1 所示。图 5.1 公网服务器模块类图首先介绍主类 PublicServer,如图 5.2 所示。它的内部需要提供多种供用户使用的函数方法,下图是对于该类的详细类图。PublicServer 类中包含三个内部类。这三

45、个内部类的作用各不相同,而之所以将其设计为内部类是为了方便在运行时读取 PublicServer 中的成员属性。这些成员属性的值通常会在运行过程发生变化。第五章 详细设计与实现 21比如说,timeAfter 这一成员属性,在公网服务器模块中负责存储当前时间,公网服务器模块通过这一属性定时记录当前时间,计算在线客户端或物联网网关模块最近一次心跳数据包与当前时间的间隔,来检测状态为在线还是已退出。而这些检测过程都是在内部类里完成的。图 5.2 公网服务器模块主类类图PublicServer 类里面的三个内部类当中,PublicServerHandler 类则是一个输入输出事件的处理类。实际上这种

46、设计方式是 Netty 通信框架中所采用的,是基于Netty 通信框架的。而在本系统中,将只针对输入事件进行相应处理操作。每当有输入事件发生时,通过 Netty 的事件处理机制,直接调用 PublicServerHandler类中消息接收方法。在该方法中,将各种消息类型进行识别与分析,从而在通道创建过程中进行不同的响应。另外一个内部类 CheckClientHeartBeat 类,这个类的作用是要检测客户端发来的心跳数据包。对于不同的客户端,同时进行分别检测。当客户端模块启动的时候,该内部类开始执行并检测客户端在线状态。通过刚刚举的 timeAfter 的例子,以这样的方式来固定间隔时间的去判

47、断客户端是否已经退出。当有多个客户端模块同时启动的时候,公网服务器会创建多个 CheckClientHeartBeat 类的实例,一对一的检测每一个客户端的状态。而最后一个内部类,CheckGatewayHeartBeat 类的功能和CheckClientHeartBeat 类相类似,不同的是该内部类检测的是物联网网关所发送来的心跳数据包。其检测方法和过程也和上一段介绍的 CheckClientHeartBeat 类相一致,本文在这里不再重复介绍。22 基于 Netty 的高性能 NAT 穿透通信系统5.1.4 方法接口对于公网服务器所需求的各种功能,将其以方法接口的方式提供出来,供用户使用以

48、及在此基础上二次开发。为了方便使用与简便开发,将公网服务器的一系列方法都封装在主类 PublicServer 中。主要方法如下表 5.1 所示。表 5.1 公网服务器模块接口接口函数序号函数名称 函数说明1 构造函数 PublicServer 初始化 PublicServer 类2 runInLocal 启动公网服务器,监听端口3 sendMessage 发送消息到指定 IP 和端口的设备公网服务器对外提供的方法接口并不是很多,事实上大部分功能都不对外提供,即大部分方法接口都是在客户端或者物联网网关构建通信通道的过程中,公网服务器内部调用执行,并不对外提供过多的方法接口。对外只提供表格中的三个

49、方法。其中第一个方法是公网服务器模块的主类 PublicServer 的构造函数,为多个成员属性提供初始化,创建内部事件处理类,用来监听消息输入事件。而下一个方法接口 runInLocal 则是启动公网服务器模块函数,该方法的主要作用是启动公网服务器模块的线程池,多线程处理通信消息,绑定服务器物理机端口,该端口通过参数传递给 runInLocal 方法接口,监听端口的连接请求。该方法启动成功返回布尔值为真,否则为假。表格中的最后一个方法接口为 sendMessage,该方法的作用是发送消息到指定 IP 和端口的设备。待发送的数据与待发送的目的地址通过参数传递到方法接口中,通过该方法可实现消息的发送。5.2 物联网网关物联网网关在整个系统中实际上是一些固定的特殊的客户端,物联网网关通常处在局域网 NAT 设备后面。公网环境下无法与之进行通信活动。对此前文总体设计中已经提出了解决方案与设计方法。本节将会对物联网网关的各种功能提第五章 详细设计与实现 23出更加详细的设计方案。仍旧考虑两种网络情况,首先提出局域网环境下的解决办法。5.2.1 局域网环境在局域网中,物联网网关模块启动后会向公网服务器发送心跳数据包。对局域网内的客户端访问不做任何限制,对局域网内的客户端不再维护通道信息。客户端仅需知道物联网网关的局域网 IP 和端口号就

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 学术论文 > 毕业论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报