ImageVerifierCode 换一换
格式:DOCX , 页数:32 ,大小:214.27KB ,
资源ID:3824572      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3824572.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(计算机网络实验含全部5个的代码及文字指导.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

计算机网络实验含全部5个的代码及文字指导.docx

1、计算机网络实验含全部5个的代码及文字指导计算机网络原理实 验 报 告学院:信息院 专业班级:计科0701 学号: 0902070110姓名:屈丽指导老师:桂劲松 实验一 数据链路层后退N帧协议1.1实验目的模拟实现数据链路层后退n帧协议。1.2实验内容要求理解链路层后退n帧协议原理,编程动态实现数据链路层后退n帧协议。1.3实验原理1.3.1窗口机制滑动窗口协议的基本原理,就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗

2、口大小一般不同。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。下面是一个例子(设发送窗口尺寸为2,接收窗口尺寸为1):分析:(1) 初始态,发送方没有帧发出,发送窗口前后沿相重合。接收方0号窗口打开,等待接收0号帧;(2) 发送方打开0号窗口,表示已发出0帧但尚未确认返回信息。此时接收窗口状态不变;(3) 发送方打开0、1号窗口,表示0、1号帧均在等待确认。至此,发送方打开的窗口数已达规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧。接收窗口此时状态仍未变;(4) 接收方已收到0号帧,0号窗口关闭,1号窗口打开,表示准备接收1号帧。此

3、时发送窗口状态不变;(5) 发送方收到接收方发来的0号帧确认返回信息,关闭0号窗口,表示从重发表中删除0号帧。此时接收窗口状态仍不变;(6) 发送方继续发送2号帧,2号窗口打开,表示2号帧也纳入待确认之列。至此,发送方打开的窗口再次达到规定限度,在未收到新的确认返回帧之前,发送方将暂停发送新的数据帧,此时接收窗口状态仍不变;(7) 接收方已收到1号帧,1号窗口关闭,2号窗口打开,表示准备接收2号帧。此时发送窗口状态不变;(8) 发送方收到接收方发来的1号帧收到的确认信息,关闭1号窗口,表示从重发表中删除1号帧。此时接收窗口状态仍不变。若从滑动窗口的观点来统一看待1比特滑动窗口、后退N及选择重传

4、三种协议,它们的差别仅在于各自窗口尺寸的大小不同而已:1比特滑动窗口协议:发送窗口 = 1,接收窗口 = 1;后退n协议:发窗口 1,接收窗口 1;选择重传协议:发送窗口 1,接收窗口 1。1.3.2比特滑动窗口协议 当发送窗口和接收窗口的大小固定为1时,滑动窗口协议退化为停-等协议(stop-and-wait)。该协议规定发送方每发送一帧后就要停下来,等待接收方已正确接收的确认(acknowledgement)返回后才能继续发送下一帧。由于接收方需要判断接收到的帧是新发送的帧还是重新发送的帧,因此发送方要为每一个帧加一个序号。由于停等协议规定只有一帧完全发送成功后才能发送新的帧,因而只用1比

5、特来编号就够了。1.3.3后退N协议任何时候,若带宽与往返延迟的乘积很大,则发送方就需要一个较大的窗口。如果带宽很高的话,即使对于一个并不很长的延迟,发送方也会很快用完它的窗口,除非窗口真的非常大。如果延迟很长,那么即使带宽并不高,发送方也会用完它的窗口。这两个因子的乘积基本上说明了这条管道的容量,发送方为了达到尖峰效率,需要这条管道来马不停蹄的发送数据。这项技术称为管道化技术。使用管道化技术后,有两种方法可以用来处理错误。一种方法是回退n帧(实验一),另一种则是选择性重传(实验二)。由于停等协议要为每一个帧进行确认后才继续发送下一帧,大大降低了信道利用率,因此又提出了后退N协议。后退N协议中

6、,发送方在发完一个数据帧后,不停下来等待应答帧,而是连续发送若干个数据帧,即使在连续发送过程中收到了接收方发来的应答帧,也可以继续发送。而且,发送方在每发送完一个数据帧时都要设置超时定时器。只要在所设置的超时时间内仍收到确认帧,就要重发相应的数据帧。例如:当发送方发送了N个帧后,若发现这N帧的前一帧在计时器超时后仍未返回其确认信息,则该帧被判定为出错或丢失,此时发送方就不得不重新发送出错的这帧及其后的N帧。 从这里不难看出,后退N协议一方面因连续发送数据帧而提高了效率,但另一方面,在重传时又必须把原来已正确传送过的数据帧进行重传(仅因这些数据帧之前有一个数据帧出了错),这种做法又使传送效率降低

7、。由此可见,若传输信道的传输质量很差,因而误码率较大时,连续传送协议不一定优于停止-等待协议。此协议中的发送窗口的大小为k,接收窗口仍是1。1.4实验步骤1.4.1编写程序程序源代码如下:#include stdio.h#include string.h#include time.h#include conio.h#include graphics.h#define N_BACKE 2#define LEN sizeof(struct Frame)int randm(int, int); int t;int g_seq = 1;int g_pos = 0;struct Frame int er

8、r; /*出错标志*/ int out; /*发送标志*/ int seq; int clock; int ack; int count; /*传输次数*/ struct Frame *next;*sd, *re;typedef struct Frame Fra;void Insert(Fra *, Fra *);void init() /*初始化就绪、阻塞、完成队列*/ sd = NULL; re = NULL;void delay(int a) /*时间延迟函数,用于实现数据帧的动态变化*/ clock_t start = clock(); /*系统时间函数*/ while (clock(

9、) - a * CLK_TCK count = 0; p-out = 0; /*已经发送标志*/ p-seq = g_seq; /*帧序号*/ p-clock = N_BACKE; /*最大后退次数*/ p-ack = 0; /*接受确认*/ if (p-seq % t = 0) p-err = 1; /*出错标志*/ else p-err = 0; p-next = NULL; Insert(&sd, p); g_seq+;void Insert(Fra *v, Fra *p) /*将数据帧插入到V队列中*/ Fra *q; q = *v; if (*v = NULL) q = p; *v

10、= q; else while (q-next != NULL) q = q-next; q-next = p; void send(Fra *p) /*发送数据帧*/ char str10; p-out = 1; if (p-err = 0) /*发送未出错*/ p-ack = 1; setfillstyle(1, 4); /*设置填充模式,用4号颜色红表示正确发送*/ setcolor(1); circle(50 + 25 * p-seq, 150, 10); /*画圆圈表示数据帧*/ floodfill(50 + 25 * p-seq, 150, 1); setcolor(2); ito

11、a(p-seq, str, 10); outtextxy(45 + 25 * p-seq, 146, str); /*显示帧的编号*/ if (p-count 0) setfillstyle(1, 5); setcolor(1); circle(50 + 25 * p-seq, 300, 10); floodfill(50 + 25 * p-seq, 300, 1); setcolor(2); itoa(p-seq, str, 10); outtextxy(45 + 25 * p-seq, 296, str); else /*发送出错*/ setfillstyle(1, 7); /*用7号颜色

12、表示错误的发送*/ setcolor(1); circle(50 + 25 * p-seq, 150, 10); floodfill(50 + 25 * p-seq, 150, 1); setcolor(4); itoa(p-seq, str, 10); outtextxy(45 + 25* p-seq, 146, str); if (p-count 0) setfillstyle(1, 5); setcolor(1); circle(50 + 25 * p-seq, 300, 10); floodfill(50 + 25 * p-seq, 300, 1); setcolor(2); itoa

13、(p-seq, str, 10); outtextxy(45 + 25 * p-seq, 296, str); p-count+;void back_send(Fra *v) /*检查超时未确认的帧*/ char str10; int pos; Fra *p; p = *v; while (p != NULL) if (p-ack = 0 & p-clock = 0) /*超时未发,取得该帧标号*/ g_pos = p-seq; break; else if (p-out = 1) p-clock -= 1; p = p-next; Fra *search(Fra *v, int num) /

14、*查找未确认帧对应的指针*/ Fra *p; p = *v; while (p != NULL) if (p-seq = num) return p; else p = p-next; int randm(int x, int y) /*随机数函数*/ int k; k = rand() % (x - y) + x; return k;print(Fra *v) /*在屏幕上显示帧序列*/ int size; char str10; void *buff; Fra *p; p = *v; while (p != NULL) setfillstyle(1, 7); setcolor(1); ci

15、rcle(50 + 25 * p-seq, 300, 10); floodfill(50 + 25 * p-seq, 300, 1); setcolor(4); itoa(p-seq, str, 10); outtextxy(45 + 25 * p-seq, 296, str); p = p-next; size = imagesize(65, 290, 85, 310); buff = malloc(size); getimage(65, 290, 85, 310, buff); p = *v; while (!kbhit() putimage(40 + 25 * p-seq, 140, b

16、uff, COPY_PUT); delay(1); send(p); back_send(&sd); if (g_pos != 0) p = (*search)(&sd, g_pos); if (p-seq % t = 0) p-err = 0; else p = p-next; delay(1); g_pos = 0; void main() int i, j; int driver = DETECT, mode; initgraph(&driver, &mode, ); cleardevice(); srand(unsigned)time(NULL); t = randm(5,7); fo

17、r (i = 0; i seq, 300, 10); floodfill(50 + 25 * p-seq, 300, 1); setcolor(4); itoa(p-seq, str, 10); outtextxy(45 + 25 * p-seq, 296, str); p = p-next; size = imagesize(65, 290, 85, 310); buff = malloc(size); getimage(65, 290, 85, 310, buff); p = *v; while (!kbhit() putimage(40 + 25 * p-seq, 140, buff,

18、COPY_PUT); delay(1); send(p); q = p; back_send(&sd); if (g_pos != 0) p = (*search)(&sd, g_pos); if (p-seq % t = 0) p-err = 0; send(p); p = q; /*保存当前帧位置*/ p = p-next; else p = p-next; delay(1); g_pos = 0; 2.4.2设计思路设计思路与实验一基本一样,不同点在上小节已详细介绍。2.5实验结果分析2.5.1结果截图2.5.2结果分析根据选择性重传协议,当6号帧发生错误时,只重传6号帧。实验三:距离向

19、量路由算法的实现3.1实验目的模拟距离向量路由算法的路由表交换过程,演示每轮交换后路由表的变化。3.2实验内容要求编程实现距离矢量路由算法的路由表交换过程,并动态演示每轮交换过后路由表的变化情况。3.3实验原理距离向量路由算法,使用这个算法的路由器必须掌握这个距离表(它是一个一维排列,即一个向量),它告诉在网络中每个节点的最远和最近距离。在距离表中的这个信息是根据临近接点信息的改变而时时更新的。表中数据的量和在网络中的所有的接点(除了它自己本身)是等同的。这个表中的列代表直接和它相连的邻居,行代表在网络中的所有目的地。每个数据包括传送数据包到每个在网上的目的地的路径和距离/时间在那个路径上来传

20、输(我们叫这个为“成本”)。这个在那个算法中的度量公式是跳跃的次数,等待时间,流出数据包的数量等等。在距离向量路由算法中,相邻路由器之间周期性地相互交换各自的路由表备份。当网络拓扑结构发生变化时,路由器之间也将及时地相互通知有关变更信息。每个路由器维护了一张路由表,它以子网中的每个路由器为索引,并且每个路由器对应一个表项。该表项包含两部分:为了达到该目标路由器而使用的输出线路,以及到达该目标路由器的时间估计值或者距离估计值。距离矢量路由算法在理论中可以工作,但在实践中有一个严重的缺陷:虽然它总是能够达到正确的答案,但是它收敛到正确答案的速度非常慢,尤其是,它对于好消息的反应非常快,但是对于坏消

21、息的反应非常迟缓。3.4实验步骤3.4.1编写程序程序的源代码如下:#include stdio.h#include stdlib.h#include alloc.h#define ROUTNUM 7typedef struct int dis; int from;RoutNode;RoutNode dataROUTNUMROUTNUM; /*路由表*/void InitData(FILE* pfile); /*从数据文件读取数据,初始化路由表*/void OutputRoutData(); /*输出所有的路由表*/void Communication(int recv, int send);

22、/*send点向recv点发送自己的路由表*/void Exchange(); /*所有节点进行一次数据交换, 更新路由表*/void main() int start, end, i, j; FILE *pfile; pfile = fopen(1.txt, r); if (pfile = NULL) printf(文件打开错误,按任意键退出.n); getch(); return; else InitData(pfile); fclose(pfile); printf(n路由表初始:n); for (i = 0; iROUTNUM; i+) printf(%c|, i + 65); for

23、 (j = 0; j 0) printf( , j + 65, dataij.dis); printf(n); for (i = 0; i ROUTNUM; i+) Exchange(); printf(n路由表交换:n); OutputRoutData(); printf(输入起始路由节点(%d-%d) : , 0, ROUTNUM - 1); scanf(%d, &start); printf(输入终点路由节点(%d-%d) : , 0, ROUTNUM - 1); scanf(%d, &end); if (start = end | start 6 | end 6) printf(n输入

24、错误,请按任意键退出n); getch(); return; else int cur = start; int total = 0; if (datastartend.dis , cur + 65); while (datacurend.from = 0) total += datacurdatacurend.from.dis; printf(%c-, datacurend.from + 65); cur = datacurend.from; /*end of while*/ total += datacurend.dis; printf(%cn总的路由距离 = %d, end + 65, total); getch(); return; /*end of else*/void InitData(FILE* pfile) char num10; int i = 0; char c; int m, n;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1