计算机网络原理.实验五
网络原理实验报告
网络原理实验报告网络原理实验报告一、引言网络原理是计算机科学中的重要基础知识,通过实验可以更好地理解和掌握网络的工作原理。
本实验报告旨在总结和分析我们在网络原理实验中所做的实验内容和实验结果。
二、实验目的本次实验的主要目的是通过搭建一个简单的局域网,了解和掌握网络的基本概念和工作原理。
具体实验内容包括网络拓扑结构的搭建、IP地址的配置、网络通信的测试等。
三、实验过程1. 网络拓扑结构的搭建我们使用了三台计算机和一个交换机来搭建一个简单的局域网。
首先,我们将三台计算机连接到交换机上,确保每台计算机都能够正常连接到交换机。
然后,我们通过配置交换机的端口,将这三台计算机连接在同一个局域网中。
2. IP地址的配置在搭建好网络拓扑结构后,我们需要为每台计算机配置IP地址,以便它们能够相互通信。
我们使用了静态IP地址的方式进行配置,为每台计算机分配了一个唯一的IP地址。
通过配置IP地址,我们可以实现计算机之间的互联和数据传输。
3. 网络通信的测试在完成网络拓扑结构的搭建和IP地址的配置后,我们进行了网络通信的测试。
我们通过在不同计算机上运行ping命令,测试计算机之间的连通性。
通过ping命令,我们可以发送一个网络数据包到目标计算机,并接收到该计算机的响应。
通过测试,我们可以判断网络是否正常工作。
四、实验结果与分析通过实验,我们成功搭建了一个简单的局域网,并配置了IP地址。
在进行网络通信测试时,我们发现所有计算机之间都能够正常通信,ping命令的结果都为成功。
这表明我们的网络拓扑结构和IP地址配置是正确的。
在实验过程中,我们还发现了一些问题。
首先,网络拓扑结构的搭建需要注意连接线的正确插入。
如果连接线插入不正确,计算机之间可能无法正常通信。
其次,IP地址的配置要确保每台计算机的IP地址不重复,并且属于同一个网段。
如果IP地址配置错误,计算机之间也无法正常通信。
通过本次实验,我们深入理解了网络的工作原理。
网络是由多台计算机通过网络设备连接在一起,通过IP地址进行通信的。
计算机网络实验报告(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版《计算机网络》实验指导书
使用`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协议利用窗口大小来实现端到端的流量控制问题:实验课后到四楼机房重做实验发现那里的网络不适合做这次实验(在那研究了一个小时),后来用自己电脑回到寝室做实验比较顺利。
计算机网络实验报告(样板)
计算机网络实验报告学院名称:电子信息学院班级:*************学号:*************学生姓名:*************指导教师: *************2013年*月*日实验二组建WINDOWS环境下的对等网并共享资源一、实验目的1、利用网络设备,学生自己组成局域网,培养学生的动手能力。
2、掌握基本的网络参数的配置,学会使用基本的测试命令来检测网络的配置情况。
3、掌握对等网环境下软硬件共享的设置和使用方法。
4、了解一些安全访问选项的设置和取消操作。
二、实验属性验证性实验。
三、实验仪器设备及器材实验要求有若干台安装Windows XP的计算机,每台计算机都要安装网卡。
D-link DES-1024R+交换机两台,直通线、交叉线若干。
四、实验要求1、预习报告中需解决以下问题:(1)掌握TCP/IP的基本配置过程(2)了解交换机的工作特性(3)注意ping命令的使用方法及参数以及结果显示中各参数表示的含义。
(4)掌握对等网环境下软硬件共享的设置和使用方法。
2、试验中正确使用仪器设备,独立操作。
3、试验后按规定要求写出实验报告。
五、实验原理1、网卡的作用计算机与外界局域网的连接是通过主机箱内插入一块网络接口板的。
网络接口板又称为通信适配器(adapter)或网络接口卡NIC (Network Interface Card),或“网卡”。
网卡的重要功能是进行串行/并行转换,对数据进行缓存,实现以太网协议等。
2、交换机的作用交换式集线器常称为以太网交换机(switch)或第二层交换机,它实质上就是一个多端口的网桥,可见交换机工作在数据链路层。
交换机能同时连通许多对的端口,使每一对相互通信的主机都能像独占通信媒体那样,进行无碰撞地传输数据,因此它是独享信道的通信设备。
3、对等网的建立主要是为了实现计算机的资源的共享。
文件夹共享名称可与本地文件夹名称相同,也可以不同。
Windows XP提供3种访问权限类型。
计算机网络实验 (5)精选全文完整版
可编辑修改精选全文完整版计算机网络实验1. 编程实验(使用NetRiver实验系统)(1)滑动窗口协议实验(见实验指导书的实验1,只做回退N帧实验)(2)IPv4协议收发实验(见实验指导书的实验2)(3)IPv4协议转发实验(见实验指导书的实验3)每位同学只做其中的一个实验,学号mod 3 = 0、1、2的同学分别做实验1、2、3。
程序应通过测试服务器的测试;程序及实验报告应提交到管理服务器供检查。
实验报告包括以下几部分内容:实验目的,协议的工作原理或处理要求,程序流程图。
提交的代码应有必要的注释。
2. 交互式实验(使用NetRiver实验系统)(1)IPv4协议交互实验(见实验指导书的实验11)(2)TCP协议交互实验(见实验指导书的实验14)该实验所有同学都要做。
服务器会自动记录实验结果,不需提交实验报告。
3. 观察实验(使用协议分析工具Wireshark)该实验所有同学都要做。
3.1观察IEEE 802.3帧结构进行实验的主机运行Windows XP操作系统。
通过Wireshark将实验主机的网卡设置为通常模式(非混杂模式),捕捉以下场景中的数据帧:先在命令行下用arp –d命令删除实验主机上的所有ARP表项,接着立即用web浏览器访问Internet上的站点。
1)依次查看捕获的各数据帧,看看目的地为实验主机的数据帧中长度最小的是多大;查看这种帧的各个域,看看前导码是否包含在记录的数据中;记录的数据是从哪个字段开始,至哪个字段结束;这是否验证了IEEE 802.3标准中规定的最小帧长为64字节?2)查看捕获的帧中长度最长的帧。
可以多访问一些网页以捕获更多的帧,看看这些帧的长度最大是多少?为什么?3)查看捕获的数据帧中由实验主机发出的ARP请求帧,查看封装该ARP 请求帧的以太帧的目的地址是多少,源地址是多少;再用ipconfig –all命令查看实验主机的MAC地址,看看是否和源地址一致。
计算机网络实验报告
计算机网络实验报告计算机网络实验报告引言:计算机网络是现代社会的重要组成部分,它连接了各种设备和系统,实现了信息的传输和共享。
在计算机网络实验中,我们通过实际操作和观察,深入了解了网络通信原理、协议和技术。
本篇实验报告将对我们进行的计算机网络实验进行总结和分析,以及实验中遇到的问题和解决方法。
实验一:网络拓扑结构在本实验中,我们学习了计算机网络的拓扑结构,包括总线型、星型、环型和网状型等。
通过搭建不同拓扑结构的网络,我们深入理解了各种结构的优缺点和适用场景。
例如,总线型拓扑结构简单易懂,但容易出现单点故障;而星型拓扑结构可靠性较高,但需要大量的物理连接。
实验二:网络协议分析在本实验中,我们学习了常见的网络协议,如TCP/IP、HTTP和FTP等。
通过抓包和分析网络数据包,我们了解了协议的工作原理和通信过程。
例如,TCP/IP协议是互联网的核心协议,它通过IP地址和端口号实现了可靠的数据传输;HTTP协议是应用层协议,用于在客户端和服务器之间传输超文本。
实验三:网络安全与防护在本实验中,我们学习了网络安全的基本概念和常见的攻击手段,如DDoS、SQL注入和跨站脚本等。
通过搭建防火墙和入侵检测系统,我们学会了如何保护网络安全。
例如,防火墙可以通过过滤规则,控制网络流量的进出;入侵检测系统可以监测网络中的异常行为,并及时作出响应。
实验四:无线网络实践在本实验中,我们学习了无线网络的工作原理和配置方法。
通过配置无线路由器和接入点,我们实现了无线网络的搭建和连接。
例如,无线网络使用无线电波进行通信,需要设置SSID和密码来保护网络安全;无线网络的覆盖范围受到信号强度和障碍物的影响,需要合理布置设备位置。
实验五:网络性能测试在本实验中,我们学习了网络性能测试的方法和工具。
通过使用ping、traceroute和iperf等工具,我们测试了网络的延迟、丢包率和带宽等性能指标。
例如,ping命令可以测试网络的延迟和丢包情况;iperf命令可以测试网络的带宽和吞吐量。
计算机网络实验内容和报告模板
计算机网络原理与应用实验报告姓名班级学号实验时间年度第学期实验一:差错检测实验实验时间:年月日第周星期【实验目的】循环冗余检验码CRC具有检错能力强的特点,计算机网络中普遍采用它进行差错检测。
通过编写循环冗余码计算和检测的程序,掌握差错检测的实现方法。
【实验学时】4【实验内容】使用生成多项式CRC-16=X16+X15+X2+1(1)编写循环冗余码的计算程序,对任意输入的信息块生成实际传输的码字;(2)编写循环冗余码的检测程序,对任意输入的码字报告出错与否。
【实验环境】PC机一台, windows 操作系统,C语言编程环境【实验步骤】(这里填写CRC校验码计算的算法)【实验结果】(这里给出CRC-16校验码计算和校验的源程序代码)成绩评定指导老师实验二:网络传输介质与应用实验实验时间:年月日第周星期【实验目的】了解双绞线的制作标准,掌握双绞线的制作过程及应用。
【实验学时】4【实验内容】(1)遵照标准EIA/TIA 568B线序练习用于连接计算机和集线器之间的直通线的制作;(2)遵照标准EIA/TIA 568A线序练习用于连接计算机与计算机的交叉双绞线的制作;(3)用通断仪进行测量。
1 2 3 4 5 6 7 8注:EIA/TIA 568B线序:橙白橙绿白蓝蓝白绿棕白棕EIA/TIA 568A线序:绿白绿橙白蓝蓝白橙棕白棕【实验环境】双绞线,水晶头,压线钳若干,通断仪一个【实验步骤】(填写双绞线的制作步骤)【实验结果】(供记录实验数据、观察或计算结果以及本次试验后对有关知识点的理解和收获)思考题:直通线和交叉线各用于什么场合,为什么在这些场合需要这样制作双绞线?成绩评定指导老师实验三:交换实验实验时间:年月日第周星期【实验目的】配置型实验,主要目的:(1)理解交换机的工作原理,掌握锐捷交换机的基本配置命令(2)理解VLAN的技术原理,掌握VLAN配置的命令(3)理解冗余链路,掌握相关命令【实验学时】4【实验内容】(一)交换机配置与VLAN划分实验:锐捷网络实验交换实验1和交换实验2(1)实现图1中两台主机的端口隔离(2)实现图2中跨交换机的VLAN配置(二)交换机间Trunk配置实验:锐捷网络交换实验3【实验环境】锐捷实验环境,Windows操作系统【实验步骤】(供填写完成实验的命令、动作或实验软硬件的设置)【实验结果】(这里填写,本次试验后对交换技术以及VLAN技术的理解)成绩评定指导老师实验四:路由器配置实验实验时间:年月日第周星期【实验目的】配置型实验,主要目的:(1)了解启用路由器需要的配置以及相关命令(2)理解三层交换机的作用/工作原理,了解启用三层交换机所需的配置命令【实验学时】4【实验内容】(1)锐捷路由实验部分的实验4,路由器的基本配置(2)锐捷路由实验部分的实验5,三层交换机的基本配置(3)锐捷路由实验部分的实验6,利用三层交换机实现不同VLAN间通信(4)将(3)实验中的三层交换机换成路由器,完成连通配置【实验环境】锐捷网络实验室【实验步骤】(供填写完成实验的命令、动作或实验软硬件的设置)【实验结果】(没有需要填写的实验结果)成绩评定指导老师实验五:TCP/IP配置与实用程序实验时间:年月日第周星期【实验目的】(1)掌握windows系统中TCP/IP协议的配置方法(2)了解网络实用程序的用途/用法。
计算机网络第5次实验-应用层协议分析
贵州大学实验报告学院:专业:班级:姓名学号实验组实验时间2011-11-28 指导教师成绩实验项目名称应用层协议分析实验目的1.掌握应用层协议HTTP数据包的组成;2.掌握HTTP数据包头各字段的含义。
实验要求1.要求掌握应用层协议HTTP数据包的组成部分;2.要求掌握HTTP数据包头各字段的含义。
实验原理HTTP报文由三个部分组成,即开始行、首部行和实体主体。
HTTP请求报文格式如图5.1所示。
图5.1 HTTP请求报文格式在请求报文中,开始行就是请求行。
“方法”是面向对象技术中使用的专门名词。
所谓“方法”就是对所请求的对象进行的操作,因此这些方法实际上也就是一些命令。
因此,请求报文的类型是由它所采用的方法决定的。
请求方法(所有方法全为大写)有多种,各个方法的解释如下:GET 请求获取Request-URI 所标识的资源POST 在Request-URI 所标识的资源后附加新的数据HEAD 请求获取由Request-URI 所标识的资源的响应消息报头PUT 请求服务器存储一个资源,并用Request-URI 作为其标识DELETE 请求服务器删除Request-URI 所标识的资源TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断CONNECT 保留将来使用OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求“URL”是所请求的资源的URL。
“版本”是HTTP 的版本。
HTTP响应报文格式如图5.2所示。
图5.2 HTTP响应报文格式响应报文的开始行是状态行。
状态行包括三项内容,即HTTP 的版本,状态码,以及解释状态码的简单短语。
状态码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:1xx:指示信息--表示请求已接收,继续处理2.选择网卡:点击“Capture->Interface”,出现如下对话框:3.开始数据捕获:选择Broadcom NetXtreme Gigabit Ethernet Driver(Microsoft’s Packet Scheduler)对应的Capture按钮,就开始捕获数据包,出现如下对话框。
哈工大计算机网络实验报告之五
计算机网络课程实验报告实验5:利用Ethereal分析TCP、UDP、ICMP协议实验过程:使用Ethereal分析TCP协议: (15分)得分:抓取本机与/ethereal-labs/alice.txt通信过程中的网络数据包。
根据操作思考以下问题:●客户服务器之间用于初始化TCP连接的TCP SYN报文段的序号(sequence number)是多少?在该报文段中,是用什么来标示该报文段是SYN报文段的?Seq=0Flags中的syn位为1,ack位为0,说明是syn报文段●服务器向客户端发送的SYNACK报文段序号是多少?该报文段中,Acknowledgement字段的值是多少?服务器是如何决定此值的?在该报文段中,是用什么来标示该报文段是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)是多少?请写出你的计算过程。
云南大学 软件学院 计网实验5
云南大学软件学院实验报告课程:计算机网络原理实验任课教师:姓名:学号:专业:成绩:实验五、传输层可靠传输协议GBN编程实验报告一、实验目的:1、编程实现简单可靠的数据传输GBN协议,模拟可靠数据传输2、理解TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。
二、实验指导:参考教材。
三、实验要求:编程实现一个GBN传输协议,采用编程语言不限,要求能将发送――接收流程以及处理方法表现出来.附源代码及注释并附上实验结果截图。
#include <stdio.h>/* ******************************************************************ALTERNATING BIT AND GO-BACK-N NETWORK EMULATOR: VERSION 1.1 J.F.KuroseThis code should be used for PA2, unidirectional or bidirectionaldata transfer protocols (from A to B. Bidirectional transfer of datais for extra credit and is not required). Network properties:- one way network delay averages five time units (longer if thereare other messages in the channel for GBN), but can be larger- packets can be corrupted (either the header or the data portion)or lost, according to user-defined probabilities- packets will be delivered in the order in which they were sent(although some can be lost).**********************************************************************/#define BIDIRECTIONAL 0 /* change to 1 if you're doing extra credit *//* and write a routine called B_output *//* 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 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){ int checksum; int i; checksum = checksum + packet->acknum;for ( i=0; i<20; i++ )checksum = checksum + (int)(packet->payload[i]); checksum = 0-checksum;packet->checksum = checksum;}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);}/* called from layer 5, passed the data to be sent to other side */A_output(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_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){ 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 ("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 */{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(){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){ 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 *//* 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 */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);}}/* called when B's timer goes off */{}{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 modifyint 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 */ 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 */ int ntolayer3; /* number sent into layer 3 */int nlost; /* number lost in media */int ncorrupt; /* number corrupted by media*/main(){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);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] */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 */generate_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!!!!!!!! */float x; /* individual students may need to change mmm */x = rand()/mmm; /* x should be uniform in [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] *//* having mean of lambda */evptr = (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);}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;}}}{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");}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(AorB,packet)int AorB; /* A or B is trying to stop timer */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 */evptr->eventity = (AorB+1) % 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 10time 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);}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");}}函数结构解释:函数其他部分定义在每个函数后面一坐定义,此处只给出main函数部分的函数结构。
哈工大计算机网络实验报告之五
Flags中的Ack和Syn位都为1,所以是SYNACK报文
如果将包含HTTP POST命令的TCP报文段看作是TCP连接上的第一个报文段,那么该TCP连接上客户机向服务器发送的第六个报文段的序号是多少?是何时发送的?该报文段所对应的ACK是何时接收的?
实验过程:
使用Ethereal分析TCP协议: (15分)
得分:
抓取本机与/ethereal-labs/alice.txt通信过程中的网络数据包。根据操作思考以下问题:
客户服务器之间用于初始化TCP连接的TCP SYN报文段的序号(sequence number)是多少?在该报文段中,是用什么来标示该报文段是SYN报文段的?
第六个报文段:
对应的ack报文段:
报文时第六个报文,seq=6310,发送时间:Jun 1,2013 13:32:56.587941000
对应的ack报文段接收时间Jun 1,2013 13:32:56.993379000
前六个TCP报文段的长度各是多少?在整个文件发送过程中,接受方公示的窗口大小是否变化?窗口大小代表什么含义?(可参考教科书“流量控制”一节)
观察一个由你的主机发送的ICMP请求包,其ICMP类型和代码号是什么?该ICMP包还含有哪些字段?checksum, sequence number和identifier字段各占多少字节?
ICMP类型:8(响应请求ECHO-REQUEST)
代码号为0
ICMP报文包括IP头、ICMP头和ICMP体,还包含checksum、identifier、sequence number、data这些字段。
对比前面的TCP协议分析,你能看出UDP是无连接的吗?
实验五TCPIP网络配置及连通性测试
实验五TCP/IP网络配置及连通性测试一、实验目的:1. 理解IP地址及其子网掩码的作用2. 理解TCP/IP,掌握IP地址的两种配置方式。
3. 掌握IP网络连通性测试方法。
二、实验环境:Windows 2000 server(xp)、对等局域网,为方便实验,计算机应按实验小组进行划分。
三、实验相关理论接入Internet中的每一台计算机都必须有一个唯一的IP地址,IP地址的配置有用户指定和自动获取两种方式。
IP地址由网络地址和网内主机地址组成,同一网络中的主机可以直接通信,不同网络中的主机则需要通过三层交换设备或路由器才能通信。
四、实验内容:1. 分别为A组、B组网络中的主机指定IP地址,验证同一网络中主机间的连通性和不同网络中主机间的连通性。
2. 自动获取IP地址,验证连通网络主机的连通性。
五、实验步骤:(一)指定IP地址,测试网络连通性1. 察看网络组件是否完整,若无则添加,同时删除除TCP/IP协议以外的其它协议。
2. 设置IP地址在保留专用IP地址范围中(192.168.x.y),任选IP地址指定给主机,选取原则是:x为实验分组中的组别码,y值是1~254之间的任意数值。
注意:同一实验分组的主机IP地址的网络ID应相同,主机ID应不同,子网掩码需相同。
3.标识计算机在“系统属性”对话框中,单击“计算机名”,将显示“计算机名”与“工作组”名。
同一实验组的计算机应有相同的“工作组”和不同的“计算机名”4. 在“网上邻居”中察看能找到哪些主机,并记录结果。
5.测试同一网络中主机的连通性(1)用Ping命令Ping 127.0.0.1,检测本机网卡连通性,记录并分析显示结果。
(2)用Ping 命令Ping <ip地址>,这里的ip地址是同一实验组中的某计算机的ip 地址,观察、记录显示结果。
(3)用Ping 命令Ping <主机名>,这里的主机名是同一实验组的计算机名,观察、记录显示结果。
UDP网络聊天实验
计算机网络原理实验报告UDP网络聊天程序设计班级:计算机1301班学号:1307010116姓名:席凤凯实验五 UDP网络聊天程序设计一.实验目的:编程设计基于 UDP 的简单聊天室程序,实现服务器与客户端之间的对话通信功能。
二.实验原理:网络编程一般都是基于 TCP 或 UDP 的,一般过程如下:(1)TCP 编程的服务器端与客户端一般步骤:服务器端:1、创建一个 socket,用函数 socket();2、绑定 IP 地址、端口等信息到 socket 上,用函数 bind();3、开启监听,用函数 listen();4、接收客户端上来的连接,用函数 accept();5、收发数据,用函数 send()和 recv(),或者 read()和 write();6、关闭网络连接;7、关闭监听;客户端:1、创建一个 socket,用函数 socket();2、设置要连接的对方的 IP 地址和端口等属性;3、连接服务器,用函数 connect();4、收发数据,用函数 send()和 recv(),或者 read()和 write();5、关闭网络连接;(2) UDP 编程步骤如下:服务器端:1、创建一个 socket,用函数 socket();2、绑定 IP 地址、端口等信息到 socket 上,用函数 bind();3、循环接收数据,用函数 recvfrom();4、关闭网络连接;客户端:1、创建一个 socket,用函数 socket();2、设置对方的 IP 地址和端口等属性;3、发送数据,用函数 sendto();4、关闭网络连接;三.实验内容:编辑代码:(1)服务器源程序:#include <stdio.h> 标准输入输出头文件#include <netinet/in.h> 互联网地址族#include <arpa/inet.h> LINUX 下 C 语言程序的 INTERNET 定义头文件#include <unistd.h> 符号常量#include <fcntl.h> 文件控制#include <sys/stat.h> 文件状态#include <sys/types.h> 基本系统数据类型#include <sys/socket.h> 套接字接口#define LOCALPORT 4567//定义本地服务器端口int main(int argc,char *argv[]){int s,len;struct sockaddr_in addr;int addr_len;char msg[256];int i=0;// 编写一个函数用来初始化套接字和绑定套接字。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.最后,计算到达时间的包在另一端。