计算机网络课程设计报告
- 格式:docx
- 大小:322.29 KB
- 文档页数:15
后面有完整代码
计算机网络课程设计报告
编程实现基于UDP的PING
学院计算机学院
专业
学号
学生姓名
指导教师姜
2017年6月
计算机网络课程设计
一.程序开发的基础知识
1.PING的相关知识
Ping是Windows、Unix和Linux系统下的一个命令。ping也属于一个通信协议,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。应用格式:Ping空格IP地址。
PING (Packet Internet Groper),因特网包探索器,用于测试网络连接量的程序。Ping发送一个ICMP(Internet Control Messages Protocol)即因特网信报控制协议;回声请求消息给目的地并报告是否收到所希望的ICMPecho (ICMP回声应答)。它是用来检查网络是否通畅或者网络连接速度的命令。
作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。
ping指的是端对端连通,通常用来作为可用性的检查,但是某些病毒木马会强行大量远程执行ping命令抢占你的网络资源,导致系统变慢,网速变慢。严禁ping入侵作为大多数防火墙的一个基本功能提供给用户进行选择。
通常的情况下你如果不用作服务器或者进行网络测试,可以放心的选中它,保护你的电脑。
2.UDP的相关知识
UDP 是User Datagram Protocol的简称,全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI 模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。
与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP (网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP 都属于传输层协议。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
3.Socket通信机制相关知识
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet 上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电,有的提供110伏交流电,有的则提供有线电视节目。客户软件将插头插到不同编号的插座,就可以得到不同的服务。
二.设计思路
本程序是通过基于UDP的socket的网络编程,来实现客户端和服务器端的信息传输,包括客户端发送请求给服务器端、服务器端回应客户端,以致实现PING的效果。
具体的思路是通过调用java JDK中包下的DatagramSocket和DatagramPacket类,可以实现对用户数据报文的控制,DatagramSocket类用于创建接收和发送UDP的Socket实例,调用DatagramPacket类用于处理报文,因为它可以将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte数组。这样就可以实现客户端和服务器端的信息交流了。以此来
达到ping的功能。
再通过多线程编程的思想,让不同客户端的请求运行在不同的线程,来实现服务器端为多个客户端服务的功能。
三.程序流程图
服务器端客户端
四.关键数据结构
本程序主要用到的数据结构有以下:
1.Math.random() * 1000,获取随机数字
2.for (int i = 0; i < 10; i++)
{if (rtt[i] > maxRtt){maxRtt = rtt[i]; }
if(rtt[i]!=0){if (rtt[i] < minRtt){minRtt = rtt[i];}
}sumRtt += rtt[i]; },通过循环获取极值。
五.关键性的代码
1.客户端发送请求和接收回复
DatagramSocket clientSocket = new DatagramSocket();//生成client端socket实例InetAddress IPAddress = InetAddress.getByName(address); //生成ip地址实例byte[] sendData = new byte[1024]; //用于接收数据的byte数组
byte[] receiveData = new byte[1024];//用于发送数据的byte数组
sendData = sentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); //生成发送数据包
Date sendBefore = new Date(); //发送前时
clientSocket.send(sendPacket); //发送
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); //生成接收数据包
clientSocket.receive(receivePacket); //接收从server返回的数据包
Date receiveAfter = new Date(); //接收后的时间
//最多等待1秒以便接收PingServer返回的reply消息。如果在该时间内没有收到服务器的reply,则认为该请求或对该请求的reply已经丢失
String modifiedSentence = "";
if(receiveAfter.getTime() - sendBefore.getTime()>1000){
modifiedSentence = "请求超过1秒,模拟数据丢失!!\n";
rtt[i-1]=(long)0; //当收不到reply时,置折返时间为0,不加入计算
}else{modifiedSentence = new String(receivePacket.getData());
rtt[i - 1] = receiveAfter.getTime() - sendBefore.getTime();
}
2.服务器端接收请求和回复客户端
new Thread(){@Override
public void run() {
int cilentCount = 0; //客户端的数量(多个客户端)
//服务器端一直处于接收状态