云南大学 软件学院 计网实验2
云南大学软件学院计算机网络原理实验八
![云南大学软件学院计算机网络原理实验八](https://img.taocdn.com/s3/m/e2f28c6fa300a6c30d229f0b.png)
实验八、链路层实验——基于CRC编码的检错程序的实现一、实验目的1、通过实验,掌握CRC编码和解码的原理。
2、掌握基于CRC编码的差错检测技术。
二、实验指导现在计算机网络广泛采用的差错检测技术是基于CRC(cyclic redundancy check)循环冗余检测编码,CRC也称为多项式编码(polynomial code),CRC算法非常容易用硬件实现。
CRC编码操作如下:对给定的数据D,发送者选择r个附加位,追加到D的末尾,形成d+r位的新位型,该位型正好能被G模2除尽。
其中,G称为生成器。
CRC编码算法实现:1、选择生成多项式G,其最高次方为r,即r+1位的二进制位串2、计算D·2r, 即在数据D后面补r个0,构成d+r位的位串3、按模2除法求(D·2r/G)的余数R4、从D·2r中模2加上R,得到新的数据T,即加了CRC的帧三、实验要求1、设置一个d位的数据D,r+1位的多项式G,生成CRC码,并把此CRC码作为数据帧进行传送。
2、编写两个子程序,分别实现CRC编码和CRC解码,在主函数中对子程序进行调用。
解码子程序应能根据解码情况判断出接收到的数据帧是否出错,并给出提示。
3、要求分别以正确和错误的数据来检验此检错程序。
4、将编写程序的源代码加必要注释和程序运行结果一起填入实验报告中。
提示:1、编写程序时数据直接用二进制数,可能用到位操作符^(异或)和<<(左移)。
2、在设置错误的编码时,错误位数最好不要超过r+1位。
四、程序代码#include <stdlib.h>void crc_code(int A[],int G[],int x,int n)//编码子程序,异或函数,求余数{int i,j,k;printf("\n\t\t");for(k=0;k<x;k++)printf("%d",A[k]);//输出补零以后的数for(i=0;i<=x-n+1;i++){if(A[i]==1)//当首位为1时进行异或{for(j=0;j<=n-1;j++){if(A[i+j]==G[j])A[i+j]=0;//异或运算,相同为0,不同为1elseA[i+j]=1;}printf("\n\t\t");//输出每次异或运算后的结果for(k=0;k<=x-1;k++)printf("%d",A[k]);//输出余数}}}void crc_decode(int M[],int A[],int m,int n)//检验解码子程序{int i,sign=0;//初始化,定义一个标志位signfor(i=0;i<=m-1;i++){if(M[i]!=A[i])//若输入的M[i]中的任意一位不等于对应的A[i] {printf("第%d位出现错误\n",i+1);//输出错误信息sign=1;//若不等,则置标志位为1}}if(sign!=1)printf("数据正确\n");//输出正确信息}int main(){int m,n;int A[20],M[20],G[20],i,j;printf("请输入M[x]的长度m= ");scanf("%d",&m);printf("请输入G[x]的长度n= ");scanf("%d",&n);printf("\n请输入M[x]= \n");for(i=0;i<=m-1;i++)scanf("%d",&M[i]);printf("\n请输入G[x]= \n");for(j=0;j<=n-1;j++)scanf("%d",&G[j]);for(i=0;i<=m-1;i++)A[i]=M[i];for(i=m;i<=m+n-2;i++)A[i]=0;//被除数左移r位,r=m+n-2,即补r个0 crc_code(A,G,m+n-1,n);//调用异或运算函数for(i=0;i<=m-1;i++)A[i]=A[i]+M[i];//在被除数后面加上余数printf("\n\n结果为: ");for(i=0;i<=m+n-2;i++)printf("%d",A[i]);printf("\n");printf("\n请输入要进行CRC解码的数据:\n");for(i=0;i<=m-1;i++)scanf("%d",&M[i]);crc_decode(M,A,m,n);//调用校验解码函数return 0;}五、运行结果六、实验小结①通过这个实验,对CRC编码解码的算法有了初步了解.并且学会了CRC编码解码的算法。
实验2-非对称加密实验报告
![实验2-非对称加密实验报告](https://img.taocdn.com/s3/m/a6a20dbec281e53a5902ff92.png)
云南大学软件学院实验报告课程:信息安全学实验学期:2012-2013学年第二学期任课教师:金鑫专业:学号:姓名:成绩:实验2-非对称加密实验一、实验目的了解非对称密码的加密和解密特点,理解加密解密与数字签名的基本原理,掌握PGP加密的原理,使用PGP加密软件加密信息。
二、实验原理公钥和私钥是互补的,就是说用公匙加密的密文可以用私匙解密,反过来也一样。
假设甲要寄信给乙,他们互相知道对方的公匙。
甲就用乙的公匙加密邮件寄出,乙收到后就可以用自己的私匙解密出甲的原文。
由于没别人知道乙的私匙所以即使是甲本人也无法解密那封信,这就解决了信件保密的问题。
另一方面由于每个人都知道乙的公匙,他们都可以给乙发信,那么乙就无法确信是不是甲的来信。
认证的问题就出现了,这时候数字签名就有用了。
甲用自己的私匙加密,附加在邮件上,再用乙的公匙将整个邮件加密。
这样这份密文被乙收到以后,乙用自己的私匙将邮件解密,得到甲的原文和签名,乙的PGP也从原文计算出一个结果与甲的公匙解密签名得到的数比较,如果符合就说明这份邮件确实是甲寄来的。
三、实验步骤1、安装PGP软件,用PGP加密、解密文件密钥加密口令加密解密口令解密2、发送PGP加密和签名后的电子邮件并解密邮件将要发送的文件添加到PGP压缩包对文件进行加密输入邮件地址签名保存生成加密后的PGP文件将加密后的PGP文件发送给搭档对方收到邮件收到的PGP文件解密后得到原文件解密后的文件可以打开并还原,如果密钥不配对打开将是乱码。
四、回答问题1)简要阐述加密解密与数字签名的原理和异同数字签名和数字加密的过程虽然都使用公开密钥体系,但实现的过程正好相反,使用的密钥对也不同。
数字签名使用的是发送方的密钥对,发送方用自己的私有密钥进行加密,接收方用发送方的公开密钥进行解密,这是一个一对多的关系,任何拥有发送方公开密钥的人都可以验证数字签名的正确性。
数字加密则使用的是接收方的密钥对,这是多对一的关系,任何知道接收方公开密钥的人都可以向接收方发送加密信息,只有唯一拥有接收方私有密钥的人才能对信息解密。
云南大学软件学院数据结构实验2
![云南大学软件学院数据结构实验2](https://img.taocdn.com/s3/m/66a42a1ee87101f69e3195fe.png)
实验难度: A □ B □ C □序号学号姓名成绩指导教师(签名)学期:2017秋季学期任课教师:实验题目:组员及组长:承担工作:联系电话:电子邮件:完成提交时间:年月日一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计等相关知识,对问题进行概要性地分析)本次实验通过C语言实现了多项式的输入(以字符串形式输入),字符串以链表形式建立、排序、多项式的加减。
利用了插入法排序的算法作为排序的核心算法。
运用了高等数学中多项式的加减法及求导的知识。
二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的定义和基本操作说明,程序包含的模块以及各模块间的调用关系,关键算法伪码描述及程序流程图等,如有界面则需包括界面设计,功能说明等)抽象数据类型:t ypedef struct Item{ElemType coef;ElemType expn;Item *next;Item *prior;}Item,*LinkList;基本操作:void input(ElemType *s); //输入字符串void TrsStoL(ElemType *s, LinkList x); //将字符串转换为链表void Items_print(LinkList s); //打印字符串LinkList Iems_Add(LinkList s1, LinkList s2);//多项式加法LinkList Iems_Sub(LinkList s1, LinkList s2);//多项式减法本程序只有两个模块,调用关系简单:主程序模块 -→调用--→多项式模块三、【实现(Implement)】(30%)(本部分应包括:抽象数据类型各操作的具体实现代码、关键操作的具体算法实现、函数实现,主程序实现等,并给出关键算法的时间复杂度分析。
如有界面则需包括界面的关键实现方法等。
云南大学软件学院综合技能实践-开发环境实验指导书
![云南大学软件学院综合技能实践-开发环境实验指导书](https://img.taocdn.com/s3/m/24528176a417866fb84a8e86.png)
云南大学软件学院综合技能实践——《常用开发平台的安装和使用》实验指导书指导教师:梁宇蔡莉(注意:请先简要阅读实验指导书的要求再开始做实验)第一部分 JSP开发环境的搭建一、实验目的:1.掌握JSP开发环境搭建的具体步骤和操作方法。
2.掌握在JSP开发环境下创建一个简单JSP文件的方法。
3.掌握在JSP中创建虚拟目录的方法。
二、实验内容预习一、JSP概述JSP(Java Server Pages,Java服务器主页)技术为创建显示动态生成内容的Web页面提供了个简捷而快速的方法。
JSP技术的设计目的使得构造基于Web 的应用程序更加容易和快捷,这些应用程序能够与各种Web服务器、应用服务器、浏览器和开发工具共同工作。
JSP的明显优势如下:平台和服务器的独立性。
基于Java的JSP与平台无关,它可以使用任何web服务器(包括Apache、IIS和PWS)。
使用的脚本语言。
JSP使用Java作为它的脚本语言,其面向对象的编程思想较为优秀。
JSP跨平台的可重用性。
J3P组件(Enterprise JavaBeans,JavaBeans)都是跨平台可重用的。
EJB(Enterprise JavaBeans,企业级JavaBeans)组件可以访问传统的数据库,并能以分布式系统模式工作于UNIX 和Windows平台。
多样化和功能强大的开发工具支持。
JSP已经有了许多非常优秀的开发工具而是有许多可以免费获取,且其中行许多开发工具已经可以顺利地运行于多种平台之下。
二、建立JSP的运行环境由于JSP使用Java作为程序设计脚本语言,因此需要建立Java的运行环境。
编译和调试运行Java程序,需要安装JDK(Java Develop Kit,Java开发工具包)。
另外,JSP是基于Web的Java应用程序,因而它需要有特定的运行环境,即解释器。
由于Java语言是跨平台的,所以能解释Java语言的Web服务器与平台无关。
云南大学软件学院计算机网络原理报告4
![云南大学软件学院计算机网络原理报告4](https://img.taocdn.com/s3/m/d4ffc4f70242a8956bece4e4.png)
云南大学软件学院实验报告课程:计算机网络原理实验任课教师:刘春花,刘宇姓名: ____ 学号:__________专业:数字媒体技术成绩:实验四、web服务器套接字编程实验报告1.实验目的:编写一个WEB服务器程序,可以接受来自浏览器的访问,并传输页面(包含多个对象)到浏览器。
掌握Socket编程。
2.实验环境:连入局域网络的主机一台。
3.实验指导:超文本传输协议(HTTP)是位于TCP/IP 协议的应用层,是最广为人知的协议,也是互连网中最核心的协议之一。
HTTP协议是Web浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。
一个完整的HTTP协议会话过程包括四个步骤:✧连接Web浏览器与Web服务器建立连接,打开一个称为Socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功;✧请求Web浏览器通过Socket向Web服务器提交请求。
HTTP的请求一般是GET或POST 命令(POST用于FORM参数的传递);✧应答Web浏览器提交请求后,通过HTTP协议传送给Web服务器。
Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面;✧关闭连接应答结束后Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web 服务器建立连接。
4.实验分析,回答下列问题。
运行实验提供的Webserver.java程序,分析该程序实现的功能,为实验程序主要代码加上注释。
import java.io.*;import .*;import java.util.*;class Webserver{public static void main(String arg[]) throws Exception{//变量定义String requestMessageLine;String filename;ServerSocket listenSocket=new ServerSocket(8080);//创建一个ServerSocket套接字对象,并绑定在8080端口上Socket connectionSocket=listenSocket.accept();//监听并接受客户端BufferedReaderinFromClient=newBufferedReader(newInputStreamReader(connectionSocket.getInputStream()));//根据socket输入流,创建个缓冲读取的对象DataOutputStreamoutToClient=newDataOutputStream(connectionSocket.getOutputStream());//根据socket输入流,创建个数据输出流,返回客户端的requestMessageLine=inFromClient.readLine();//读取第一行信息StringTokenizer tokenizerLine=new StringTokenizer(requestMessageLine);//将第一行信息转换成StringTokenizer对象if(tokenizerLine.nextToken().equals("GET")){ //如果遇到"GET"filename=tokenizerLine.nextToken();//将下一个值赋值给filenameif(filename.startsWith("/")==true)filename=filename.substring(1); //如果filename中有/,去掉/System.out.println("The request filename is:" + filename);//打印出The request filename is:File file=new File(filename);int numOfBytes=(int)file.length();//获得到这个文件的大小FileInputStream inFile=new FileInputStream(filename);//创建这个文件的输入流byte[] fileInBytes=new byte[numOfBytes]; //定义个文件大小的字节数组inFile.read(fileInBytes); //将文件读入到字节数组中outToClient.writeBytes("HTTP/1.0 200 Document Follows\r\n"); //将字符返回给客户端if (filename.endsWith(".jpg")) //如果文件是jpg格式的outToClient.writeBytes("Content-Type:image/jpeg\r\n"); //将文件类型jpeg发送给客户端if (filename.endsWith(".gif")) //如果文件是gif格式的outToClient.writeBytes("Content-Type:image/gif\r\n"); //将文件类型gif发送给客户端outToClient.writeBytes("Content-Length:" + numOfBytes + "\r\n"); //将文件大小发送给客户端outToClient.writeBytes("\r\n"); //换行outToClient.write(fileInBytes, 0, numOfBytes); //将文件的字节流形式发送给客户端connectionSocket.close(); //关闭socket} elseSystem.out.println("Bad Resquest Message"); //如果请求信息中没有“GET”,控制台输出此信息}}运行截图如下:5、实验总结总结你在实验过程中遇到的问题和解决的方法。
云南大学软件学院计算机网络原理实验五和六-17年金老师班
![云南大学软件学院计算机网络原理实验五和六-17年金老师班](https://img.taocdn.com/s3/m/8fc589bff524ccbff12184f2.png)
实验五、六传输层协议分析实验报告序号:姓名:学号:2016 成绩1.实验目的:理解TCP报文首部格式和字段的作用,TCP连接的建立和释放过程,TCP数据传输过程中编号与确认的过程;分析UDP协议报文格式。
2.实验环境:连网环境,可以是局域网,也可以是连入Internet的单机。
3.实验步骤:(1)启动Etherel协议分析软件,并开始抓包。
(2)启动某个基于TCP的应用程序,例如连接某个FTP站点,或通过浏览器访问某个网页。
(3)等出现浏览的网页后停止数据包的捕获。
(4)出现协议分析界面,将filter 一栏填入tcp,则只显示TCP协议信息,通过此信息,可以看到TCP连接的三次握手过程和协商的初始的序列号,数据传输过程以及拆除连接的相应信息。
4.实验分析,回答下列问题实验五 TCP协议分析打开捕获文件,通过捕获的数据包分析TCP建立连接的三次握手的过程,并将TCP建立连接过程中的三个报文填写下来。
字段名称第一条报文第二条报文第三条报文报文序号 1 2 3Sequence Number 0 0 1 Acknowedgement Numbber 0 1 1ACK 0 1 1SYN 1 1 0(1)TCP建立连接时的三个报文,其报文首部与其他TCP报文有什么不同?都使用了SYN 协议。
TCP 建立连接时的三个报文的首部都具有Options 字段,且其Sequence 和Acknowedgement Numbber为0或者1。
SYN是发送标志位,ACK是确认标志位。
(2)报文首部的OPTION字段的作用是什么?值为多少?表明本端所能接收的最大长度的报文段。
值为12bytes。
(3)分析TCP数据传输阶段的前8个报文,将报文信息填入到表中数据传送阶段第一个报文的序号字段值是否等于连接建立时第三个报文的序号?相等(4)捕获一个拆除TCP连接的数据包,附上捕获截图,主要要包含拆除连接的数据包部分,分析TCP释放连接的过程,选择TCP释放连接过程当中的四个报文,将报文信息填在下表。
云南大学软件学院综合技能实践-数据库实验指导书
![云南大学软件学院综合技能实践-数据库实验指导书](https://img.taocdn.com/s3/m/b06ede1ba300a6c30c229f0b.png)
云南大学软件学院综合技能实践——《常用数据库系统的安装和调试》实验指导书第一部分MySQL数据库的安装和使用一、实验目的:1.掌握MySQL数据库环境搭建的具体步骤和操作方法。
2.掌握启动和运行MySQL的方法。
3.掌握使用SQL语句创建数据库、表及向表中插入记录的方法。
二、实验内容预习一、MySQL概述MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发、发布并支持的。
MySQL AB是由多名MySQL开发人创办的一家商业公司。
它是一家第二代开放源码公司,结合了开放源码价值取向、方法和成功的商业模型。
数据库是数据的结构化集合。
它可以是任何东西,从简单的购物清单到画展,或企业网络中的海量信息。
要想将数据添加到数据库,或访问、处理计算机数据库中保存的数据,需要使用数据库管理系统,如MySQL服务器。
计算机是处理大量数据的理想工具,因此,数据库管理系统在计算方面扮演着关键的中心角色,或是作为独立的实用工具,或是作为其他应用程序的组成部分。
关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大的仓库内。
这样就增加了速度并提高了灵活性。
MySQL的SQL指得是“结构化查询语言”。
SQL是用于访问数据库的最常用标准化语言,它是由ANSI/ISO SQL标准定义的。
SQL标准自1986年以来不断演化发展,有数种版本。
在本手册中,“SQL-92”指得是1992年发布的标准,“SQL:1999”指得是1999年发布的标准,“SQL:2003”指得是标准的当前版本。
我们采用术语“SQL标准”标示SQL标准的当前版本。
二、MySQL的安装MySQL是一个开源的用于数据库管理的软件。
可以到MySQL的主页上进行下载,地址为。
登录学院ftp://172.25.10.20/(内网)或者ftp://113.55.4.20(外网) 用户名:zhuyp_std, 密码:std,下载区常用数据库的安装和调试文件夹下载相关软件。
数据库实验2:使用向导创建并管理数据库1
![数据库实验2:使用向导创建并管理数据库1](https://img.taocdn.com/s3/m/76b555ea102de2bd96058883.png)
云南大学软件学院实验报告
课程:数据库原理与实用技术实验学期:2012学年第一学期任课教师:薛岗专业:学号:姓名:成绩:
实验2使用向导创建并管理数据库
一、实验目的
二、实验内容
SQL Server 2000数据库平台
1.使用企业管理器创建如下数据库:(截图)
2.使用企业管理器创建Employee数据库表:(截图)
3.练习生成Employee数据库脚本“employee.sql”,并分析和记录下脚本信息。
4.使用企业管理器生成Employee数据库表的关系图,并记录。
5.在企业管理其中,直接执行删除表月薪表salary中的Fact列的操作,看是否能执行这一操作。
1、在数据库salary表中要求base不小于300,bonus不小于50如何实现。
2、在数据库雇员信息表person中要求SEX列值只能为“男”或者“女”,如何实现。
3、。
云南大学 软件学院 计网实验8
![云南大学 软件学院 计网实验8](https://img.taocdn.com/s3/m/4fecc0237cd184254a35352d.png)
云南大学软件学院实验报告课程:计算机网络原理实验任课教师:姓名:学号:专业:成绩:实验八、Link States Algorithm的实现1.实验目的:通过编程模拟实现LSA.2.实验环境:软件开发平台,可以使用任何编程语言。
3.实验要求(1)求网络中任何两个结点之间的最短路径(网络中至少有4个节点)。
(2)得到任何一个节点上的转发表。
4.实验内容、拓扑结构通过链路状态算法计算A点到其它各点的cost,最终输出A的路由表。
# include<stdio.h># include<stdlib.h># define maxlen 10# define large 999 //(该处设置路径最大值,表示不存在该路线)typedef struct{int vexnum;char vexs[maxlen];int arcs[maxlen][maxlen];}graph;void init_graph(graph *g)//初始化图{int i = 0,j = 0;g -> vexnum = 5; //根据题目此处将图的节点数初始化为5个for(i = 0; i < 5; i++) //经过两层循环将条路径初始化为无穷大for(j = 0; j < 5; j++)g -> arcs[i][j] = 999;g -> arcs[0][1] = 7; g -> arcs[1][0] = 7; //将相邻两个节点的路径初始化为其权值g -> arcs[0][4] = 1; g -> arcs[4][0] = 1;g -> arcs[1][2] = 1; g -> arcs[2][1] = 1;g -> arcs[2][3] = 2; g -> arcs[3][2] = 2;g -> arcs[1][4] = 8; g -> arcs[4][1] = 8;g -> arcs[3][4] = 2; g -> arcs[4][3] = 2;g -> vexs[0] = 'A'; //将节点值初始化g -> vexs[1] = 'B';g -> vexs[2] = 'C';g -> vexs[3] = 'D';g -> vexs[4] = 'E';}void shortpath_dijkstra(graph g)//寻找最短路径{int cost[maxlen][maxlen]; //cost[i][j]: 节点i到节点j的成本int dist[maxlen]; //dist[i]: 源节点到i节点的距离或者是成本int path[maxlen]; //已经经过了的节点int s[maxlen]; //如果 s[i] = 1,那么i节点已经纳入最短路径集合int i,j,v0,min,u;char e;printf("Input the source point(AorBorCorDorE):");//用户输入源节点scanf("%c",&e);switch(e){case'A':v0=0;break;case'B':v0=1;break;case'C':v0=2;break;case'D':v0=3;break;case'E':v0=4;break;}for(i = 0; i < g.vexnum; i++){for(j = 0; j < g.vexnum; j++)cost[i][j] = g.arcs[i][j];}for(i = 0; i < g.vexnum; i++){dist[i] = cost[v0][i]; //初始化源节点到各个节点的成本,如果与源节点相邻则成本为权值,否则为无穷大if(dist[i] < large && dist[i] > 0)path[i] = v0;s[i] = 0;}s[v0] = 1;for(i = 0; i < g.vexnum; i++){min = large;u = v0;for(j = 0; j < g.vexnum; j++)if(s[j] == 0 && dist[j] < min){min = dist[j];u = j;}s[u] = 1;for(j = 0; j < g.vexnum; j++)if(s[j] == 0 && dist[u] + cost[u][j] < dist[j]){dist[j] = dist[u] + cost[u][j];path[j] = u;}}printf("Output%c\n\n",e);for(i = 0; i < g.vexnum; i++)if(s[i] == 1){u = i;while(u != v0){printf(" %c <- ",g.vexs[u]);u = path[u];}printf(" %c ",g.vexs[u]);printf(" :%d \n",dist[i]);}else printf(" %c <- %c: no path \n",g.vexs[i],g.vexs[v0]);}int main(){graph g;init_graph(&g);shortpath_dijkstra(g);system("pause");return 0;}从A点开始,寻找到其余各点的最短路径截图如下:4.实验分析,回答下列问题(1)给出LSA算法的主要思想。
云南大学软件学院云计算实验一
![云南大学软件学院云计算实验一](https://img.taocdn.com/s3/m/8d3a9f41767f5acfa1c7cd39.png)
云南大学软件学院
实验报告
课程:云计算技术与实践任课教师:梁宇实验指导教师(签名):李海姓名:张兴鹏学号:20121120291 专业:网络工程日期:成绩:
实验一
一、实验目标:
1. 了解VMware 软件虚拟化原理
2. 熟悉VMware Workstation 的安装过程
3. 掌握在VMware 下建立虚拟机的步骤
4. 掌握在虚拟机中安装Linux 操作系统的方法
二、实验要求
三、实验内容和步骤
1、VMware Workstation 简介
2、搭建虚拟化实验环境步骤
安装VMware 软件和建立虚拟机的具体步骤见附件“VMware 虚拟机的安装
与使用”。
由于我的电脑上之前已经安装过几次虚拟机,故其中具体的安装步骤不在赘述。
3、分析安装VMware 和建立虚拟机的过程中出现的问题和原因。
创建虚拟机完成后进不去,查询后发现需要进入BIOS开启Intel VT-X服务。
四、实验总结
经过这次安装VMware虚拟机以及CentOS操作系统,我对使用虚拟机更加熟练,对Linux系列操作系统又有了新的认识,之前的的电脑上已经安装了Ubuntu操作系统,并且已经使用了一段时间,但是由于该系统的用户界面做的非常出色,所以接触命令操控的机会相对CentOS来说较少,今后我会对这2款操作系统勤
加研究,争取熟练掌握。
计算机网络实验报告二
![计算机网络实验报告二](https://img.taocdn.com/s3/m/236440a05a8102d276a22f90.png)
《计算机网络(II)》实验报告实验名称:IEEE802标准和以太网班级:120341A 姓名:黄帅学号:120341110 任课教师:崔鸿完成日期:2014/11/01 实验环境:Windows2003网络实验平台一、实验目的:1.掌握ip数据报的报文格式2.掌握ip校验和计算方法3.掌握子网掩码和路由转发4.理解特殊ip地址含义5.理解ip分片过程6.理解协议栈对IP协议的处理方法7.理解ip路由表作用以及ip路由表的管理二、实验内容:主机Aip地址10.5.27.250,网关设为10.5.27.38主机B端口1IP地址10.5.27.38,端口2IP地址10.5.29.213,不设网关主机CIP地址10.5.27.238,网关设为10.5.27.38主机DIP地址10.5.27.138,网关设为10.5.27.38主机EIP地址10.5.29.125,网关设为10.5.29.213主机FIP地址10.5.29.111,网关设为10.5.29.213所有主机的子网掩码全为255.255.255.01.1. 主机B在命令行方式下输入staticroute_config命令,开启静态路由服务。
2. 主机A启动协议编辑器,编辑一个IP数据报,其中:MAC层:目的MAC地址:主机B的MAC地址(对应于172.16.1.1接口的MAC)。
源MAC地址:主机A的MAC地址。
协议类型或数据长度:0800。
IP层:总长度:IP层长度。
生存时间:128。
源IP地址:主机A的IP地址(172.16.1.2)。
目的IP地址:主机E的IP地址(172.16.0.2)。
校验和:在其它所有字段填充完毕后计算并填充。
自定义字段:数据:填入大于1字节的用户数据。
【说明】先使用协议编辑器的“手动计算”校验和,再使用协议编辑器的“自动计算”校验和,将两次计算结果相比较,若结果不一致,则重新计算。
●IP在计算校验和时包括哪些内容?3. 在主机B(两块网卡分别打开两个捕获窗口)、E上启动协议分析器,设置过滤条件(提取IP协议),开始捕获数据。
云南大学软件学院计算机网络原理实验六实验报告
![云南大学软件学院计算机网络原理实验六实验报告](https://img.taocdn.com/s3/m/8e4dde50b307e87101f69687.png)
实验六、传输层可靠传输协议GBN编程实验报告序号:姓名:学号:成绩指导老师:一、实验目的:1、通过编写实现一个简单可靠的数据传输协议GBN的发送和接收代码,模拟可靠数据传输2、理解TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。
二、实验指导:参考教材。
动画演示:/details?uuid=ff808081-284d0365-0128-4d0450cc-1e4b&objectId=o id:ff808081-284d0365-0128-4d0450cc-1e4c三、实验要求:编程实现一个GBN传输协议的发送方和接收方两程序,采用编程语言不限,要求能将发送――接收流程以及处理方法表现出来.1.实验流程图如下:2.实验截图与代码如下: 截图:代码及注释:一、GBN.h#pragma once#include <stdio.h>//基础功能模块的数据结构声明#define BIDIRECTIONAL 1 /* change to 1 if you're doing extra credit andwrite a routine called B_output *//* a "msg" is the data unit passed from layer 5 (teachers code) to layer4 (students' code). It contains the data (characters) to be delivered tolayer 5 via the students transport level protocol entities. */struct msg{ char data[20];};/* a packet is the data unit passed from layer 4 (students code) to layer3 (teachers code). Note the pre-defined packet structure, which allstudents must follow. */struct pkt{int seqnum;int acknum;int checksum;char payload[20];};#define WINDOWSIZE 8#define MAXBUFSIZE 50#define RTT 15.0#define NOTUSED 0#define NACK -1#define TRUE 1#define FALSE 0#define A 0#define B 1//网络仿真部分数据结构声明***********************************************************struct event{float evtime; /* event time */int evtype; /* event type code */int eventity; /* entity where event occurs */struct pkt *pktptr; /* ptr to packet (if any) assoc w/ this event */ struct event *prev;struct event *next;};/* possible events: */#define TIMER_INTERRUPT 0#define FROM_LAYER5 1#define FROM_LAYER3 2#define OFF 0#define ON 1//基础功能模块的函数声明******************************************************************* void ComputeChecksum(struct pkt *packet);//计算校验和int CheckCorrupted(struct pkt packet);//检查数据是否出错void A_output( struct msg message);//A端向外发送数据void A_input(struct pkt packet);//A端接收数据void A_timerinterrupt();//A计时器超时void A_init();//A端初始化void B_output(struct msg message);void B_input(struct pkt packet);void B_timerinterrupt();void B_init();//网络仿真部分的函数声明**************************************************void init(); //初始化仿真器float jimsrand();//随机数发生器[0,1]//处理事件列表部分的函数声明*********************************************void generate_next_arrival();//产生下一个到达的分组void insertevent(struct event *p);//向事件列表中插入一条新的事件void printevlist();//打印事件列表//******************************************************************** //**********************计时器模块*********************************** void stoptimer(int);//停止计时器void starttimer(int,float);//启动计时器//******************************************************************** *//**************************网络各层之间传送模块***********************void tolayer3(int AorB,struct pkt packet);//向第3层发送信息void tolayer5(int AorB,char datasent[20]);//向第5层发送信息二、GBN.c#include "GBN.h"#include <stdio.h>#include <string.h>#include <stdlib.h>extern int TRACE = 1; /* for my debugging */为我的调试extern int nsim = 0; /* number of messages from 5 to 4 so far */目前为止信息的数字是从5到4extern int nsimmax = 0; /* number of msgs to generate, then stop */如果信息产生的数字为0,然后就停止extern float time = 0.000;float lossprob; /* probability that a packet is dropped */数据包可能会丢失float corruptprob; /* probability that one bit is packet is flipped*/这一点的数据包可能会被弹出去float lambda; /* arrival rate of messages from layer 5 */ 第五层到达的信息的次序int ntolayer3; /* number sent into layer 3 */被传送到第三层的数据static int nlost = 0; /* number lost in media */在媒介中数据丢失static int ncorrupt = 0; /* number co rrupted by media*/被媒介毁坏的数据static int expectedseqnum = 0; /* expected se quence number at receiver side */在接收者这边接收到预期的序列数据static int nextseqnum; /* next sequence number to use in sender side */下一个序列数据使用在发送者这边static int base; /* t he head of sender window */发送者的头窗口struct pkt winbuf[WINDOWSIZE]; /* window packets buffer */数据包缓冲区窗口static int winfront,winrear; /* front and rear points of wind ow buffer */窗口缓冲区的前方点和后方点static int pktnum; /* packet number of window buffer */窗口缓冲区的数据包个数struct msg buffer[MAXBUFSIZE]; /* sender message buffer */发送消息缓冲区int buffront,bufrear; /* front and rear pointers of buffer */缓冲区的前指针与后指针static int msgnum; /* message number of buffer */信息数量的缓冲int packet_lost =0;int packet_corrupt=0;int packet_sent =0;extern int packet_correct=0;extern int packet_resent =0;int packet_timeout=0;extern struct event *evlist = NULL; /* the event list *///计算校验和void ComputeChecksum( struct pkt *packet){int checksum;int i;checksum = packet->seqnum;checksum = checksum + packet->acknum;for ( i=0; i<20; i++ )checksum = checksum + (int)(packet->payload[i]);checksum = 0-checksum;packet->checksum = checksum;}//检查是否出错int CheckCorrupted(struct pkt packet){int checksum;int i;checksum = packet.seqnum;checksum = checksum + packet.acknum;for ( i=0; i<20; i++ )checksum = checksum + (int)(packet.payload[i]);if ( (packet.checksum+checksum) == 0 )return (FALSE);elsereturn (TRUE);}//A端向外发送数据/* called from layer 5, passed the data to be sent to other side */ void A_output(struct msg message){int i;struct pkt sendpkt;/* if window is not full */if ( nextseqnum < base+WINDOWSIZE ){printf("----A: New message arrives, send window is not full, send new messge to layer3!\n");/* create packet */sendpkt.seqnum = nextseqnum;sendpkt.acknum = NOTUSED;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = message.data[i];/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet */tolayer3 (A, sendpkt);/* copy the packet to window packet buffer */winrear = (winrear+1)%WINDOWSIZE;pktnum ++;winbuf[winrear] = sendpkt;for (i=0; i<20; i++)winbuf[winrear].payload[i]= sendpkt.payload[i];/* update state variables */nextseqnum = nextseqnum+1;starttimer(A,RTT);B_input(sendpkt);A_input(sendpkt);}/* if window is full */else{printf("----A: New message arrives, send window is full,");/* if buffer full, give up and exit*/if ( msgnum == MAXBUFSIZE){printf (" Error: Sender buffer is full! \n");exit (1);}/* otherwise, buffer the message */else{printf("buffer new message!\n");bufrear = (bufrear+1) % MAXBUFSIZE;for (i=0; i<20; i++)buffer[bufrear].data[i] = message.data[i];msgnum ++;}}}//B端向外发送数据/* called from layer 5, passed the data to be sent to other side */ void B_output(struct msg message){int i;struct pkt sendpkt;/* if window is not full */if ( nextseqnum < base+WINDOWSIZE ){printf("----A: New message arrives, send window is not full, send new messge to layer3!\n");/* create packet */sendpkt.seqnum = nextseqnum;sendpkt.acknum = NOTUSED;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = message.data[i];/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet */tolayer3 (A, sendpkt);A_input(sendpkt);/* copy the packet to window packet buffer */winrear = (winrear+1)%WINDOWSIZE;pktnum ++;winbuf[winrear] = sendpkt;for (i=0; i<20; i++)winbuf[winrear].payload[i]= sendpkt.payload[i];/* if it is the first packet in window, start timeout */ //if ( base == nextseqnum )//{//starttimer(A,RTT);//printf("----A: start a new timer!\n");// }/* update state variables */nextseqnum = nextseqnum+1;}/* if window is full */else{printf("----A: New message arrives, send window is full,");/* if buffer full, give up and exit*/if ( msgnum == MAXBUFSIZE){printf (" Error: Sender buffer is full! \n");exit (1);}/* otherwise, buffer the message */else{printf("buffer new message!\n");bufrear = (bufrear+1) % MAXBUFSIZE;for (i=0; i<20; i++)buffer[bufrear].data[i] = message.data[i];msgnum ++;}}}//A端接收数据void A_input(struct pkt packet){struct pkt sendpkt;int i;/* if received packet is not corrupted and ACK is received */if ( (CheckCorrupted(packet) == FALSE) && (packet.acknum != NACK) ) {printf("----A: ACK %d is correctly received,",packet.acknum);packet_correct++;/* delete the acked packets from window buffer */winfront = (winfront+(packet.acknum+1-base)) % WINDOWSIZE; pktnum = pktnum - (packet.acknum+1-base);/* move window base */base = packet.acknum+1;stoptimer(A);if ( base < nextseqnum){//starttimer(A,RTT);printf ("\n\n\nsend new packets!");}/* if buffer is not empty, send new packets */while ( (msgnum!=0) && (nextseqnum<base+WINDOWSIZE) ) {/* create packet */sendpkt.seqnum = nextseqnum;sendpkt.acknum = NOTUSED;buffront = (buffront+1) % MAXBUFSIZE;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = buffer[buffront].data[i];/* computer checksum */ComputeChecksum (&sendpkt);/* if it is the first packet in window, start timeout */if ( base == nextseqnum ){//starttimer(A,RTT);printf ("send new packets!\n");}/* send out packet */tolayer3 (A, sendpkt);/* copy the packet to window packet buffer */winrear = (winrear+1)%WINDOWSIZE;winbuf[winrear] = sendpkt;pktnum ++;/* update state variables */nextseqnum = nextseqnum+1;/* delete message from buffer */msgnum --;}}elseprintf ("----A: NACK is received, do nothing!\n");}//B端接收数据*****************************************************一定要调用这个/* Note that with simplex transfer from a-to-B, there is no B_output() */ /* called from layer 3, when a packet arrives for layer 4 at B*/void B_input(struct pkt packet){struct pkt sendpkt;int i;/* if not corrupted and received packet is in order */if ( (CheckCorrupted(packet) == FALSE) && (packet.seqnum == expectedseqnum)){printf("\n----B: packet %d is correctly received, send ACK!\n",packet.seqnum);/* send an ACK for the received packet *//* create packet */sendpkt.seqnum = NOTUSED;sendpkt.acknum = expectedseqnum;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = '0';/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet *///tolayer3 (B, sendpkt);/* update state variables */expectedseqnum = expectedseqnum+1;printf("----B:expectedseqnum = %d\n",expectedseqnum);/* deliver received packet to layer 5 *///tolayer5(B,packet.payload);}/* otherwise, discard the packet and send a NACK */else{printf("----B: packet %d is corrupted or not I expects, send NACK!\n",packet.seqnum);/* create packet */sendpkt.seqnum = NOTUSED;sendpkt.acknum = NACK;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = '0';/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet */tolayer3 (B, sendpkt);}}//A计时器超时/* called when A's timer goes off */void A_timerinterrupt(){int i;printf("----A: time out,resend packets!\n");/* start timer */starttimer(A,RTT);/* resend all packets not acked */for ( i=1; i<=pktnum; i++ ){packet_resent++;tolayer3(A,winbuf[(winfront+i)%WINDOWSIZE]);}}//B计时器超时/* called when B's timer goes off */void B_timerinterrupt(){int i;printf("----B: time out,resend packets!\n");/* start timer */starttimer(B,RTT);/* resend all packets not acked */for ( i=1; i<=pktnum; i++ ){packet_resent++;tolayer3(B,winbuf[(winfront+i)%WINDOWSIZE]);}}//A端初始化/* entity A routines are called. You can use it to do any initialization */void A_init()base = 0;nextseqnum = 0;buffront = 0;bufrear = 0;msgnum = 0;winfront = 0;winrear = 0;pktnum = 0;}//B端初始化/* entity B routines are called. You can use it to do any initialization */void B_init(){expectedseqnum = 0;}//初始化仿真器void init() /* initialize the simulator */{int i;float sum, avg;float jimsrand();FILE *fp;fp = fopen ("parameter.txt","r");printf("----- Stop and Wait Network Simulator Version 1.1 -------- \n\n");printf("Enter the number of messages to simulate: ");//fscanf(fp,"%d",&nsimmax);scanf("%d",&nsimmax);printf("\nEnter packet loss probability [enter 0.0 for no loss]: "); //fscanf(fp, "%f",&lossprob);scanf("%f",&lossprob);printf("\nEnter packet corruption probability [0.0 for no corruption]: "); //fscanf(fp,"%f",&corruptprob);scanf("%f",&corruptprob);printf("\nEnter average time between messages from sender's layer5 [ > 0.0]: ");//fscanf(fp,"%f",&lambda);scanf("%f",&lambda);printf("\nEnter TRACE: ");//fscanf(fp,"%d",&TRACE);scanf("%d",&TRACE);printf("\n\n");srand(9999); /* init random number generator */sum = 0.0; /* test random number generator for students */for (i=0; i<1000; i++)sum=sum+jimsrand(); /* jimsrand() should be uniform in [0,1] */avg = sum/1000.0;/*if(avg < 0.25 || avg > 0.75){printf("It is likely that random number generation on your machine\n" ); printf("is different from what this emulator expects. Please take\n"); printf("a look at the routine jimsrand() in the emulator code. Sorry. \n");exit(0);}*/printf("%f",avg);ntolayer3 = 0;nlost = 0;ncorrupt = 0;time=0.0; /* initialize time to 0.0 */generate_next_arrival(); /* initialize event list */}//随机数发生器float jimsrand(){double mmm = 2147483647; /* largest int - MACHINE DEPENDENT!!!!!!!! */float x; /* individual students may need to change mmm */x = rand()/mmm; /* x should be uniform in [0,1] */return(x);}//**************************************************************************************//*******************************事件处理部分*******************************************void generate_next_arrival(){double x,log(),ceil();struct event *evptr;float ttime;int tempint;//if (TRACE>2)//printf("-----------------GENERATE NEXT ARRIVAL: creating new arrival\n");x = lambda*jimsrand()*2; /* x is uniform on [0,2*lambda] *//* having mean of lambda */evptr = (struct event *)malloc(sizeof(struct event));evptr->evtime = time + x;evptr->evtype = FROM_LAYER5;if (jimsrand()<0.5){evptr->eventity = A;}evptr->eventity = B;insertevent(evptr);}//向事件列表中插入一条新的事件void insertevent(struct event *p){struct event *q,*qold;if (TRACE>2){//printf(" INSERTEVENT: time is %lf\n",time);//printf(" INSERTEVENT: future time will be %lf\n",p->evtime);}q = evlist; /* q points to front of list in which p struct inserted */if (q==NULL)/* list is empty */{evlist=p;p->next=NULL;p->prev=NULL;}else{for (qold = q; q !=NULL && p->evtime > q->evtime; q=q->next) qold=q;if (q==NULL)/* end of list */{qold->next = p;p->prev = qold;p->next = NULL;}else if (q==evlist)/* front of list */p->next=evlist;p->prev=NULL;p->next->prev=p;evlist = p;}else /* middle of list */{p->next=q;p->prev=q->prev;q->prev->next=p;q->prev=p;}}}//打印事件列表void printevlist(){struct event *q;int i;printf("--------------\nEvent List Follows:\n");for(q = evlist; q!=NULL; q=q->next){printf("Event time: %f, type: %d entity: %d\n",q->evtime,q->evtype,q->eventity);}printf("--------------\n");}//启动计时器void starttimer(int AorB,float increment){struct event *q;struct event *evptr;if (TRACE>2)printf("\n----A: START TIMER: starting timer at %f\n",time);/* be nice: check to see if timer is already started, if so, then warn *//* for (q=evlist; q!=NULL && q->next!=NULL; q = q->next) */for (q=evlist; q!=NULL ; q = q->next)if ( (q->evtype==TIMER_INTERRUPT && q->eventity==AorB) ){//printf("Warning: attempt to start a timer that is already started\n");return;}/* create future event for when timer goes off */evptr = (struct event *)malloc(sizeof(struct event));evptr->evtime = time + increment;evptr->evtype = TIMER_INTERRUPT;evptr->eventity = AorB;insertevent(evptr);}//停止计时器/* called by students routine to cancel a previously-started timer */ void stoptimer(int AorB) /* A or B is trying to stop timer */{struct event *q,*qold;if (TRACE>2)printf("\n----A: STOP TIMER: stopping timer\n");/* for (q=evlist; q!=NULL && q->next!=NULL; q = q->next) */for (q=evlist; q!=NULL ; q = q->next)if ( (q->evtype==TIMER_INTERRUPT && q->eventity==AorB) )/* remove this event */{if (q->next==NULL && q->prev==NULL)evlist=NULL; /* remove first and only event on listelse if (q->next==NULL) /* end of list - there is one in front */ q->prev->next = NULL;else if (q==evlist) /* front of list - there must be event after */{q->next->prev=NULL;evlist = q->next;}else /* middle of list */{q->next->prev = q->prev;q->prev->next = q->next;}free(q);return;}//printf("Warning: unable to cancel your timer. It wasn't running.\n");}//向第三层发送信息/************************** TOLAYER3 ***************/void tolayer3(int AorB,struct pkt packet){struct pkt *mypktptr;struct event *evptr,*q;float lastime, x, jimsrand();int i;ntolayer3++;/* simulate losses: */if (jimsrand() < lossprob){nlost++;if (TRACE>0)printf(" TOLAYER3: packet being lost\n");return;}/* make a copy of the packet student just gave me since he/she may decide *//* to do something with the packet after we return back to him/her */ mypktptr = (struct pkt *)malloc(sizeof(struct pkt));mypktptr->seqnum = packet.seqnum;mypktptr->acknum = packet.acknum;mypktptr->checksum = packet.checksum;for (i=0; i<20; i++)mypktptr->payload[i] = packet.payload[i];if (TRACE>2){printf(" TOLAYER3: seq: %d, ack %d, check: %d ", mypktptr->seqnum,mypktptr->acknum, mypktptr->checksum);for (i=0; i<20; i++)printf("%c",mypktptr->payload[i]);printf("");}/* create future event for arrival of packet at the other side */evptr = (struct event *)malloc(sizeof(struct event));evptr->evtype = FROM_LAYER3; /* packet will pop out from layer3 */ evptr->eventity = (AorB) % 2; /* event occurs at other entity */evptr->pktptr = mypktptr; /* save ptr to my copy of packet *//* finally, compute the arrival time of packet at the other end. medium can not reorder, so make sure packet arrives between 1 and 10 time units after the latest arrival time of packetscurrently in the medium on their way to the destination */lastime = time;/* for (q=evlist; q!=NULL && q->next!=NULL; q = q->next) */for (q=evlist; q!=NULL ; q = q->next)if ( (q->evtype==FROM_LAYER3 && q->eventity==evptr->eventity) ) lastime = q->evtime;evptr->evtime = lastime + 1 + 9*jimsrand();/* simulate corruption: */if (jimsrand() < corruptprob){ncorrupt++;if ( (x = jimsrand()) < .75)mypktptr->payload[0]='Z'; /* corrupt payload */else if (x < .875)mypktptr->seqnum = 999999;elsemypktptr->acknum = 999999;if (TRACE>0)printf(" TOLAYER3: packet being corrupted\n");}//if (TRACE>2)//printf(" TOLAYER3: scheduling arrival on other side\n");insertevent(evptr);}//向第五层发送信息/************************** TOLAYER5 ***************/void tolayer5(int AorB,char datasent[20]){int i;if (TRACE>2){printf(" TOLAYER5: data received: ");for (i=0; i<20; i++)printf("%c",datasent[i]);printf("\n");}}三、GBN-CS.c#include "GBN.h"#include <stdio.h>#include <string.h>#include <stdlib.h>extern int TRACE ; /* for my debugging */extern int nsim ; /* number of messages from 5 to 4 so far */extern int nsimmax; /* number of msgs to generate, then stop */extern float time;extern int packet_correct;extern int packet_resent;extern struct event *evlist;int main(){struct event *eventptr;struct msg msg2give;struct pkt pkt2give;int i,j;char c;init();A_init();B_init();while (1){eventptr = evlist; /* get next event to simulate */ if (eventptr==NULL)goto terminate;evlist = evlist->next; /* remove this event from event list */if (evlist!=NULL)evlist->prev=NULL;if (TRACE >= 2){printf("\nEVENT time: %f,",eventptr->evtime);printf(" type: %d",eventptr->evtype);if (eventptr->evtype==0)printf(", timerinterrupt ");else if (eventptr->evtype==1)printf(", fromlayer5 ");elseprintf(", fromlayer3 ");printf(" entity: %d\n",eventptr->eventity);}time = eventptr->evtime; /* update time to next event time*/if (nsim==nsimmax)break; /* all done with simulation */if (eventptr->evtype == FROM_LAYER5 ){generate_next_arrival(); /* set up future arrival *//* fill in msg to give with string of same letter */j = nsim % 26;for (i=0; i<20; i++)msg2give.data[i] = 97 + j;if (TRACE>2){printf(" MAINLOOP: data given to student: ");for (i=0; i<20; i++)printf("%c", msg2give.data[i]);printf("\n");}nsim++;if (eventptr->eventity == A){A_output(msg2give);}else{B_output(msg2give);}}else if (eventptr->evtype == FROM_LAYER3){pkt2give.seqnum = eventptr->pktptr->seqnum;pkt2give.acknum = eventptr->pktptr->acknum;pkt2give.checksum = eventptr->pktptr->checksum;for (i=0; i<20; i++)pkt2give.payload[i] = eventptr->pktptr->payload[i];if (eventptr->eventity == A) /* deliver packet by calling */ A_input(pkt2give); /* appropriate entity */elseB_input(pkt2give);free(eventptr->pktptr); /* free the memory for packet */ }else if (eventptr->evtype == TIMER_INTERRUPT){if (eventptr->eventity == A)A_timerinterrupt();elseB_timerinterrupt();}else{printf("INTERNAL PANIC: unknown event type \n");}free(eventptr);}terminate:printf(" Simulator terminated at time %f\n after sending %d msgs from layer5\n",time,nsim);printf(" correctly sent pkts: %d \n", packet_correct);printf(" resent pkts: %d \n", packet_resent);system("pause");}附源代码及注释四. 实验小结通过本次试验了解了编程实现简单可靠的数据传输GBN协议,模拟了可靠数据传输理解了TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。
云南大学软件学院计算机网络原理实验七
![云南大学软件学院计算机网络原理实验七](https://img.taocdn.com/s3/m/11113b788bd63186bdebbc94.png)
实验七、Link States Algorithm 的实现序号:_____ 姓名: __________ 学号:2016 成绩 _________1. 实验目的:通过编程模拟实现LSA.2. 实验环境:软件开发平台,可以使用任何编程语言。
3. 实验要求(1)求网络中任何两个结点之间的最短路径(网络中至少有4个节点)。
(2)得到任何一个节点上的转发表。
4. 实验内容、拓扑结构通过链路状态算法计算A点到其它各点的cost,最终输出A的路由表。
算法提示:In itializati on:2 N' = {u} /*u is source node*/3 for all no des j /* j is dest no de*/4 if j adj ace nt to u5 then D(j) = c(u,j)6 else D(j) = g77 Loop8 find i not in N' such that D(i) is a minimum9 add i to N'10 update D(j) for all j adjace nt to i and not in N':11 D(j) = min( D(j), D(i) + c(i,j))12 /* new cost to j is either old cost to j or known13 shortest path cost to i plus cost from i to j */14 until all nodes in N'4.实验分析,回答下列问题(1)给出LSA算法的主要思想。
LSA 算法即链路状态选路算法, 该算法中,网络拓扑和所有的链路费用都是已知的。
它的具体实现依据Dijkstra 算法,其主要思想是计算从某节点(源节点, u )到网络中所有其他节点的最短路径。
其算法是迭代算法, 即经算法的第k 次迭代后,可知道到k 个目的节点的最低 费用路径,在在到所有目的节点的最低费用路径之中,这k 条路径具有k 个最低费用。
云南大学计算机网络工程实验
![云南大学计算机网络工程实验](https://img.taocdn.com/s3/m/ca2030ced1d233d4b14e852458fb770bf78a3baa.png)
云南大学计算机网络工程实验引言计算机网络工程实验是云南大学计算机网络工程专业的重要实践环节,旨在帮助学生通过实际操作掌握计算机网络相关的实验技能和知识。
本文档将介绍云南大学计算机网络工程实验的基本内容和实施步骤。
实验目的计算机网络工程实验的主要目的是培养学生的实验能力和动手能力,加深对计算机网络概念的理解,提升对计算机网络原理的应用能力。
通过实验,学生将能够掌握计算机网络的基本概念、网络协议的原理和应用,以及网络设备的配置和管理等技能。
实验内容云南大学计算机网络工程实验内容包括以下几个方面:1. 网络配置实验该实验主要包括网络连接配置、IP地址配置、子网划分和路由器配置等内容。
学生将学习如何配置网络设备,正确连接计算机网络,配置IP地址和子网掩码,实现网络间的通信。
2. 网络安全实验网络安全实验主要涉及网络攻击与防御的知识和技能。
学生将学习如何识别和应对常见的网络攻击方式,如DDoS攻击、SQL注入攻击等,并学习安全策略的制定和实施。
3. 网络性能实验网络性能实验主要针对网络带宽、延迟、丢包率等性能指标的测试与优化。
学生将学习使用网络性能测试工具,分析网络性能数据,并提出优化方案,改善网络的性能。
4. 网络应用实验在网络应用实验中,学生将学习如何配置和管理网络应用服务,如Web服务器、邮件服务器和文件传输服务器等。
通过实际操作,学生将了解如何搭建和管理各种网络应用服务。
实施步骤云南大学计算机网络工程实验的具体步骤如下:1.实验准备:根据实验要求,准备所需的实验设备和软件工具。
确保实验环境的正常运行。
2.实验设置:按照实验要求,配置实验环境。
包括网络设备的连接和配置,计算机的IP地址和子网掩码的配置等。
3.实验操作:根据实验指导书的要求,进行实验操作。
实验过程中需按照实验要求记录实验数据和结果。
4.实验分析:根据实验数据和结果,进行实验分析。
通过分析,找出问题所在,提出解决方案。
5.实验总结:总结实验过程中的经验和教训,归纳实验中的关键点和要点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
云南大学软件学院
实验报告
课程:计算机网络原理实验任课教师:
姓名:学号:专业:成绩:
实验二、应用层协议分析实验报告
1.实验目的:
分析HTTP协议报文的首部格式,理解HTTP协议的工作过程;分析DNS的工作过程。
2.实验环境:
(1)连入Internet的主机一台
(2)主机安装Ethereal软件
3.实验步骤:
a.下载一个非常简单的HTML文件(该文件不嵌入任何对象),利用Ethereal软件分析HTTP 协议。
(1)启动Web browser。
清空浏览器的缓存。
(2)启动Ethereal,开始Ethereal分组俘获。
(3)在打开的Web browser窗口中可输入下列地址之一
浏览器中将显示一个只有一行或多行文字的非常简单的HTML文件。
(4)停止分组俘获。
在显示过滤筛选说明处输入“http”,分组列表子窗口中将只显示所俘获到的HTTP报文。
将捕获结果保存为test1。
(5)根据结果回答下列问题回答实验a的问题。
实验b.下载一个含多个嵌入对象的网页,利用Ethereal软件分析HTTP协议。
(1)启动浏览器,将浏览器的缓存清空。
(2)启动Ethereal分组俘获器。
开始Ethereal分组俘获。
(3)在浏览器的地址栏中输入某个地址,(需要满足该地址下的网页是包含多个内嵌对象即可)。
(4)停止Ethereal分组俘获,在显示过滤筛选说明处输入“http”,分组列表子窗口中将只显示所俘获到的HTTP报文。
将捕获结果保存为test2
(5)重新启动Web browser。
启动Ethereal分组俘获器,进行分组捕获。
在Web browser 当中重新输入相同的URL或单击浏览器中的“刷新”按钮。
(6)步骤同(5)。
将捕获结果保存为test3
(7)根据结果回答下列问题回答实验b的问题。
实验c. DNS 实验
(1)在ms-dos 下,键入ipconfig/flushdns,清理并重设定DNS客户解析器缓存的内容。
(2)打开浏览器,并清空浏览器的缓存.
(3)打开Ethereal协议分析软件,在filter一栏输入 ip.address==”本机IP地址”,则该协议分析软件仅捕获从本机发送或发送到本机的数据包.
(4)开始捕获数据
(5)在浏览器的地址一栏输入任意一个Internet网址
(6)停止捕获数据,并显示分析结果。
将filter一栏输入DNS,即只查看DNS协议的内容。
(7)根据结果回答下列问题回答实验d的问题。
4.实验分析,回答下列问题。
实验a
(1)填写浏览器的输入的URL地址。
URL地址:/ethereal-labs/HTTP-ethereal-file1.html。
(2)打开test1的捕获文件,分析请求报文
请求行字段:
首部字段:
(3)打开test1的捕获文件,分析响应报文
状态行字段:
首部行字段:
(4)根据捕获的报文,填写相应的内容
实验b.
根据操作回答下面的问题。
(1)填写浏览器的输入的URL地址。
URL地址: 。
(2)分析test2的捕获文件,你的浏览器一共发出了多少个HTTP GET请求,每个GET 请求的对象是什么?这些请求被发送到的目的地的IP地址是多少?
(3)分析你的浏览器向服务器发出的第一个HTTP GET请求的内容,在该请求报文中,是否有一行是:IF-MODIFIED-SINCE?分析服务器响应报文的内容,服务器是否明确返回了文件的内容?如何获知?
没有;服务器明确返回了文件的内容,报文顶部视图里出现“HTTP/1.1 200 OK (text/html)”的字段,状态码为200
(4)分析捕获文件test3分析你的浏览器向服务器发出的第二个“HTTP GET”请求,在该请求报文中是否有一行是:IF-MODIFIED-SINCE?如果有,在该首部行后面跟着的信息是什么?
有;
信息:Thu, 20 Jan 2011 07:15:35 GMT。
(5)服务器对第二个HTTP GET请求的响应中的HTTP状态代码是多少?服务器是否明确返回了文件的内容?请解释。
状态代码:304;
服务器没有明确返回文件的内容,因为该响应报文中没有“Line-based text data: text/html”字段。
实验c.
(1)填写浏览器的输入的URL地址。
URL地址: 。
(2)定位到DNS查询报文和查询响应报文,这两种报文的发送是基于UDP还是基于TCP 的?DNS查询报文的目的端口号是多少?DNS查询响应报文的源端口号是多少?
基于UDP。
目的端口号:51402。
源端口号:53
(3)DNS查询报文发送的目的地的IP地址是多少?利用ipconfig命令(ipconfig/all)决定你主机的本地DNS服务器的IP地址。
这两个地址相同吗?
202.203.208.33,一样的
(4)填写相应的DNS报文各字段的值(选择两个相对应的DNS查询和响应报文即可,没有的字段可填无)
DNS 查询报文:
检查DNS查询报文,它是哪一类型的DNS查询?该查询报文中包含“answers”吗?
A类型,含有answer
DNS响应报文
检查DNS查询响应报文,其中提供了多少个“answers”?每个answers包含哪些内容?。