1、基于Socket的网络数据多机协作采集研究 指导老师:谭敏生 答辩人:吴海彬 (20034440330),南华大学计算机科学与技术学院,目 录,一、研究背景 二、Java简介2.1 Java Socket编程2.2 Java多线程技术2.3 Jpcap介绍 三、多机协作系统的设计与实现3.1 多机协作系统理论模型3.2 多机协作系统实现3.3 多机协作系统的核心代码,四、数据采集系统的设计与实现4.1 数据采集系统的基本原理4.2 数据采集系统的实现4.3 数据采集系统的核心代码 五、系统的使用方法及运行结果5.1 系统的使用方法5.2 系统的运行结果 六、进一步工作,一、研究背景,随着Int
2、ernet的普及,全球性信息化浪潮在给我们带来便利的同时,网络信息安全问题也日益彰显。因此,一些企业、机关、科研机构为了防止数据的泄密,常常需要利用网络数据包的截获与还原技术来监视从本单位传出的数据。然而,在一个大型局域网中,对大量的网络数据进行采集和监控可能需要通过多机协作技术来实现。本文首先对TCP/IP协议进行了阐述,并分析了多机协作和数据包采集技术,然后以Java为工具,实现了基于Socket的网络数据多机协作采集的有关技术和核心算法。,2.1 Java Socket编程,流式Socket所完成的通信是一种基于连接的通信,即在通信开始之前先由通信双方确认身份并建立一条专用的虚拟连接通道
3、,然后它们通过这条通道传送数据信息进行通信,当通信结束时再将原先所建立的连接拆除。这个过程可以用右图表示。图中Server端首先在某端口提供一个监听Client请求的监听服务并处于监听状态,当Client端向该Server的这个端口提取服务请求时,Server端和Client端就建立了一个连接和一条传输数据的通道。当通信结束时,这个连接通道将同时被拆除。,二、Java简介,Socket是TCP/IP协议的编程接口,即利用Socket提供的一组API就可以编程实现TCP/IP协议,在Java语言里,这个编程接口就是若干系统预先定义好类。,InetAddress类InetAddress类主要用来区
4、分计算机网络中的不同节点,即不同的计算机并对其寻址。每个InetAddress对象中包含了IP地址、主机名等信息。Socket与ServerSocket类在上图中,提到了Socket类和ServerSocket类,它们是用Java实现流式Socket通信的主要工具。创建一个ServerSocket对象就创建了一个监听服务,创建一个Socket对象就建立了一个Client与Server间的连接。,1、 ServerSocket类下面的语句将创建一个ServerSocket类,同时在运行该语句的计算机的指定端口处建立一个监听服务:ServerSocket MyListener = new Serv
5、erSocket(8000);这里指定提供监听服务的端口号是8000。一台计算机可以同时提供多个服务,这些不同的服务之间通过端口号来区别,不同端口号可以提供不同的服务,Client连接到哪个端口,就可以接受那个端口提供的服务。为了随时监听可能的Client请求,还应该执行如下语句:Socket LinkSocket = new MyListener .accept( );这个语句调用了ServerSocket对象的accept( )方法,这个方法的执行将使Server端的程序处于等待状态,程序将一直阻塞直到捕捉到一个来自Client端的请求,并返回一个用于与该Client通信的Socket对象
6、。此后Server程序只要向这个Socket对象读写数据,就可以实现向远端Client读写数据。需要结束监听时,只需要用如下语句关闭ServerSocket对象:MyListener .close( );,2、 Socket类当Client程序需要从Server端获得信息及其他服务时,应该创建一个Socket对象:Socket MySocket = new Socket(“ServerName”,8000);Socket类的构造函数有两个参数,第一个参数是欲连接到的Server计算机的主机地址,第二个参数是该Server机上提供服务的端口号。Socket对象建立成功之后,就可以在Client和
7、Server之间建立一个连接,并通过这个连接在两个端点之间传递数据。OutputStream SocketOs = MySocket .getOutputStream( );InputStream SocketIs = MySocket .getInputStream( );SocketOs .write(SocketIs .read( ) );这里首先利用Socket类的两个方法getOutputStream( )和getInputStream( )分别获得向Socket读写数据的输入/输出流,最后一个语句将从Server端读取的数据重新返回到Server端。当Server端和Client端
8、的通信结束时,可以调用Socket类的close( )方法来关闭Socket,拆除连接。,2.2 Java多线程技术,线程是进程中某一个顺序控制流。所谓多线程即是单个程序中包含多个顺序控制流在“同时”运行。在单CPU系统中,多个线程共享一个CPU资源,任意时刻只能有一个线程运行,即从微观上看多线程实际上是以串行方式工作的;但每个线程在允许的情况下都在向前推进,在一段时间内似乎所有线程在同时运行,即从宏观上看多个线程并发执行。多线程通过将多进程的原理运用到程序中,实现了在“程序”这一更低层次中多个执行路径并发地、独立地进行一一即所谓的“异步执行”。因此可以大大提高应用程序的执行效率。 在大多数环
9、境中只有一个CPU,多线程在单CPU上按照一定顺序运行的过程称为调度。为方便调度,Java为每个线程设置优先级属性,并借助就绪队列和等待队列管理线程,借助多优先级队列实现“高优先级线程优于低优先级线程”的调度策略。Java对多线程的支持一般是通过编写自己的仿真式多线程包实现的。,Java中编程实现多线程应用有两种途径:一种是创建用户自己的线程子类,一种是在用户自己的类中实现Runnable接口。无论哪种方法,都需要使用到Java基础类库中的Thread类及其方法。(1) 创建Thread类的子类在这个途径中,用户程序需要创建自己的Thread类的子类,并在之类中重新定义自己的run( )方法,
10、这个run( )方法中包含了用户线程的操作。这样在用户程序需要建立自己的项城市,它只需要创建一个已定义好的Thread之类的实例就可以了。创建用户自定义的Thread子类的途径虽然简便易用,但是要求必须有一个以Thread为父类的用户之类。假设用户之类需要有另一个父类,例如Applet父类,则根据Java单重继承原则,上述途径就不可行了。这时就需要用到第二种方法。,(2) 实现Runnable接口在这个途径中,已经有了一个父类的用户类可以同过实现Runnable接口的方法来定义用户线程的操作。我们知道Runnable接口只有一个方法run( ),实现这个接口,就必须要定义run( )方法的具体
11、内容,用户新建线程操作也由这个方法来决定。定义好run( )方法自豪,当用户程序需要建立新线程时,只要以这个实现了run( )方法的类为参数创建系统类Thread的对象,就可以把用户实现run( )方法继承过来。,本系统是用java实现的,为了实现多任务,本系统充分灵活地运用了Windows的消息和线程机制。消息和线程机制是紧密相关的,线程之间可以通过消息通信,消息可以驱动线程执行某项操作。本文设计了以下线程: 1)Server端监听线程。该线程创建一个监听服务,并一直处于等待状态,一直到捕捉到一个来自Client端的请求,并创建一个与改线程通信的Socket对象。2)Server端通信线程。
12、该线程由Server端监听线程创建,负责处理与Client端的通信。3)Client端通信线程。该线程负责与Server端通信。4)计时器线程。该线程用于计时,当时间片完后结束采集线程并发送消息给通信线程。5)数据采集线程。该线程由于采集网络数据并以字符串的形式保存在文本文档中。,2.3 Jpcap介绍,如果需要通过Java程序捕获网络中的数据包,那么你需要一些辅助工具,因为核心Java API不能访问底层的网络数据。Jpcap 是一个Java类集合,它为网络数据包的捕获提供接口和系统。包括一个可视化网络事件的协议库和工具。是一种提供在Windows或UNIX系统上进行这种访问的Java AP
13、I。但是Jpcap不是一种纯粹的Java解决方案;它依赖本地库的使用。在Windows 或 UNIX上,必须有必要的第三方库,分别是WinPcap或libpcap。,3.1 多机协作系统的理论模型,对于本系统,采用了流式Socket的方式让计算机实现网络底层通信。系统中包括一个Server端和若干个Client端。由Server负责与每个Client端建立一个可靠的连接(TCP连接),并根据用户设定的多机协作方式发送相应的命令给Client端。Client端收到Server端的命令后,就可以开始自己的任务。任务完成后Client可以返回信息给Server,Server根据时间片事件驱动的工作方
14、式分配任务给对于的Client。Client收到命令后开始执行任务。时间片事件驱动就是以时间片轮转的方式来实现多机协作。假设时间片大小为T ,N台计算机参与协作,则每台计算机运行抓包程序T时刻,休息(N-1)*T时刻。具体步骤如下:,三、多机协作系统的设计与实现,(1) Server端首先开始运行抓包程序,T时刻后Server结束抓包程序并发送信息给Client A。(2) Client A收到Server的命令后,开始运行抓包程序,当Client A运行T时刻后,结束抓包并返回信息给Server。(3) 此时,Server查询是否还有参与多机协作的计算机,如果有,则发送命令给Client B
15、。如果没有参与多机协作的计算机,Server则重复步骤(1)-(2)。,这样,就实现了以时间片为事件驱动的多机协作。然而,这种方式存在的问题是当Client A完成抓包后,需要与Server通信。之后,Server又需要将命令发送给Client B。设Server 与Client通信的时间为t,程序从收到命令到执行命令的时间差很小,可以忽略不计。那么两次抓包的时间间隔为2t。当网络性能较差的时候,2t可能长达数秒,在这数秒钟的时间内是没有抓包程序在运行的。这样就会造成漏掉大量的数据包,因此需要改进这种方法。为了避免上述的问题出现,我们可以采取相应的措施。如: 在抓包的T时刻快要完成但还没有完成
16、时就与Server通信。这样可以避免丢包现象,但是可能会造成两台计算机之间采集的数据包中有小部分重复。 减少主机之间的通信次数。由于本系统就此采用这种方法,因此在下面重点阐述这种方法。,(1) 当Client A与Server连接时Server开始抓包并将T和N发送给Client A。(2) Client A等待T时刻后开始抓包,此时Server的时间片正好结束,抓包程序自动休眠(N-1)T时刻。(3) 当Client A的时间片结束后,抓包程序也自动休眠(N-1)T时刻,而不需要与Server通信。(4) 当Client B连接Server时,由于它不是第一个与Server连接的Client
17、,Server将发送T、N、Client B的序号C(因为Client B并不知道在它之前有几个Client已经与Server建立连接)以及上一个Client与Server建立连接与现在的时间差TE给Client B。(5) Client B收到T、N、M、C之后,首先等待(T*C-TE)%(T*C)时刻,然后开始抓包,此时Client A的时间片T正好结束,Server的抓包程序也处于休眠状态。(6) Client B的时间片T结束后,和Server、Client A一样,休眠(N-1)T时刻。(7) 当又有Client连接时,重复步骤(4)-(6)。,这样,多台计算机只需要与Server建
18、立一次连接就可以不断执行抓包任务。减少了丢包的可能。同时,每个计算机是使用各自的时钟来做时间片轮转的,因此每个Client端可以定时与Server同步时钟,做到每个Client端的时钟与Server相同。时间片事件驱动的工作方式主要能解决大型网络中单机无法截获网络中所有数据的问题。,3.2 多机协作系统的实现,在上一节,对多机协作机制进行了详细的分析。本系统通过Java Socket编程实现了以时间片为事件驱动的触发方式。多机协作系统的工作流程是:,(1) 启动Server后,由用户输入参与多机协作的计算机的数量、时间片的大小。然后Server创建ServerSocket对象启动监听线程,建立
19、监听8000端口的服务。 (2) 当Client连接Server时,Server创建一个与之通信的线程,该线程以字符串形式发送一个消息给Client端,消息内容包括时间片大小、参与协作的客户端数量、该客户端的序号。 (3) 当Client收到Server的消息时首先对Server发送的消息进行分析,然后启动抓包线程。 (4) 当另一个Client连接Server时,Server创建一个与之通信的线程,该线程以字符串形式发送一个消息给Client端,消息内容包括时间片大小、参与协作的客户端数量、该客户端的序号以及时间偏移(上一个Client与Server建立连接的时间与现在的时间差)。 (5)
20、当Client收到Server的消息时首先对Server发送的消息进行分析。,然后启动抓包线程。,3.3 多机协作系统的核心代码,1、多机协作系统Server端核心代码,2、多机协作系统Client端核心代码,4.1 数据采集系统的基本原理,数据采集系统的任务是采集数据,本系统是通过Jpcap开启网卡混杂模式来采集网络数据。在一个实际系统中,数据的收发是由网卡来完成的,网卡接收到传输来的数据,网卡内的单片程序接收数据帧的目的MAC地址,根据计算机上网卡的驱动程序设置接收模式判断该不该接收,认为需接收就产生中断信号通知CPU,认为不该接收的就丢掉不管,对于计算机网络高层应用程序是透明的。CPU得
21、到中断信号产生中断,操作系统就调用网卡中断程序接收数据,并把它放入信号堆栈使之为应用程序所用。现在几乎所有的以太网网卡都可以被设置成混杂模式。网卡处于普通模式时,它会丢弃所有目的地址和本机地址不相符的帧,而处于混杂模式时,它会向上层软件传递所有侦听到的帧,并能发送任意的帧。这样,只需要将网卡设置混杂模式,我们就能接收同一个以太网上的所有帧,并能发送任意帧以便施加控制。,四、数据采集系统的设计与实现,4.2 数据采集系统的实现,数据采集系统主要的任务是采集数据,启动抓包程序后,如果是Server则直接开始抓包,如果是第一个Client则等待一个时间片后时间后开始抓包,如果是其他Client则等待
22、(T*C-TE)%(T*C)时刻后开始抓包。当各自的时间片完成后,就进入休眠状态,休眠的时间为(N-1)T。数据采集系统就是这样不断循环来完成数据采集工作的。,4.3 数据采集系统的核心代码,1、数据采集系统Server端核心代码,2、数据采集系统Client端核心代码,5.1 系统的使用方法,五、系统使用方法及运行结果,运行Server端后首先选择用于采集数据的网卡,对于多网卡的计算机,请选择和其他Client端连接在一个网络中的网卡。然后输入参与多机协作的计算机的数量,注意,该数量是Server端与所以Client端的和。最后,选择时间片大大小,共有10秒、1分、5分、10分和30分共五个
23、选项,在这里推荐使用10分作为时间片大小。10秒一般用作测试程序,在实际使用中不推荐使用。当完成以上的步骤后,就可以单击“启动服务器”来启动Server的监听服务。当Client端发送连接请求给Server时,Server会与其建立连接并开始运行抓包程序。,运行Client端后,首先输入Server端的IP地址或是主机名,然后选择用于采集数据的网卡,对于多网卡的计算机,请选择和其他Client端连接在一个网络中的网卡。当上述步骤都完成后,单击“开始”按钮,Client会与主机连接,当连接成功后会根据主机发送设消息开始多机协作。,5.2 系统的运行结果,六、进一步工作,本系统能较好的完成以时间片为事件驱动的多机协作网络数据采集。除了使用这种方式外,还可以采用以数据包数目为事件驱动的多机协作方式和以数据包种类为事件驱动的多机协作方式。也可以将这三种方式结合,更好的提升本系统的实用价值和性能。同时,本系统可以结合一些数据包还原技术,如电子邮件还原技术(本人已在Java网络编程课程设计中实现)、HTTP还原技术等,为本系统提供更强的监控性能。在以后的学习和工作中我还会在这些方面继续学习和深入研究。,感谢各位老师!,