- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
课程设计报告
课程:计算机通信与网络
题目:滑动窗口协议的模拟实现
班级: 物联1301
学号: 131408119
姓名: 滕玲
一、 任务描述
1. 深入理解计算机网络中可靠传输的实现原理。
2. 编写两个程序:一个模拟提供可靠传输服务的发送实体;一个模拟提供可靠传输服务的接收实体。
3. 撰写课程设计报告
二、可靠传输的实现原理
1. 理想的数据传输:
假定1:链路是理想的传输信道(不会出错和丢失)
假定2:不管发方以多快的速率发送数据,收方总来得及收下,并及时上交主机(接收缓冲区容量无限大永不会溢出或收发速率精确相等)
2.差错控制方法=确认+重发
a.为了防止数据传输中出错,在发送完一个分组后,必须暂时保留已发送的分组的副本,直到收到接收方的肯定确认。
b.为了防止数据丢失,导致发送方死等,发送方在发出一个分组的同时,启动一个计时器,如果超时还没有收到确认,则主动重发。
c.为了防止因确认丢失导致的重复接收,对每个协议数据单元编号,接收方通过编号判断分组是否重复分组。
3.流量控制方法
a.流量控制要求发送方根据接收方的能力调整发送速度。
b.最保守的做法是每发出一个协议数据单元,仅当等到接收方的许可确认,再发送下一个协议数据单元。但是这样做的话,发送效率很低。即使接收方足够快,也要经过两点间传播时延的2倍时间,才能发出去一个协议数据单元。
c.可以不像上面一样将接收方按最坏情形设想,连续发送多个协议数据单元数。如果设想正确,在两点间传播时延的2倍时间内,就可以发送多个协议数据单元,提高发送效率。当然,由于发出去的每个协议数据单元都有可能遇到问题需要重发,发送方必须设置多个发送缓冲区以保存副本,发送缓冲区的个数决定了发送速率。当缓冲区满,即使有用户请求到达,也不会发送。
d.实用的可靠传输协议既要进行差错控制,又要进行流量控制。流量控制的加入,给发送方实体增加了一种可能情形:当用户发送请求到达,发送实体因为发送缓冲区满,拒绝发送。
e.滑动窗口协议实现了上述可靠传输原理。
4.滑动窗口协议
a.原理: 所有滑动窗口协议中,每个外出协议数据单元包含一个序号:0~某一最大值,如序号长度为n,最大值通常为2n-1。
发送方在任何时刻,决定一个用户请求是否被满足的条件是是否有缓冲区存放副本。随着数据的发送和确认的到达,已经发出的协议数据单元和允许发送的协议数据单元的个数总等于发送缓冲区大小,并且它们的序号变化的规律如同在序号序列上滑动窗口一样。
而为了防止重复接收,接收方维持着已经看到过的序号/期望看到的序号,随着数据不断到达,这个序号也不断变化,变化的规律如同在序号序列上滑动窗口一样。
b.类型: 停等协议:发送窗口=1,接收窗口=1
退后N帧协议:发送窗口1,接收窗口=1
选择重传协议:发送窗口 1,接收窗口1
三、发送方模拟程序的设计与实现
swpstate1.head=NULL; //变量初始值为空
swpstate1.sendq=sendq_rear=(structsendq_slot*)malloc(sizeof(structsendq_slot);
if(!swpstate1.sendq) exit(1);
sendq_rear-next=NULL;
printf(请输入窗口大小:);
scanf(%ld,swpstate1.sws); //输入窗口大小
swpstate1.rws=swpstate1.sws; //把窗口大小的值赋给变量
if (swpstate1.sws0)
{
printf(请输入第一帧的序列号:);
scanf(%ld,swpstate1.hdr.seqnum); //输入第一帧序列号
}
swpstate1.nfe=swpstate1.hdr.seqnum; //把第一帧的值放进缓冲池内
sendp=(struct sendq_slot*) malloc (size of(struct sendq_slot));
if(!sendp) exit(1);
sendp-msg=swpstate1.hdr.seqnum;
sendp-timeout=1;
sendp-next=NULL;
sendq_rear-next=sendp;
sendq_rear=sendp;
--swpstate1.sws;
swpstate1.lfs=swpstate1.hdr.seqnum; //最近发送的帧取值
swpstate1.lar=swpstate1.hdr.seqnum; //最近收到的确认帧取值
do
{
while(swpstate1.sws0) //
文档评论(0)