计算机网络原理.实验五

合集下载

网络原理实验报告

网络原理实验报告

网络原理实验报告网络原理实验报告一、引言网络原理是计算机科学中的重要基础知识,通过实验可以更好地理解和掌握网络的工作原理。

本实验报告旨在总结和分析我们在网络原理实验中所做的实验内容和实验结果。

二、实验目的本次实验的主要目的是通过搭建一个简单的局域网,了解和掌握网络的基本概念和工作原理。

具体实验内容包括网络拓扑结构的搭建、IP地址的配置、网络通信的测试等。

三、实验过程1. 网络拓扑结构的搭建我们使用了三台计算机和一个交换机来搭建一个简单的局域网。

首先,我们将三台计算机连接到交换机上,确保每台计算机都能够正常连接到交换机。

然后,我们通过配置交换机的端口,将这三台计算机连接在同一个局域网中。

2. IP地址的配置在搭建好网络拓扑结构后,我们需要为每台计算机配置IP地址,以便它们能够相互通信。

我们使用了静态IP地址的方式进行配置,为每台计算机分配了一个唯一的IP地址。

通过配置IP地址,我们可以实现计算机之间的互联和数据传输。

3. 网络通信的测试在完成网络拓扑结构的搭建和IP地址的配置后,我们进行了网络通信的测试。

我们通过在不同计算机上运行ping命令,测试计算机之间的连通性。

通过ping命令,我们可以发送一个网络数据包到目标计算机,并接收到该计算机的响应。

通过测试,我们可以判断网络是否正常工作。

四、实验结果与分析通过实验,我们成功搭建了一个简单的局域网,并配置了IP地址。

在进行网络通信测试时,我们发现所有计算机之间都能够正常通信,ping命令的结果都为成功。

这表明我们的网络拓扑结构和IP地址配置是正确的。

在实验过程中,我们还发现了一些问题。

首先,网络拓扑结构的搭建需要注意连接线的正确插入。

如果连接线插入不正确,计算机之间可能无法正常通信。

其次,IP地址的配置要确保每台计算机的IP地址不重复,并且属于同一个网段。

如果IP地址配置错误,计算机之间也无法正常通信。

通过本次实验,我们深入理解了网络的工作原理。

网络是由多台计算机通过网络设备连接在一起,通过IP地址进行通信的。

计算机网络实验报告(6篇)

计算机网络实验报告(6篇)

计算机网络实验报告(6篇)计算机网络实验报告(通用6篇)计算机网络实验报告篇1一、实验目的1、熟悉微机的各个部件;2、掌握将各个部件组装成一台主机的方法和步骤;3、掌握每个部件的安装方法;4、了解微型计算机系统的基本配置;5、熟悉并掌握DOS操作系统的使用;6、掌握文件、目录、路径等概念;7、掌握常用虚拟机软件的安装和使用;8、熟悉并掌握虚拟机上WINDOWS操作系统的安装方法及使用;9、掌握使用启动U盘的制作和U盘安装windows操作系统的方法;10、了解WINDOWS操作系统的基本配置和优化方法。

二、实验内容1.将微机的各个部件组装成一台主机;2.调试机器,使其正常工作;3.了解计算机系统的基本配置。

4.安装及使用虚拟机软件;5.安装WINDOWS7操作系统;6.常用DOS命令的使用;7.学会制作启动U盘和使用方法;8.WINDOWS7的基本操作;9.操作系统的基本设置和优化。

三、实验步骤(参照实验指导书上的内容,结合实验过程中做的具体内容,完成此项内容的撰写)四、思考与总结(写实验的心得体会等)计算机网络实验报告篇2windows平台逻辑层数据恢复一、实验目的:通过运用软件R-Studio_5.0和winhe_对误格式化的硬盘或者其他设备进行数据恢复,通过实验了解windows平台逻辑层误格式化数据恢复原理,能够深入理解并掌握数据恢复软件的使用方法,并能熟练运用这些软件对存储设备设备进行数据恢复。

二、实验要求:运用软件R-Studio_5.0和winhe_对电脑磁盘或者自己的U盘中的删除的数据文件进行恢复,对各种文件进行多次尝试,音频文件、系统文件、文档文件等,对简单删除和格式化的磁盘文件分别恢复,并检查和验证恢复结果,分析两个软件的数据恢复功能差异与优势,进一步熟悉存储介质数据修复和恢复方法及过程,提高自身的对存储介质逻辑层恢复技能。

三、实验环境和设备:(1)Windows _P 或Windows 20__ Professional操作系统。

实验五 无线局域网的组建及共享上网

实验五  无线局域网的组建及共享上网

实验五 无线局域网的组建及共享上网一、实验目的(1)掌握Internet 连接共享的安装设置(2)掌握无线路由器的配置及无线网卡的安装二、实验理论基础在服务器(指直接连接到internet 的计算机)上设置“允许其他网络用户通过此计算机的Internet 连接来连接”,在客户机上对TCP/IP 进址进行适当设置。

三、实验设备及环境计算机2台/人,无线路由器1台/组,无线网卡1个/人。

实验环境(1)实验室网络环境IP :192.168.0.x掩码:255.255.255.0网关:192.168.0.254(2)四、实验内容及步骤1、无线路由器的配置(已配置)(1)连接图:用一条直通线将无线路由器(接无线路由器的LAN 口)与计算机相连。

(2)无线路由器的LAN 口的默认IP 地址为:192.168.1.1(不需要改动)。

设定计算机的IP 地址为192.168.1.X ,掩码为:255.255.255.0,网关:192.168.1.1。

内网客户机配置:(3)在计算机上启动IE,在地址栏上输入:http://192.168.1.1用户名:admin密码:admin(请不要任意改动)(4)按实验图配置无线路由器的IP地址,并启用无线功能2、无线网卡驱动程序的安装及配置。

首先安装无线网卡的驱动程序。

运行无线网卡的应用程序。

按照实验图配置IP地址,并验证服务器可以通过无线网卡上网。

3、在服务器上配置共享上网服务器,右击“网上邻居”—“属性”,在“网络任务”中选“设置家庭和小型办公网络”。

然后按照向导完成安装。

注意:①要记得哪一个网卡是连接到Interne,哪一个网卡是连接到专用网络(即内网)。

②192.168.0.254是本实验室出口网关③安装完成后重新启动机器,并注意此时内置网卡的IP地址将修改为192.168.0.1,将它改为192.168.XX.1并查看内置网卡上否已有共享4、测试:①用PING命令,测试服务器是否与无线路由器连通,同组计算机进行是否连能: ping 192.168.1.1②在服务器和客户机上运行:ping 172.16.24.254,能连通。

2024版《计算机网络》实验指导书

2024版《计算机网络》实验指导书
3. 基本网络命令使用
使用`tracert`命令跟踪路 由路径
使用`ping`命令测试网络 连通性
使用`netstat`命令查看网 络连接状态
实验结果与分析
1. 网络配置结果 展示主机名、IP地址、子网掩码和默
认网关的配置结果 2. TCP/IP协议分析结果
展示捕获的数据包,并分析各层协议 头部信息,包括源/目的IP地址、源/ 目的端口号、协议类型等
01 1. 环境搭建
02
安装和配置实验所需的软件和工具,如虚拟机、操作系
统、网络模拟器等;
03
构建实验网络拓扑,包括内部网络、外部网络和防火墙
等组成部分。
实验内容和步骤
2. 防火墙配置
选择一种防火墙软件或设备,如iptables、pfSense等; 配置防火墙规则,包括访问控制列表(ACL)、网络地址转换(NAT)、 端口转发等;
1. 连接路由器和交换机, 并启动设备
实验步骤
01
03 02
实验内容和步骤
3. 配置路由器接口,并启用路由协议 4. 配置交换机VLAN,并启用STP 5. 验证配置结果,确保网络连通性
实验结果与分析
01
实验结果
02
路由器和交换机配置成功,网络连通性良好
03
各设备运行状态正常,无故障提示
04
分析
02 如何提高网络服务器的安全性和稳定性?
03
如何优化网络服务器的性能?
04
在实际应用中,如何管理和维护网络服务 器?
05
实验五:网络安全与防火 墙配置
实验目的和要求
理解和掌握网络安全的基本概念和原 理;
通过实验,了解防火墙在网络安全中 的作用和重要性。

《计算机网络》实验报告

《计算机网络》实验报告

一、实验目的1. 理解计算机网络的基本概念和结构。

2. 掌握网络设备的配置方法,包括交换机、路由器等。

3. 学习网络协议的作用和配置方法,如TCP/IP、DHCP等。

4. 通过实验加深对网络故障诊断和排除能力的培养。

二、实验内容1. 实验环境实验设备:一台PC机、一台交换机、一台路由器、双绞线、网线等。

实验软件:Windows操作系统、网络管理软件等。

2. 实验步骤(1)网络设备连接首先,将PC机通过网线连接到交换机的一个端口上。

然后,将交换机的另一个端口连接到路由器的WAN口。

最后,将路由器的LAN口连接到PC机的另一台交换机上。

(2)网络设备配置①交换机配置进入交换机命令行界面,配置交换机的基本参数,如VLAN ID、IP地址、子网掩码等。

②路由器配置进入路由器命令行界面,配置路由器的接口参数,如WAN口和LAN口的IP地址、子网掩码等。

同时,配置路由协议,如静态路由、动态路由等。

③PC机配置在PC机的网络设置中,将IP地址、子网掩码、默认网关等信息设置为与路由器LAN口相同的参数。

(3)网络测试①测试PC机与交换机之间的连通性在PC机中ping交换机的IP地址,检查PC机是否能够与交换机通信。

②测试PC机与路由器之间的连通性在PC机中ping路由器的IP地址,检查PC机是否能够与路由器通信。

③测试不同VLAN之间的连通性在PC机中ping另一个VLAN中的设备,检查不同VLAN之间的设备是否能够相互通信。

三、实验结果与分析1. 实验结果(1)PC机与交换机之间连通(2)PC机与路由器之间连通(3)不同VLAN之间的设备相互通信2. 实验分析通过本次实验,我们成功搭建了一个简单的计算机网络,并掌握了网络设备的配置方法。

在实验过程中,我们遇到了一些问题,如网络设备之间的连通性、VLAN之间的通信等。

通过查阅资料和调试,我们解决了这些问题,加深了对计算机网络的理解。

四、实验总结1. 通过本次实验,我们了解了计算机网络的基本概念和结构,掌握了网络设备的配置方法。

计算机网络实验五网络层协议分析实验报告

计算机网络实验五网络层协议分析实验报告

南昌航空大学实验报告年月日课程名称:计算机网络与通信实验名称:网络层协议分析班级:学生姓名:邓佳威学号: 2212893107 指导教师评定:签名:一、实验目的分析ARP协议报文首部格式及其解析过程;分析ICMP报文格式和协议内容并了解其应用;分析IP报文格式、IP地址的分类和IP层的路由功能;分析TCP/IP协议中网络层的分片过程。

二、实验内容(一)ARP协议分析1.实验原理(1)ARP协议ARP(address resolution protocol)是地址解析协议的简称,在实际通信中,物理网络使用硬件地址进行报文传输,IP地址不能被物理网络所识别。

所以必须建立两种地址的映射关系,这一过程称为地址解析。

用于将IP地址解析成硬件地址的协议就被称为地址解析协议(ARP协议)。

ARP是动态协议,就是说这个过程是自动完成的。

在每台使用ARP的主机中,都保留了一个专用的内存区(称为缓存),存放最近的IP地址与硬件地址的对应关系。

一旦收到ARP应答,主机就将获得的IP地址和硬件地址的对应关系存到缓存中。

当发送报文时,首先去缓存中查找相应的项,如果找到相应项后,遍将报文直接发送出去;如果找不到,在利用ARP进行解析。

ARP缓存信息在一定时间内有效,过期不更新就会被删除。

(2)同一网段的ARP解析过程处在同一网段或不同网段的主机进行通信时,利用ARP协议进行地址解析的过程不同。

在同一网段内通信时,如果在ARP缓存中查找不到对方主机的硬件地址,则源主机直接发送ARP 请求报文,目的主机对此请求报文作出应答即可。

(3)不同网段的ARP解析过程位于不同网段的主机进行通信时,源主机只需将报文发送给它的默认网关,即只需查找或解析自己的默认网关地址即可。

(二)ICMP协议分析1.实验原理(1)ICMP协议ICMP(internet control message protocol)是因特网控制报文协议[RFC792]的缩写,是因特网的标准协议。

计算机网络实践实验报告

计算机网络实践实验报告

《计算机网络实践实验报告》实验一:传输介质的实验实验思考题:1.左右两侧线序完全一致,但不是标准线序。

问:能否当正线使用?2.8根线中有4根是实际用于数据传输。

问:是哪4根?3.直通线和交叉线实际的应用环境是什么?4.列出3中功能不同的测线仪,并简述其功能。

实验二:常用网络命令介绍实验思考题:1.如何通过常用网络命令判断目标主机的操作系统?2.作为一名网管,应对于网络拓扑有详尽的了解。

如何通过网络命令判断故障点。

3.分析网关的作用。

实验三:在Windows Server 2003 环境下配置WWW服务实验思考题:1.WWW服务的支撑组件事ISS,最新的IIS版本是什么?支撑WWW所必须的IIS组件事什么?(internet信息服务管理器公用文件万维网服务)2.同一IP能否搭配两个或多个WWW服务器?能3.如何设计非80端口访问服务器?默认网站右键属性tcp端口浏览器输入http://10.0.56.77:80804.Windows 默认的站点主目录是什么?C:\Inetpub\wwwroot5.描述hTTP协议工作的过称及原理。

实验四:在Windows Server 2003 下搭建DNS 服务器实验思考题:1.把本机搭成DNS服务器,能否为主机某一网站分配两个或多个域名?能2.在同一DNS服务器内,能否为不同的网站(不同的IP)分配相同的域名?不能3.在实验实内为本机安装了DNS组件,但没有添加任何记录。

在TCP/IP 属性里,将本机的IP设成唯一的DNS 服务器。

在外网连通的情况下,你能否通过域名访问百度网站?不能4.在TCP/IP属性里面,将本机IP设成唯一DNS服务器,在外网连通的情况下,能否通过域名访问百度网站。

不能5.某主机IP掩码网关配置正常,未设DNS服务器,该主机能否访问某一网站,如可以,通过什么来访问?能通过代理访问6.反向搜索区域的作用实验五:搭建DHCP实验思考题:1. 能否通过交换机充当DHCP服务器?如可以,用二层交换机还是三层交换机?2. DHCP服务器的IP是否必须要和IP值在同一子网,说明原因,如果在同一子网,该IP是否需要做排除?如果不做排除,地址租约中会出现什么样的效果?3. 设计一个实验,使租约生效。

哈工大计算机网络实验报告之五

哈工大计算机网络实验报告之五

计算机网络课程实验报告实验5:利用Ethereal分析TCP、UDP、ICMP协议实验过程:使用Ethereal分析TCP协议: (15分)得分:抓取本机与http://gaia。

/ethereal—labs/alice。

txt通信过程中的网络数据包.根据操作思考以下问题:●客户服务器之间用于初始化TCP连接的TCP SYN报文段的序号(sequence number)是多少?在该报文段中,是用什么来标示该报文段是SYN报文段的?Seq=0Flags中的syn位为1,ack位为0,说明是syn报文段●服务器向客户端发送的SYNACK报文段序号是多少?该报文段中,Acknowledgement字段的值是多少?Gaia.cs。

umass。

edu服务器是如何决定此值的?在该报文段中,是用什么来标示该报文段是SYNACK报文段的?Seq=0Ack=1,服务器根据客户端发送的SYN报文的Seq值加一后得到此值Flags中的Ack和Syn位都为1,所以是SYNACK报文●如果将包含HTTP POST命令的TCP报文段看作是TCP连接上的第一个报文段,那么该TCP连接上客户机向服务器发送的第六个报文段的序号是多少?是何时发送的?该报文段所对应的ACK是何时接收的?第六个报文段:对应的ack报文段:23号报文时第六个报文,seq=6310,发送时间:Jun 1,2013 13:32:56.587941000 对应的ack报文段接收时间Jun 1,2013 13:32:56.993379000●前六个TCP报文段的长度各是多少?在整个文件发送过程中,接受方公示的窗口大小是否变化?窗口大小代表什么含义?(可参考教科书“流量控制”一节)首个报文段长度为555,其余都为1506,接收方窗口长度是变化的.它代表接收方端口上缓冲区空闲空间的大小,显示其接受能力●TCP连接的throughput (bytes transferred per unit time)是多少?请写出你的计算过程.(不必给出计算结果,表达出计算的思路即可)TCP连接发送报文的数据字节总数÷发送数据报总时间●实验结论,以及实验中遇到的其他问题是如何解决的?结论:tcp协议在建立连接时要经历三次握手过程;当tcp连接需要发送比较大块的数据时,会将其分割成若干份数据报发送.Tcp协议利用窗口大小来实现端到端的流量控制问题:实验课后到四楼机房重做实验发现那里的网络不适合做这次实验(在那研究了一个小时),后来用自己电脑回到寝室做实验比较顺利。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验五、传输层可靠传输协议GBN编程实验报告序号:姓名:学号:成绩一、实验目的:1、编程实现简单可靠的数据传输GBN协议,模拟可靠数据传输2、理解TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。

二、实验指导:参考教材。

三、实验要求:编程实现一个GBN传输协议,采用编程语言不限,要求能将发送――接收流程以及处理方法表现出来.附源代码及注释并附上实验结果截图。

#include <stdio.h>#define BIDIRECTIONAL 0 /* change to 1 if you're doing extra credit *//* and write a routine called B_output */ 如果你想做酷文解码和写一个程序叫B_output就改变值为0/* a "msg" is the data unit passed from layer 5 (teachers code) to layer */ /* 4 (students' code). It contains the data (characters) to be delivered */ /* to layer 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 layer */ /* 3 (teachers code). Note the pre-defined packet structure, which all */ /* students must follow. */ 一个数据包从第四层传送到第三层的数据单元,声明提前定义的学生必须遵守的数据包结构struct pkt/*定义结构体*/ {int seqnum;int acknum;int checksum;char payload[20];};/********* STUDENTS WRITE THE NEXT SEVEN ROUTINES *********/#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 1int expectedseqnum; /* expected sequence number at receiver side */ 在接收端预期序列号int nextseqnum; /* next sequence number to use in sender side */ 下一个序号在发送方使用int base; /* the head of sender window */发送方窗口的负责人struct pkt winbuf[WINDOWSIZE]; /* window packets buffer */窗口包缓冲区int winfront,winrear; /* front and rear points of window buffer */ 前后点的窗口缓冲区int pktnum; /* packet number of window buffer */包数量的窗口缓冲区struct msg buffer[MAXBUFSIZE]; /* sender message buffer */发送消息缓冲区int buffront,bufrear; /* front and rear pointers of buffer */前方和后方的缓冲区的指针int msgnum; /* message number of buffer */消息数量的缓冲int packet_lost =0;int packet_corrupt=0;int packet_sent =0;int packet_correct=0;int packet_resent =0;int packet_timeout=0;void ComputeChecksum(packet)//计算校验和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(packet)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 */A_output(message)来自第五层,通过数据派往另一边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];/* 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 ++;}}}//B端向外发送数据B_output(message) /* need be completed only for extra credit */struct msg message;{}/* called from layer 3, when a packet arrives for layer 4 */A_input(packet)struct pkt packet;{struct pkt sendpkt;int i;/* if received packet is not corrupted and ACK is received */ 如果收到的数据包并没有破坏和收到ACK应答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 */删除ack数据包从窗口缓冲区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 ("send new packets!\n");}/* 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");}/* called when A's timer goes off */称当一个的计时器响起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]);}}/* the following routine will be called once (only) before any other *//* entity A routines are called. You can use it to do any initialization */A_init(){base = 0;nextseqnum = 0;buffront = 0;bufrear = 0;msgnum = 0;winfront = 0;winrear = 0;pktnum = 0;}/* 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*/B_input(packet)//B接收数据包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("----B: packet %d is correctly received, send ACK!\n",packet.seqnum);/* send an ACK for the received packet */发送ACK数据包的响应/* 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;/* deliver received packet to layer 5 */收到第5层的包tolayer5(B,packet.payload);}/* otherwise, discard the packet and send a NACK */否则,丢弃封包和发送NACKelse {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);}}/* called when B's timer goes off */B时调用计时器响起B_timerinterrupt(){}/* the following rouytine will be called once (only) before any other *//* entity B routines are called. You can use it to do any initialization */B_init(){expectedseqnum = 0;}/********************************************************************************** NETWORK EMULATION CODE STARTS BELOW ***********The code below emulates the layer 3 and below network environment:- emulates the tranmission and delivery (possibly with bit-level corruption and packet loss) of packets across the layer 3/4 interface- handles the starting/stopping of a timer, and generates timerinterrupts (resulting in calling students timer handler).- generates message to be sent (passed from later 5 to 4)THERE IS NOT REASON THAT ANY STUDENT SHOULD HAVE TO READ OR UNDERSTANDTHE CODE BELOW. YOU SHOLD NOT TOUCH, OR REFERENCE (in your code) ANYOF THE DATA STRUCTURES BELOW. If you're interested in how I designedthe emulator, you're welcome to look at the code - but again, you should have to, and you defeinitely should not have to modify******************************************************************/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;};struct event *evlist = NULL; /* the event list */事件列表/* possible events: */#define TIMER_INTERRUPT 0#define FROM_LAYER5 1#define FROM_LAYER3 2#define OFF 0#define ON 1#define A 0#define B 1int TRACE = 1; /* for my debugging */int nsim = 0; /* number of messages from 5 to 4 so far */消息数量从5到4到目前为止int nsimmax = 0; /* number of msgs to generate, then stop */数量的短信息来生成,然后停止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 */消息从第5层的到达率int ntolayer3; /* number sent into layer 3 */号码发送到第三层int nlost; /* number lost in media */号码丢失int ncorrupt; /* number corrupted by media*/号码败坏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 */ 填写msg给一系列相同的字母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);elseB_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);}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("Enter packet loss probability [enter 0.0 for no loss]:");fscanf(fp, "%f",&lossprob);//scanf("%f",&lossprob);printf("Enter packet corruption probability [0.0 for no corruption]:");fscanf(fp,"%f",&corruptprob);//scanf("%f",&corruptprob);printf("Enter average time between messages from sender's layer5 [ > 0.0]:"); fscanf(fp,"%f",&lambda);//scanf("%f",&lambda);printf("Enter TRACE:");fscanf(fp,"%d",&TRACE);//scanf("%d",&TRACE);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] */jimsrand()应该统一在[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(1);}ntolayer3 = 0;nlost = 0;ncorrupt = 0;time=0.0; /* initialize time to 0.0 */初始化时间0.0generate_next_arrival(); /* initialize event list */初始化事件列表}/****************************************************************************//* jimsrand(): return a float in range [0,1]. The routine below is used to *//* isolate all random number generation in one location. We assume that the*//* system-supplied rand() function return an int in therange [0,mmm] *//****************************************************************************/ float jimsrand(){double mmm = 65535; /* largest int 2147483647 65535 - MACHINE DEPENDENT!!!!!!!! */最大的int 2147483647 65535 -依赖机器float x; /* individual students may need to change mmm */x = rand()/mmm; /* x should be uniform in [0,1] */x应该统一在[0,1] return(x);}/********************* EVENT HANDLINE ROUTINES ****2147483647***//* The next set of routines handle the event list *//*****************************************************/generate_next_arrival(){double x,log(),ceil();struct event *evptr;char *malloc();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] */x应该统一在[0,1] /* having mean of lambda */平均lambdaevptr = (struct event *)malloc(sizeof(struct event));evptr->evtime = time + x;evptr->evtype = FROM_LAYER5;if (BIDIRECTIONAL && (jimsrand()>0.5) )evptr->eventity = B;elseevptr->eventity = A;insertevent(evptr);}insertevent(p)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 */问点前的列表,在其中p struct插入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;}}}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");}/********************** Student-callable ROUTINES ***********************//* called by students routine to cancel a previously-started timer */stoptimer(AorB)int AorB; /* A or B is trying to stop timer */阻止定时器{struct event *q,*qold;if (TRACE>2)printf(" STOP TIMER: stopping timer at %f\n",time);/* 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 list */删除第一个也是唯一的活动列表else 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");}starttimer(AorB,increment)int AorB; /* A or B is trying to stop timer */时间停止器float increment;{struct event *q;struct event *evptr;char *malloc();if (TRACE>2)printf(" 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);}/************************** TOLAYER3 ***************/tolayer3(AorB,packet)int AorB; /* A or B is trying to stop timer */A或B是试图阻止定时器struct pkt packet;{struct pkt *mypktptr;struct event *evptr,*q;char *malloc();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("\n");}/* 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 */从layer3数据包将弹出evptr->eventity = (AorB+1) % 2; /* event occurs at other entity */事件发生在其他实体evptr->pktptr = mypktptr; /* save ptr to my copy of packet */复制ptr /* finally, compute the arrival time of packet at the other end.最后,计算到达时间的包在另一端。

相关文档
最新文档