精华内容
下载资源
问答
  • 这里实现了简单的单向 双向GBN协议用于实现网络编程中的GBN协议
  • 计算机网络原理GBN协议代码.pdf
  • GBN协议复习

    千次阅读 2020-09-20 15:51:05
    (1)GBN协议中:主机甲在给主机乙发送数据帧并捎带确认时,只能对按序到达的最后一个数据帧(第二问是R1,3)进行确认,即确认号为1+1=2。 (2)SR协议中,接收方逐个确认正确接收的分组,不管接收到的分组是否有序...

    一.GBN&SR

    (1)GBN缺点

    不能向发送方及时反映出接收方已经正确接收的数据分组信息。
    当通信线路质量不好时,其信道利用率并不比停止-等待协议高。

    二.累计确认

    重传情况

    (1)GBN协议中:主机甲在给主机乙发送数据帧并捎带确认时,只能对按序到达的最后一个数据帧(第二问是R1,3)进行确认,即确认号为1+1=2。(ACKn表示序号为n及以前的所有数据分组都已正确接收)
    (2)SR协议中,接收方逐个确认正确接收的分组,不管接收到的分组是否有序,只要正确接收就发送选择ACK分组进行确认——即SR中的ACK分组不再像GBN一样具有【累计确认】作用;
    TCP默认也采用【累计确认】——只确认数据流中至第一个丢失字节为止的字节。
    ---------------举栗:SR中,发送方已发了0~3号,现已收到1号帧的确认,而0、2号帧依次超时,则需要重传(0、2号)帧。
    ---------------注意暂时不用重传3号帧(因为3号帧计时器并无超时)。

    三.窗口大小

    下图背景:发送方发送0~7号,然后接收方发送一个7号的确认帧(但该帧中途丢失),于是发送方超时重传。

    PS:注意接收方的最后一点。

    四.

    (1)17年真题

    https://blog.csdn.net/qq_35812205/article/details/108223575

    (2)14年选择题

    【题目】甲和乙使用GBN传输数据,甲的发送窗口尺寸为1000,数据帧长为1000B,信道带宽为100Mb/s,乙每收到一个数据帧立即利用一个短帧(忽略其传输时延)进行确认,若甲、乙之间的单向传播时延是50ms,则甲可以达到的最大平均数据传输速率约为(80Mb/s)
    【解析】
    主机甲从发送第一个帧开始到收到该帧对应的确认帧的这段时间内,可将序号落在发送窗口内的所有数据帧全部发送出去,题目给定甲的发送窗口大小为1000,所以主机甲收到第一个帧的确认帧前的这段时间内,可以发送1000个长度为1000字节的数据帧。

    a:第一个帧的发送时延
    b:第一个数据帧的最后一比特信号从主机甲传播到主机乙的单向传播时延;
    c:第一个确认帧的最后一比特信号从主机乙传播到主机甲的单向传播时延;
    T=a+b+c

    核心数据传输速率=可发的数据量/T;链路利用率=可发的数据量的发送时间/T

    展开全文
  • 理解GBN协议

    万次阅读 2018-03-31 20:32:04
    在理解GBN协议之前,先了解滑动窗口是怎么回事? 在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口...

    在理解GBN协议之前,先了解滑动窗口是怎么回事?

            在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。

            若从滑动窗口的观点来统一看待停等、后退n及选择重传三种协议,它们的差别仅在于各自窗口尺寸的大小不同而已。停等:发送窗口= 1,接收窗口=1; 后退n协议:发送窗口>1,接收窗口=1;选择重传协议:发送窗口>1,接受窗口>1;

            停等协议很好理解,这里主要解释后退n协议和选择重传协议。

            GBN协议中,发送方在发完一个数据帧后,连续发送若干个数据帧,即使在连续发送过程中收到了接收方发来的应答帧,也可以继续发送。且发送方在每发送完一个数据帧时都要设置超时定时器。只要在所设置的超时时间内仍收到确认帧,就要重发相应的数据帧。如:当发送方发送了N个帧后,若发现该N帧的前一个帧在计时器超时后仍未返回其确认信息,则该帧被判为出错或丢失,此时发送方就不得不重新发送出错帧及其后的N帧。

            接受帧只允许按顺序接受帧。为了减少开销,累计确认允许接收端在连续收到好几个正确的确认帧后,只对最后一个数据帧发确认信息,或者可以在自己有数据要发送时才将对以前正确收到的帧加以捎带确认。这就是说,对某一数据帧的确认就表明该数据帧和这以前所有的数据帧均已正确无误地收到了。

            后退N帧协议的接受窗口为1,可以保证按序接受数据帧。若采用n个比特对帧编号,则其发送窗口的尺寸应满足:1~2^(n-1)。若发送窗口的尺寸大于2^(n-1),则会造成接受方无法分辨新帧和旧帧。(具体例子见书)

            SR协议是当接收方发现某帧出错后,其后继续送来的正确的帧虽然不能立即递交给接收方的高层,但接收方可收下来,存放在一个缓冲区中,同时要求发送方重新传送出错的那一帧。一旦收到重新传来的帧后,就可以原已存于缓冲区中的其余帧一并按正确的顺序递交高层。显然,SR减少了浪费,但要求接收方有足够大的缓冲区空间。

            若采用n比特对帧编号,为了保证接收方向向前移动窗口后,新窗口序号与旧窗口序号没有重叠部分,需要满足条件:接受窗口+发送窗口<=2^n。假定仍然采用累计确认的方法,并且接受窗口显然不应超过发送窗口,那么接受窗口尺寸不应超过序号范围的一半<=2^(n-1)。

    假设n取3,序号空间即0~7  (S:sender R:receiver)
    1. S 发送了0,1,2,3,4,5,6 号帧
    2. R 接受上述帧并且捎带发送 ACK6,但是丢失了
    3. S的0号帧首先超时,S 重发发送0号帧
    4. R收到0号帧,但是因为之前它已经接受0~6,发送了ACK6,它会认为0号帧是一个新的帧,而在0号帧之前的一个7号帧丢失(注意这里是一个环的结构)。因为是选择重传协议,R会接受0号帧( the old)作为新帧(暂时放在缓存区),并通知S重发7号帧。
    5. S 发送7号帧
    6. R接受了7和0号帧,并且发送ACK0

    这就出现了问题:

    1、R接受错误的0号帧作为新的帧 

    2、S在发送完7号帧之后收到了ACK0,而不是ACK7,此时对于S而言,它的0号帧早已在ACK6中确认。

            出现这个问题的主要原因是我们不能区别新旧帧,现在我们将序号空间一分为二,首先发送0~3,继续上面的步骤。走到步骤4的时候R不会接受0作为新帧,因为R知道新的帧是4而不是0。这样就避免了上面的问题。

    例题(个人理解):        


           先提个别的问题:回退N步协议中,如果接收方发送的ACK1丢失,ACK2到达发送方,这时还没有超时发生,发送方是否因为收到了 ACK2 就不会重新发送 帧 1 了?

            我的答案是不会重发 1 。在累计确认中,即使ACK1丢失,但是在超时时间内接收到ACK2,那么发送方立即就知道1号帧已经被成功接收,只是对应的ACK1丢失而已,因此无需重传1。

            类似的这道题,发送发没有收到1的确认,但是却收到帧2、3的确认消息,说明此时还没有超时,在这超时时间内是依然可以收到后序帧的确认,一个原因可能是接收方发送帧1的确认,但丢在路上,另一个原因是“累计确认”即捎带确认,接受方根本没有发送帧1的确认,而是通过2、3帧的确认告诉我们帧1已经接收成功。

            所以,帧0、1、2、3均已正确接收到,需要重发的是4、5、6、7帧,答案选C。

            (初学者,希望大家批评指正!)


    展开全文
  • 可靠数据传输协议-GBN 协议的设计与实现 ...实现了GBN协议,模拟丢包,并支持双向传输,并改进为了SR协议 基于UDP设计一个简单的GBN协议,实现单向可靠数据传输(服务器到客户的数据传输)。 模拟引入数据包的丢失...

    可靠数据传输协议-GBN 协议的设计与实现

    首先最重要的代码:github地址

    一、 实验目的

    理解滑动窗口协议的基本原理;掌握 GBN 的工作原理;掌握基于 UDP 设计并实现一个 GBN 协议的过程与技术。

    二、 实验内容

    实现了GBN协议,模拟丢包,并支持双向传输,并改进为了SR协议

    1. 基于UDP设计一个简单的GBN协议,实现单向可靠数据传输(服务器到客户的数据传输)。
    2. 模拟引入数据包的丢失,验证所设计协议的有效性。
    3. 改进所设计的 GBN 协议,支持双向数据传输;(选作内容,加分 项目,可以当堂完成或课下完成)
      4)将所设计的 GBN 协议改进为 SR 协议。( 选作内容,加分项目, 可以当堂完成或课下完成)

    三、实验过程及结果

    1. 流程:首先client端将需要发送的文件解析成byte数组,调用send发送server端使用receive接收,当数据传输结束后server端利用在之前receive获取的port和address使用重载的send方法返回数据,client直接调用receive即可。
      其中定时器采用多线程,没发送一个都启用一个定时间线程,并将发送的socket,packet,序列号等传入,启动线程即使其sleep,当超多时间后判断是否接收到ack,没有则重传并再次启动定时器。
      对ack的接收也使用多线程处理,使其发送的同时可以接收。
      需要注意的是由于多个线程都用到了ackMap(记录接收ack状况的map)所以需要使用线程安全的ConcurrentHashMap
    2. 数据分组格式
      Length	Seq	Data	End
      Length:数据长度,2字节,<=1024;
      Seq:序列号,1字节,0 ~ 255;
      Data:数据,最大1024自己;
      End:结尾标志,1字节,0表示结尾,1表示非结尾
    3. 确认分组格式
      Seq	End
      Seq:序列号,1字节,0 ~ 255;
      End:结尾标志,1字节,0表示结尾,1表示非结尾
    4. 协议两端程序流程图
      在这里插入图片描述
    5. 协议典型交互过程
      发送方的事件与动作:
      • 从上层收到数据。当从上层接收到数据后,SR 发送方检查下一个可用于该分组的序号。如果序号位于发送方的窗口内,则将数据打包并发送;否则就像在 GBN 中一样,要么将数据缓存,要么将其返回给上层以便以后传输。
      • 超时。定时器再次被用来防止丢失分组。然而,现在每个分组必须拥有其自己的逻辑定时器,因为超时发生后只能发送一个分组。
      • 收到ACK。如果收到 ACK,倘若该分组序号在窗口内,则 SR 发送方将那个被确认的分组标记为已接收。若该分组的序号等于 send_base,则窗口基序号向前移动到具有最小序号的未确认分组处。如果窗口移动了并且有序号落在窗口内的未发送分组,则发送这些分组。
      接收方的事件与动作:
      • 序号在 [rcv_base, rcv_base+N-1] 内的分组被正确接收。在此情况下,收到的分组落在接收方的窗口内,一个选择 ACK 被回送给发送方。如果该分组以前没收到过,则缓存该分组。如果该分组的序号等于接收端的基序号(rcv_base),则该分组以及以前缓存的序号连续的(起始于 rcv_base 的)分组交付给上层。然后,接收窗口按向前移动分组的编号向上交付这些分组。
      • 序号在 [rcv_base-N, rcv_base-1] 内的分组被正确收到。在此情况下,必须产生一个 ACK,即使该分组是接收方以前确认过的分组。
      • 其他情况。忽略该分组。
    6. 数据分组丢失验证模拟方法
      设置数据包丢失率和ACK丢失率,使用Math.random生成0到1的随机数,只有当生成的随机数大于丢失率时才发送数据或ACK
      private static double sendLoss = 0.1;
      private static double recvLoss = 0.05;
    7. 程序实现的主要类(或函数)及其主要作用
      1)Server:服务器端,首先接收客户端发送的数据,之后发送数据给客户端
      2)Client:客户端,首先发送数据给服务器端,然后接收服务器返回的数据
      3)RecvAck:接收ack,继承自thread,参数为ackMap,datagramSocket。使用新的线程接收ack,注意要设置阻塞时间,否则接收完成后会阻塞住,ackMap的size为0并且收到ack的end为0时代表接收完成。注意当倒数几个有重发时,虽然接到了end是0但不是终止,所以要两个条件一起判断。
      4)TimeOut:定时器类,继承自thread,参数有datagramSocket,datagramPacket,sequence。每发送一个数据则启动一个定时器,睡眠100ms,之后判断是否接受到ack,没接受到则重传,并重新启动定时器
      5)PublicMethod:一些公共的方法,因为实现了双向数据传输,客户端与服务器端逻辑基本相同,都放在了公共方法里,其也是程序的重点,重要代码处理逻辑都在其中。
      a)ByteArrayOutputStream getByteArray(File file) :将要传输的文件转化成ByteArrayOutputStream方便以后传输时转化成数组处理
      通过FileInputStream读入文件并将其写入ByteArrayOutputStream
      b)void send(DatagramSocket socket, byte[] sendBytes, InetAddress address, int targetPort):client端发送函数,参数为UDP的socket,要传输的数据,目的地址,目的端口号。
      使用ackMap记录已经发送的分租收到ack的情况,创建RecvAck对象并start启动接收ack线程,注意必须使用线程安全的ConcurrentHashMap(开始没有发现,经常出现null,debug巨久),当其收到连续的ack时滑动窗口到第一个未收到ack的位置。可以发送的窗口大小为窗口大小减去ackMap的大小,接下来开始发送数据,按上面的数据格式创建报文,并发送,序列号最大为255,注意要循环序列号,之后发送报文并启动定时器线程,将socket和ackMap,packet,sequence传送给定时器并启动。当全部发送且ackMap里面没有数据时终止。
      c) byte[] receive(DatagramSocket socket):接受函数,参数为接受的socket,以byte数组返回接收到的数据。
      使用ByteArrayOutputStream存放接收到的数据,通过datagramSocket的receive接受数据,并获取其中的长度,序列号,是否结束。注意要判断收到序列号所在的位置,由于序列号是循环的,[rcv_base, rcv_base+N-1]和[rcv_base-N, rcv_base-1]的大小可能不同要进行分析。第二种情况发送只ack即可,第一种如果收到和base相同的则滑动接受窗口,不连续则缓存都要发送ack。都不满足则无需处理。当接接收超时时证明接收完成退出循环。(因为发送的ack可能没有到达所以不好用是否接收到全部数据判断,否则对面可能未接到ack而server已关闭不发送ack使对面陷入无限重传)
      d) void send(DatagramSocket socket, byte[] sendBytes):server端的发送函数,参数只有socket和数据,实际为客户端socket的重载,其中目的地址和目的端口号有receive函数中解析出来,由于server端先接受,首先调用receive方法时即可获取targetPort和address。
      处理逻辑与client的send相同
      e) void recvByteMethod(FileOutputStream fileOutputStream, DatagramSocket socket):接受数据函数,使用wile(true)循环使得可以一直处于接受状态,否则必须在server开始后再启动client也可以防止server端回传数据时client已关闭的问题。
    展开全文
  • 回退N协议_GBN协议

    2020-12-17 21:22:05
    GBN协议对确认帧采用累积确认的方式,返回ACK = n 时,表示n号帧以及n号帧之前的帧都已经收到了(和TCP的滑动窗口的确认报文不太一样) 超时重传 回退N协议的名字由来就是超时重传来的,如果发生超时重传事件,发送...

    回退N协议,发送窗口可以有多个,但是接受窗口只能有一个
    在这里插入图片描述

    累计确认

    GBN协议对确认帧采用累积确认的方式,返回ACK = n 时,表示n号帧以及n号帧之前的帧都已经收到了(和TCP的滑动窗口的确认报文不太一样)

    超时重传

    回退N协议的名字由来就是超时重传来的,如果发生超时重传事件,发送方重传所有的已发送但未收到确认的帧
    对于接收方,如果中间n号帧丢失了,接收方就会一直等待,这时再次收到后边的帧会直接丢弃,只想等着丢失的帧到来,接收方会返回一个n的确认帧,代表n以及n之前的都已经收到了,这时发送方会从 n+1 号帧开始在发送一遍后边所有的帧(很专一)。
    在这里插入图片描述

    总结

    GBN协议只按照顺序接收帧,不按序就被无情丢弃

    1. 优点:提高了信道利用率和停等协议相比,GBN协议能同时发送多个帧。
    2. 缺点:只要丢失了一个,后边即使收到对的帧也会丢掉,非常的浪费时间。(选择重传协议能够完善这个缺点)
    展开全文
  • GBN协议的最大窗口

    千次阅读 多人点赞 2019-07-04 12:47:20
    使用GBN协议,发送窗口的大小W的范围是1~2^n-1。即最大窗口是2^n-1。这里很容易记错为2^n,如下面这道题 正确答案是,最大窗口数为2^8-1=255,所以有(255x128x8)/30=8.704Kbps。 可以这么理解:以下假设采用n=2...
  • 计算机网络GBN协议的动画演示,教师给的参考动画
  • 带图形界面的gbn协议模拟,通过按钮是否可按显示窗口的剩余数目,人工操控丢包超时
  • 基于UDP设计一个简单的GBN协议,实现单向可靠数据传输(服务器到客户的数据传输)。 模拟引入数据包的丢失,验证所设计协议的有效性。 改进所设计的 GBN 协议,支持双向数据传输;(选作内容,加分项目,可以当堂完成或...
  • 这一周做了一个计算机网络的实验,名字叫 可靠数据传输协议-GBN协议的设计与实现 感觉自己做的很认真,实现的效果也不错,就把自己的过程与结果记录一下 对于这个实验,实验要求上说实现SR协议是加分项,而SR协议又是以...
  • 适合学习计算机网络的人学习
  • 基于UDP的GBN协议(C语言实现),在不可靠链接基础上实现可靠数据传输。
  • 目录教训参考知识服务器端客户端实验目的实验内容实验过程GBN协议服务器端设计客户端设计实验结果全双工传输 教训 数据传输完成后未成功跳出 原因:while (true) {switch (stage) {case 0:break;}不能跳出循环,...
  • 计算机网络之GBN协议

    万次阅读 2016-05-25 19:17:23
    //如果将窗口大小设为 1,则为停-等协议 const int SEQ_SIZE = 20; //序列号的个数,从 0~19 共计 20 个 //由于发送数据第一个字节如果值为 0, 则数据会发送失败 //因此接收端序列号为 1~20,与发送端一一对应 BOOL...
  • GBN协议的一些理解

    2020-05-07 23:19:58
    王道书上的讲解不清楚,包括王道网课(2020)讲得也不清楚。 自己试着讲一下为什么窗口最大值 ≤ 2 (e^n) - 1 设用2个比特给帧编号:00、01、10、11 则帧序列为 [ 0,1,2,3 ],[ 0,1,2,3 ]......
  • UDP滑动窗口协议是建立在UDP上的应用层协议之上的。传输层使用的仍是UDP,但在应用层使用滑动窗口技术,并通过模拟TCP的一些机制以保证UDP的低协议处理开销和获得高通信可靠性。 在开始传输前,不进行tcp的3次握手。 ...
  • 建议将思维导图保存下来观看,或者点击这里在线观看
  • 精品文档实验 3:可靠数据传输协议 -GBN 协议的设计与实现1. 实验目的理解滑动窗口协议的基本原理;掌握 GBN 的工作原理;掌握基于 UDP 设计并实现一个 GBN 协议的过程与技术。2. 实验环境? 接入 Internet 的实验...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,640
精华内容 656
关键字:

gbn协议