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>
UDT的Sender和Receiver的更多相关文章
- 很多人以为 connect 和 disconnect 应该像 new 和 delete 一样成对出现 这是错误的(只要 sender 或 receiver 其中之一不存在了,connect 会自动失效。QObject::connect 函数是线程安全的)
其实我写文章也是边查资料边编辑的 有时候是怕自己的阐述不严谨,有时候是怕自己重复造轮子 就像有些人不停的教大家QLabel QDialog QWidget 个人是不屑的 命令模式 用 Qt's Und ...
- 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)
搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...
- Bluemix中国版体验(二)
从上一篇到现在大概有一个多月了.时隔一个月再登录中国版Bluemix,发现界面竟然更新了,现在的风格和国际版已经基本保持一致!这次我们来体验一下Mobile Service.不过mobile serv ...
- qt5中信号和槽的新语法
qt5中的连接 有下列几种方式可以连接到信号上 旧语法 qt5将继续支持旧的语法去连接,在QObject对象上定义信号和槽函数,及任何继承QObjec的对象(包含QWidget). connect(s ...
- Fedora 24中的日志管理
Introduction Log files are files that contain messages about the system, including the kernel, servi ...
- c++局域网多播
转自http://www.51cto.com/specbook/17/35216.htm Visual C++实现局域网IP多播 在局域网中,管理员常常需要将某条信息发送给一组用户.如果使用一对一的发 ...
- java发送 email
public class EmailUtils implements IAction { private static Logger logger = Logger.getLogger(EmailUt ...
- 深入浅出JMS(一) JMS基本概念
摘要:The JavaMessage Service (JMS) API is a messaging standard that allows application components base ...
- Event,delegate,handler之间的关系
在C#或者说.Net的事件处理机制中,有三个关键的概念 - 事件(Event),委托(Delegate)和处理器(Handler),另外在面向对象的背景中,还有另外两个概念 - 发送者(Sender) ...
随机推荐
- php的 '1' == 1, 返回true,到底是谁变成了谁?
此过程为字符串的 '1' 隐含的编程了数字类型1,所以是true
- python--装饰器、生成器、迭代器、元类
一.装饰器 def w1(func): def inner(): func() return inner @w1 def f1(): ') 1.只要python解释器执行到装饰器,就会自动进行装饰,而 ...
- SpringMVC(二):使用注解开发
本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接 https://space.bilibili.com/95256449?spm_id_from=33 ...
- 2017蓝桥杯贪吃蛇(C++C组)
原题: 贪吃蛇长度+-------------------------------------------------+| ...
- Array(数组)对象-->数组的访问
1.访问数组: 通过指定数组名以及索引号码,你可以访问某个特定的元素. 格式: 数组对象名[下标] 例如:arr[0] 就是访问数组第一个值 var arr = new Array(3); arr[ ...
- C++语言实现双向链表
这篇文章是关于利用C++模板的方式实现的双向链表以及双向链表的基本操作,在之前的博文C语言实现双向链表中,已经给大家分析了双向链表的结构,并以图示的方式给大家解释了双向链表的基本操作.本篇文章利用C+ ...
- python数据类型及有关的实用函数
本系列例子使用python3.x, 编辑时间:2019-09-03,23:03:36 python以“对象引用”来存储数据,以对象来表达数据,每个对象都具有身份,对象和值. 实用函数: id(): 查 ...
- 数据表记录包含表索引和数值(int范围的整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出
此题如果直接使用有序的TreeMap就不需要这样折腾: 1.map的key值唯一性,故就不在需要set集合来去重 2.使用map后利用key的唯一性,把序列号相同的数据直接加在一起,代码会很简洁 pa ...
- Centos7_搭建暗网网站
Tor运行原理 请求方需要使用:洋葱浏览器(Tor Browser)来对暗网网站进行访问 响应放需要使用:Tor协议的的Hidden_service 搭建步骤 更新YUM源: rpm -Uvh htt ...
- 【一统江湖的大前端(9)】TensorFlow.js 开箱即用的深度学习工具
示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 目录 一. 上手TensorFlow.js 二. ...