源地址: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.
- 选择性 acks
- 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的距离。