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) ...
随机推荐
- 怎样让scratch里的人物两腿走动
需要人物角色至少有两个“造型”,表现走路时的两个动作.以默认的“小猫”觉色为例,它有两个“造型”,可以用来表现奔跑的动作. 但是要想让小猫跑起来,需要脚本来实现,简单跑动脚本如下 scratch学习视 ...
- SpringMVC(六):分层整合SSM
环境搭建 版本: MySQL 8 SpringMVC+Spring+Mybatis C3P0连接池 数据库建表 CREATE DATABASE `ssmbuild`; `ssmbuild` DROP ...
- Linux 磁盘管理篇,开机挂载
设置开机挂载需要到 /etc/fstab 里设置 第一列:磁盘设备文件名或该设备的label 第二列:挂载点 第三列:磁盘分区文件系统 第四列:文件系统参数 第五列:能否被dump备份命令作用 第六列 ...
- 中阶d03.3 JDBC_CURD_Util --- 使用 junit执行单元测试(增删改查)
1.单元测试环境准备 https://www.cnblogs.com/longesang/p/11399010.html 2.测试 3.结果返回 4.代码 新建一个test目录统一存放测试案例 查: ...
- 30.3 Collections 集合体系的工具类
/* * Collections: * 面试题:Collection和Collections有什么区别? * Collection是集合体系的最顶层,包含了集合体系的共性 * Collections是 ...
- Array(数组)对象-->shift() 方法
1.定义和用法 shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值. 语法: array.shift() 注意: 此方法改变数组的长度! 举例: var arr = [1,2, ...
- 一个有关 scala 编程语言 的博客
http://www.cnblogs.com/superjt/category/312683.html
- 【Canvas】(2)---绘制折线图
绘制折线图 之前在工作的时候,用过百度的ECharts绘制折线图,上手很简单,这里通过canvas绘制一个简单的折线图.这里将一整个绘制过程分为几个步骤: 1.绘制网格 2.绘制坐标系 3.绘制点 4 ...
- 一个好的olap框架
一.何为一个好的olap框架? 框架大概分为两种: (1)底层技术框架,专注于抽象底层技术,如网络通信netty.中间件kafka等 (2)开发人员框架,专注于提高开发效率,如spring的面向切面和 ...
- 联通友华通信光纤猫PT952G设置无线路由光猫桥接拨号
#0x1 登陆后台,点击网络,点击宽带设置.选择第二个接口. 0x2 只修改模式,改成Bridge,其他无需修改.然后直接接路由器拨号就行,或者电脑都行. 0x4 恢复默认拨号,这样修改以后,直接连 ...