当前位置:文档之家› 广工计算机网络课设基于UDP的ping.doc

广工计算机网络课设基于UDP的ping.doc

《计算机网络》课程设计学院 ____计算机学院 _______ 专业 ______软件工程 _______年级班别 ______12 级 4 班 _______ 学号91学生姓名指导教师__________林炳城梁路_ __ ___________成绩目录设计题目已知技术参数和设计要求设计内容与步骤设计工作计划与进度安排计算机网络课程设计任务书编程实现基于UDP 的 PING (Java)1.编程实现 PING 的服务器端和客户端,实现操作系统提供的 ping 命令的类似功能。

2.服务器端PingServer 功能:可以显示用户通过客户端发送来的消息内容(包含头部和payload);能够模拟分组的丢失;能够模拟分组传输延迟;将用户发送来的请求request 在延迟一段随机选择的时间(小于 1s)后返回给客户端,作为收到请求的响应reply;通过如下命令行启动服务器:java PingServer port 。

port 为 PingServer 的工作端口号3.客户端 PingClient功能:启动后发送10 个 request。

发送一个request 后,最多等待 1 秒以便接收PingServer 返回的 reply 消息。

如果在该时间内没有收到服务器的reply ,则认为该请求或对该请求的 reply 已经丢失;在收到 reply 后立即发送下一个 request。

请求消息的payload 中至少包含关键字PingUDP 、序号、时间戳等内容。

如: PingUDP SequenceNumber TimeStamp CRLF其中: CRLF 表示回车换行符(0X0D0A) ; TimeStamp 为发送该消息的机器时间。

为每个请求计算折返时间(RTT) ,统计10 个请求的平均RTT 、最大 /小RTT 。

通过如下命令行启动:java PingClient host port 。

host 为 PingServer 所在的主机地址;port 为 PingServer 的工作端口号1.学习 ICMP ,了解 ping 命令的工作机理;2.学习 Java UDP Socket 通信机制;3.了解 Java 多线程程序设计;4.服务器 PingServer 程序设计;5.客户端 PingClient 程序设计。

6.调试与演示命令工作机制学习 2 小时UDP Socket 通信机制 2 小时多线程程序设计 4 小时程序设计 6 小时程序设计12 小时6.调试与演示 4 小时6.课程设计说明书10 小时一、设计环境操作系统: win8开发环境:IDE : eclipse二、课程设计的目的本次课程设计的目的在掌握计算机网络理论的基础上,了解网络技术,掌握计算机网络相关设计方法和思想,希望能通过本次的课程设计,达到巩固和综合应用计算机网络原理和知识,本次课程设计主要是编程实现基于 UDP 的 ping,使用 java 语言编程,编写一个实验程序、仿真模拟 Ping 命令,通过观察实验结果,从而判定本次程序设计是否成功完成任务。

三、理论基础UDP 简介UDP 是 User Datagram Protocol 的简称,中文名是用户数据包协议,是OSI(Open System Interconnection ,开放式系统互联)参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768 是 UDP 的正式规范。

UDP 在 IP 报文的协议号是17。

UDP 协议全称是用户数据报协议[1] ,在网络中它与TCP 协议一样用于处理数据包,是一种无连接的协议。

在OSI 模型中,在第四层——传输层,处于IP 协议的上一层。

UDP 有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

UDP 用来支持那些需要在计算机之间传输数据的网络应用。

包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP 协议。

UDP 协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP 仍然不失为一项非常实用和可行的网络传输层协议。

与所熟知的 TCP(传输控制协议)协议一样, UDP 协议直接位于 IP (网际协议)协议的顶层。

根据 OSI(开放系统互连)参考模型, UDP 和 TCP 都属于传输层协议。

UDP 协议的主要作用是将网络数据流量压缩成数据包的形式。

一个典型的数据包就是一个二进制数据的传输单位。

每一个数据包的前 8 个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。

ping 简介Ping 是 Windows 下的一个命令在Unix 和 Linux 下也有这个命令。

ping 也属于一个通信协议,是TCP/IP 协议的一部分。

利用“ping ”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障。

应用格式: Ping 空格 IP 地址。

该命令还可以加许多参数使用,具体是键入Ping 按回车即可看到详细说明。

PING (Packet Internet Groper) ,因特网包探索器,用于测试网络连接量的程序。

Ping 发送一个 ICMP(Internet Control Messages Protocol)即因特网信报控制协议;回声请求消息给目的地并报告是否收到所希望的ICMP echo(ICMP回声应答)。

它是用来检查网络是否通畅或者网络连接速度的命令。

作为一个生活在网络上的管理员或者黑客来说,ping 命令是第一个必须掌握的DOS 命令,它所利用的原理是这样的:利用网络上机器IP 地址的唯一性,给目标 IP 地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。

ping 指的是端对端连通,通常用来作为可用性的检查,但是某些病毒木马会强行大量远程执行ping 命令抢占你的网络资源,导致系统变慢,网速变慢。

严禁ping 入侵作为大多数防火墙的一个基本功能提供给用户进行选择。

通常的情况下你如果不用作服务器或者进行网络测试,可以放心的选中它,保护你的电脑。

四、基本要求编程实现PING 的服务器端和客户端,实现操作系统提供的服务器端PingServer 功能:可以显示用户通过客户端发送来的消息内容(包含头部和能够模拟分组的丢失;能够模拟分组传输延迟;将用户发送来的请求request 在延迟一段随机选择的时间户端作为收到请求的响应reply ;通过如下命令行启动服务器:java PingServer port 。

ping 命令的类似功能。

payload);(小于 1s)后返回给客port 为PingServer 的工作端口号客户端 PingClient功能:启动后发送10 个 request。

发送一个request 后,最多等待 1 秒以便接收PingServer 返回的 reply 消息。

如果在该时间内没有收到服务器的 reply,则认为该请求或对该请求的 reply 已经丢失;在收到 reply 后立即发送下一个request。

请求消息的payload 中至少包含关键字PingUDP 、序号、时间戳等内容。

如:PingUDP SequenceNumber TimeStamp CRLF其中:CRLF表示回车换行符(0X0D0A) ; TimeStamp 为发送该消息的机器时间。

为每个请求计算折返时间(RTT) ,统计 10 个请求的平均RTT 、最大 /小 RTT 。

通过如下命令行启动:java PingClient host port 。

host 为 PingServer 所在的主机地址port 为 PingServer 的工作端口号五、设计思想UDP 协议的全称是用户数据报,在网络中它与TCP 协议一样用于处理数据包,在OSI 模型中,在第四层---- 传输层,处于IP 协议的上一层,UDP 有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知是否安全完整的到达目的地。

这个课设通过调用java JDK 中包下的DatagramSocket 和 DatagramPacket类,可以实现对用户数据报文的控制,DatagramSocket 类用于创建接收和发送UDP 的Spcket 实例,调用 DatagramPacket 类用于处理报文,因为它可以将Byte 数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte 数组。

通过调用DatagramSocket 和DatagramPacket 类来实现操作系统提供的ping 命令的类似功能。

编程实现基于UDP 的 ping 的思想可以概括为几点:服务器端 PingServer 功能:可以并发地为多个用户服务;显示用户通过客户端发送来的消息内容(包含头部和payload) ;将用户发送来的请求在延迟一段时间后返回给客户端,作为收到请求的相应。

通过 java PingServer 9999 (端口号可以任意选择)命令行来启动服务器。

客户端 PingClient功能:启动都发送10 个请求,发送一个请求后,最多等待 1 秒以便接收PingServer返回的响应消息。

请求消息的payload 中包含有关键字PingUDP 、序号、时间戳等内容。

为每个请求计算折返时间(RTT ),统计 10 个请求的平均RTT 、 min/max 的RTT 。

通过 java PingClient localhost (本机 IP 地址) 9999 命令行启动。

程序设计流程图根据课程设计的要求,结合程序设计流程,本次设计按如下的流程进行开始结束Y功能分析N通过程序设计程序校验六、源程序服务器端代码import* 服务器端*@author LinBingcheng*/public class PingServer extends Thread {private int initPort; ubstring(0, 100);//将数据从缓冲区轮换成字符串}InetAddress host = (); //获取客户端的ip 地址int port = (); //获取客户端的通讯端口buffer = (); //请求数据转换成byte 数组,用于发回客户端DatagramPacket sendPacket = new DatagramPacket(buffer, ,host, port); // 生成数据包,已经保存好发送目的地的地址和端口了try {(sendPacket);// 发送数据给客户端} catch (Exception e) {();}//显示请求结果}public DatagramPacket getReceivePacket() {return receivePacket;}public void setReceivePacket(DatagramPacket receivePacket){ = receivePacket;}public DatagramSocket getServerSocket() {return serverSocket;}public void setServerSocket(DatagramSocket serverSocket){ = serverSocket;}}客户端代码import* 客户端*@author LinBingcheng*/public class PingClient {public static void main(String[] args) throws Exception {//Scanner scanner = new Scanner;// 接收从系统指定输入方式输入的数据(默认为键盘)String host = args[0]; //(); //获取服务器端所在的主机地址int port = (args[1]);//(); //获取服务器端监听的端口号Long[] rtt = new Long[10]; // 用于存储rtt ,用于最后的统计for (int i = 1; i <= 10; i++) { //模拟发送10 条请求SimpleDateFormat sdf = new SimpleDateFormat("yyyy -MM -dd hh:mm:"); //时间戳格式Date sendBefore = new Date(); //记录发送前时间String sentence = "head: request " + i+" \n" // 模拟用的请求数据+"playload: PingUDP SequenceNumber:" + i + " TimeStamp:"+(sendBefore) + "\n";clientSocket = new DatagramSocket(); //生成客户端DatagramSocketDatagramSocket 实例InetAddress IPAddress = (host); // 生成ip 地址实例byte[] buffer = new byte[1024]; // 数据包使用的缓冲区buffer = (); //将请求数据放进缓冲区内DatagramPacket sendPacket = new DatagramPacket(buffer,, IPAddress, port); //生成发送数据包实例(sendPacket); // 发送到服务器端DatagramPacket receivePacket = new DatagramPacket(buffer, ; // 生成接收数据包实例try { //接收从服务端返回的数据包(receivePacket);} catch (IOException e){ "分组接受异常 ");();}String receiveSentence = new String()); // 将数据从缓冲区轮换成字符串Date receiveAfter = new Date(); // 记录接收后的时间rtt[i -1]=() -();// 计算rttif( rtt[i - 1] > 1000){ // 如果接收时间大约1000ms,视为数据包丢失rtt[i - 1] = (long) 1000;receiveSentence = "data lose\n";}//显示从server 返回的数据端"rtt:" + rtt[i - 1]); // 显示rtt(); // 关闭socket}//统计出平均 rtt,最大 rtt 和最小 rttlong sumRtt = 0;long maxRtt = 0;long minRtt = rtt[0];for (int i = 0; i < 10; i++) {if (rtt[i] > maxRtt) {maxRtt = rtt[i];}if (rtt[i] < minRtt) {minRtt = rtt[i];}sumRtt += rtt[i];}"average rtt: " + sumRtt / 10 + " millisecond");"max rtt: " + maxRtt);"min rtt: " + minRtt);}}七、测试用例按“ win + R ”键,在弹出的对话框中输入“cmd ”回车,如下:通过“ cd”命令,进入源程序所在目录输入“ javac”命令,编译程序输入“ javac”命令,编译程序在相同目录下生成两个可执行文件(没有报错说明编译成功)测试程序将 class文件复制到简单易读取的位置此时需要启动 PingServer 和启动 PingClient ,打开两个命令行,通过“ cd”进入到文件存放目录输入测试执行命令:java PingServer 9999(9999是端口号可以是任意的)java PingClient localhost 9999 (localhost 代表本机,即命令进行启动,并发送 10 个请求,请求信息 payload 包括了 PingUDP、SequenceNumber 、TimeStamp的内容,以及每个请求的折返时间,并统计 10 个请求的平均 RTT以及最大 RTT和最小 RTT,此时PingClient 客户端收到 PingServer 服务器的返回信息显示如下:PingServer 输出结果如下PingClient输出结果如下对于分组的丢失体现在如果生成的 rtt 超过 1000ms 就当做是是丢失了(在 1 秒之内),结果如下:其中 rtt 是指发送数据的时间减去接收数据的时间,也即产生的时延。

相关主题