BitTorrent通信流程与网络包结构

本文转载自: http://blog.csdn.net/wengpingbo/article/details/9174363

BitTorrent协议支持基于TCPUTP网络协议进行数据传输,但是由于TCP协议是有连接的,需要先进行握手。在进行数据传输的过程中,每个种子会占有大量的TCP连接,从而占有大量的用户带宽。这给其他需要高实时性的应用造成很大的网络压力。

于是BitTorrent又支持UTP协议用来进行数据传输,这也是当前大部分BT下载客户端所采用的实现方式。UTP(uTorrent Transport Protocol)是基于UDP网络协议的,也就是无连接协议,采用这种协议进行数据交换,可以很容易进行带宽控制,不会造成网络拥堵。

下面主要分析BitTorrent中的UTP协议,因为这个常用嘛!

UTP协议的包结构如下:(不包含UDP header


Fig. 1 UTP包结构(来自bittorrent.org)

  •  type:数据包类型,0--带负载数据包,就是通常在连接建立后,上传数据或下载数据的包;1--连接结束数据包,结束一个连接;2--数据回应包,当一个peer收到一个带负载数据包后,会回一个ACK包,来表示这个包已正确接收,有点类似于TCPSYN的感觉,但是这个是在UDP包的数据段做连接控制;3--重置连接;4--开始一个连接
  •  ver:协议版本,通常为1
  •  extension:扩展段,用于支持BEPs
  •  connection_id:连接id,同一个连接id的数据包属于一个连接,一般每两个peer之间会开两个连接,一个用于发,一个用于收
  •  timestamp_microseconds:包的发送时间
  •  timestamp_difference_microseconds:由于双方的时间戳不同,因此每个报文都要带一个上次接收到的包中显示的时间(就是上面的timestamp_microseconds)和当前时间戳之间的差值,然后把这个差值减去最小的基准差(也就是历史差值中的最小值),再把结果送到拥塞控制器中运算,进而控制速度。
  •  wnd_size:发送方当前剩余窗口大小,用于进行速度和带宽控制。BitTorrent协议中每一个发出去的数据包,都要求接收方回一个ACK包。而一个peer的窗口大小是指当前发送出去,但还没有收到回应的包的总大小,单位为字节。每一个peer都一个最大窗口值和一个窗口大小上限值。当wnd_size小于最小UTP包大小的时候,发送方会停止发送数据包,或调整每个数据包的数据负载大小
  •  seq_nr:相对于一个连接,数据包的序列号,以一个包为计数单位
  •  ack_nr:发送方最近接收到的包的序列号

可能说这么多,有点混乱了,下面以一个具体的UTP包做说明。

数据包内容如下:

0000   78 ac c0 55 45 4a 00 0c 86 23 b8 00 08 00 45 00

0010   00 30 2f e7 00 00 66 11 a4 23 01 a4 60 2e db f6

0020   42 ea 8f b9 cf 46 00 1c 00 00 21 00 19 a2 ec 07

0030   ea 27 c3 62 4a be 00 37 f5 10 11 89 32 d4

其中0x00-0x29UDP header,这里不再分析。咱来看一下它的数据部分:

210019a2ec07ea27c3624abe0037f510118932d4

可以看出来:

  •  0x2type字段,代表这是一个数据回应包
  •  0x1是它的协议版本号
  •  0x00是它的扩展字段
  •  00代表该包没有扩展信息
  •  0x19a2是该包的连接id,这是一个随机数
  •  0xec07ea27是该包的发送时间
  •  0xc3624abe是这个包的发送方最近一次接收包到这次发生包之间的间隔,间隔这么长,表示当前网络环境不行,数据传输速度不是很快
  •  0x0037f510是发送方的窗口大小,也就是说当前发送方还可以接收3.5MB的数据
  •  0x1189是该数据包的序列包,也就意味着发送方在这个连接上已经发送了4489个包
  •  0x32d4是该发送方最近接受到的包序列号

猜你喜欢

转载自blog.csdn.net/WangZekun_wolf/article/details/78627288
今日推荐