如何识别uTP协议流量?
【注意】请使用等宽字体(如Courier New)阅读本文档。
1. uTP协议文档请参见:Specifications: BEP-0029
http://www.bittorrent.org/beps/bep_0029.html
2. uTP协议流量中的数据包具有如下uTP协议包头:
-- Fixed Header --
Fields Types
0 4 8 16 24 32
+-------+-------+---------------+---------------+---------------+
| ver | type | extension | connection_id |
+-------+-------+---------------+---------------+---------------+
| timestamp_microseconds |
+---------------+---------------+---------------+---------------+
| timestamp_difference_microseconds |
+---------------+---------------+---------------+---------------+
| wnd_size |
+---------------+---------------+---------------+---------------+
| seq_nr | ack_nr |
+---------------+---------------+---------------+---------------+
【备注】在头部中,ver字段是第一个字节(byte 0)的低4位。
数据包的类型由type字段决定,有如下几种类型:
1. type==0
表示传输数据。该包中必然包含数据部分。
2. type==1
表示释放uTP连接。这是一条uTP流的最后一个数据包。
3. type==2
表示状态。主要用于ACK。
4. type==3
表示强制断开uTP连接。
5. type==4
表示请求建立uTP连接。
此外,uTP协议还定义了扩展字段(见数据包头部中的extension),扩展字段主要有三类:
1. extension==0
表示无扩展。
如果extension!=0,则头部之后接着有2Bytes,
-- Extension Field(s) --
0 8 16...
+---------------+---------------+---------------+---------------+
| extension | len | 负载
+---------------+---------------+---------------+---------------+
其中,
extension指定下一个扩展。也就是说,本扩展部分之后还可以继续有扩展部分。如果extension==0,表示接着没有扩展部分了。如果extension!=0,表示本扩展之后,接着是另一个扩展。
len指定了本扩展的长度。
2. extension==1
表示有选择地确认(selective ACK)。
len是以Bytes表示的。
负载部分是32位(4Bytes)或32位的倍数(4*n Bytes)的位掩码(bitmask)。因此,len是4或者为4的倍数。
3. extension==2
用于交换信息。长度len==8,现在负载全部为0。
一条完整的uTP流的过程如下:A(ip1, port1) B(ip2, port2)
1. SYN A->B
type==4
A->B: Connect_ID+1
B->A: Connect_ID
2. ACK B->A
type==2
A->B: Connect_ID+1
B->A: Connect_ID
3. DATA
type==0
4. FIN或RST
type==1或type==3
【注意】请使用等宽字体(如Courier New)阅读本文档。
1. uTP协议文档请参见:Specifications: BEP-0029
http://www.bittorrent.org/beps/bep_0029.html
2. uTP协议流量中的数据包具有如下uTP协议包头:
-- Fixed Header --
Fields Types
0 4 8 16 24 32
+-------+-------+---------------+---------------+---------------+
| ver | type | extension | connection_id |
+-------+-------+---------------+---------------+---------------+
| timestamp_microseconds |
+---------------+---------------+---------------+---------------+
| timestamp_difference_microseconds |
+---------------+---------------+---------------+---------------+
| wnd_size |
+---------------+---------------+---------------+---------------+
| seq_nr | ack_nr |
+---------------+---------------+---------------+---------------+
【备注】在头部中,ver字段是第一个字节(byte 0)的低4位。
数据包的类型由type字段决定,有如下几种类型:
1. type==0
表示传输数据。该包中必然包含数据部分。
2. type==1
表示释放uTP连接。这是一条uTP流的最后一个数据包。
3. type==2
表示状态。主要用于ACK。
4. type==3
表示强制断开uTP连接。
5. type==4
表示请求建立uTP连接。
此外,uTP协议还定义了扩展字段(见数据包头部中的extension),扩展字段主要有三类:
1. extension==0
表示无扩展。
如果extension!=0,则头部之后接着有2Bytes,
-- Extension Field(s) --
0 8 16...
+---------------+---------------+---------------+---------------+
| extension | len | 负载
+---------------+---------------+---------------+---------------+
其中,
extension指定下一个扩展。也就是说,本扩展部分之后还可以继续有扩展部分。如果extension==0,表示接着没有扩展部分了。如果extension!=0,表示本扩展之后,接着是另一个扩展。
len指定了本扩展的长度。
2. extension==1
表示有选择地确认(selective ACK)。
len是以Bytes表示的。
负载部分是32位(4Bytes)或32位的倍数(4*n Bytes)的位掩码(bitmask)。因此,len是4或者为4的倍数。
3. extension==2
用于交换信息。长度len==8,现在负载全部为0。
一条完整的uTP流的过程如下:A(ip1, port1) B(ip2, port2)
1. SYN A->B
type==4
A->B: Connect_ID+1
B->A: Connect_ID
2. ACK B->A
type==2
A->B: Connect_ID+1
B->A: Connect_ID
3. DATA
type==0
4. FIN或RST
type==1或type==3