UDT 协议学习

 UDT是双工的,每个UDT实体有:发送和接收。 
发送者根据流量控制和速率控制来发送(和重传)应用程式数据。接收者接收数据包和控制包,并根据接收到的包发送控制包。发送和接收程式共享同一个UDP端口来发送和接收。

UDT有两种包:数据包和控制包。
他们通过包头的第一位来区分(标志位),  假如是0,表示是数据包,1表示是控制包。

1. 数据包
UDT 协议学习_第1张图片
数据包头(32bit):
数据包以0开头,包序号是UDT数据包头中唯一的内容,它是个无符号整数,使用标志位后的31位,UDT包是基于序列的,例如: 每个非重传的包都增加序号1。

消息头(32bit):
消息头的前两 bit (上图中FF的位置) 表示分包标记,  如果 FF 的位置 是 10 表示第一个分包, 00 表示中间分包, 01 表示最后一个分包,  11 表示一个完整的包; 第三bit表示是否按顺序传递(1是, 0否),  按顺序传递消息 要求必须传递或删除以前面的所有消息, 后面的 29 位是消息号.

2. 控制包
UDT 协议学习_第2张图片
UDT中有8种类型的控制包,type 放在报头的位字段1-15中,后面的内容取决于 type。前面的 4字节 (128 bit) 必须存在。根据 type 的定义 可能有一个空的控制信息字段。

注意:
ACK包 (type=0x2) 使用子序列,每个ACK包分配一个唯一的递增16位序列号,该序列号独立于数据包序列号 (范围从0~2^31-1),ACK序列号使用包头中的 32-63 bit(即: Additional Info)。

附加信息:Additional Info
控制信息:Control Information Field

类型0x0:协议连接握手
    附加信息:未定义
    控制信息:1) 32位:UDT版本
                      2) 32位:套接字类型(STREAM或DGRAM)
                      3) 32位:初始包序列号
                      4) 32位:最大数据包大小(包括UDP/IP头)
                      5) 32位:最大流窗口大小
                      6) 32位:连接类型(常规或集合)
                      7) 32位:套接字ID
                      8) 32位:SYN cookie
                      9)128位:对等方UDP套接字的IP地址

类型0x1:保持活动状态
      附加信息:未定义
      控制信息:无

类型0x2:确认(ACK)
      附加信息:ACK序列号
      控制信息:1)32位:所有已接收以前的数据包(不包括)
                        [以下字段是可选的]
                        2)32位:RTT(微秒)
                        3)32位:RTT 方差
                        4)32位:可用缓冲区大小(字节)
                        5)32位:数据包接收速率(以每秒数据包数为单位)
                        6)32位:估计链路容量(以每秒数据包数为单位)

类型0x3:否定确认(NAK)
       附加信息:未定义
       控制信息:1) 压缩损失信息的32位整数数组(见第3.9节)。

类型0x4:未使用   (空的控制信息)

类型0x5:停机
       附加信息:未定义
       控制信息:无

类型0x6:确认确认(ACK2)
        附加信息:ACK序列号
        控制信息:无

类型0x7:消息删除请求:
       附加信息:消息ID
       控制信息:1) 32位:消息中的第一个序列号
                         2) 32位:消息中的最后一个序列号

类型0x7FFF:由位16-31解释,保留给用户定义控制数据包. 

最后,时间戳和目标套接字ID也存在于控制数据包。
注意,对于数据和控制包来说,能够从UDP协议头中得到实际的包大小。包大小信息能被用来得到有效的数据负载和NAK包中的控制信息字段大小。

你可能感兴趣的:(工业相机,音频视频,流媒体,学习,服务器,网络,c++)