uTP协议的包头格式

源地址:http://www.bittorrent.org/beps/bep_0029.html下面是我翻译的,英语比较好的可以读原文。

包头格式

version 1 header:

0       4       8               16              24              32

+-------+-------+---------------+---------------+---------------+

| ver   | type  | extension    | connection_id                 |

+-------+-------+---------------+---------------+---------------+

| timestamp_microseconds                                        |

+---------------+---------------+---------------+---------------+

| timestamp_difference_microseconds                             |

+---------------+---------------+---------------+---------------+

| wnd_size                                                     |

+---------------+---------------+---------------+---------------+

| seq_nr                        | ack_nr                        |

+---------------+---------------+---------------+---------------+

4、8、16、24、32单位为bit

version

版本号,4bit 目前版本号为1

connection_id

connection_id包含随机性,唯一性,可以用来唯一确认一个连接。每个socke对于发送包流程和接收包流程t有不同的connection_id。任意一端初始化这个id,每次返回connection_id+1.

timestamp_microseconds

时间戳。用来标注包发送时的本地时间 在类posix的系统下使用gettimeofday() 在windows下调用QueryPerformanceTimer()来获得。时间戳越精确,越接近发送时间,时间戳反映的效果越好越真实。

timestamp_difference_microseconds

时间值差异度。也就是延迟。指明了本地时间和接收到的时间戳之间的延迟。用于表示和衡量远端peer到本地机器的链路的延迟。

当新开一个socket时,并没有延迟sample,该值应当置为0。

wnd_size

窗口大小. 32bit宽。.

窗口大小标注了正在发送并没有收到ack的包数量。该窗口允许另一段控制窗口大小以便控制传输速度。

发送数据时,该值应当是socket 接收buffer的bytes数。

extension

extention的种类有3种,分别赋值表示如下:

0 means no extension.

  1. 选择性 acks
  2. Extension bits

Extensions are linked, 就像TCP选项。 If the extension域不是0,则紧跟着uTP头的是如下2个字节i

0              8               16

+---------------+---------------+

| extension     |len           |

+---------------+---------------+

where extension 指定下一个extention的种类,0表示结束。长度确定了这个extension的长度。未知的extension可以通过长度选项直接跳过。

Selective ACK

选择性ACK是一种ACK可发回ACK包而没有顺序。它的负载是一个至少32位的btimask。每个bkit代表了发送窗口的一个包。忽略发送窗口以外的包。一个置位的bit指明已经收到的包,清零的bit指明尚未收到的包。包头如下图:

0               8               16

+---------------+---------------+---------------+---------------+

| extension     |len           | bitmask

+---------------+---------------+---------------+---------------+

                                |

+---------------+---------------+

请注意extension的长度选项。也即是说extension至少为4,并且一定是4的倍数。

选择性的ACK在接受流中至少有一个顺序包被忽略时使用。因此如果mask中的第一个值代表 ack_nr + 2,当这样的包发出来的时候,那么ack_nr + 1的包就可以认为是已经抛弃或者丢失。一个置位的bit指明已经收到的包,清零的bit指明尚未收到的包。

The bitmask has reverse byte order. The first byte represents packets[ack_nr + 2,ack_nr + 2 + 7] in reverse order. The least significant bit in thebyte representsack_nr + 2, the most significant bit in the byte representsack_nr + 2 + 7. Thenext byte in the mask represents [ack_nr + 2 + 8, ack_nr + 2+ 15] in reverse order,and so on. The bitmask is not limited to 32 bits but canbe of any size.

上面这段大概是说,顺序是倒排的从2开始,每8个一排。图在下面很清晰的说。

在选择性ACK的包中,bitmask的层次如下:

0              8               16

+---------------+---------------+---------------+---------------+

| 9 8 ...   3 2 |17   ...  10 | 25   ...   18 | 33  ...   26 |

+---------------+---------------+---------------+---------------+

这些数字都是offset 表示的是该处与ack_nr的距离。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值