精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
UDT协议的包结构可分为2种:数据包和控制包。两种“信息包”(数据包或控制包)通 过包头的第一位区分。
数据包的包结构如下图所示:
数据包的包头第一位值是0。序列号宽度占有31位。UDT使用基于序列号的包。每一 次发包时,序列号以包发送的次序同步累加1。序列号是无符号数,序列号到231 – 1后又 从新开始。
包头的第二个4字节域用于消息。域的前二位“FF”标记了消息包的位置。
“10”表示消息的第一个包;
“01”表示消息的最后一个包;
“11”表示消息仅含有唯一的包;
“00”表示当前包在消息的中间。
域的第三位标识该消息应当以顺序(“1”)或者乱序(“0”)投递。一个顺序的消息投递时, 需要保证之前排队投递的消息都已经被投递或者被丢弃。
域的剩余29位表示消息号。消息号是独立的,是和包序列号相似的计数序号。
一个UDT消息可以包含多个UDT包。
包头的第三个4字节表示时间标签。时间标签是一个相对值,相对于UDT连接建立时 的消耗时间。时间标签信息目前并不是必要的。仅当用户在自定义控制算法时,UDT协议可 以向用户提供可选的时间标签参数作为算法的控制项。
包头的第四个4字节表示目标Socket ID。目标Socket ID用于UDP多路复用。多个 UDT的Socket可被绑定(Bind)在同一个UDP端口上,而目标Socket ID用来区分不同 的UDT连接。
包头的第一位是1时,暗示了该包是控制包。控制包的包结构如下图所示:
Type字段占包头的15位,目前存在8种有效的控制包类型。
后续的字段域的内容的取决于Type字段的控制包类型。前128位(4个双字)必然存在 于包头,然而个别字段域的值可能为空。
例如,UDT的ACK控制包里使用ACK序列号。ACK序列号不依赖于数据包的序列号。
ACK序列号使用控制包头的“Additional Info”字段域。ACK序列号的取值范围为[0, 231 – 1]。
TYPE 0x0: 协议的握手连接
Additional Info: 未定义
Control Info:
1) 32 bits: UDT version(UDT目前有4个版本)
2) 32 bits: Socket type (数据流或者报文)
3) 32 bits: initial packet sequence number
4) 32 bits: maximum packet size (包括UDP和IP头)
5) 32 bits: maximum flow window size
6) 32 bits: connection type (Traditional or Rendezvous)
7) 32 bits: socket ID
8) 32 bits: SYN cookie
9) 128 bits: the IP address of the peer's UDP socket
TYPE 0x1: Keep-alive
Additional Info: 未定义
Control Info: None
TYPE 0x2: 应答(ACK)
Additional Info: ACK sequence number
Control Info:
1) 32 bits: The packet sequence number to which all the previous packets have been received (excluding)
[以下2-6信息域是可选的]
2) 32 bits: RTT (单位是微秒)
3) 32 bits: RTT variance
4) 32 bits: Available buffer size (单位是字节)
5) 32 bits: Packets receiving rate (单位是每秒包数)
6) 32 bits: Estimated link capacity (单位是每秒包数)
TYPE 0x3: 否定应答(NAK)
Additional Info: 未定义
Control Info:
1) 32 bits integer array of compressed loss information
TYPE 0x4: 未使用的
TYPE 0x5: 关闭连接
Additional Info: 未定义
Control Info: None
TYPE 0x6: 应答的应答(ACK2)
Additional Info: ACK sequence number
Control Info: None
TYPE 0x7: Message Drop Request
Additional Info: Message ID
Control Info:
1) 32 bits: First sequence number in the message
2) 32 bits: Last sequence number in the message
TYPE 0x7FFF: Explained by bits 16 - 31, reserved for user defined Control Packet
另外,时间标签和目标Socket ID也存在控制包里。