zoukankan      html  css  js  c++  java
  • 计算机网络-传输层(2)流水线协议和滑动窗口协议

    流水线技术允许发送方在收到ACK之前连续发送多个分组:
    (1)必须增加序号范围,因为每个输送中的分组(不计算重传的)必须有一个唯一的序号,而且也许有多个在输送中未确认的报文。
    (2)协议的发送方和接收方要能缓存多个分组。发送方至少要能缓存那些已发送但没有确认的分组,接收方可能要缓存那些已正确接收的分组。
    (3)所需序号范围和对缓冲的要求取决于数据传输协议如何处理丢失、损坏及延时过大的分组。解决流水线的差错恢复有两种滑动窗口协议:回退N步(Go-Back- N,GBN) 和选择重传(Selective Repeat,SR) 。
     
     
    回退N步(GBN)协议
    在流水线中未确认的分组数不能超过最大允许数(窗口长度N<2^k)
    基序号(base) 定义为最早的未确认分组的序号,将下一个序号(nextseqnum) 定义为最小的未使用序号(下一个待发分组的序号)
    如果窗口已满,发送方会缓存上层应用发来的数据,或使用同步机制(如一个信号量或标志)仅当窗口不满时才允许上层应用发送数据。
    对序号为n的分组的确认采取累积确认的方式, 接受方发送拥有最高序列号的、已被正确接收的分组的ACK,表明自己已正确接收到序号≤n的所有分组。
    乱序到达的分组直接丢弃(接收方无需缓存)重新确认序列号最大的、按序到达的分组,因此可能产生重复ACK。
    只有一个计时器,base每次增加1,如果base==nextseqnum,就停止计时器,否则重启计时器。
    如果出现超时,发送方重传所有已发送但还未被确认过的所有分组。
    缺点:单个分组的差错就能够引起GBN重传大批分组,许多分组根本没有必要重传。随着信道差错率的增加,流水线可能会被这些不必要重传的分组所充斥。
     
    选择重传(Selective Repeat, SR)
    发送方窗口和接受方窗口之和必须小于2^k
    发送方:
    从上层收到数据:当从上层接收到数据后,发送方检查下一个可用于该分组的序号。如果序号位于发送方的窗口内,则将数据打包并发送;否则就像在GBN 中一样,要么将数据缓存,要么将其返回给上层以便以后传输。
    重传:每个分组必须拥有其自己的逻辑定时器,超时发生后只能发送一个分组,并重启该定时器
    收到ACK :如果收到ACK,倘若该分组序号在窗口内,则发送方将那个被确认的分组标记为己接收;如果该分组的序号等于发送窗口基序号send_base, 则send_base向前移动到具有最小序号的未确认分组处;如果窗口移动了并且有序号落在窗口内的未发送分组,则发送这些分组。
    缓存机制:接收方将确认一个正确接收的分组而不管其是否按序。失序的分组将被缓存直到所有丢失分组(序号更小的分组)皆被收到为止
    接受方:
    序号在[rcv_base, rcv_base + N-1] 内的分组被正确接收:如果该分组以前没收到过,则缓存该分组。如果该分组的序号等于接收窗口的基序号rcv_base,则该分组以及以前缓存过的所有连续分组交付给上层。
    序号在[rev_base-N, rev_base-1]内的分组被正确接收:虽然该分组是接收方以前已确认过的分组,也必须发送ACK
    其他情况:忽略该分组。
  • 相关阅读:
    Btrace
    ThreadPoolExecutor线程池参数设置技巧
    工具篇-NotePad++/JSON格式化
    springcloud-- Alibaba-nacos--支持的几种服务消费方式
    @RequestParam和@RequestBody的区别
    Excel 2013如何判断单元格里是否包含某个字符
    redis 通配符批量删除key
    字节真题 ZJ26-异或:使用字典树代替暴力破解降低时间复杂度
    约瑟夫环问题解决方法时间复杂度分析
    九字真言
  • 原文地址:https://www.cnblogs.com/yangyuliufeng/p/9268886.html
Copyright © 2011-2022 走看看