zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    Shared Memory in Windows NT
    Layered Memory Management in Win32
    软件项目管理的75条建议
    Load pdbs when you need it
    Stray pointer 野指针
    About the Rebase and Bind operation in the production of software
    About "Serious Error: No RTTI Data"
    Realizing 4 GB of Address Space[MSDN]
    [bbk4397] 第1集 第一章 AMS介绍
    [bbk3204] 第67集 Chapter 17Monitoring and Detecting Lock Contention(00)
  • 原文地址:https://www.cnblogs.com/twodog/p/12137846.html
Copyright © 2011-2022 走看看