-
UDT的Sender和Receiver
Sender算法
数据结构和变量:
- Sender’s Loss List:发送方的loss list用来存储丢失包的序列号,序列号来自于两个地方,一是receiver通过NAK包反馈回来,二是超时事件发生时插入到列表里。序列号在loss list中是按序存储的。
数据发送算法:
- 如果sender的loss list不为空,那么重发loss list中的第一个包并且从list中删除它,然后转到<5>
- 在messaging模式中,如果数据包在Losslist中已经超过了应用指定的TTL时间,那么就发送message drop请求,并且将所有相关的数据包从loss list中清除,然后转到<1>
- 等待直到有应用数据可以发送
- 两种情况
- 如果未应答的包总量达到了 flow/congestion 窗口大小,那么等待直到收到任何一个ack,然后转到<1>
- 否则包装一个新的数据包然后发送。
- 如果当前数据包的序号是16N,即16的倍数,转到<2>
- 等待(SND-t)时间,SND是数据包发送间隔,通过拥塞控制更新,t是步骤1-5消耗的总时间,然后转到<1>
Receiver算法
数据结构和变量
- Receiver的Loss List:是一个数据元列表,数据元包含:已检测到丢失的数据包的序号,数据元最近一次NAK反馈的时间,已经被NAK反馈的次数K。数据元按照数据包序号升序排列。
- ACK History Window:一个循环数组,包含了每个送出的ACK和其出发的时间,如果数组中没有足够的空间,新数据会覆盖老数据。
- PKT History Window:一个循环数组记录了每个数据包到达的时间
- Packet Pair Window: 一个循环数组记录了每个对包内部的间隔时间
- LRSN:该变量记录收到的最大数据包序号,LRSN被初始化为(初始序号 -1)
- ExpCount:该变量记录EXP time-out事件发生的数量
数据接收算法:
- 查询系统时间,检查ACK,NAK,EXP定时器是否过期,如果任何一个定时器过期,则处理对应的事件,然后重置定时器对应的时间。对于ACK定时器,需要同时检查ACK包的间隔时间。
- 开始有超时的UDP报文接收,如果没有任何报文到达,转到<1>
- 重置ExpCount=1,如果全部数据已经ACK(loss list 为空?)或者收到ACK,NAK控制包,重置EXP定时器
- 检查包头的标志位,如果是控制包,根据其类型进行处理,然后转到<1>
- 如果当前数据包的序号是16N+1,在Packet Pair Window中记录当前数据包跟上一个数据包的时间间隔。
- 在PKT History Window中记录包到达时间
- 两种情况
- 如果当前数据包的序号A比LRSN+1大,将A和LRSN+1之间(不含)的所有序号放到loss list中,然后用NAK包发送回sender。
- 如果序号比LRSN小,将其从loss list中移除。
- 更新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
润新知