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>
原文地址:https://www.cnblogs.com/twodog/p/12137847.html