zoukankan      html  css  js  c++  java
  • 数据链路层(3) 流量控制

    一、流量控制

      当AB两台设备在发送数据,如果A设备有较高的发送速度,而B设备只有较低的接收速度,那么就会造成不匹配,容易造成传输错误,因此就需要流量控制。这种情况一般是由于B设备的缓冲区溢出而造成的。

      流量控制不止是链路层具备的功能,传输层也具备相应的功能。下面是链路层流量控制与传输层流量控制的区别:

      (1)数据链路层的流量控制是点对点的,而传输层的流量控制是端到端的

      (2)数据链路层流量控制的手段是接收方收不下就不回复确认帧。传输层的流量控制手段是接收端通过滑动窗口告诉发送方

    二、流量控制的方法

      数据链路层的流量控制方法主要是停止等待协议和滑动窗口协议,滑动窗口协议还包括后退N帧协议GBN和选择重协议SR

      

      停止-等待协议

      停止等待协议就是每发送完一个帧就停止发送,等待对方的确认帧,在收到确认帧后再发送下一个帧。下图实例:

        

      通过实例可以看到,当左边的发送端需要向右边的接收端发送数据帧M1,在右边的接收端在收到M1数据帧后,会向左边的发送端回复一个确认帧,当左边的发送端收到确认帧后,才开始发送M2数据帧,往复这样的过程来完成数据帧的发送,可以看就这种发送的方式是比较的低效的。

      

      三种流量控制协议滑动窗口的大小对比

      停止-等待协议  发送窗口大小 = 1,接收窗口大小 = 1;

      后退N帧协议GBN  发送窗口大小 > 1,接收窗口大小 =1;

      选择重传协议SR    发送窗口大小 > 1,接收窗口大小 >1;

      注:在链路层的滑动窗口控制协议中,在传输过程发送方滑动窗口的大小与接收方接收窗口的大小是固定值。

      流量控制总结

      (1)流量控制:控制发送速率,使接收方有足够的缓冲区来接收每一个帧。

      (2)滑动窗口就是用于流量控制的具体手段。

      (3)滑动窗口还可以解决可靠传输问题,因为它可以和自动重传功能搭配使用。

    三、停止-等待协议

      停止-等待协议就是每发送完一个帧就停止发送,等待对方的确认帧,在收到确认帧后再发送下一个帧。

      停止-等待协议有两种应用情况分别是无差错的和有差错的

      (1)停止-等待协议无差错的情况

        

        当发送方向接收方发送数据帧,发送方发送0帧到接收方,接收方收到0帧后,会向发送方回复0帧的确认帧ACK 0,发送方收到回复的确认帧ACK 0后,然后再向接收方发送1帧,发送双方不断的进行发送和确认的操作而传输数据。

        

      (2)停止-等待协议有差错的情况

        1)发送方帧丢失

        

        当发送方向接收方发送数据帧,发送的0帧发送方已经收到,接着发送方向接收方发送1帧,但是数据1帧因传输问题丢失,所以接收方也就不能回复确认帧,发送方在没有收到确认帧的情况下,它也不会无限期的等待,而是发送方设置有超时计时器,当超时计时器超时,发送方会再次发送1帧,这次接收方收到了1帧,并向发送方回复ACK 1 帧,接收方收到确认帧传输就结束了。

      注:(1)超时计时器设置的重传时间应当比帧传输的平均RTT更长一些

         (2)发送方发完一个帧后,必须保留该帧的副本,如果没有收到回复帧,则立刻重传该帧。

        

        2)接收方确认帧丢失

        

        当发送方向接收方发送数据帧,接收方已收到发送方的帧,并向发送方发确认帧,但是确认帧在传输过程中丢失,发送方没有收到,此时接收方也是通过超传计时器计时,如果在规定的时间内没有收到确认帧,那么发送方则重新发送该帧,接收方收到帧并丢弃,则重发确认帧给发送方。

        注:通过上面的实例可以看到,停止-等待协议的信道利用率比较低,只是解决了可靠传输的问题。

        

    四、后退N帧协议GBN  

      在讲述后退N帧协议GBN之前,我们先来看停止-等待协议,停止-等待协议就是每发送完一个帧就停止发送,等待对方的确认帧,在收到确认帧后再发送下一个帧。这样就会造成发送的效率非常的低,为了解决这个发送效率问题,就有了退N帧协议GBN。

      为了解决发送效率的问题,后退N帧协议GBN改变了滑动窗口的数量。

        

      现在我们通过实例来看看,后退N帧协议对滑动窗口做的改变,首先当发送方要发送数据时,它先准备6个滑动窗口,就是发送方蓝色的窗口,对应着0-5个帧。发送方先发出第0帧的数据(然后保留一份第0帧的附本),接着发送第1帧的数据(然后保留一份第1帧的附本),此时,第0帧先到达接收方,接收方收到第0帧后立刻回复第0帧的确认帧ACK 0,当发送方收到ACK 0时,滑动窗口就向后移动一格,现在则对应着1-6个帧,此时第1帧还在链路上传输,这样就提升了发送的效率,当然这只是图例,实现发送的过程是滑动窗口的数据都可以按顺序发送,收到确认帧则滑动窗口向后移动

      

      GBN发送方需要响应的三件事

      (1)上层的调用

      上层要发送数据时,发送方先检查发送窗口是否已满,如果未满,则产生一个帧并将其发送,如果窗口已满,发送方只需将数据返回给上层,提示上层窗口已满,上层等一会再发送。(实际情况是发送方先缓存这些数据,窗口空闲时再发送

      (2)收到了一个ACK帧

      GBN协议中,对n帧的确认采用累积确认的方式,标明接收方已经收到n帧和它之前的全部帧

      (3)超时

      与停止-等待协议一样,如果出现超时,发送方重传所有已发送但未被确认的帧

      

      GBN接收方需要响应的事

      如果正确收到n号帧,并且按序,那么接收方为n帧发送一个ACK确认帧,并将帧中的数据部分交付给上层。其余情况都丢弃帧,并为最近按序接收的帧重新发送ACK,接收方无需缓存任何失序帧,只需要维护一个信息,就是下一个按序接收的帧序号意思是不是按序收到的帧都会被丢弃,并且不会回复确认帧

      接着我们来看看实例:

      

      当发送方向接收方发送数据,接收方收到0帧、1帧,并且都回复了确认帧,但是2帧传输过程丢失,虽然接收方收到第3、4、5帧它都会丢弃这些帧,只发送回复ACK 1(意思是只收到了0、1帧,请发送方发送第2帧),此时发送方第2帧设置的计时器超时,重新发送了2、3、4、5帧。

      

      GBN协议总结

      (1)累积确认:就是当接收方向发送方发出第n帧的确认信息,那么接收方就认为第n帧之前的所有帧接收方都已正确接收。

      (2)接收方只按顺序接收帧,不按顺序会被丢弃。接收方有一个计录需要接收帧的序号,如果不是它都不会接收直接丢弃。

      (3)发送方窗口最大为 2n - 1,接收窗口大小为1。

      GBN协议性能分析:因连续发送数据帧而提高了信道利用率(与停止-等待协议比较),但是在重传时把原来已经正确传送的数据帧重传,又降低了效率。

    五、选择重传协议SR

       选择重传协议SR就是为解决后退N帧协议GBN数据帧丢失需要重传确认的问题,选择重传协议SR解决问题的办法是设置单个确认,同时加大接收窗口,设置接收缓存(缓存乱序帧)。以下是选择重传协议SR的图例:

        

      

      SR发送方需要响应的三件事

      (1)上层的调用

      上层要发送数据时,SR发送方先检查发送窗口可用于该帧的序号,如果序号位地发送窗口内,则发送数据帧;否则就像GBN一样,要么将数据缓存,要么返回上层之后再传输。

      (2)收到了一个ACK帧

      如果收到ACK,加入该帧序号在窗口内,则SR发送方将被确认的帧标记为已接收,如果该帧序号是窗口的下界(最左边第一个窗口对应的序号),则窗口向前移动到具有最小序号的未确认帧,如果窗口移动到有序号并未发送的帧,则发送帧。

      (3)超时

      每个帧都有自己的定时器,当某帧确认超时,则只重传某帧。

      

      SR接收方需要响应的事

      来者不拒(窗口内的帧)

      SR接收方将确认一个正确接收的帧而不管其是否按序,失序的帧将被缓存,并反回给发送方一个该帧的确认帧,当序号最小的帧被接收,这时可以将一批按序帧交付给上层,则向前移动滑动窗口。图例:

        

      

      SR协议总结

      (1)对数据帧逐一确认,收一个确认一个。

      (2)只重传出错帧。

      (3)接收方有缓存。

      (4)滑动窗口大小 = WRmax = 2 (n - 1 ) 

  • 相关阅读:
    移动端性能优化动态加载JS、CSS
    右侧跟踪导航
    JQ+rotate插件实现图片旋转,兼容IE7+ CHROME等浏览器
    什么JSONP
    Web前端开发:什么是页面重回(repaints)与回流(reflow)
    javascript中的eval()函数应用以及要点
    SQL表值参数批量插入
    SQL SERVER 使用 OPENRORWSET(BULK)函数将txt文件中的数据批量插入表中(2)
    SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)
    一个编程菜鸟的进阶之路(C/C++)
  • 原文地址:https://www.cnblogs.com/PBDragon/p/14920433.html
Copyright © 2011-2022 走看看