精华内容
下载资源
问答
  • 假如接收方只发送了第3个帧的确认,就说明前面0,1,2,3号帧都被接收方正常接收了,但是后面的四个帧虽然也已经发送了,但是却需要重传,这就称作Go-back-N,也就是gbn(后退N帧协议。 在这里实际上是回退4帧。

    1,通俗解释:

    讲到gbn,首先要讲到累积确认。
    累积确认的意思是:接收方不必对收到的分组逐个发送确认,而是可以在收到几个分组后,对按序到达的最后一个分组加以确认。
    比如,发送方发送0~7个帧,接收方对第0,2,3,7个帧发送确认,就是分别对第0个帧的确认,对第1,2个帧的确认,对第3个帧的确认,对第4,5,6,7个帧的确认。
    假如接收方只发送了第3个帧的确认,就说明前面0,1,2,3号帧都被接收方正常接收了,但是后面的四个帧虽然也已经发送了,但是却需要重传,这就称作Go-back-N,也就是gbn(后退N帧)协议
    在这里实际上是回退4帧。

    展开全文
  • 在后退N帧式ARQ中,发送方不需要在收到上一帧的ACK后才能开始发送下一帧,而是可以连续发送帧。当接受方检测出失序的信息帧后,要求发送方重发最后一个正确接受的信息帧之后的所有未确认的帧;或者当发送方发送了N个...

    在后退N帧式ARQ中,发送方不需要在收到上一帧的ACK后才能开始发送下一帧,而是可以连续发送帧。当接受方检测出失序的信息帧后,要求发送方重发最后一个正确接受的信息帧之后的所有未确认的帧;或者当发送方发送了N个帧后,若发现该N个帧的前一个帧在计时器超时后仍未返回其确认信息,则该帧被判为出错或丢失,此时发送方就不得不又重传该出错帧及随后的N个帧。换句话说,接受帧只允许按顺序接受帧。

    源站向目的站发送数据帧。当源站发完0号帧后,可以继续发送后续的1号帧、2号帧等。源站每发送一帧就要为该帧设置超时计时器。由于连续发送了许多帧,所以确认帧必须要指明是对哪一帧进行确认。为了减少开销,GBN协议还规定接受端不一定每收到一个正确帧就必须发回一个确认帧,而是可以在连续收到好几个正确的确认帧后,才对最后一个数据帧发确认信息,或者可以在自己有数据要发送时才将对以前正确收到的帧加以捎带确认。这就是说,对某一数据帧的确认就表明该数据帧和这以前所有的数据帧均已正确无误地收到了。

    ACK(n+1)表示对第n号帧的确认,表明接受方已正确收到第n帧及以前的所有帧,下一次期望收到第n+1号帧(也可能是第0号帧)。接受端只按序接受数据帧。虽然在有差错的2号帧之后接着又收到了正确的6个数据帧,但接收端必须将这些帧丢弃。接收端虽然丢弃了这些不按序的无出错帧,但应重复发送已经发送过的最后一个确认帧ACK1(这是为了防止已经发送过的确认帧ACK1丢失)。

    展开全文
  • 滑动窗口协议实验的报告滑动窗口协议实验报告篇一:Exp1_滑动窗口协议_实验报告 Exp1 滑动窗口协议实验报告 【实验目标】 ? 理解和掌握“滑动窗口”技术。 ? 基于计算机网络实验系统NetRiver进行。 ? NetRiver...

    滑动窗口协议实验的报告

    滑动窗口协议实验报告

    篇一:Exp1_滑动窗口协议_实验报告  Exp1 滑动窗口协议实验报告  【实验目标】  ? 理解和掌握“滑动窗口”技术。  ? 基于计算机网络实验系统NetRiver进行。  ? NetRiver系统提供了各实验的上下文和接口函数,利用C/C++编程语言  实现典型协议的核心部分。  ? 使用NetRiver系统完成程序代码的编译、调试和测试,验证协议实现的  正确性。  【实验原理】  1-bit滑动窗口协议  1-bit滑动窗口协议中,需要保证发送窗口大小不超过1。我们用ack_expected表示发送窗口下界,即希望得到确认的帧号;用window_size表示当前发送窗口的大小。当有事件到达时,根据事件的类型进行相应处理:  ? 超时事件:此时pBuffer指向的UINT32类型存储的是主机序的序列号seq,  将seq与当前窗口区间[ack_expected, ack_expected+windoe_size)进行比较,从seq开始连续进行发送。 ? 网络层发送事件:此时网络层想要发送一个新帧,pBuffer指向的是网络  层准备好的帧,我们将该帧放入缓冲队列,并在发送窗口未满时进行1次发送。  ? 帧到达事件:此时我们收到了一个帧,通过ntohl将其确认号转化成主  机序ack,然后对比ack是否等于ack_expected,若是则发送窗口下界加1,此时若还有帧在缓冲区则尝试进行1次发送,发送窗口上界加1。  回退n帧滑动窗口协议  回退n帧滑动窗口协议和1-bit滑动窗口协议相比,主要的区别在于窗口大小的不同,以及处理超时事件时,应从超时的帧开始进行连续发送。其他事件的处理则没有不同。  【实验中遇到的问题】  起始编号  实验中帧号从1开始编号,而不是通常认为的0。  静态变量  由于两个函数将被分别连续调用,故不适合使用全局变量,否则将出现未初始化的现象。这里我使用了函数内的静态变量来保证合适的初始值。  实验系统不稳定  实验过程中挺经常遇到服务器超时的现象,而且有时同一个程序运行两次也会有不同的结果。一个经验性的做法是在程序中增加一些cout语句,实践上能够保证结果正确,但具体原因尚不清楚。  【源代码】  #include "sysinclude.h" #include using namespace std;  extern void SendFRAMEPacket(unsigned char* pData, unsigned intlen);  #define WINDOW_SIZE_STOP_WAIT 1 #define WINDOW_SIZE_BACK_N_FRAME 4  // 帧类型  typedefenum{data, ack, nak} frame_kind; // 帧头  typedefstructframe_head { }; // 完整帧  typedefstructframe {};  // 队列元素  typedefstructstore_elm {}; /*  * 停等协议测试函数  frame   *pframe; len;   //帧头 //数据长度   frame_head unsigned int  head; size;   //帧头 //数据的大小   frame_kind unsigned int unsigned int unsigned char  kind; seq; ack;   //帧类型 //序号 //确认号 //数据   data[100];  unsigned int  intstud_slide_window_stop_and_wait(char *pBuffer, intbufferSize, UINT8 messageType) {  switch(messageType) { caseMSG_TYPE_TIMEOUT:  seq = *((UINT32 *)pBuffer);  // 给出主机序  // 发送缓冲区  staticdequebuffDeque; staticUINT32 window_size = 0; static UINT32 ack_expected = 1; UINT32 seq, ack; store_elm s;   // 起始编号为 1   if(ack_expected  for(UINT32 i = seq - ack_expected; i   SendFRAMEPacket((unsigned char  *)(buffDeque[i].pfra

    展开全文
  • 滑动窗口实验报告

    2021-05-22 17:30:00
    滑动窗口实验报告(含源码)一、 实验目的1. 实现一个数据链路层协议的数据传送部分。2. 更好地理解数据链路... 回退N帧滑动窗口协议三、 实验内容充分理解滑动窗口协议,根据滑动窗口协议,模拟滑动窗口协议中发送端...

    滑动窗口实验报告(含源码)

    一、 实验目的

    1. 实现一个数据链路层协议的数据传送部分。

    2. 更好地理解数据链路层协议中的“滑动窗口”技术的基本工作原理。

    3. 掌握计算机网络协议的基本实现技术。

    二、 实验要求

    在一个数据链路层的模拟实现环境中,用C语言实现下两个数据链路层协议。

    1. 1比特滑动窗口协议

    2. 回退N帧滑动窗口协议

    三、 实验内容

    充分理解滑动窗口协议,根据滑动窗口协议,模拟滑动窗口协议中发送端的功能,对系统发送的帧进行缓存并加入窗口等待确认,并在超时或者错误时对部分帧进行重传。

    编写停等及退回N滑动窗口协议函数,响应系统的发送请求、接收帧消息以及超时消息,并根据滑动窗口协议进行相应处理。

    四、 源代码及注释

    #include "sysinclude.h"

    #include using namespace std;

    extern void SendFRAMEPacket(unsigned char* pData, unsigned int len);

    //1比特滑动窗口

    #define WINDOW_SIZE_STOP_WAIT 1

    //回退N帧协议

    #define WINDOW_SIZE_BACK_N_FRAME 4

    //缓存区大小

    #define BUFFER_SIZE 50

    typedef enum {DATA,ACK,NAK} Frame_kind;

    //帧头

    typedef struct Frame_head

    {

    Frame_kind kind;

    unsigned int seq;

    unsigned int ack;

    unsigned char data[100];

    };

    //帧

    typedef struct Frame

    {

    Frame_head head;

    unsigned int size;

    };

    //缓存区

    Frame buffer[BUFFER_SIZE];

    //当前希望确认的帧,最近缓存的帧,下一次要发送的帧

    unsigned int expect_frame = 0, last_buffered_frame = 0, next_frame = 0;

    /*

    * 停等协议测试函数

    */

    int stud_slide_window_stop_and_wait(char *pBuffer, int bufferSize, UINT8 messageType)

    {

    Frame_head* p = (Frame_head*)pBuffer;

    //unsigned int frameNum = ntohl(*(unsigned int*)pBuffer);

    switch (messageType)

    {

    //网络层要发送一帧数据时

    case MSG_TYPE_SEND : {

    //缓存当前要发送的帧

    buffer[last_buffered_frame % BUFFER_SIZE].head = *p;

    buffer[last_buffered_frame % BUFFER_SIZE].size = bufferSize;

    //更新下次缓存的位置

    ++ last_buffered_frame;

    //如果当前有空闲的窗口可以用

    if (last_buffered_frame - expect_frame <= WINDOW_SIZE_STOP_WAIT)

    {

    //发送缓存帧

    SendFRAMEPacket((unsigned char*)pBuffer, (unsigned int)bufferSize);

    //窗口上界加1

    ++ next_frame;

    }

    return 0;

    }

    //物理层收到一帧数据时

    case MSG_TYPE_RECEIVE : {

    //解码确认信号

    unsigned int ack = ntohl(p->ack);

    //试探

    for (int i = expect_frame; i < next_frame; ++ i)

    {

    unsigned int exp_ack = ntohl(buffer[i % BUFFER_SIZE].head.seq);

    //如果确认消息大于等于期望消息,则说明期望帧已经被确认过了

    if (ack >= exp_ack)

    {

    //期望帧+1

    ++ expect_frame;

    //如果有缓存帧没发出

    if (next_frame < last_buffered_frame)

    {

    //发出一个缓存帧

    SendFRAMEPacket((unsigned char*)(&buffer[next_frame % BUFFER_SIZE]), buffer[next_frame % BUFFER_SIZE].size);

    //窗口上界+1

    ++ next_frame;

    }

    //否则,无法继续发送帧,退出。等待下次再更新期望确认帧

    else break;

    }

    }

    return 0;

    }

    //超时

    case MSG_TYPE_TIMEOUT : {

    //超时重发,把当前窗口内未确认的帧重发一遍

    for (int i = expect_frame; i < next_frame; ++ i)

    {

    //if (frameNum > ntohl(buffer[i % BUFFER_SIZE].head.seq)) continue;

    SendFRAMEPacket((unsigned char*)(&buffer[i % BUFFER_SIZE]), buffer[i % BUFFER_SIZE].size);

    }

    return 0;

    }

    default : break;

    }

    return -1;

    }

    /*

    * 回退n帧测试函数

    */

    int stud_slide_window_back_n_frame(char *pBuffer, int bufferSize, UINT8 messageType)

    {

    Frame_head* p = (Frame_head*)pBuffer;

    unsigned int timeoutNum = *(unsigned int*)pBuffer;

    switch (messageType)

    {

    //网络层要发送一帧数据时

    case MSG_TYPE_SEND : {

    buffer[last_buffered_frame % BUFFER_SIZE].head = *p;

    buffer[last_buffered_frame % BUFFER_SIZE].size = bufferSize;

    ++ last_buffered_frame;

    //窗口数未达上限,则发送当前缓存帧,更新窗口上界

    if (last_buffered_frame - expect_frame <= WINDOW_SIZE_BACK_N_FRAME)

    {

    SendFRAMEPacket((unsigned char*)z, (unsigned int)bufferSize);

    ++ next_frame;

    }

    return 0;

    }

    //物理层接收到一帧数据时

    case MSG_TYPE_RECEIVE : {

    unsigned int ack = ntohl(p->ack);

    cout << "receive ack : " << ack << endl;

    for (int i = expect_frame; i < next_frame; ++ i)

    {

    unsigned int exp_ack = ntohl(buffer[i % BUFFER_SIZE].head.seq);

    cout << "exp_ack : " << exp_ack << endl;

    if (ack >= exp_ack)

    {

    ++ expect_frame;

    if (next_frame < last_buffered_frame)

    {

    SendFRAMEPacket((unsigned char*)(&buffer[next_frame % BUFFER_SIZE]), buffer[next_frame % BUFFER_SIZE].size);

    ++ next_frame;

    }

    }

    else break;

    }

    return 0;

    }

    //超时

    case MSG_TYPE_TIMEOUT : {

    cout << "time out : " << timeoutNum << endl;

    //超时重发

    for (int i = expect_frame; i < next_frame; ++ i)

    {

    unsigned int frameNum = ntohl(buffer[i % BUFFER_SIZE].head.seq);

    //if (timeoutNum > frameNum) continue;

    cout << frameNum << endl;

    SendFRAMEPacket((unsigned char*)(&buffer[i % BUFFER_SIZE]), buffer[i % BUFFER_SIZE].size);

    }

    return 0;

    }

    default : break;

    }

    return -1;

    }

    /*

    * 选择性重传测试函数

    */

    int stud_slide_window_choice_frame_resend(char *pBuffer, int bufferSize, UINT8 messageType)

    {

    return 0;

    }

    五、 思考题

    1. 退回 N 帧协议不必像 1bit 滑动窗口协议一样,允许发送完一帧后不等确认帧而继续发送,提高了发送效率。

    2. 缺点是在重传时可能重新传送已经正确发送的数据帧。

    展开全文
  • 1)1 比特滑动窗口协议 2)回退 N 帧滑动窗口协议 3)选择性重传协议 1.3 实验内容 充分理解滑动窗口协议,根据滑动窗口协议,模拟滑动窗口协议中发送 端的功能,对系统发送的帧进行缓存并加入窗口等待确认,并在超时...
  • 13、滑动窗口协议(数据链路层)

    万次阅读 多人点赞 2018-12-20 21:47:30
    1、滑动窗口协议 引言 在之前的协议中,数据只在一个方向上传输。而在大多数实际环境中,往往需要在两个方向上同时传输数据,一种做法是使用一条链路来实现双向传输,从机器A到机器B的数据可以与从机器A到...
  • 后退N帧协议(GBN)

    千次阅读 2020-03-26 09:45:32
    前言: GBN协议和SR协议,都是为了提高信道利用率。  ...后退N帧协议中的滑动窗口 建议大家认真看下图: 窗口的移动: 原来的发送窗口中是0~5帧,发送0帧之后,如果接收窗口接收到0帧,窗...
  • 滑动窗口协议 滑动窗口协议(Sliding Window Protocol),属于TCP协议的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个...
  • 这个是需要自己编程之类的吗,有没有类似参数之类的修改,就可以选则~萌新求帮助~~
  • 数据链路层滑动窗口协议的设计与实现数据链路层滑动窗口协议的设计与实现实验报告一、实验任务及内容利用所学数据链路层原理,设计一个滑动窗口协议并在仿真环境下编程实现有噪音信道环境下的可靠的双工通信。...
  • 可靠传输的实现机制——回退N帧协议GBN(Go Back N) 因为使用停等协议的发送方式,在发送过程中,信道利用率很低,如果出现超时重传,则信道利用率更低 如果可以同时发送很多个数据分组,采用一种流水线式的传输方式...
  • 滑动窗口协议 发送和接受方都会维护一个数据的序列,这个序列被称作窗口。发送方的窗口大小由接受方确定,目的在于控制发送速度,以免接受方的缓存不够大,而导致溢出,同时控制流量也可以避免网络拥塞。下面图...
  • 滑动窗口:数据链路层与传输层

    千次阅读 2020-03-28 21:49:15
    文章目录1 数据链路层的滑动窗口1.1 连续ARQ协议1.2 SR协议(选择重传)1.3 GBN(回退N帧)2 TCP滑动窗口TCP滑动...数据链路层滑动窗口协议 1.1 连续ARQ协议 什么是连续ARQ协议 发送方维持着一个一定大小的发送窗...
  • 回退n帧

    千次阅读 2018-05-20 16:02:37
    丢弃错帧,其后续帧因不是期望接收帧也被丢弃(接收窗口为1)发送方的重传策略选择:缓存在发送窗口中的出错帧以及其后续帧全部重发协议5:回退n帧协议的基本概念定义序列号seq的取值范围和滑动窗口长度W发送方连续...
  • 后退N帧协议总结

    万次阅读 2016-04-22 20:58:17
    2)后退N帧的发送窗口大小应该小于2^m。 这种原因要分两种情况讨论:假设接收端所期望接受的豹纹的序列号为n, 一种情况为:发送端还没发送能发送这个n,而是发送窗口刚好处于n的左边,那么这种情况说明发送端处于...
  • 滑动窗口机制

    千次阅读 2015-07-15 23:22:35
     滑动窗口协议:为了控制发送方的发送速度,并考虑到受发送缓冲区大小的制约等,要求对发送方已发出但尚未经确认的的数目加以限制。这个数目就称为发送窗口。落在这个窗口内的号就是等待接收方返回的Ack信号的...
  • 回退N协议_GBN协议

    2020-12-17 21:22:05
    GBN协议对确认采用累积确认的方式,返回ACK = n 时,表示n以及n之前的都已经收到了(和TCP的滑动窗口的确认报文不太一样) 超时重传 回退N协议的名字由来就是超时重传来的,如果发生超时重传事件,发送...
  • 计算机网络第三章(三) 1. 流量控制与可靠传输协议概述 数据链路层的流量控制:控制发送方的发送速度 1. 1 数据链路层和传输层的流量控制 数据链路层的流量控制是点对点的,而...滑动窗口协议 发送窗口:在发送方维
  • 2、BGP协议特性: 1、BGP是自治系统外部路由协议,用来在AS之间传递路由信息 2、路径矢量路由协议,从设计上避免了环路的发生 其路由信息中携带了所经过的全部AS路径列表。这样,接收该路由信息的BGP路由器可以 明确...
  • 连续ARQ协议

    千次阅读 2006-10-18 20:45:00
    7.4.6 连续ARQ协议 连续重发请求ARQ方案是指发送方可以连续发送一系列信息,即不用等前一被确认便可继续发送下一,效率大大提高。但在这种重发请求方案中,需要在发送方设置一个较大的缓冲存储空间(称作重...
  • 2019计算机考研|计算机网络冲刺知识点:数据链路层一、数据链路层的功能链路层的主要功能包括链路管理、同步、流量控制、差错控制、数据和控制信息分开、透明传输和寻址。二、组帧1.面向比特的方法基本原理:将...
  • 计算机网络笔记(更新中)

    千次阅读 2020-01-30 14:29:46
    TDM:划分时间,周期使用 FDM、WDM:划分频率带宽为模拟信道 CDM:按编码划分 举例: 在CDM中,为便于计算,0表示为-1,1表示为1。 A、B、C通信,A码片序列为 (-1, 1, -1, 1),B码片序列为 (1, 1, 1, -1...
  • TCP/IP协议笔记

    2015-09-27 16:32:00
    在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。  IP是一种网络层协议,提供的是一种不可靠的服务,它只是尽可能快地把...
  • 计算机网络体系结构及协议

    千次阅读 2013-01-17 17:40:25
    http://www.huibo.org.cn/NetworkTheory/41.htm 网络体系结构及OSI基本参考模型 3.1.1 协议及体系结构 通过通信信道和设备互连起来的多个不同地理位置的计算机系统,要使其能...网络协议(Protocol) 为进行计算机网

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 169
精华内容 67
关键字:

退回n帧滑动窗口协议

友情链接: webcalendar-master.zip