基于JSP计算网络时延的实现

2022-04-02 03:18费东阳,王艳丽,王蒙恩,张书宁,孙智慧,张学良
电脑知识与技术 2022年33期

费东阳,王艳丽,王蒙恩,张书宁,孙智慧,张学良

摘要:为了计算源主机到目的主机的端到端的时延,该文设计了一种基于JSP的计算网络时延程序。首先通过使用MINA框架的IoHandler接口进行服务端和客户端的搭建;然后使用IoService接口来封装数据;用SSM框架中的Mybatis用来持久层与数据库的交互;日志的记录采用了基于Java的Apache Log4j组件;最后利用SSL的密码处理技术保证了TCP连接中的网络安全通信。测试结果表明,本程序计算的端到端的时延是准确的,符合实际的。

关键词:JSP;网络时延;TCP;SSL

中图分类号:TP311      文献标识码:A

文章编号:1009-3044(2022)33-0071-03

1 引言

随着计算机网络的迅速发展,许多因特网应用,如搜索、Web浏览、电子邮件、地图、及时信息和IP语音,它们的性能受网络时延的影响很大。很多时候我们在微信聊天,打游戏或看视频会遇到卡顿情况,网络时延便是导致卡顿的一个非常重要的因素。而很多同步应用对网络时延的要求是非常高的,网络时延不稳定可能会导致丢包从而使其不能使用。而且不同的服务类型在相同的延时下,给人的主观感受也是不一样的。例如,当视频加载时,10s的初始化时延是能忍受的,但当我们即时通信时,5s的时延就会很糟糕。这时候就需要一个专門的程序来帮我们测试在不同情况下我们请求服务的时延[1]。

延迟时间长的设备都将使网络速度慢下来,无论其利用率是多少。我们可能会认为高速以太网的毫秒级延迟不会对应用造成影响。其实不然,在高速以太网中,即使几毫秒的时延也会极大地降低TCP性能。而80%以上的Internet通信使用的是TCP,延时便成了一个我们不得不考虑的问题。通过研究时延,可以让我们的系统更加流畅,让用户拥有更好的体验,让系统的研究维护成本大大降低。尤其对一些需要实时更新、实时通信的应用来说,研究时延就变得非常重要。因此,计算网络时延程序的实现有着重要的意义。

2 技术要求

2.1 主要技术

本项目是基于JSP实现的Java小程序。前端是一个VUE框架实现的可视化图形界面。后端则以MINA,SSM两大框架为主体,Apache Log4j组件和JSEE技术为辅助,实现计算网络时延的功能。

网络编程抽象地来说,就是信息的交互。在发送端按照协议对信息进行封装,通过物理媒介传输到接收端。在接收端同样按照协议对消息进行解析,提取出信息,实现信息的交互。网络上的两个程序通过一个双向的通信连接实现数据的交换。这个连接的端点由IP地址和端口号共同组成,叫作Socket。因此,网络编程也叫作Socket编程。本程序主要使用的是Socket的TCP连接。Socket可以看作是应用层与TCP/IP协议族通信的中间软件抽象层,它就是一组接口[2]。

MINA框架是一个网络通信应用框架,可以快速地开发性能优良,扩展性高的网络通信应用。其核心是IoSession接口,服务端和客户端交互的信息便封装在其中。在客户端与服务端可以通过继承MINA框架中的IoHandlerAdapter类来获取IoSession接口中的信息。在服务端也可以用来表示客户端,在服务端通过IoSession接口对客户端进行操作。MINA框架也可以远程搭建服务器并远程控制服务器。服务端和客户端的端口号和IP地址,可以自动指定也可以用户定义。

SSM就是三个框架的集合。其中Spring包括SpringMVC。是整个项目中用来与数据库动态交互的框架。通过使用SSM可以极大地简化连接数据库的过程与代码,使开发更加高效便捷。其核心思想是控制反转。

Spring是一个开源的框架,更准确地说它就是一个容器。容器中的每一个Bean都是一个抽象的方法。Spring通过建立Bean工厂来管理这些Bean。虽然Spring有很多的Bean,但是它是模块化的,它的Bean是单独的,只需利用有用的即可。

和Spring一样,MyBatis也是一个开源的框架。文档与代码的结合使用是其最鲜明的特点。MyBatis的核心是XML文件的配置。通过XML配置或者注解的使用,我们几乎不需要JDBC代码。它实现了SQL语句与代码的分离,降低了代码的耦合性,使程序便于维护与测试。SSM动态连接数据库的方便与快捷便体现在MyBatis上。

Apache Log4j是当前在J2EE和J2SE开发中用的最多的日志框架,它具有出色的性能和灵活的配置以及丰富的功能,并且可以使用自定义组件来代替框架中组件来满足要求。如果说MyBatis是文档与代码的结合。那Apache Log4j完完全全就是文档编程。通过Apache Log4j框架,在编写配置文件时就可以与数据库进行交互,不需要再另写代码。

JSEE技术实现了SSL协议和TSL协议。在网络编程中,一个非常重要的问题就是数据传输的安全性。本项目使用的SSL证书数据安全加密的方式遵守SSL协议,是数字证书的一种,类似于日常生活中的数字签名。

使用SSL加密,要向数字证书颁发机构申请。申请通过后会有一份具有数据传输加密和服务器身份验证功能的SSL证书。通过SSL证书我们可以对信息进行加密解密。同样SSL也会保证信息的完整性和一致性,防止信息被篡改。

SSL协议位于应用层协议和传输层协议之间,主要是用来对TCP通道进行加密。而SSL协议又可以分为两层:SSL记录协议和SSL握手协议。记录协议主要是对数据进行封装、压缩、加密。握手协议顾名思义就是服务端和客户端进行握手,进行一些信息交互前的操作,例如身份验证、交换密钥等。

Vue框架是一个只关注视图层的前端框架,它具有灵活的组件和高效的数据绑定,同时它封装了大量前端页面常用的功能。前端的代码往往是繁杂的,冗余的,Vue框架通过代码复用,功能封装,极大地减少了代码量。

2.2 主要实现过程

通过MINA框架在目标服务器上再搭建一个服务端,然后运行在本地的客户端通过socket与搭建的服务器端进行TCP连接[3]。客户端通过服务端远程控制目标服务器执行ping命令,并将获得的数据储存在LOG日志中,然后再通过MINA的IoSession返回数据给客户端。客户端通过SSM框架来与数据库进行交互,并对数据进行相应的处理之后生成URL地址。前台页面通过axios访问URL地址获得数据。JSSE通过生成clientkeystore和serverkeystore加密证书来保证数据的安全性。图1为实现过程图。

3 系统功能设计

3.1 服务端与客户端的搭建

首先,建立两个处理器类PingServerIoHandler和PingClientIoHandler继承MINA框架的IoHandlerAdapter类来分别作为服务端和客户端的处理器。在服务端处理器中通过System的getProperty方法获得操作系统的OsName,通过OsName选择合适的命令。远程调用目标服务器的cmd执行ping命令,通过MessageFormat来格式化命令字符串。客户端连接服务端,通过服务端的Runtime来远程控制目标服务器执行命令获得数据,并将获得的数据一行行写入IoSession中,IoSession是客户端和服务端的特定连接,以键值对的形式保存数据。

与PingServerIoHandler相对的是PingServer服务端。在服务端创建一个非阻塞的Socket,通过NioSocketAcceptor来实现。消息的传送会经过一系列的过滤器。自定义过滤器使数据、操作和状态存储在日志中。然后使用MINA框架提供的文本换行符编解码器来转化文本为UTF-8类型。最后为接收器设置管理服务并绑定端口。这一系列过程通过Acceptor来实现。

同样与PingClientIoHandler相对的是PingController客户端,也是SSM的控制器。类似地,客户端也需要创建一个非阻塞的Socket,并绑定一个与服务端相同的端口。不同的是需要给客户端一个固定IP地址,而服务端的IP地址则作为数据输入。因为我们的服务端是在目标服务器上搭建的服务器,所以服务端的IP地址和目标服务器的IP地址不一样,这从某种程度上保证了一定的安全性。这个数据的输入是在客户端完成的,输入数据也会写入IoSession中。同样的客户端也能从IoSession中獲得服务端写入的数据。数据也会经过一系列的过滤器。同时客户端需要一个计时机制来提前结束获取数据超时的连接。

3.2 数据的安全传输

远程连接服务器和网络中数据的传输是本程序的核心。通过事件驱动,异步操作的编程模型使程序高性能,高扩展性地远程控制服务器;利用控制反转来降低代码之间的耦合性;设置一系列的拦截器,过滤器,控制器来与数据库进行交互;I/O流来进行数据的读写;Socket去组织数据,以符合指定的协议。

在客户端和服务器之间通过TCP/IP协议传输数据时,数据并不是安全的。为了保证数据传输的安全性,我们采用了JSSE技术[4]。在这里我们使用了JAVA自带的keytool命令去生成证书文件。在编写SSL相关类时通过调用getInstance工厂方法创建SSLContext对象。在客户端和服务端还需要分别添加Ssl Filter安全加密过滤器。需要注意的是要确保注入SslFilter到过滤器链中的第一位置。目的负责管理数据的加密和解密通过安全连接。图2是SSL相关文件目录:

3.3 数据的存储与日志的处理

在存储数据时则采用了SSM框架。SSM框架的核心是web.xml文件,用来初始化Spring核心,配置拦截器,配置过滤器。Jdbc.properties配置连接数据库的各种信息。applucationContext.xml加载jdbc.properties,连接数据库,扫描包下面的注解,配置映射对象,配置声明式事务管理器,视图解析,json转换器等功能。自定义Apache Log4j组件对日志进行格式化处理与输出,同时还需要在前台设置过滤器来对输出的日志数据进行过滤。Apache Log4j框架的核心的log4j.properties,其通过使用Log4j的三个主要组件:Logger,Appender和Layout来分别完成客户端代码调用,日志的输出以及日志信息格式化[5]。

3.4 实验数据

本程序获得的数据:

4 结束语

本程序的主要功能就是为了测试网络中存在的时延。虽然随着技术的更新换代,时延越来越小,不再像以前一样不能忍受,但是时延是不可避免的,无论是打游戏时的卡顿还是看视频时的加载,都会影响我们的主观感受和应用的性能。在理想情况下,希望时延能在现有的技术下达到最小,改善用户的体验,提高应用的性能。本程序通过一系列的框架和算法实现初步达到了测试时延的目的。通过运行本程序可以获得一系列相关的时延数据。通过分析实验数据,得到一般性结论,再反复实验进行验证,对改善网络时延,提高应用性能具有重要意义。

参考文献:

[1] James F.Kurous,Keith W.Ross.Computer Networking A Top-Down Approach[M].陈鸣,译.7版. 北京:机械工业出版社,2018.

[2] 苏鹏飞,徐松毅,于晓磊.基于WOA-LSTM的窄带通信网网络时延预测算法[J].河北工业科技,2022,39(1):9-15.

[3] 张民忠.Apache Mina中TCP服务器集群功能扩展研究[D].武汉:武汉理工大学,2018.

[4] 周明华,杨海云,吴鑫哲,等.国密算法JSSE密码套件的设计与实现[J].网络安全技术与应用,2019(7):34-36.

[5] 夏文忠.Log4J在学生管理系统中的开发与应用[J].电脑编程技巧与维护,2009(10):34-36.

【通联编辑:梁书】