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>

UDT的Sender和Receiver的更多相关文章

  1. 很多人以为 connect 和 disconnect 应该像 new 和 delete 一样成对出现 这是错误的(只要 sender 或 receiver 其中之一不存在了,connect 会自动失效。QObject::connect 函数是线程安全的)

    其实我写文章也是边查资料边编辑的 有时候是怕自己的阐述不严谨,有时候是怕自己重复造轮子 就像有些人不停的教大家QLabel QDialog QWidget 个人是不屑的 命令模式 用 Qt's Und ...

  2. 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)

    搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...

  3. Bluemix中国版体验(二)

    从上一篇到现在大概有一个多月了.时隔一个月再登录中国版Bluemix,发现界面竟然更新了,现在的风格和国际版已经基本保持一致!这次我们来体验一下Mobile Service.不过mobile serv ...

  4. qt5中信号和槽的新语法

    qt5中的连接 有下列几种方式可以连接到信号上 旧语法 qt5将继续支持旧的语法去连接,在QObject对象上定义信号和槽函数,及任何继承QObjec的对象(包含QWidget). connect(s ...

  5. Fedora 24中的日志管理

    Introduction Log files are files that contain messages about the system, including the kernel, servi ...

  6. c++局域网多播

    转自http://www.51cto.com/specbook/17/35216.htm Visual C++实现局域网IP多播 在局域网中,管理员常常需要将某条信息发送给一组用户.如果使用一对一的发 ...

  7. java发送 email

    public class EmailUtils implements IAction { private static Logger logger = Logger.getLogger(EmailUt ...

  8. 深入浅出JMS(一) JMS基本概念

    摘要:The JavaMessage Service (JMS) API is a messaging standard that allows application components base ...

  9. Event,delegate,handler之间的关系

    在C#或者说.Net的事件处理机制中,有三个关键的概念 - 事件(Event),委托(Delegate)和处理器(Handler),另外在面向对象的背景中,还有另外两个概念 - 发送者(Sender) ...

随机推荐

  1. hadoop(学习)

                                                                                hadoop Hadoop是一个用于海量数据统计 ...

  2. 家庭记账本app进度之对于登录和注册两个界面点击按钮的相互跳转

    这次主要完成了两个两个android页面之间的跳转.从登录页面点击注册就会跳转到注册页面.在注册页面点击返回登录,这样就可以返回到登录界面.主要是这样的操作.其中遇到了一个困难主要是当点击按钮的时候, ...

  3. Oracle--pl/sql编程-分支语句(判断、循环)

    if语句 oracle: elsif      java: else if if (条件) then pl/sql或sql语句 [elsif (条件) then ] ...可以有多个elsif [el ...

  4. search(4)- elastic4s-ElasticDsl

    上次分析了一下elastic4s的运算框架.本来计划接着开始实质的函数调用示范,不过看过了Elastic4s的所有使用说明文档后感觉还是走的快了一点.主要原因是elasticsearch在7.0后有了 ...

  5. python 集合(set)和字典(dictionary)的用法解析

    Table of Contents generated with DocToc ditctaionary and set hash 介绍 集合-set 创建 操作和访问集合的元素 子集.超集.相对判断 ...

  6. AJ学IOS(45)之常用的小功能比如打电话、打开网址、发邮件、发短信打开其他应用。

    AJ分享,必须精品 简介 iOS中的很多小功能都是非常简单的,几行代码就搞定了,比如打电话.打开网址.发邮件.发短信.打开其他应用等. 打电话 方法1 最简单最直接的方式:直接跳到拨号界面 NSURL ...

  7. java接口工厂模式理解

    作为实际java开发经验还不到一年的我,第一次写博客,诚惶诚恐,怕把自己的谬误公之于众,误人子弟,不过转念一想,若是能有同行加以指点评判,将他们的真知灼见描述出来,那这篇文章就算抛转引玉了. 最近在阅 ...

  8. sublime text3配置html环境

    1.安装View in Browser 2.配置快捷键 [1]Preferences—Key Bindings—User. [2]插入代码 [ //ie { "keys": [&q ...

  9. CTE(With As)

    WITH tabdate(dt) AS ( FROM dual UNION ALL FROM tabdate WHERE dt ) SELECT * FROM TabDate ; 一.With Tab ...

  10. day28作业

    import os import uuid import pickle from conf import settings class School: def __init__(self,name,a ...