《2022年2022年计算机网络课程设计实验报告 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年计算机网络课程设计实验报告 .pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实 验 报 告课程名称:计算机网络实验实验名称: ARQ 协议模拟实现院系:计算机科学学院实验日期 :2010-11-10 班级: 07 通信工程实验报告日期: 2010-11-10 姓名:谭才盛学号: 071101450037 老师批阅签字:_ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 7 页 - - - - - - - - - 实验内容:编写两个计算机程序p1,p2。p1 模拟发送方:首先从界面读取待发送字符(每接受一个字符的输入),保存到文件exe1.txt
2、中,并启动计时器;p2 模拟接收方,它从exe1.txt 中查找是否有新字符到来,并提供模拟界面给用户选择:1. Ack- 接收该字符2. NAK- 丢弃3. 无反应 -导致超时将用户选择的结果记录到exe2.txt 中;接收的字符保存到exe3.txt 中。由于可视化操作不精通,这次实验过程在C+环境下模拟运行。运行环境: Visual C+ 6.0 编程思路:新建三个文本文件,每次运行程序开始阶段使系统随机产生100 个随机数,并使其转化为字符格式,让P1 从界面读取字符,输送到exe1,txt 文件中。并启动计时器记录传输时间。读入exe1.txt,若发现有新字符,则提供模拟界面给用户选
3、择接收还是丢弃;若无反应,则输出超时信息。 将用户选择的结果记录到exe2.txt 中; 接收的字符保存到exe3.txt 中。文本文件读写一律采用追加模式。实验步骤:1. 分析ARQ协议模拟实现的一般流程,画出流程图:(ARQ 协议流程图 ) 2.结合 C+文件操作部分编写源程序:源程序如下:#include iostream.h #include fstream.h #include stdlib.h #include iomanip.h exe1.txt exe2.txt。1. Ack- 接收该字符 2.NAK- 丢弃 .3. 无反应 -导致超时。选择的结果记录到exe2.txt 中ex
4、e3.txt 。接收的字符保存到exe3.txt 中P11 模拟发送方界面从界面读取字符保存到exe1中,并启动计时器接收新字符P2 模拟接收方名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 7 页 - - - - - - - - - #include time.h #include string.h void main() long curtime_front_Sender, curtime_rear_Sender, curtime_front_Receiver, cu
5、rtime_rear_Receiver; curtime_front_Receiver=time(NULL);/定义时钟char ch,choice,str4, array100; int i,tag=0;/ 定义开关变量fstream file1; fstream file2; fstream file3; cout打开文件 : exe1,exe2,exe3endl; file1.open(exe1.txt,ios:in|ios:out|ios:app); if(file1.fail() cout 不能打开文件 :exe1endl; exit(0); file2.open(exe2.txt,
6、ios:in|ios:out|ios:app); if(file2.fail() cout 不能打开文件 :exe2endl; exit(0); file3.open(exe3.txt,ios:in|ios:out|ios:app); if(file3.fail() cout 不能打开文件 :exe3endl; exit(0); coutendlendlttt ARQ协议模拟实验 nnn; cout ttt1 随机产生字符nnttt2 接收nnttt3 退出 choice; switch(choice) case 1: for(i=0;i100;i+)/随机产生字符arrayi=a+rand(
7、)%26; coutsetw(2)arrayi; file1.put(arrayi);/字符读入exe1.txt 文件中curtime_front_Sender=time(NULL);/时钟运行tag=1; file1.close(); cout 字符已读入exe1.txt 文件中 .endl; break; case 2: if(tag=1) cout 文件 exe1.txt 中有新字符到来.endl; cout 输入 Ack: 接收字符 n; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - -
8、- - 第 3 页,共 7 页 - - - - - - - - - cout1)/超时是否判断curtime_front_Receiver=time(NULL); continue; file2 接收该字符 .; file1.get(ch); cout 文件读写完毕.n; else if(strcmp(str,NAk)=0) cout已经放弃这些字符.n; else if(strcmp(str,NAk)!=0 & strcmp(str,Ack)!=0 ) cout 输入错误,请从新输入:endl; while(strcmp(str,NAk)!=0 & strcmp(str,Ack)!=0 );
9、 else if(tag=0) cout 文件 exe1.txt 中没有新字符到来.endl; break; default:cout 谢谢使用 .endl; while(choice!=3); file1.close();file2.close();file3.close(); 3.模拟实验,运行源程序. 实验中的问题及心得:通过实验发现在课程学习中对很多方面只是一知半解,并没有深入的加以研究,致使在组织源程序过程中遇到了很多麻烦,例如对ARQ 协议只是片面地了解,对其背景,发展过程,应用过程, 作用范围并不是很了解,今后一定会在这方面加强认识。通过学习实践发现计算机网络这门课程虽然大部分都
10、是理论课程,很少有实践类的, 但其从当今最前沿的计算机科学理论成果出发, 将整个网络世界的总体框架呈现在面前,使得网络协议描述表现的淋漓尽致,今后必将以百倍的热情投入到这门课程的学习中。总结通过实验所掌握的内容:1.连续 ARQ 协议的算法#define MAX_SEQ 7 /* 应该为 2n-1 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 7 页 - - - - - - - - - typedef enum frame_arrival, cksum_error
11、, timeout, network_layer_ready event_type; #include protocal.h static boolean between(seq_nr a, seq_nr b, seq_nr c) /* 如果 b 落在 a和 c 之间 (含 a不含 c)返回 true,否则返回false. */ if (a=b) & (bc) | (ca) & (a=b) | (bc) & (c1; 用于外出流*/ seq_nr ack_expected; /* 还没有得到应答的最早的帧*/ seq_nr frame_expected; /* 进入流期望的下一帧*/ fram
12、e r; /* 初始变量*/ packet bufferMAX_SEQ+1 /* 外出流的缓存*/ seq_nr nbuffered; /* 当前正在使用的输出缓存*/ event_type event; enable_network_layer(); /* 允许network_layer_ready 事件*/ ack_expected = 0; /* 下一个期望进入的应答*/ next_frame_to_send = 0; /* 下一个要送出的帧*/ frame_expected = 0; /* 期望进入的帧的序号*/ nbuffered = 0; /* 初始没有分组被缓存*/ while
13、(true) wait_for_event ( &event); /* 四种可能的事件,见上面 event_type 定义*/ switch (event) case network_layer_ready; /* 网络层有一个分组要发送*/ /* 接收 , 保存 , 以及发送一个新的帧*/ from_network_layer(&buffernext_frame-to_send); /* 获得一个新的分组*/ nbuffered = nbuffered + 1; /* 增加发送方的窗口*/ send_data(next_frame_to_send, frame_expected, buffe
14、r); /* 发送帧*/ inc(next_frame_to_send); /* 发送方的窗口上界向前移动*/ break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 7 页 - - - - - - - - - case frame_arrival: /* 一个数据帧或控制帧到达*/ from_physical_layer(&r); /* 从物理层得到一个进入的帧*/ if (r.seq = frame_expected) /* 所有的帧只能按序接收. */ to_
15、network_layer(&r.info); /* 传递分组到网络层*/ inc(frame_expected); /* 接收方的窗口下界向前移动*/ /* Ack n 意味着 n-1,n-2,.等 . */ while (between(ack_expected, r.ack, next_frame_to_send) /* 处理捎带应答*/ nbuffered = nbuffered + 1; /* 减少一个缓存的帧*/ stop_timer(ack_expected); /* 帧完好到达 , 停止定时器*/ inc(ack_expected); /* 压缩发送窗口*/ break; ca
16、se cksum_err: break; /* 丢弃坏帧*/ case time_out: /* 重传所有超时的帧*/ next_frame_to_send = ack_expected; /* 开始重传*/ for (i = 1; i = nbuffered; i +) send_data(next_frame_to_send, fram_expected, buffer); /* 重发 1 帧 */ inc(next_frame_to_send); /* 准备发送下一帧*/ if (nbuffered MAX_SEQ) enable_network_layer(); else disabl
17、e_network_layer(); 连续 ARQ 协议采用的重要原理:在简单停止等待协议的基础上,允许连续发送若干帧,在收到相应ACK 后继续发送若干帧,用以提高传输效率。这时ACK 及 NAK 也必须有对应的帧序号,才能够一一对应起来。在发生差错时丢弃原已发送的所有后续帧,重发差错发生以后的所有帧,相当于完全返回重传。信道较差时传输效率不高。连续重发请求ARQ 方案是指发送方可以连续发送一系列信息帧,即不用等前一帧被确认便可继续发送下一帧,效率大大提高。 但在这种重发请求方案中,需要在发送方设置一个较大的缓冲存储空间(称作重发表),用以存放若干待确认的信息帧。当发送方到对某信息帧的确认帧后
18、,便可从重发表中将该信息帧删除。所以,连续重发请求ARQ 方案的链路传输效率大大提高,但相应地需要更大的缓冲存储空间。在这一协议中, 当发送站点发送完一个数据帧后,不是停下来等待应答帧,而是可以连续在发送若干个数据帧。如果在此过程中又收到了接收端发来的应答帧,那么还可以接着发送数据帧。由于减少了等待时间,整个通信的吞吐量就提高了。如结点 A 向结点 B 发送数据帧,当结点A 发完 0 号帧时,并不等待,而是继续发送后续的1 号帧、 2号帧等。由于连续发送了许多帧,所以应答帧不仅要说明是对哪一帧进行确认或名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - -
19、 - - - - - 名师精心整理 - - - - - - - 第 6 页,共 7 页 - - - - - - - - - 否认,而且应答帧本身也必须编号。假设2 号帧出了差错,于是结点B 发送否认帧NAK2 。当否认帧NAK2 到达结点A 时,结点 A 正在发送 5 号数据帧。当5 号 帧发送完毕后,结点 A 才能进行2 号帧的重发。这里要注意两点:接受端只能按序接收数据帧。对于2 号帧,结点B 应答了 NAK2 ,虽然接着又收到了三个正确的数据帧,但都必须将他们丢弃,因为这些帧的发送序号都不是顺序号;结点A 在重传 2 号数据帧时,虽然已经发完了5 号帧,但仍必须向回走,从2 号帧起进行重
20、传。正因如此,连续ARQ 又称为 Go-back-N ARQ ,意思是当出现差错必须重传时,要向回走N 个帧,然后再开始重传。GO-DACK-N策略的基本原理是,当接收方检测出失序的信息帧后,要求发送方重发最后一个正确接收的信息帧之后的所有未被确认的帧;或者当发送方发送了N 个帧后,若发现该 N 帧的前一个帧在计时器超时后仍未返回其确认信息,则该帧被判为出错或丢失,此时发送方就不得不重新发送出错帧及其后的N 帧。这就是GO-DACK-N (退回 N)法名称的由来。因为对接收方来说,由于这一帧出错,就不能以正常的序号向它的高层递交数据,对其后发送来的N 帧也可能都不能接收而丢弃。GO-DACK-
21、N法操作过程如图7-7 所示。图中假定发送完8 号帧后, 发现 2 号帧的确认返回信号在计时器超时后还未收到,则发送方只能退回到从2 号帧开始重发以后所有已发的数据。还有另一种情况。2 号数据帧丢失,3 号至 5 号数据帧虽然正确传送到结点 B,但也不得不被丢弃。当结点A 发送 5 号数据帧的过程中,超时定时器设定的超时时间到。因此,在 5 号数据帧发送完毕后,就回到2 号数据帧进行重传。在使用连续ARQ 协议时,如果发送端一直没有受到对方的确认信息,那么实际上发送端并不能无限制的发送其数据。这是因为: 当未被确认的数据帧的数目太多时,只要有一帧出了差错,就要有很多的数据帧需要重传,这必然浪费
22、很多时间。另外为了对所发送的大量数据帧进行编号,每个数据帧的发送序号也要占用较多的比特数,这样又增加了一些不必要的开销。因此,在连续ARQ 协议中必须将已发送出去、但未被确认的数据帧的数目加以限制,这是本章后面将要要的滑动窗口协议所要讨论的内容。从原理不难看出, 连续 ARQ 协议一方面因连续发送数据帧而提高了效率,但另一方面,在重传时又必须把原来已正确传送过的数据帧进行重传(但仅因这些数据帧之前有一个数据帧出了错),这样又使传送速率降低。由此可见,若传输信道的传输质量很差而误码率较大时,连续ARQ 协议不一定优于停止等待协议。综上所述,连续重发请求ARQ 方案的特点如下:(1)发送方连续发送
23、信息帧,而不必等待确认帧的返回;(2)在重发表中保存所发送的每个帧的备份;(3)重发表按先进先出(FIFO)队列规则操作;(4)接收方对每一个正确收到的信息帧返回一个确认帧,每一个确认帧包含一个惟一的序号,随相应的确认帧返回;(5)接收方保存一个接收次序表,包含最后正确收到的信息帧的序号。当发送方收到相应信息帧的确认后,从重发表中删除该信息帧的备份;(6)当发送方检测出失序的确认帧(即第 N 号信息帧和第N+2 号信息帧的确认帧已返回,而 N+1 号的确认帧未返回)后,便重发未被确认的信息帧。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 7 页 - - - - - - - - -