• UDT的Sender和Receiver


    Sender算法

    数据结构和变量:

    1. Sender’s Loss List:发送方的loss list用来存储丢失包的序列号,序列号来自于两个地方,一是receiver通过NAK包反馈回来,二是超时事件发生时插入到列表里。序列号在loss list中是按序存储的。

    数据发送算法:

    1. 如果sender的loss list不为空,那么重发loss list中的第一个包并且从list中删除它,然后转到<5>
    2. 在messaging模式中,如果数据包在Losslist中已经超过了应用指定的TTL时间,那么就发送message drop请求,并且将所有相关的数据包从loss list中清除,然后转到<1>
    3. 等待直到有应用数据可以发送
    4. 两种情况
      • 如果未应答的包总量达到了 flow/congestion 窗口大小,那么等待直到收到任何一个ack,然后转到<1>
      • 否则包装一个新的数据包然后发送。
    5. 如果当前数据包的序号是16N,即16的倍数,转到<2>
    6. 等待(SND-t)时间,SND是数据包发送间隔,通过拥塞控制更新,t是步骤1-5消耗的总时间,然后转到<1>

    Receiver算法

    数据结构和变量

    1. Receiver的Loss List:是一个数据元列表,数据元包含:已检测到丢失的数据包的序号,数据元最近一次NAK反馈的时间,已经被NAK反馈的次数K。数据元按照数据包序号升序排列。
    2. ACK History Window:一个循环数组,包含了每个送出的ACK和其出发的时间,如果数组中没有足够的空间,新数据会覆盖老数据。
    3. PKT History Window:一个循环数组记录了每个数据包到达的时间
    4. Packet Pair Window: 一个循环数组记录了每个对包内部的间隔时间
    5. LRSN:该变量记录收到的最大数据包序号,LRSN被初始化为(初始序号 -1)
    6. ExpCount:该变量记录EXP time-out事件发生的数量

    数据接收算法:

    1. 查询系统时间,检查ACK,NAK,EXP定时器是否过期,如果任何一个定时器过期,则处理对应的事件,然后重置定时器对应的时间。对于ACK定时器,需要同时检查ACK包的间隔时间。
    2. 开始有超时的UDP报文接收,如果没有任何报文到达,转到<1>
    3. 重置ExpCount=1,如果全部数据已经ACK(loss list 为空?)或者收到ACK,NAK控制包,重置EXP定时器
    4. 检查包头的标志位,如果是控制包,根据其类型进行处理,然后转到<1>
    5. 如果当前数据包的序号是16N+1,在Packet Pair Window中记录当前数据包跟上一个数据包的时间间隔。
    6. 在PKT History Window中记录包到达时间
    7. 两种情况
      • 如果当前数据包的序号A比LRSN+1大,将A和LRSN+1之间(不含)的所有序号放到loss list中,然后用NAK包发送回sender。
      • 如果序号比LRSN小,将其从loss list中移除。
    8. 更新LRSN,转到<1>
  • 相关阅读:
    C#使用进度条,并用线程模拟真实数据 ProgressBar用法(转)
    装饰者模式(Decorator Pattern)C#版本的
    C# Stream篇(七) -- NetworkStream
    C# Stream篇(六) -- BufferedStream
    C# Stream篇(五) -- MemoryStream
    C# Stream篇(四) -- FileStream
    C# Stream篇(三) -- TextWriter 和 StreamWriter
    C# Stream篇(二) -- TextReader 和StreamReader
    C# Stream篇(—) -- Stream基类
    代理模式(Proxy Pattern)C#版本的
  • 原文地址:https://www.cnblogs.com/twodog/p/12137845.html
Copyright © 2020-2023  润新知