




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、长沙理工大学 网络协议编程课程设计报告 回捞視爛擞4働锻谕島套軀 梁碧莹 学 计算机与通信工程专 院 学 指导教师 完成日期 网络工程 200858080205 王静 2011年7月2日 课程设计任务书 计算机与通信工程学院 网络工程专业 课程名称 网络协议编程 课程设计 时间 20102011学年第二学期 1819周 学生姓名 梁碧莹 指导老师 土静 题目 滑动窗口协议模拟程序的设计与实现 主要内容: (1)了解网络协议编程的基本知识; (2)了解滑动窗口协议的工作机制; (3) 使用编程语言编写一个滑动窗口协议的模拟程序,按要求实现程 序。 要求: (1)按要求编写课程设计报告书,能正确阐
2、述设计结果。 (2)通过课程设计培养学生严谨的科学态度,认真的工作作风和团队 协作精神。 (3)学会文献检索的基本方法和综合运用文献能力。 (4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。 应当提交的文件: (1)课程设计报告。 (2) 课程设计附件(源程序、各类图纸、实验数据、运行截图等)。 课程设计成绩评定 学 院 计算机通信工程 专 业 网络工程 班 级 网络08-02班 学 号 200858080205 学生姓名 梁碧莹 指导教师 王静 课程成绩 完成日期 2011 年 7 月 2 日 指导教师对学生在课程设计中的评价 评分项目 优 良 中 及格 不及格 课程设计中的创造
3、性成果 学生掌握课程内容的程度 课程设计完成情况 课程设计动手能力 文字表达 学习态度 规范要求 课程设计论文的质量 指导教师对课程设计的评定意见 综合成绩指导教师签字 年 月 日 滑动窗口协议模拟程序的设计与实现 学生:梁碧莹 指导老师:王静 摘要:本文主要介绍如何根据滑动窗口协议的原理,在Visual C+的平台上设 计一个滑动窗口协议模拟程序,并最终使该程序得以实现。本次程序设计分两部 分:第一部分是发送方,第二部分是接收方。通过发送方和接收方之间的数据帧 传输模拟,学习滑动窗口协议控制流量的原理和方法,以及滑动窗口协议的工作 机制。 关键词:滑动窗口协议流量控制 工作机制 模拟程序 D
4、esign and Implementation of Sliding Window Protocol Procedures Student: Liang Biying Instructor: Wang Jing Abstract: This paper describes the prin ciple of Slidi ng Win dow Protocol and how to desig n and impleme nt a procedure about the Slidi ng Win dow Protocol. The program desig n in two parts, o
5、ne is the sen der, the other is the receiver. After all, study ing the principle and method of how the Sliding Window Protocol control the flow, and how the Sliding Window Protocol works through the transmission of data between the sen der and the receiver. Keywords:Sliding window protocol Flow cont
6、rolWorking mechanism Simulatio n program 目录 1引言 1 1.1 滑动窗口协议概述 1 1.2 本次设计任务 1 2 滑动窗口协议介绍 2 2.1 滑动窗口协议工作原理 2 2.2 滑动窗口算法 2 3 设计方案及分析 5 3.1 窗口机制总体设计及分析 5 3.2 协议选择及分析 6 3.3 发送方与接收方设计流程 6 4 程序测试 12 5 总结 15 5.1 程序改进与完善 15 5.2 设计总结 15 参考文献 16 附录 17 滑动窗口协议模拟程序的设计与实现第25页,共21页 1引言 随着网络的不断壮大,用户数量、信息量的需求不断增加,网络
7、负荷越来越 重。此时,我们迫切需要一种机制来控制网络的流量,减少网络拥堵的几率,提 高传输的效率。因此,一种名为滑动窗口的协议应运而生。 滑动窗口协议,是TCP使用的一种流量控制方法。该协议允许发送方在停 止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来 等待确认,因此该协议可以加速数据的传输。 经测试证明,该协议还能有效地解 决TCP的高协议处理开销和UDP的低可靠性之间的矛盾, 1.1 滑动窗口协议概述 滑动窗口协议,是TCP使用的一种流量控制方法。滑动窗口协议也称为 Go-Back-N(GBN)协议。在该协议中,允许发送方传输多个分组(当有多个分组 时)而不需等待确
8、认,但它也受限于在流水账中未确认的分组数不能超过最大允 许数N。只有在接收窗口向前滑动时(与此同时也发送了确认),发送窗口才有 可能向前滑动。收发两端的窗口按照以上规律不断地向前滑动,因此这种协议又 称为滑动窗口协议。当发送窗口和接收窗口的大小都等于1时,就是停止等待 协议。当发送窗口大于1,接收窗口等于1时,就是回退N步协议。当发送窗口 和接收窗口的大小均大于1时,就是选择重发协议。协议中规定,对于窗口内未 经确认的分组需要重传。这种分组的数量最多可以等于发送窗口的大小,即滑动 窗口的大小n减去1 (因为发送窗口不可能大于(n-1 ),起码接收窗口要大于 等于1)。 1.2 本次设计任务 本
9、次的设计任务是根据滑动窗口协议的工作原理,在Visual C+ 6.0 的平 台上用C+语言编写一个基于TCP滑动窗口协议的模拟程序。 要求该程序能够实现滑动窗口协议的发送和接收数据帧功能,在此功能上体 现滑动窗口协议的运作,女口:发送帧被接收与否的判断,帧超时重发,帧缓存等。 2 滑动窗口协议介绍 2.1滑动窗口协议工作原理 TCP协议在工作时,如果发送端的TCP协议软件每传输一个数据分组后, 必须等待接收端的确认才能够发送下一个分组,由于网络传输的时延,将有大量 时间被用于等待确认,导致传输效率低下。为此 TCP在进行数据传输时使用了 滑动窗口机制。 TCP滑动窗口用来暂存两台计算机间要传
10、送的数据分组。每台运行 TCP协 议的计算机有两个滑动窗口: 一个用于数据发送,另一个用于数据接收。发送端 待发数据分组在缓冲区排队等待送出。 被滑动窗口框入的分组,是可以在未收到 接收确认的情况下最多送出的部分。 滑动窗口左端标志X的分组,是已经被接收 端确认收到的分组。随着新的确认到来,窗口不断向右滑动。 TCP协议软件依靠滑动窗口机制解决传输效率和流量控制问题。它可以在收 到确认信息之前发送多个数据分组。这种机制使得网络通信处于忙碌状态,提高 了整个网络的吞吐率,它还解决了端到端的通信流量控制问题, 允许接收端在拥 有容纳足够数据的缓冲之前对传输进行限制。 在实际运行中,TCP滑动窗口的
11、大 小是可以随时调整的。收发端 TCP协议软件在进行分组确认通信时,还交换滑 动窗口控制信息,使得双方滑动窗口大小可以根据需要动态变化,达到在提高数 据传输效率的同时,防止拥塞的发生。 称窗口左边沿向右边沿靠近为窗口合拢, 这种现象发生在数据被发送和确认时。 当窗口右边沿向右移动时将允许发送更多的数据,称之为窗口张开。这种现 象发生在另一端的接收进程读取已经确认的数据并释放了TCP的接收缓存时。 当右边沿向左移动时,称为窗口收缩。Host Requirements RFC强烈建议不要 使用这种方式。但TCP必须能够在某一端产生这种情况时进行处理。 如果左边沿到达右边沿,则称其为一个零窗口。 2
12、.2 滑动窗口算法 滑动窗口算法工作过程如下: 首先,发送方为每1帧赋一个序号(sequenee number),记作SeqNum。现在, 我们忽略SeqNum是由有限大小的头部字段实现的事实,而假设它能无限增大。 发送方维护3个变量:发送窗口大小(send window size),记作SWS,给出发送 方能够发送但未确认的帧数的上界;LAR表示最近收到的确认帧(last ack no wledgeme nt received 的序号;LFS 表示最近发送的帧(last frame sen)的 序号,发送方还维持如下的不变式:LAR-LFS詬WS。 时 当一个确认到达时,发送方向右移动 LA
13、R,从而允许发送方发送另一帧。 同时,发送方为所发的每个帧设置一个定时器,如果定时器在ACK到达之前超 时,则重发此帧。注意:发送方必须存储最多SWS个帧,因为在它们得到确认 之前必须准备重发。接收方维护下面 3个变量:接收窗口大小(receive window size),记为RWS,给出接收方所能接收的无序帧数目的上界;LAF表示可接 收帧(largest acceptable frame 的序号;LFR 表示最近收到的帧(last frame rece ived)的序号。接收方也维持如下不变式:LFS-LAFK SWS LARLTS 图2-2接收方的滑动窗口 当一个具有顺序号SeqNum
14、的帧到达时,接收方采取如下行动:如果 SeqNumC LFR或SeqNumLAF,那么帧不在接收窗口内,于是被丢弃;如果LFR v SeqNum LAF,那么帧在接收窗口内,于是被接收。现在接收方需要决定是否 发送一个ACK。设SeqNum To ACK表示未被确认帧的最大序号,则序号小于或 等于SeqNum To ACK的帧都已收到。即使已经收到更高序号的分组,接收方仍 确认SeqNum To ACK的接收。这种确认被称为是累积的 (cumulative)。然后它设 置 LFA = SeqNum To ACK,并调整 LFA = LFR + RWS。 图2-3接收方的滑动窗口 窗口协议算法有
15、三个功能: 在不可靠链路上可靠地传输帧 保持帧的传输顺序 支持流量控制 3设计方案及分析 3.1窗口机制总体设计及分析 送帧 10 接收确圾送 认0号帧纺;帧 接收确 认1号tfi 图3-1发送方和接收方状态示意图 设计分析: (1)初始态,发送方没有帧发出,发送窗口前后沿相重合。接收方0号窗口打 开,等待接收0号帧; (2)发送方打开0号窗口,表示已发出0帧但尚未确认返回信息。此时接收窗 口状态不变; (3)发送方打开0、1号窗口,表示0、1号帧均在等待确认之列。至此,发送 方打开的窗口数已达规定限度,在未收到新的确认返回帧之前,发送方将 暂停发送新的数据帧。接收窗口此时状态仍未变; (4)
16、 接收方已收到0号帧,0号窗口关闭,1号窗口打开,表示准备接收1号 帧。此时发送窗口状态不变; (5)发送方收到接收方发来的0号帧确认返回信息,关闭0号窗口,表示从重 发表中删除0号帧。此时接收窗口状态仍不变; (6)发送方继续发送2号帧,2号窗口打开,表示2号帧也纳入待确认之列。 至此,发送方打开的窗口又已达规定限度,在未收到新的确认返回帧之前, 发送方将暂停发送新的数据帧,此时接收窗口状态仍不变; (7) 接收方已收到1号帧,1号窗口关闭,2号窗口打开,表示准备接收2号 帧。此时发送窗口状态不变; (8)发送方收到接收方发来的1号帧收毕的确认信息,关闭1号窗口,表示从 重发表中删除1号帧。
17、此时接收窗口状态仍不变 3.2协议选择及分析 在设计过程中,我主要运用了选择重传协议,该协议能很好地弥补了 1比特 滑动窗口协议和后退n协议的缺点,是比较完善的滑动窗口协议。 在选择重传协议中,当接收方发现某帧出错后,其后继续送来的正确的帧虽 然不能立即递交给接收方的高层,但接收方仍可收下来,存放在一个缓冲区中, 同时要求发送方重新传送出错的那一帧。一旦收到重新传来的帧后,就可以原已 存于缓冲区中的其余帧一并按正确的顺序递交高层。这种方法称为选择重发 (SELECTICE REPEAT),其工作过程如图所示。显然,选择重发减少了浪费,但 要求接收方有足够大的缓冲区空间。 灵送帧o 1 2 3
18、4 a 6 7 a; 3 4 5 7 K 9 10 出 咫ggg 接收帧 1.) 1 3 4 5 6 2 7 8 9 10 11 12 13 14 需忘卿時炮交高层 图3-2选择重传协议原理图 3.3发送方与接收方设计流程 由于我设计的程序为模拟程序,因此我把发送方和接收方集合在同一版面 上。它们各自的功能同时在同一版面上实现及显示。 在程序实现后,我们可以通 过在同一版面根据提示输入相关信息,即可得到模拟过程。 虽然只有一个版面,但是发送方和接收方的功能是清晰的、 相对齐全的。发 送方和接收方的设计流程如下: 蟄進方 计时弱担圧 Ack 到这 不対 八叫发寇 序号 恢量报机 从主机取报文 口
19、发送帧号 0-期待帧号 期待帧号创一 期待帔号 / 变量初始值为空 swpstate1.se ndq=se ndq_rear=(structse ndq_slot*)malloc(sizeof(structse ndq_slot); if(!swpstate1.sendq) exit(1); sen dq_rear- n ext=NULL; printf(请输入窗口大小:); sca nf(%ld, 输入窗口大小 swpstate1.rws=swpstate1.sws; 把窗口大小的值赋给变量 if (swpstate1.sws0) printf(请输入第一帧的序列号:); scanf(%ld
20、, 输入第一帧序列号 swpstate1. nfe=swpstate1.hdr.seq num; / 把第一帧的值放进缓冲池内 sen dp=(struct sen dq_slot*) malloc (size of(struct sen dq_slot); if(!se ndp) exit(1); sen dp-msg=swpstate1.hdr.se qnum; sen dp-timeout=1; sen dp-n ext=NULL; sen dq_rear- n ext=se ndp; sen dq_rear=se ndp; -swpstate1.sws; swpstate1fs=swp
21、state1.hdr.se qnum; / 最近发送的帧取值 swpstate1ar=swpstate1.hdr.se qnum; / 最近收到的确认帧取值 do while(swpstate1.sws0) 当窗口大小大于0时,执行以下的循环 sen dp=(struct sen dq_slot*)malloc(sizeof(struct sen dq_slot); if(!sendp) exit(1); se ndp-msg=swpstate1.lfs+1; 如果输入的帧序号大于之前帧序号,那 么窗口向前滑动 sendp-timeout=1; /时延为 1 sen dp-n ext=NULL
22、; sen dq_rear- n ext=se ndp; sen dq_rear=se ndp; -swpstate1.sws; +swpstate1 .lfs; swpstate1.hdr.acknum=0; /ACK 清空 swpstate1.hdr.flags=0;存储缓冲池清空 printf(最近收到的 ACK的帧序号:%ldn,swpstate1.lar); 输出最近收到的ACK帧序号 printf(最近发送的帧序号(发送新帧后):%ldn,swpstate1.lfs); 输出最近发送帧序号 (2)接收方程序: 图3-4数据包接收过程 接收方的接收原则从总体上看是先判断输入的数据帧是
23、否在接收范围之内, 若是,则继续判断是否符合其他接收条件;若不是,则马上丢弃该数据帧, 不再进行其他条件的判断。 struct sen dq_slot *se ndq_rear,*se ndp,*p3,*p4; / 设定变量 struct recvq_slot *recvp,*recvq_rear,*p1,*p2; if(swpstate1.hdr.flags=0) /上次输入的数据帧被放置在缓存区,输入区被清空 do 如果继续接收数据帧则实施下面循环 prin tf(请输入收到的数据帧号:); scan f(%ld, if(a=swpstate1. nfe swpstate1.head=re
24、cvp; else if(swpstate1.head!=NULL) recvp=(struct recvq_slot*)malloc(sizeof(struct recvq_slot); recvp-n ext=NULL; recvq_rear- n ext=recvp; recvq_rear=recvp; _ else printf(所输数据不在接收窗口内!); break; 跳出该循环 若输入数据帧在接收范围内则继续判断并进行以下循环。 recvp-msg=a; if(recvp-msg=swpstate1.nfe) 是否放入缓存判断 recvp-received=1; else rec
25、vp-received=0; -swpstate1.rws; if(recvp-received=1) /数据帧被接收,则进行下面语句 a=a-1; do a=a+1; if(swpstate1.head=NULL) break; p1=swpstate1.head; flag=0; while(a!=p1-msg)p1=p1- n ext; if(a=p1-msg) flag=1; if(p1=swpstate1.head) swpstate1.head=swpstate1.head-n ext; else p2-n ext=p1- n ext; swpstatel. nfe=a+1; sw
26、pstate1.hdr.ack num=a+1; swpstate1.hdr.flags=1; while(flag=1); printf( ACK号 (期待的下一帧的序号):ldn,swpstate1.nfe); printf(没按序接受的序号:n); p1=swpstate1.head; while(p1!=NULL) prin tf(%ldt,p1-msg); p1=p1- n ext; 当接收完一个数据帧时,我们可以选择终止下面的继续接收,也可以选择继 续接收。如果继续接收,那么程序跳到判断循环,继续判断是否接收下一个 数据帧,原理与上面相当。 while(swpstate1.rws0
27、) if(swpstate1.hdr.flags=1) p3=swpstate1.se ndq-n ext; flag=0; while(swpstate1.hdr.ack num)!=p3-msgp3=p3- next; if(swpstate1.hdr.ack num=p3-msg) flag=1; if(p3-msg=swpstate1.se ndq-n ext-msg) swpstate1.se ndq-n ext=p3; else swpstate1.se ndq-n ext=p3; swpstate1.sws=swpstate1.sws+(swpstate1.se ndq-n ex
28、t-msg-swpstate1.lar); swpstate1 .l ar=swpstate1.se ndq-n ext-msg; swpstate1.hdr.se qnum=swpstate1.hdr.ack num; printf(最近收到的 ACK的帧序号(收到 ACK后):%ldn,swpstate1.lar); printf(最近发送的帧序号(此时还未发送新的数据):%ldn,swpstate1.lfs); 4程序测试 F面我以窗口大小为11,第一帧序列号为3,做程序的测试。 图4-1程序测试整体图 (1)整体窗口展示,命令行界面 图4-2整体窗口展示 (2)输入窗口大小及第一帧序列
29、号 图4-3信息设置输入 (3) 当输入的接收帧并不是 ACK期待的帧,那么根据滑动窗口协议该帧不被接 收,且把该帧存放在缓冲区 图4-4帧不被接收的情况 (4) 当前面输入的都不是系统所期待的帧,那么这些帧会一直被存放在缓冲区 直到输入下一个输入的帧的序号比前面输入的帧的序号大,且是系统所期 待的帧时,之前和当前输入的帧会一并被接收,缓冲区清空。继续接收命 令,进行新的帧的检测及接收。 图4-5帧被接收的情况 (5) 若输入的帧超过了窗口大小,那么系统会显示该帧不在接收范围内,并拒 绝接收 囱口大小1石 景一帧的序列号 1 门匹収刹旳mu迥丿予鬥;1 滋发送英!帧序寻.(笈送新帧后): un
30、 sig ned longack num; unsigned short flags; /*flag=0 表示这是一个数据帧,flag=1 表示这是一个 ACK帧*/ ; struct sen dq_slot un sig ned short timeout;/*1时表示计时启动,0时表示已收到确认 */ un sig ned longmsg; struct sen dq_slot *n ext; ; struct recvq_slot unsigned short received;/ 表示顺序接收,0表示错序接受*/ un sig ned longmsg; struct recvq_slo
31、t *n ext; ; struct swpstate un sig ned longlar; un sig ned longlfs; un sig ned long sws; struct swphdr hdr; un sig ned long rws; struct sen dq_slot *se ndq; un sig ned longnfe; struct recvq_slot *head; swpstate1; un sig ned long a; int flag,b; /*发送*/ struct sen dq_slot *se ndq_rear,*se ndp,*p3,*p4;
32、struct recvq_slot *recvp,*recvq_rear,*p1,*p2; swpstate1.head=NULL; swpstate1.se ndq=se ndq_rear=(structse ndq_slot*)malloc(sizeof(structse ndq_slot); if(!swpstate1.se ndq) exit(1); sen dq_rear- n ext=NULL; printf(”请输入窗口大小:); sca nf(%ld, swpstate1.rws=swpstate1.sws; if (swpstate1.sws0) printf(请输入第一帧的
33、序列号:”); sca nf(%ld, swpstate1. nfe=swpstate1.hdr.se qnum; sen dp=(struct sen dq_slot*)malloc(sizeof(struct sen dq_slot); if(!sendp) exit(1); sen dp-msg=swpstate1.hdr.se qnum; sen dp-timeout=1; sen dp-n ext=NULL; sen dq_rear- n ext=se ndp; sen dq_rear=se ndp; -swpstate1.sws; swpstate1 .l fs=swpstate1
34、.hdr.se qnum; swpstate1 .l ar=swpstate1.hdr.se qnum; do while(swpstate1.sws0) sen dp=(struct sen dq_slot*)malloc(sizeof(struct sen dq_slot); if(!sendp) exit(1); sen dp-msg=swpstate1 .l fs+1; sen dp-timeout=1; sen dp-n ext=NULL; sen dq_rear- n ext=se ndp; sen dq_rear=se ndp; -swpstate1.sws; +swpstate
35、1.lfs; swpstate1.hdr.ack num=0; swpstate1.hdr.flags=0; printf(” 最近收到的 ACK的帧序号:%ldn,swpstate1.lar); printf(”最近发送的帧序号(发送新帧后):%ldn,swpstate1.lfs); /*接收*/ if(swpstate1.hdr.flags=0) do printf(”请输入收到的数据帧号:”); sea nf(%ld, if(a=swpstate1. nfe swpstate1.head=recvp; else if(swpstate1.head!=NULL) recvp=(struct
36、 recvq_slot*)malloc(sizeof(struct recvq_slot); recvp-n ext=NULL; recvq_rear- n ext=recvp; recvq_rear=recvp; else printf(所输数据不在接收窗口内!”); break; recvp-msg=a; if(recvp-msg=swpstate1. nfe) recvp-received=1; else recvp-received=0; -swpstate1.rws; if(recvp-received=1) a=a-1; do a=a+1; if(swpstate1.head=NU
37、LL) break; p1=swpstate1.head; flag=0; while(a!=p1-msg) p1=p1- n ext; if(a=p1_msg) flag=1; if(p1=swpstate1.head) swpstate1.head=swpstate1.head-n ext; else p2-n ext=p1- n ext; swpstate1. nfe=a+1; swpstate1.hdr.ack num=a+1; swpstate1.hdr.flags=1; while(flag=1); printf( ACK号(期待的下一帧的序号):ldn,swpstate1.nfe); printf(没按序接受的序号:n”); p1=swpstate1.head; while(p1!=NULL) prin tf(%ldt,p1-msg); p1=p1- n ext; prin tf(n); printf(继续接收帧?若是,输入1,若不是,输入0.n); sca nf(%d, whi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 校园超市消防知识培训课件
- 2026届湖南省衡阳二十六中高二化学第一学期期末学业质量监测试题含答案
- 铸造造型试题及答案
- 街道特勤考试试题及答案
- 饥荒家园测试题及答案
- 校园安全知识培训课件专题
- 会议工作试题及答案
- 唐朝写诗考试题及答案
- 中工会考试试题及答案
- 产业招商面试题及答案
- NB∕T 10731-2021 煤矿井下防水密闭墙设计施工及验收规范
- 《用户体验要素》以用户为中心的产品设计课件
- 千方百剂操作流程
- 油品计量工(高级技师)技能操作理论考试总题库-上(单选题-下部分)
- DB32T 1553-2017 高速公路工程工程量清单计价规范
- 组织知识清单
- GB-T 1040.2-2022 塑料 拉伸性能的测定 第2部分:模塑和挤塑塑料的试验条件
- 城镇燃气安全管理专业知识
- 一页纸的劳动合同范本(5篇)
- 免疫缺陷病PPT精品课件
- 检验科感染管理质量自查表
评论
0/150
提交评论