计算机网络实验可靠数据传输

合集下载

计算机网络实验二实验报告讲解

计算机网络实验二实验报告讲解

计算机网络实验二实验报告讲解实验二:网络传输性能的测试与评估实验目的:1.掌握网络传输性能的测试方法;2.了解网络传输性能评估的参数;3. 学会使用JPerf工具进行网络传输性能测试。

实验环境:1. JPerf软件;2. 两台运行Windows操作系统的计算机;3.以太网交换机;4.网线,以连接两台计算机及交换机。

实验步骤:1.配置网络环境连接两台计算机和交换机,保证网络连接正常。

2. 安装JPerf软件在两台计算机上分别安装JPerf软件。

3. 运行JPerf服务器选择一台计算机作为服务器,打开JPerf程序,选择“Server”模式,并设置端口号。

4. 运行JPerf客户端打开另一台计算机的JPerf程序,选择“Client”模式,并输入服务器的IP地址和端口号。

5.设置测试参数在JPerf客户端上,设置传输模式(TCP/UDP)、传输时长和数据包大小等参数,并点击“Start”按钮开始测试。

6.分析结果测试结束后,JPerf会输出传输性能测试的结果,包括带宽、丢包率、延迟等参数。

根据这些参数可以评估网络的传输性能。

实验结果与分析:在测试过程中,我们选择了TCP传输模式,传输时长设置为30秒,数据包大小为1MB。

根据测试结果,我们得到了以下性能参数:带宽:100Mbps丢包率:0%延迟:10ms根据带宽和延迟,我们可以评估网络的传输性能。

带宽表示单位时间内能够传输的数据量,带宽越大,传输速度越快。

延迟表示数据从发送方到接收方的传输延时,延迟越小,传输速度越快。

丢包率表示发送的数据在传输过程中丢失的比例,丢包率越小,数据传输越可靠。

在这个实验中,我们得到了较高的带宽和较低的延迟,说明网络的传输性能较好。

同时,丢包率为0%,说明数据传输的可靠性也很高。

根据这些结果,我们可以对网络的传输性能进行评估。

如果带宽较小、延迟较大或丢包率较高,就会影响数据的传输速度和可靠性,从而降低网络的传输性能。

因此,在设计和配置网络时,需要考虑这些因素,以提高网络的传输性能。

计算机网络-实验3-可靠数据传输协议-GBN协议的设计与实现

计算机网络-实验3-可靠数据传输协议-GBN协议的设计与实现

实验3:可靠数据传输协议-GBN协议的设计与实现
1.实验目的
理解滑动窗口协议的基本原理;掌握GBN的工作原理;掌握基于UDP设计并实现一个GBN协议的过程与技术。

2.实验环境
接入Internet的实验主机;
Windows xp或Windows7/8;
开发语言:C/C++(或Java)等。

3.实验内容
1)基于UDP设计一个简单的GBN协议,实现单向可靠数据传输(服务器到客户的数据传输)。

2)模拟引入数据包的丢失,验证所设计协议的有效性。

3)改进所设计的GBN协议,支持双向数据传输;
4.实验设计
1)Client:
函数列表:
各函数功能:
状态转换图:
2)Server:
状态转换图:
3)数据包结构:
发送方:数据包包括序列号与内容接收方:只含接收到的数据包的序号
5.实验结果1)Client:
2)Server:
详细对照:。

tcp协议分析实验报告

tcp协议分析实验报告

TCP协议分析实验报告1. 引言TCP(传输控制协议)是一种面向连接的协议,用于在计算机网络中可靠地传输数据。

本实验旨在分析TCP协议的工作原理、数据包的格式和传输过程,并通过实验验证其可靠性和效率。

2. 实验环境在该实验中,我们使用了两台计算机作为实验设备,一台作为服务器,另一台作为客户端。

两台计算机通过以太网连接,并配置了相应的IP地址和子网掩码。

3. 实验步骤3.1 建立连接首先,客户端发送一个SYN包(同步包)到服务器的指定端口。

服务器收到SYN包后,发送一个SYN-ACK包(同步-确认包)作为响应。

客户端再次发送一个ACK包(确认包)给服务器,表示连接已建立。

3.2 数据传输一旦连接建立,客户端和服务器之间可以开始传输数据。

数据被分割成多个小的数据包,并使用TCP协议进行传输。

每个数据包都包含源端口、目的端口、序列号、确认号以及数据内容等字段。

3.3 确认和重传在传输过程中,接收方会发送确认包以确认已接收到的数据包。

如果发送方在一定时间内没有收到确认包,它会认为数据包丢失,然后重新发送该数据包。

这样可以确保数据的可靠性。

3.4 连接终止当数据传输完成后,客户端或服务器可以发送一个FIN包(结束包)来关闭连接。

接收到FIN包的一方发送一个ACK包作为确认,并关闭连接。

另一方在收到确认后也关闭连接。

4. 实验结果通过抓包工具,我们捕获并分析了在实验中传输的数据包。

我们观察到数据包的格式与TCP协议规定的格式相符,并且在传输过程中发现了确认和重传的情况,验证了TCP协议的可靠性。

5. 实验总结TCP协议是一种可靠的传输协议,在实验中我们深入了解了其工作原理和数据包的格式。

通过实验验证了TCP协议的可靠性和效率。

同时,我们也了解到了TCP协议在实际网络通信中的重要性和广泛应用。

参考文献•Tanenbaum, A. S., & Wetherall, D. J. (2011). 计算机网络(第5版).机械工业出版社.•Stevens, W. R., Wright, G., & Coppola, R. (1994). TCP/IP 详解卷1:协议. 机械工业出版社.本文档旨在介绍TCP协议的工作原理和实验验证过程,并不涉及具体的技术细节和算法解析。

计算机网络-实验2-可靠数据传输协议-停等协议的设计与实现

计算机网络-实验2-可靠数据传输协议-停等协议的设计与实现

实验2:可靠数据传输协议-停等协议的设计与实现
1.实验目的
理解可靠数据传输的基本原理;掌握停等协议的工作原理;掌握基于 UDP 设计并实现一个停等协议的过程与技术。

2.实验环境
接入Internet的实验主机;
Windows xp或Windows7/8;
开发语言:python。

3.实验内容
1)基于 UDP 设计一个简单的停等协议,实现单向可靠数据传输(服务器到客户的数据传输)。

2)模拟引入数据包的丢失,验证所设计协议的有效性。

4.程序设计
在实验报告中要说明所设计停等各个域作用,协议两端程序流程图,协议典型交互过程,数据分组丢失验证模拟方法,程序实现的主要类(或函数)及其主要作用、UDP 编程的主要特点、实验验证结果,详细注释源程序等。

1)协议主要数据结构:
客户端:
服务器:
数据包格式:分为数据分组和确认分组
-数据分组:为数据分组序号后面加上数据内容,如‘0HELLO’
-确认分组:为确认类型与确认分组号,如‘ACK0’。

为了实现丢包,增加NAK类型,如‘NAK0’。

2)协议两端程序流程图:客户端:
服务器:
3)UDP编程的主要特点:
-在python3中,能传输的只有比特字符串,因此要加以转换
-由于是网络编程,很可能发生各种异常,有必要进行捕捉并处理。

计算机网络rdt实验报告.wps

计算机网络rdt实验报告.wps

课程:计算机网络项目:实验3 rdt协议一、实验目的熟悉并掌握各种不同rdt协议的运行环境和协议性能。

二、实验原理可靠数据传输:提供给上层实体的服务抽象是,数据可以通过一条可靠的信道进行传输。

不过由于下层协议不一定可靠,所以就有问题要处理。

停等协议:肯定确认(positive acknowledgment)与否定确认(negative acknowledgment)。

是接收方反馈信息的两种方式。

其次,是ARQ(Automatic Repeat reQuest自动重传请求)协议,简单理解为发送方发送数据,然后等待接收方反馈,然后再相应发送数据。

综合起来理解,就是发送方发送数据,然后等待接收方通过ACK或者NAK反馈,就是停等协议的大概流程。

接下里的优化有,校验和(差错处理)、序号、定时器(超时)、ACK和NAK等。

流水线协议:为了解决上面停等协议对资源的极其浪费问题引入了一个解决方案:允许发送方发送多个分组而无需等待确认。

滑动窗口协议:抽象理解,发送方和接收方各有一个缓存数组。

发送方存放着:已发生且成功确认包序号、已发送未确认包序号(已发送已确认包序号序号|已发送未确认包序号)*、未发送包序号;接收方存放着:已接受包序号、正在接收包序号、未接收包序号。

其中,每个数组有个两个扫描指针,开头和结尾,一起向后扫描,两者形成一个窗口。

故称为窗口协议。

回退N步:回退N步,接收方则是只接受最小的未接受帧,对错序到达帧,都丢弃。

选择重传:SR协议通过让发送方仅重传那些它怀疑在接收方出错(即丢失或受损)的分组而避免了不必要的重传。

SR这种个别的,按需的重传协议要求接收方逐个地确认正确接收方的分组。

三、实验内容1.搭建linux运行环境;2.运行simulator,模拟各种不同rdt协议;3.完成exercises的问题。

四、实验结果与分析:运行protocol2 ,所得结果如下解释:protocol2 参数为./protocol2 100 50 20 10 ,是一个无措信道上的单工停等协议。

计算机网络第三次实验rdt

计算机网络第三次实验rdt

计算机网络第二次实验智能1402班201408070221 李帅玲目录计算机网络第二次实验 (1)一.实验目的 (1)二.实验原理 (1)三.实验步骤及分析 (3)(一)实验前准备 (3)(二)实验步骤及问题回答 (5)一.实验目的1.熟悉并掌握各种不同rdt协议的运行环境和协议性能。

二.实验原理1.几种rdt协议1)Rdt1.0:在可靠信道上进行可靠的数据传输➢所依赖的信道非常可靠:不可能有位错,不会丢失数据;➢分别为发送方和接收方建立FSMs:发送方将数据送入所依赖的信道,接收方从所依赖的信道读出数据。

2)Rdt2.0:在可能发送位错的信道上传输➢问题:如何从错误中恢复正向确认(ACKs):由接收方发送报文向发送方进行确认负向确认(NAKs):由接收方发送报文向发送方进行否认,说明分组有错发送方在收到NAK后进行分组重传➢rdt2.0的新机制(在rdt1.0基础之上)错误检测;接收方的反馈:控制信息(ACK,NAK)。

➢Rdt2.0 有一个致命的缺点若ACK/NAK 报文丢失?发送方将不会知道接收端发生了什么,假如进行重传:可能发生数据重复。

管理重复的问题接收方丢弃重复的分组(不向上递交)如果ACK/NAK丢失,发送方则重传正确的分组,发送方给每个分组加上sequence number (序号)。

3)Rdt2.1:发送方,管理丢失的ACK/NAK,接收方,管理丢失的ACK/NAK。

4)流水线协议流水作业:发送端允许发送多个分组,等待应答。

必须增加顺序号的位数,在发送和接收端增加缓存。

两种常用的流水线协议:回退N重传(go-Back-N),选择重传(Select Retransmit)。

➢回退N重传(GBN:Go-Back-N)发送方:在分组首部设置k位seq #,使用尺寸为N的“滑动窗口”,允许连续的多个分组不被应答。

“回退n”协议的基本特点:发送方连续发送许多数据帧,接收方只接收一帧,即只能顺序接收,发送方发送的帧需要不同的编号来区分,发送方要有较大的发送缓冲区来保留可能重发的帧。

国家开放大学《计算机网络》课程实验报告(实验六 计算机网络综合性实验)

国家开放大学《计算机网络》课程实验报告(实验六 计算机网络综合性实验)

计算机网络实验报告实验时间:参加人员:一、实验名称:实验六计算机网络综合性实验;二、实验内容1. 任意捕获一个数据包,分析其数据链路层格式、网络层格式和传输层格式,加深学生对计算机网络分层概念的理解。

2. 地址解析协议(ARP)是LAN 环境中最重要的协议之一。

ARP 允许你的网络上使用的设备自动将物理(MAC)地址映射为IP 地址,因此需要对ARP 有很详细的了解,并清楚它是怎样工作的。

3. 传输控制协议(TCP)是互联网上最常用的协议,TCP 可以保证数据传输的可靠性。

很多互联网服务,比如HTTP、FTP、SMTP 和Telnet,都要依靠TCP 来传输数据。

另外,很多传统的LAN 程序,比如文件传输和SQL 也都要使用TCP 协议。

三、实验步骤1.捕获报文基本分析实验(1)打开SnifferPro程序后,选择Capture(捕获)→Start(开始),或者使用F10键,或者是工具栏上的开始箭头。

图1 SnifferPro软件界面(2)一小段时间过后,再次进入Capture(捕获)菜单,然后选择Stop(停止)或者按下F10键,还可以使用工具栏。

(3)按F9键来执行“停止并显示”的功能,或者可以进入Capture(捕获)菜单,选择“停止并显示”。

(4)停止捕获后,在对话框最下角增加了一组窗口卷标,包括高级、解码、矩阵、主机表单、协议分布和统计信息。

(5)选择解码卷标,可以看到SnifferPro缓冲器中的所有实际“数据”。

分析该卷标结构及其内容。

2.捕获并分析地址解析协议(ARP)(1)选择“捕获”→“定义过滤器”。

(2)在“定义过滤器”中,选择“文件”→“新建”。

(3)将这个文件命名为ARP,单击OK,然后单击“完成”。

(4)现在选择“高级”,从协议列表中选择ARP。

(5)单击OK,关闭定义过滤器窗口。

已经定义了过滤器,可以按F10来捕获流量。

(6)输入arp-dIP来清除默认网关上的ap,这个命令中的IP是你的默认网关IP地址,然后Ping你的默认网关。

传输网络实验报告

传输网络实验报告

一、实验目的1. 了解传输网络的基本组成和功能。

2. 掌握传输网络中常见设备的配置和操作。

3. 熟悉传输网络测试方法和数据分析。

4. 培养实际操作能力和网络故障排查能力。

二、实验原理传输网络是指将数据从源节点传输到目的节点的网络。

它主要由传输介质、网络设备和传输协议组成。

传输网络的主要功能是实现数据的高速、可靠传输。

三、实验设备1. 交换机(2台)2. 路由器(1台)3. 传输介质(双绞线、光纤等)4. 计算机终端(3台)5. 测试工具(网络测试仪、万用表等)四、实验内容1. 网络拓扑搭建(1)根据实验要求,设计并搭建传输网络拓扑结构。

(2)使用双绞线或光纤连接交换机和路由器。

(3)将计算机终端连接到交换机端口。

2. 设备配置(1)配置交换机端口,包括VLAN划分、端口镜像、端口流量控制等。

(2)配置路由器,包括接口配置、路由协议配置、静态路由配置等。

(3)配置计算机终端的IP地址、子网掩码、默认网关等。

3. 网络测试(1)使用网络测试仪测试链路质量,包括带宽、延迟、丢包率等。

(2)使用ping命令测试网络连通性。

(3)使用tracert命令跟踪数据包传输路径。

4. 故障排查(1)分析网络故障现象,确定故障原因。

(2)根据故障原因,采取相应的排查措施。

(3)修复故障,确保网络正常运行。

五、实验步骤1. 网络拓扑搭建(1)设计传输网络拓扑结构,包括交换机、路由器和计算机终端的位置关系。

(2)使用双绞线或光纤连接交换机和路由器,确保连接正确无误。

(3)将计算机终端连接到交换机端口,检查连接是否正常。

2. 设备配置(1)登录交换机,配置端口VLAN、端口镜像、端口流量控制等。

(2)登录路由器,配置接口、路由协议、静态路由等。

(3)配置计算机终端的IP地址、子网掩码、默认网关等。

3. 网络测试(1)使用网络测试仪测试链路质量,记录测试结果。

(2)使用ping命令测试网络连通性,记录连通性结果。

(3)使用tracert命令跟踪数据包传输路径,记录路径信息。

计算机网络实验2报告

计算机网络实验2报告

计算机网络实验2报告实验二:网络性能测试1.引言计算机网络是现代社会中必不可少的一部分,作为信息交流的基础设施,网络的性能是影响用户体验的重要因素之一、本次实验旨在通过网络性能测试工具来评估网络的传输速度、延迟和稳定性,并对测试结果进行分析和探讨。

2.实验目的(1)了解网络性能测试的基本原理和常用工具;(2)掌握网络传输速度、延迟和稳定性的测试方法;(3)分析并评估网络性能测试结果。

3.实验环境本次实验使用的实验环境如下:(1) 操作系统:Windows 10;(2) 硬件配置:Intel Core i7 处理器,8GB内存,100Mbps有线网络连接。

4.实验步骤(2) 分别在两台计算机上安装iperf工具,并设置一台计算机为服务端,另一台计算机为客户端。

(3) 在服务端启动iperf服务:打开命令提示符窗口,运行命令"iperf -s"。

(4) 在客户端发起性能测试请求:打开命令提示符窗口,运行命令"iperf -c 服务端IP地址",其中服务端IP地址为服务端计算机的IP地址。

(5)等待测试结束,客户端会显示测试结果。

(6)根据测试结果进行数据分析和评估。

5.测试结果分析通过对网络性能测试的实施,我们得到了以下测试结果:(1) 传输速度:通过测试工具的报告,我们可以得知网络的最大传输速度。

在本次实验中,我们得到的传输速度为80Mbps,接近网络的理论最大带宽。

(2) 延迟:通过测试工具的报告,我们可以得知网络的延迟情况。

在本次实验中,我们得到的延迟为10ms,属于较低的延迟。

(3)稳定性:通过测试工具的报告,我们可以得知网络的稳定性,即是否存在丢包现象。

在本次实验中,我们没有观察到丢包现象,说明网络的稳定性较好。

6.结论和建议通过本次实验,我们对计算机网络的性能进行了测试和评估,得到了相对准确的结果。

根据测试结果,我们可以得出以下结论:(1)网络的传输速度接近理论最大带宽,说明网络的带宽利用率较高。

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

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

计算机网络课程实验报告实验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.1 分组交换在计算机网络中,数据被切分成小的数据包(也称为分组),并进行传输。

分组交换是一种高效的数据传输方式,它允许多个数据包通过网络同时传输,且每个数据包可以独立选择传输路径。

这种方式相比于电路交换更具有灵活性和可扩展性。

1.2 路由选择路由选择是指在计算机网络中决定数据包传输路径的过程。

当数据包离开发送方后,它将通过一系列的路由器和链路,最终到达目标节点。

路由选择可以基于静态路由或动态路由。

静态路由是预先配置好的路径,它不受网络状态的影响。

而动态路由是根据网络中实时的链路状态和流量情况进行调整的。

路由选择的目标是找到一条最短路径或最佳路径,以确保数据的快速到达和高效传输。

1.3 可靠性保证在数据传输过程中,错误和丢失是无法避免的,如何保证数据的可靠性也是计算机网络的关键问题。

为了解决这个问题,常见的解决方案包括序列号,确认和重传机制。

序列号是对每个数据包进行编号,接收方可以根据序列号判断数据包的顺序和完整性。

确认机制是接收方向发送方发送确认信息,告知数据包已经正确接收。

而重传机制则是在发送方没有收到确认信息时,重新发送可能丢失的数据包。

2. 传输方式根据不同的需求和网络环境,计算机网络数据传输可以采用多种不同的传输方式。

2.1 电路交换在电路交换中,通信双方建立一条专用的物理连接,并在整个通信过程中保持连接。

这种方式类似于打电话,发送方和接收方在整个通信过程中占用着一条专用的通信路径。

然而,电路交换需要占用大量的带宽资源,而且无法适应多用户的需求。

计算机网络中的数据传输可靠性研究

计算机网络中的数据传输可靠性研究

计算机网络中的数据传输可靠性研究随着互联网的快速发展,计算机网络已成为了我们日常生活和工作中不可或缺的一部分。

在计算机网络中,数据传输的可靠性是一个十分重要的问题。

本文将以计算机网络中数据传输可靠性研究为主题,探讨数据传输可靠性的定义、重要性以及相关的研究方法和技术。

一、数据传输可靠性的定义和重要性数据传输可靠性可以被定义为在计算机网络中,数据能够被正确、完整地传输到目的地的概率。

在实际应用中,由于网络链路等原因,数据包丢失、延迟、重复等问题经常发生。

因此,保证数据传输的可靠性对于保证网络的正常运行和提供良好用户体验至关重要。

保证数据传输可靠性的重要性主要体现在以下几个方面:1. 数据完整性:数据在传输过程中,任何形式的丢失或损坏都可能导致数据的不完整性。

例如,在进行在线游戏或者文件传输时,数据包的丢失可能会导致数据的传输不完整,进而影响用户的正常体验。

2. 数据可靠性:在网络中,数据传输的可靠性直接影响到数据的正确性。

不可靠的数据传输可能会导致数据错乱、重复或者乱序等问题。

这对于一些重要的数据传输,如金融交易或者医疗数据传输,将带来严重的后果。

3. 用户体验:保证数据传输的可靠性可以提高用户的体验。

例如,在视频流传输或者在线会议等场景中,数据传输的丢失或延迟将导致视频卡顿、声音不同步等问题,降低用户对于服务的满意度。

二、数据传输可靠性的研究方法和技术为了保证数据传输的可靠性,研究者们提出了一系列的方法和技术。

以下是常见的几种方法:1. 序列号和确认应答:在数据传输中,发送方给每个数据包分配唯一的序列号,接收方通过发送确认应答来告知发送方已接收到该数据包。

如果发送方在一定时间内未收到确认应答,则会进行重传。

通过序列号和确认应答机制,可以实现可靠的数据传输。

2. 检验和和循环冗余校验(CRC):检验和是一种简单的校验方法,通过对数据包中的每个字节进行相加,再将结果与预先设定的校验值进行比较,来验证数据的完整性。

计算机网络实验报告 tcp协议

计算机网络实验报告 tcp协议

计算机网络实验报告 tcp协议计算机网络实验报告:TCP协议一、引言计算机网络是现代社会中不可或缺的一部分,而其中最重要的组成部分之一就是传输控制协议(TCP)。

TCP协议是一种可靠的、面向连接的协议,它在保证数据可靠传输的同时,提供了流量控制和拥塞控制等重要功能。

本实验旨在深入了解TCP协议的原理和工作机制,通过实际操作和观察,进一步加深对TCP协议的理解。

二、实验目的1. 了解TCP协议的基本原理和工作机制;2. 熟悉TCP连接的建立和终止过程;3. 掌握TCP的流量控制和拥塞控制机制;4. 通过实验验证TCP协议的可靠性和效率。

三、实验环境本实验使用了一台运行着Linux操作系统的计算机,通过该计算机可以模拟TCP协议的各种操作和行为。

四、实验步骤1. TCP连接的建立在本实验中,我们使用了一个简单的客户端-服务器模型来模拟TCP连接的建立过程。

首先,在服务器端启动一个监听进程,等待客户端的连接请求。

然后,在客户端发起连接请求时,服务器接受该请求,并建立一个TCP连接。

在这个过程中,可以观察到TCP三次握手的过程,即客户端发送SYN包,服务器回应SYN+ACK包,最后客户端发送ACK包,完成连接的建立。

2. TCP连接的终止TCP连接的终止过程也是一个重要的实验内容。

在本实验中,我们通过发送一个特殊的FIN包来终止一个已建立的TCP连接。

在终止过程中,可以观察到TCP四次挥手的过程,即一方发送FIN包,另一方回应ACK包,然后另一方也发送FIN包,最后再回应ACK包,完成连接的终止。

3. TCP的流量控制TCP通过使用滑动窗口机制来实现流量控制。

在本实验中,我们可以通过调整滑动窗口的大小,观察到数据发送和接收的速度变化。

当滑动窗口的大小较小时,发送方发送的数据量较小,接收方的处理速度较慢;而当滑动窗口的大小较大时,发送方发送的数据量较大,接收方的处理速度较快。

通过实验可以验证TCP流量控制的有效性。

计算机网络中的数据传输实验研究

计算机网络中的数据传输实验研究

计算机网络中的数据传输实验研究在计算机网络中,数据传输是指通过网络将数据从一个节点传输到另一个节点的过程。

数据传输的可靠性和效率对网络的性能和用户体验起着至关重要的作用。

因此,对计算机网络中的数据传输进行实验研究具有重要意义。

本文将从数据传输的基本原理、实验设计和实验结果等方面进行探讨。

一、数据传输的基本原理数据传输是计算机网络中的一项基本操作,它依赖于各层协议的协同工作。

当用户主机向目标主机传输数据时,数据被分割成数据包,并在各层协议的封装和解封装过程中加上相应的标志和控制信息。

这些数据包随后被传输到目标主机,并按照相同的过程进行解封装和重组。

在数据传输的过程中,有几个重要的指标需要考虑,包括传输延迟、带宽、丢包率和传输可靠性等。

传输延迟是指从发送数据到接收数据所需的时间,带宽是指单位时间内传输的数据量,丢包率是指数据包在传输过程中丢失的比例,传输可靠性则是指数据在传输过程中是否能够可靠地到达目标主机。

二、实验设计为了研究计算机网络中的数据传输,我们可以设计一系列实验来模拟和分析各种网络环境下的数据传输性能。

以下是一些可能的实验设计:1. 带宽测试实验:通过在网络中传输不同大小的数据包,测量在不同带宽下的传输延迟和传输速率,并绘制带宽与传输性能之间的关系曲线。

2. 延迟测试实验:通过测量数据包从发送端到接收端的传输延迟,分析延迟的主要影响因素,并探索如何优化传输延迟。

3. 丢包率测试实验:通过发送大量数据包到目标主机,统计在传输过程中丢失的数据包数量,分析丢包率与网络拥塞程度之间的关系。

4. 可靠性测试实验:通过在网络传输过程中模拟数据包的丢失和重传,研究不同重传策略对数据传输可靠性的影响。

以上只是一些可能的实验设计,根据具体的研究目的和实验条件,还可以进一步拓展和改进实验设计。

三、实验结果实验结果是实验研究的核心,通过实验结果可以评估不同的测试方案和改进策略的有效性。

在数据传输实验研究中,实验结果可以包括以下方面:1. 不同网络环境下的传输性能对比:通过比较在不同网络环境下的传输延迟、带宽和丢包率等指标,评估不同网络环境下的数据传输性能。

计算机网络编程实验报告(实现TCP、UDP数据传输)

计算机网络编程实验报告(实现TCP、UDP数据传输)
客户端程序:
package internet;
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import .Socket;
package internet;
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import .ServerSocket; import .Socket;
建立 Socket 连接至少需要一对套接字,其中一个运行于客户端,称为 ClientSocket ,另一个运行于服务器端,称为 ServerSocket 。
套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。 服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接 的状态,实时监控网络状态,等待客户端的连接请求。
public class UDPserver { public static void main(String[] args) throws IOException{ /* * 接收客户端发送的数据 */ DatagramSocket socket=new DatagramSocket(10086); // 创 建 服 务 器 端
的连接
System.out.println(s.getInetAddress().getHostAddress()+"...connection");

计算机网络原理实验报告

计算机网络原理实验报告

计算机网络原理实验报告一、实验目的1.理解计算机网络基本原理2.掌握计算机数据传输的过程3.了解计算机网络的基本组成二、实验器材1.计算机2.网线3.路由器三、实验过程1.实验一:理解网络分层结构-计算机网络采用分层结构,分为物理层、数据链路层、网络层、传输层、应用层。

-物理层负责传输比特流,主要是光纤、双绞线等物理媒介。

-数据链路层负责将比特流转化为帧,并进行传输以保证数据的可靠性。

-网络层负责寻路和分组转发,将数据包从源节点传输到目标节点。

-传输层负责端到端连接的可靠性和流量控制。

-应用层为用户提供服务,负责通信协议的选择和具体的应用功能。

2.实验二:数据传输过程-数据从源主机通过物理媒介传输到目标主机的过程可以分为三个阶段:发送、传输和接受。

-发送端将数据按照层级结构封装,并通过物理媒介传输到接收端。

-接收端根据层级结构进行解封装和处理,最终将数据交给应用层使用。

3.实验三:计算机网络的基本组成-计算机网络由主机和链路两部分组成。

-主机包括终端设备和网络结点,终端设备有桌面电脑、笔记本电脑、智能手机等,网络结点有路由器、交换机等。

-链路是连接主机之间和主机与网络结点之间的通信路径。

四、实验结果在实验过程中,我成功地理解了计算机网络的基本原理,掌握了计算机数据传输的过程,并了解了计算机网络的基本组成。

实验结果表明,计算机网络是一个复杂的系统,需要多个层级结构相互配合才能实现数据的传输和通信。

五、实验总结通过本次实验,我深入理解了计算机网络的基本原理,掌握了计算机数据传输的过程,并了解了计算机网络的基本组成。

实验过程中,我遇到了一些问题,但通过与同学们的讨论和老师的指导,我成功地解决了这些问题,并达到了实验的目标。

六、总结和建议总的来说,本次实验对我来说是一次很好的学习机会,通过实践操作,我深入理解了计算机网络的基本原理。

然而,实验时间比较紧张,希望老师能够给予更多的实验训练的时间,让我们有更多的机会去实践和探索。

网络传输演示实验报告(3篇)

网络传输演示实验报告(3篇)

第1篇一、实验目的1. 理解网络传输的基本原理和过程。

2. 掌握网络数据包的发送、接收和转发过程。

3. 熟悉不同网络设备在数据传输中的作用。

4. 学习使用网络测试工具对网络性能进行评估。

二、实验环境1. 操作系统:Windows 102. 网络设备:两台PC机、交换机、路由器、网线3. 网络平台:局域网4. 实验软件:Packet Tracer 7.3.1三、实验步骤1. 网络拓扑搭建:- 使用Packet Tracer模拟器搭建实验网络拓扑,包括两台PC机、交换机、路由器等网络设备。

- 配置网络设备的IP地址和子网掩码,确保设备之间可以相互通信。

2. 数据包发送与接收:- 在PC1上使用ping命令发送数据包到PC2,观察数据包的发送和接收过程。

- 分析数据包在网络中的传输路径,了解数据包经过交换机和路由器的转发过程。

3. 交换机学习与转发:- 观察交换机的MAC地址表,了解交换机如何学习并存储端口与MAC地址的映射关系。

- 通过改变PC1和PC2的MAC地址,观察交换机MAC地址表的变化,理解交换机如何更新MAC地址表。

4. 路由器转发:- 观察路由器的路由表,了解路由器如何根据目的IP地址选择合适的出口接口进行数据包转发。

- 通过修改路由器的静态路由,观察数据包在不同路径上的转发过程。

5. 网络性能测试:- 使用网络测试工具(如Iperf)测试网络带宽和延迟。

- 分析测试结果,了解网络性能的影响因素。

6. 故障排除:- 故意断开网络设备之间的连接,观察网络通信受到影响的情况。

- 使用网络诊断工具(如Wireshark)分析网络故障原因,并尝试解决故障。

四、实验结果与分析1. 数据包发送与接收:- 通过ping命令成功发送和接收数据包,验证了网络设备的连通性。

- 数据包在网络中经过交换机和路由器的转发,实现了跨网段通信。

2. 交换机学习与转发:- 交换机通过学习MAC地址表,实现了端口与MAC地址的映射,从而正确转发数据包。

云南大学 软件学院 计网实验5

云南大学 软件学院 计网实验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函数部分的函数结构。

计算机网络数据通信可靠传输机制:停等协议、滑动窗口、ARQ协议

计算机网络数据通信可靠传输机制:停等协议、滑动窗口、ARQ协议

计算机网络数据通信可靠传输机制:停等协议、滑动窗口、ARQ协议2022-08-28 发表于河南计算机网络数据通信过程中,由于一些原因数据在信道传输过程中可能发生如比特差错(1001变为1000),乱序(数据块1、2、5、6、3、4),数据丢失(数据块1、2、5)等问题,那么为了能够使数据可以正确稳定的传输和接收,计算机网络制定了一些规则,即可靠传输机制。

比如在数据链路层的可靠传输通常使用确认和重传两种机制来完成。

•肯定应答:接收方对收到的数据帧校验无误后送回肯定应答信号ACK,它是一种无数据的控制帧,这种控制帧使得接收方可以让发送方知道哪些内容被正确接收,发送方可继续发送后续帧。

•否定应答重传:接收方收到一个数据帧后经校验发现错误,则送回一个否定应答信号NAK,发送方必须重新发送出错帧。

•超时重传:发送方在发送一个数据帧以后就开始一个计时器,在一定时间内如果没有得到关于该数据帧的应答信号,那么就重新发送该数据帧,直到发送成功为止。

我们首先讨论没有传输错误的流控技术,流控是一种协调发送站和接收站工作步调的技术,其目的是避免由于发送速度过快,使得接收站来不及处理而丢失数据。

即传输过程中不会丢失帧,接收到的帧都是正确的,无须重传,并且所有发出的帧都能按顺序到达接收端。

常见的流量控制方式有两种:停止-等待协议、滑动窗口协议。

停止-等待协议停等协议的工作原理是每发送完一个帧就停止发送,等待对方的确认,在收到确认后再发送下一个帧。

停等协议的优点是简单,但是缺点是信道利用率太低。

信道利用率为发送方在一个发送周期内有效地发送数据所需要的时间占整个发送周期的比率。

而发送周期为发送方从开始发送数据到收到第一个确认帧ACK为止的时间。

假设发送站为S1,接收站为S2,tp为传播延迟,tf为发送一帧的时间(称为一帧时),则发送一帧的时间即发送周期为:TFA=2tp+tf。

所以信道利用率:E=tf/(2tp+tf),若定义a=tp/tf(传播时延与帧时之比)则E=1/(2a+1)。

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

计算机网络可靠数据传输一、实验目的熟悉并掌握各种不同rdt协议的运行环境和协议性能。

二、实验内容1.搭建linux运行环境;2.运行simulator,模拟各种不同rdt协议;3.完成exercises的问题。

三、实验过程1.在本机上安装虚拟机,然后通过虚拟机安装red hat linux 9.0系统,安装成功。

2.了解simulator模拟的几种rdt协议。

simulator中有p2.c—p6,c5个文件是描述协议的:p2.c是停等协议,设置有限的buffer和有限的处理速度;p3.c在不可靠的信道上允许单向的数据流动;p4.c是双向的滑窗协议;p5.c是GBN 协议;p6.c是重传协议。

3.几种rdt协议1)Rdt1.0:在可靠信道上进行可靠的数据传输所依赖的信道非常可靠:不可能有位错,不会丢失数据;分别为发送方和接收方建立FSMs:发送方将数据送入所依赖的信道,接收方从所依赖的信道读出数据。

2)Rdt2.0:在可能发送位错的信道上传输问题:如何从错误中恢复正向确认(ACKs):由接收方发送报文向发送方进行确认负向确认(NAKs):由接收方发送报文向发送方进行否认,说明分组有错发送方在收到NAK后进行分组重传rdt2.0的新机制(在rdt1.0基础之上)错误检测;接收方的反馈:控制信息(ACK,NAK)。

Rdt2.0 有一个致命的缺点若ACK/NAK 报文丢失?发送方将不会知道接收端发生了什么,假如进行重传:可能发生数据重复。

管理重复的问题接收方丢弃重复的分组(不向上递交)如果ACK/NAK丢失,发送方则重传正确的分组,发送方给每个分组加上sequence number (序号)。

3)Rdt2.1:发送方,管理丢失的ACK/NAK,接收方,管理丢失的ACK/NAK。

4)流水线协议流水作业:发送端允许发送多个分组,等待应答。

必须增加顺序号的位数,在发送和接收端增加缓存。

两种常用的流水线协议:回退N重传(go-Back-N),选择重传(Select Retransmit)。

回退N重传(GBN:Go-Back-N)发送方:在分组首部设置k位seq #,使用尺寸为N的“滑动窗口”,允许连续的多个分组不被应答。

“回退n”协议的基本特点:发送方连续发送许多数据帧,接收方只接收一帧,即只能顺序接收,发送方发送的帧需要不同的编号来区分,发送方要有较大的发送缓冲区来保留可能重发的帧。

优点:连续发送提高了信道利用率,误码率较低时,连续ARQ优于停等协议。

缺点:要回退n帧重传(Go-back-n),导致某些已正确接收帧的重传,因此降低了发送效率。

选择重传(SR:Selective Repeat)发送方仅对未收到应答的分组进行重发,发送方对每个unACKed分组设置计时器;发送方的窗口,N个连续的seq,同样对已发送的seq #s,unACKed分组进行限制;接收方逐个对所有正确收到的分组进行应答,对接收到的(失序)分组进行缓存,以便最后对上层进行有序递交。

优点:避免重传已正确传送的帧,提高了信道利用率。

缺点:在接收端需要占用一定容量的缓存,控制较复杂。

4.搭建环境并测试用例我电脑上安装的有Ubuntu的linux系统,编译模拟器的时候会有两个警告,但是仍可以运行,不过运行的结果都是不正确的,所发送的包全是得不到确认的,最后的效率都为0%。

尝试过之后,就在在虚拟机下安装red hat linux 9.0系统,安装成功。

测试用例如下图所示:四、Exercises1)For one or more selected protocols, make a study of protocolperformance,measured in payloads delivered per second, as a function of the checksum error rate, lost packet rate, and timeout interval. For example, provide graphs showing payloads/sec as a function of timeout interval, for various error rates. What can you conclude?Answers:实验中选择运行的是p5.c文件,即回退N步协议。

运行图如下:运行协议5,1000个时间片,超时时间间隔为20个时间片,无丢包,无数据出错,显示发送和接收如下图:测试多组实验,如下面所示。

测试有效负载和超时时间间隔的关系,运行协议5,1000个时间片,无丢包,无数据出错,结果如下表所示:(由于运行的几组都是1000个时间片,所以可以直接根据payloads来比较)超时时间间隔Total data frames sent Payloads accepted10 1 120 262 13630 219 17640 187 17950 196 19660 187 18770 190 19080 192 19290 190 190结论:由表中的测试数据可以看出,有效负载在超时时间间隔为50的时候最大,为196。

因为时间间隔小于50的时候,重传的比较多,导致有效的少,当时间间隔大于50的时候,虽然没有重传,但是时间间隔多大,发送一个数据后等待的时间过长,导致发送的总的数据减少。

测试有效负载和校验和错误率的关系,运行协议5,1000个时间片,设置超时间隔为50,无丢包,结果如下表所示:(由于运行的几组都是1000个时间片,所以可以直接根据payloads来比较)The checksum error rate Total data frames sent Payloads accepted10 182 9520 172 6830 166 4040 161 2850 149 1060 146 8结论:由表中数据可以看出,校验和错误率越高,收到的有效的负载越少。

测试有效负载和校验和丢包率的关系,运行协议5,1000个时间片,设置超时间隔为50,无校验和错误,结果如下表所示:(由于运行的几组都是1000个时间片,所以可以直接根据payloads来比较)Lost packet rate Total data frames sent Payloads accepted10 187 10020 176 7130 174 5040 164 2450 155 1560 150 10结论:从表中数据可以看出,丢包率越高,收到的有效的负载就越少。

2)Compare the performance of protocols 5 and 6 in detail with respect topayloads/sec and number of retransmissions for a wide variety of parameters.Under which circumstances is protocol 5 better? protocol 6? Answers:运行:./sim 5 1000 50 0 0 0和./sim 6 1000 50 0 0 0./sim 5 1000 50 0 0 0 ./sim 6 1000 50 0 0 0Total data frames sent Payloads accepted Total data frames sent Payloads accepted196 196 165 165 运行:./sim 5 1000 50 10 10 0和./sim 6 1000 50 10 10 0./sim 5 1000 50 10 10 0 ./sim 6 1000 50 10 10 0Total data frames sent Payloads accepted Total data frames sent Payloads accepted 179 74 137 97 结论:网络状况越差,协议6的影响相对小,即协议6的性能好,当网络都处于理想状况时,即都没有丢包和错误时,两个协议的性能差不多,但整体协议6的性能更好。

原因:协议5为流水线协议,适合运行在网络状况较好的情况下,丢包率和出错率较小的时候,重传几率较小,传输速率较快。

而如果网络状况不佳,会出现大量重传,协议5会丢弃大量无序的且正确的分组,会带来更多的重传。

而协议6只需重传丢失的分组,在网络状况较差时,效果会非常显著。

3)The function pick_event() has built-in priorities for events. For example,forprotocol 5, frame arrivals go before timeouts. Experiment with changing these priorities (by reordering the statements in pick_event().What conclusions can you draw?答:当顺序为数据到达,校验和检验,上层数据准备好,超时处理时:设置超时间隔为50,结果见下表:The checksum error rate Lost packet rate Total data frames sent Payloads accepted10 0 190 8610 10 188 6920 10 161 3920 20 155 34当顺序为上层数据准备好,数据到达,校验和检验,超时处理时:设置超时间隔为50,结果见下表:The checksum error rate Lost packet rate Total data frames sent Payloads accepted10 0 191 9610 10 175 7620 10 174 6020 20 179 52当顺序为超时处理时,数据到达,校验和检验,上层数据准备好:设置超时间隔为50,结果见下表:The checksum error rate Lost packet rate Total data frames sent Payloads accepted10 0 175 8510 10 164 7320 10 164 4720 20 156 37通过上面三个的对比,可以看出在相同的条件下,当设置为上层数据准备好,数据到达,校验和检验,超时处理时,收到的有效负载最大。

4)Investigate the number of retransmitted frames as a function of the timeoutinterval for various parameters? Can you determine what the optimum setting should be?答:设置丢包率为0,检验和错误率为0,运行得到如下数据:超时时间间隔Total data framessentPayloads acceptedretransmittedframes10 1 1 62320 262 136 5630 219 176 2840 187 179 750 196 196 060 187 187 070 190 190 080 192 192 090 190 190 0结论:从表中数据可以看出,当设置超时间隔为50时,重传帧最少,并且收到的有效负载最多。

相关文档
最新文档