費東陽,王艷麗,王蒙恩,張書寧,孫智慧,張學(xué)良
摘要:為了計算源主機(jī)到目的主機(jī)的端到端的時延,該文設(shè)計了一種基于JSP的計算網(wǎng)絡(luò)時延程序。首先通過使用MINA框架的IoHandler接口進(jìn)行服務(wù)端和客戶端的搭建;然后使用IoService接口來封裝數(shù)據(jù);用SSM框架中的Mybatis用來持久層與數(shù)據(jù)庫的交互;日志的記錄采用了基于Java的Apache Log4j組件;最后利用SSL的密碼處理技術(shù)保證了TCP連接中的網(wǎng)絡(luò)安全通信。測試結(jié)果表明,本程序計算的端到端的時延是準(zhǔn)確的,符合實際的。
關(guān)鍵詞:JSP;網(wǎng)絡(luò)時延;TCP;SSL
中圖分類號:TP311? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2022)33-0071-03
1 引言
隨著計算機(jī)網(wǎng)絡(luò)的迅速發(fā)展,許多因特網(wǎng)應(yīng)用,如搜索、Web瀏覽、電子郵件、地圖、及時信息和IP語音,它們的性能受網(wǎng)絡(luò)時延的影響很大。很多時候我們在微信聊天,打游戲或看視頻會遇到卡頓情況,網(wǎng)絡(luò)時延便是導(dǎo)致卡頓的一個非常重要的因素。而很多同步應(yīng)用對網(wǎng)絡(luò)時延的要求是非常高的,網(wǎng)絡(luò)時延不穩(wěn)定可能會導(dǎo)致丟包從而使其不能使用。而且不同的服務(wù)類型在相同的延時下,給人的主觀感受也是不一樣的。例如,當(dāng)視頻加載時,10s的初始化時延是能忍受的,但當(dāng)我們即時通信時,5s的時延就會很糟糕。這時候就需要一個專門的程序來幫我們測試在不同情況下我們請求服務(wù)的時延[1]。
延遲時間長的設(shè)備都將使網(wǎng)絡(luò)速度慢下來,無論其利用率是多少。我們可能會認(rèn)為高速以太網(wǎng)的毫秒級延遲不會對應(yīng)用造成影響。其實不然,在高速以太網(wǎng)中,即使幾毫秒的時延也會極大地降低TCP性能。而80%以上的Internet通信使用的是TCP,延時便成了一個我們不得不考慮的問題。通過研究時延,可以讓我們的系統(tǒng)更加流暢,讓用戶擁有更好的體驗,讓系統(tǒng)的研究維護(hù)成本大大降低。尤其對一些需要實時更新、實時通信的應(yīng)用來說,研究時延就變得非常重要。因此,計算網(wǎng)絡(luò)時延程序的實現(xiàn)有著重要的意義。
2 技術(shù)要求
2.1 主要技術(shù)
本項目是基于JSP實現(xiàn)的Java小程序。前端是一個VUE框架實現(xiàn)的可視化圖形界面。后端則以MINA,SSM兩大框架為主體,Apache Log4j組件和JSEE技術(shù)為輔助,實現(xiàn)計算網(wǎng)絡(luò)時延的功能。
網(wǎng)絡(luò)編程抽象地來說,就是信息的交互。在發(fā)送端按照協(xié)議對信息進(jìn)行封裝,通過物理媒介傳輸?shù)浇邮斩?。在接收端同樣按照協(xié)議對消息進(jìn)行解析,提取出信息,實現(xiàn)信息的交互。網(wǎng)絡(luò)上的兩個程序通過一個雙向的通信連接實現(xiàn)數(shù)據(jù)的交換。這個連接的端點由IP地址和端口號共同組成,叫作Socket。因此,網(wǎng)絡(luò)編程也叫作Socket編程。本程序主要使用的是Socket的TCP連接。Socket可以看作是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它就是一組接口[2]。
MINA框架是一個網(wǎng)絡(luò)通信應(yīng)用框架,可以快速地開發(fā)性能優(yōu)良,擴(kuò)展性高的網(wǎng)絡(luò)通信應(yīng)用。其核心是IoSession接口,服務(wù)端和客戶端交互的信息便封裝在其中。在客戶端與服務(wù)端可以通過繼承MINA框架中的IoHandlerAdapter類來獲取IoSession接口中的信息。在服務(wù)端也可以用來表示客戶端,在服務(wù)端通過IoSession接口對客戶端進(jìn)行操作。MINA框架也可以遠(yuǎn)程搭建服務(wù)器并遠(yuǎn)程控制服務(wù)器。服務(wù)端和客戶端的端口號和IP地址,可以自動指定也可以用戶定義。
SSM就是三個框架的集合。其中Spring包括SpringMVC。是整個項目中用來與數(shù)據(jù)庫動態(tài)交互的框架。通過使用SSM可以極大地簡化連接數(shù)據(jù)庫的過程與代碼,使開發(fā)更加高效便捷。其核心思想是控制反轉(zhuǎn)。
Spring是一個開源的框架,更準(zhǔn)確地說它就是一個容器。容器中的每一個Bean都是一個抽象的方法。Spring通過建立Bean工廠來管理這些Bean。雖然Spring有很多的Bean,但是它是模塊化的,它的Bean是單獨的,只需利用有用的即可。
和Spring一樣,MyBatis也是一個開源的框架。文檔與代碼的結(jié)合使用是其最鮮明的特點。MyBatis的核心是XML文件的配置。通過XML配置或者注解的使用,我們幾乎不需要JDBC代碼。它實現(xiàn)了SQL語句與代碼的分離,降低了代碼的耦合性,使程序便于維護(hù)與測試。SSM動態(tài)連接數(shù)據(jù)庫的方便與快捷便體現(xiàn)在MyBatis上。
Apache Log4j是當(dāng)前在J2EE和J2SE開發(fā)中用的最多的日志框架,它具有出色的性能和靈活的配置以及豐富的功能,并且可以使用自定義組件來代替框架中組件來滿足要求。如果說MyBatis是文檔與代碼的結(jié)合。那Apache Log4j完完全全就是文檔編程。通過Apache Log4j框架,在編寫配置文件時就可以與數(shù)據(jù)庫進(jìn)行交互,不需要再另寫代碼。
JSEE技術(shù)實現(xiàn)了SSL協(xié)議和TSL協(xié)議。在網(wǎng)絡(luò)編程中,一個非常重要的問題就是數(shù)據(jù)傳輸?shù)陌踩?。本項目使用的SSL證書數(shù)據(jù)安全加密的方式遵守SSL協(xié)議,是數(shù)字證書的一種,類似于日常生活中的數(shù)字簽名。
使用SSL加密,要向數(shù)字證書頒發(fā)機(jī)構(gòu)申請。申請通過后會有一份具有數(shù)據(jù)傳輸加密和服務(wù)器身份驗證功能的SSL證書。通過SSL證書我們可以對信息進(jìn)行加密解密。同樣SSL也會保證信息的完整性和一致性,防止信息被篡改。
SSL協(xié)議位于應(yīng)用層協(xié)議和傳輸層協(xié)議之間,主要是用來對TCP通道進(jìn)行加密。而SSL協(xié)議又可以分為兩層:SSL記錄協(xié)議和SSL握手協(xié)議。記錄協(xié)議主要是對數(shù)據(jù)進(jìn)行封裝、壓縮、加密。握手協(xié)議顧名思義就是服務(wù)端和客戶端進(jìn)行握手,進(jìn)行一些信息交互前的操作,例如身份驗證、交換密鑰等。
Vue框架是一個只關(guān)注視圖層的前端框架,它具有靈活的組件和高效的數(shù)據(jù)綁定,同時它封裝了大量前端頁面常用的功能。前端的代碼往往是繁雜的,冗余的,Vue框架通過代碼復(fù)用,功能封裝,極大地減少了代碼量。
2.2 主要實現(xiàn)過程
通過MINA框架在目標(biāo)服務(wù)器上再搭建一個服務(wù)端,然后運行在本地的客戶端通過socket與搭建的服務(wù)器端進(jìn)行TCP連接[3]??蛻舳送ㄟ^服務(wù)端遠(yuǎn)程控制目標(biāo)服務(wù)器執(zhí)行ping命令,并將獲得的數(shù)據(jù)儲存在LOG日志中,然后再通過MINA的IoSession返回數(shù)據(jù)給客戶端??蛻舳送ㄟ^SSM框架來與數(shù)據(jù)庫進(jìn)行交互,并對數(shù)據(jù)進(jìn)行相應(yīng)的處理之后生成URL地址。前臺頁面通過axios訪問URL地址獲得數(shù)據(jù)。JSSE通過生成clientkeystore和serverkeystore加密證書來保證數(shù)據(jù)的安全性。圖1為實現(xiàn)過程圖。
3 系統(tǒng)功能設(shè)計
3.1 服務(wù)端與客戶端的搭建
首先,建立兩個處理器類PingServerIoHandler和PingClientIoHandler繼承MINA框架的IoHandlerAdapter類來分別作為服務(wù)端和客戶端的處理器。在服務(wù)端處理器中通過System的getProperty方法獲得操作系統(tǒng)的OsName,通過OsName選擇合適的命令。遠(yuǎn)程調(diào)用目標(biāo)服務(wù)器的cmd執(zhí)行ping命令,通過MessageFormat來格式化命令字符串??蛻舳诉B接服務(wù)端,通過服務(wù)端的Runtime來遠(yuǎn)程控制目標(biāo)服務(wù)器執(zhí)行命令獲得數(shù)據(jù),并將獲得的數(shù)據(jù)一行行寫入IoSession中,IoSession是客戶端和服務(wù)端的特定連接,以鍵值對的形式保存數(shù)據(jù)。
與PingServerIoHandler相對的是PingServer服務(wù)端。在服務(wù)端創(chuàng)建一個非阻塞的Socket,通過NioSocketAcceptor來實現(xiàn)。消息的傳送會經(jīng)過一系列的過濾器。自定義過濾器使數(shù)據(jù)、操作和狀態(tài)存儲在日志中。然后使用MINA框架提供的文本換行符編解碼器來轉(zhuǎn)化文本為UTF-8類型。最后為接收器設(shè)置管理服務(wù)并綁定端口。這一系列過程通過Acceptor來實現(xiàn)。
同樣與PingClientIoHandler相對的是PingController客戶端,也是SSM的控制器。類似地,客戶端也需要創(chuàng)建一個非阻塞的Socket,并綁定一個與服務(wù)端相同的端口。不同的是需要給客戶端一個固定IP地址,而服務(wù)端的IP地址則作為數(shù)據(jù)輸入。因為我們的服務(wù)端是在目標(biāo)服務(wù)器上搭建的服務(wù)器,所以服務(wù)端的IP地址和目標(biāo)服務(wù)器的IP地址不一樣,這從某種程度上保證了一定的安全性。這個數(shù)據(jù)的輸入是在客戶端完成的,輸入數(shù)據(jù)也會寫入IoSession中。同樣的客戶端也能從IoSession中獲得服務(wù)端寫入的數(shù)據(jù)。數(shù)據(jù)也會經(jīng)過一系列的過濾器。同時客戶端需要一個計時機(jī)制來提前結(jié)束獲取數(shù)據(jù)超時的連接。
3.2 數(shù)據(jù)的安全傳輸
遠(yuǎn)程連接服務(wù)器和網(wǎng)絡(luò)中數(shù)據(jù)的傳輸是本程序的核心。通過事件驅(qū)動,異步操作的編程模型使程序高性能,高擴(kuò)展性地遠(yuǎn)程控制服務(wù)器;利用控制反轉(zhuǎn)來降低代碼之間的耦合性;設(shè)置一系列的攔截器,過濾器,控制器來與數(shù)據(jù)庫進(jìn)行交互;I/O流來進(jìn)行數(shù)據(jù)的讀寫;Socket去組織數(shù)據(jù),以符合指定的協(xié)議。
在客戶端和服務(wù)器之間通過TCP/IP協(xié)議傳輸數(shù)據(jù)時,數(shù)據(jù)并不是安全的。為了保證數(shù)據(jù)傳輸?shù)陌踩?,我們采用了JSSE技術(shù)[4]。在這里我們使用了JAVA自帶的keytool命令去生成證書文件。在編寫SSL相關(guān)類時通過調(diào)用getInstance工廠方法創(chuàng)建SSLContext對象。在客戶端和服務(wù)端還需要分別添加Ssl Filter安全加密過濾器。需要注意的是要確保注入SslFilter到過濾器鏈中的第一位置。目的負(fù)責(zé)管理數(shù)據(jù)的加密和解密通過安全連接。圖2是SSL相關(guān)文件目錄:
3.3 數(shù)據(jù)的存儲與日志的處理
在存儲數(shù)據(jù)時則采用了SSM框架。SSM框架的核心是web.xml文件,用來初始化Spring核心,配置攔截器,配置過濾器。Jdbc.properties配置連接數(shù)據(jù)庫的各種信息。applucationContext.xml加載jdbc.properties,連接數(shù)據(jù)庫,掃描包下面的注解,配置映射對象,配置聲明式事務(wù)管理器,視圖解析,json轉(zhuǎn)換器等功能。自定義Apache Log4j組件對日志進(jìn)行格式化處理與輸出,同時還需要在前臺設(shè)置過濾器來對輸出的日志數(shù)據(jù)進(jìn)行過濾。Apache Log4j框架的核心的log4j.properties,其通過使用Log4j的三個主要組件:Logger,Appender和Layout來分別完成客戶端代碼調(diào)用,日志的輸出以及日志信息格式化[5]。
3.4 實驗數(shù)據(jù)
本程序獲得的數(shù)據(jù):
4 結(jié)束語
本程序的主要功能就是為了測試網(wǎng)絡(luò)中存在的時延。雖然隨著技術(shù)的更新?lián)Q代,時延越來越小,不再像以前一樣不能忍受,但是時延是不可避免的,無論是打游戲時的卡頓還是看視頻時的加載,都會影響我們的主觀感受和應(yīng)用的性能。在理想情況下,希望時延能在現(xiàn)有的技術(shù)下達(dá)到最小,改善用戶的體驗,提高應(yīng)用的性能。本程序通過一系列的框架和算法實現(xiàn)初步達(dá)到了測試時延的目的。通過運行本程序可以獲得一系列相關(guān)的時延數(shù)據(jù)。通過分析實驗數(shù)據(jù),得到一般性結(jié)論,再反復(fù)實驗進(jìn)行驗證,對改善網(wǎng)絡(luò)時延,提高應(yīng)用性能具有重要意義。
參考文獻(xiàn):
[1] James F.Kurous,Keith W.Ross.Computer Networking A Top-Down Approach[M].陳鳴,譯.7版. 北京:機(jī)械工業(yè)出版社,2018.
[2] 蘇鵬飛,徐松毅,于曉磊.基于WOA-LSTM的窄帶通信網(wǎng)網(wǎng)絡(luò)時延預(yù)測算法[J].河北工業(yè)科技,2022,39(1):9-15.
[3] 張民忠.Apache Mina中TCP服務(wù)器集群功能擴(kuò)展研究[D].武漢:武漢理工大學(xué),2018.
[4] 周明華,楊海云,吳鑫哲,等.國密算法JSSE密碼套件的設(shè)計與實現(xiàn)[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2019(7):34-36.
[5] 夏文忠.Log4J在學(xué)生管理系統(tǒng)中的開發(fā)與應(yīng)用[J].電腦編程技巧與維護(hù),2009(10):34-36.
【通聯(lián)編輯:梁書】