⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fast extension.mht

📁 关于BT的协议文档
💻 MHT
📖 第 1 页 / 共 2 页
字号:
<P>Let <I>k</I> denote the final number of pieces in the allowed fast =
set. </P><PRE> x =3D 0xFFFFFF00 &amp; ip                           (1)
 x.append(infohash)                            (2)
 while |a| &lt; k:=20
   x =3D SHA1(x)                                 (3)
   for i in [0:5] and |a| &lt; k:                 (4)
     j =3D i*4                                   (5)
     y =3D x[j:j+4]                              (6)
     index =3D y % sz                            (7)
     if index not in a:                        (8)
       add index to a                          (9)
</PRE>
<P>Step (1) selects the most significant octets in peer <I>P'</I>s ip =
address.=20
We do this to prevent a user that obtains more than one IP address on =
the same=20
network from obtaining more than one <I>allowed fast set.</I> Use of =
three bytes=20
is heuristic and historical. </P>
<P>Step (3) generates a 20-byte random number on each call. By =
performing a=20
SHA-1 hash on the previous iteration's hash, we can generate an =
arbitrarily long=20
pseudorandom sequence. </P>
<P>Steps (4) through (9) partition the 20-byte hash into piece indices =
and add=20
them to the allowed fast set. </P></DIV><A =
name=3DExample_Implementation></A>
<H2>Example Implementation </H2>
<P>The following C++ implementation was provided by CacheLogic: =
</P><PRE>void generate_fast_set(
  uint32 k,     // number of pieces in set
  uint32 sz,    // number of pieces in torrent
  const char infohash[20], // infohash of torrent
  uint32 ip, // in host byte order, ie localhost is 0x7f000001
  std::vector&lt;uint32&gt; &amp;a) // generated set of piece indices
{
   a.clear();
   std::string x;
   char buf[4];
   *(uint32*)buf =3D htonl(ip &amp; 0xffffff00);
   x.assign(buf, 4);
   x.append(infohash, 20); // (3)
   while (a.size()&lt;k) {
     x =3D SHA1(x); // (4)
     for ( int i=3D0&nbsp;; i&lt;5 &amp;&amp; a.size()&lt;k&nbsp;; i++ ) =
{ // (5)
       int j =3D i*4; // (6)
       uint32 y =3D ntohl(*(uint32*)(x.data()+j)); // (7)
       uint32 index =3D y % sz; // (8)
       if (std::find(a.begin(), a.end(), index)=3D=3Da.end()) { // (9)
         a.push_back(index); // (10)
       }
     }
   }
}
</PRE>
<P>Example results generated by this function: </P><PRE>7 piece allowed =
fast set for torrent with 1313 pieces and hex infohash  =20
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa for node with IP 80.4.4.200:
  1059,431,808,1217,287,376,1188
9 piece allowed fast set for torrent with 1313 pieces and hex infohash   =
 =20
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa for node with IP 80.4.4.200:
  1059,431,808,1217,287,376,1188,353,508
</PRE></DIV><!-- ### End Content ### --></DIV>
<DIV></DIV>
<DIV id=3Dfooter>
<HR>

<P>Copyright 2006 BitTorrent.org</P></DIV></BODY></HTML>

------=_NextPart_000_0005_01C7859D.6CEAB7F0
Content-Type: text/css;
	charset="gb2312"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.bittorrent.org/css/screen.css

BODY {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; FONT: 10px/1.5em "Trebuchet MS",sans-serif; COLOR: #333; =
PADDING-TOP: 0px; BACKGROUND-COLOR: #666; TEXT-ALIGN: center
}
#upper {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: url(../img/bg.gif) =
#fff repeat-x 0px 0px; PADDING-BOTTOM: 60px; MARGIN: 0px; PADDING-TOP: =
60px
}
#wrap {
	MARGIN: 0px auto; WIDTH: 700px; TEXT-ALIGN: left
}
#header {
	MARGIN: 0px; WIDTH: 100%; BORDER-BOTTOM: #eee 2px solid
}
#nav {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0.5em; MARGIN: =
0px 0px 40px; PADDING-TOP: 0.5em; TEXT-ALIGN: right
}
#nav UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none
}
#nav LI {
	PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; FONT-WEIGHT: =
bold; FONT-SIZE: 1.5em; PADDING-BOTTOM: 0px; MARGIN-LEFT: 1em; =
PADDING-TOP: 0px
}
#nav LI SPAN {
	COLOR: #f60
}
#home-l UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 2px; PADDING-BOTTOM: 10px; MARGIN: =
0px 0px 1.5em; PADDING-TOP: 0px
}
#home-c UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 2px; PADDING-BOTTOM: 10px; MARGIN: =
0px 0px 1.5em; PADDING-TOP: 0px
}
#home-r UL {
	PADDING-RIGHT: 0px; PADDING-LEFT: 2px; PADDING-BOTTOM: 10px; MARGIN: =
0px 0px 1.5em; PADDING-TOP: 0px
}
#home-l LI {
	PADDING-RIGHT: 0px; PADDING-LEFT: 25px; FONT-SIZE: 1.5em; BACKGROUND: =
url(../img/li.gif) no-repeat 0px 0px; PADDING-BOTTOM: 0px; MARGIN: 1em =
0px; LINE-HEIGHT: 1.2em; PADDING-TOP: 0px; LIST-STYLE-TYPE: none
}
#home-c LI {
	PADDING-RIGHT: 0px; PADDING-LEFT: 25px; FONT-SIZE: 1.5em; BACKGROUND: =
url(../img/li.gif) no-repeat 0px 0px; PADDING-BOTTOM: 0px; MARGIN: 1em =
0px; LINE-HEIGHT: 1.2em; PADDING-TOP: 0px; LIST-STYLE-TYPE: none
}
#home-r LI {
	PADDING-RIGHT: 0px; PADDING-LEFT: 25px; FONT-SIZE: 1.5em; BACKGROUND: =
url(../img/li.gif) no-repeat 0px 0px; PADDING-BOTTOM: 0px; MARGIN: 1em =
0px; LINE-HEIGHT: 1.2em; PADDING-TOP: 0px; LIST-STYLE-TYPE: none
}
#second LI {
	FONT-SIZE: 10pt; MARGIN: 0.4em 0px; LINE-HEIGHT: 12pt
}
#second DT {
	FONT-SIZE: 10pt; MARGIN: 0.4em 0px; LINE-HEIGHT: 12pt
}
#second DD {
	FONT-SIZE: 1.2em; MARGIN-BOTTOM: 7px; LINE-HEIGHT: 1.5em
}
#intro {
	PADDING-RIGHT: 3em; PADDING-LEFT: 3em; FONT-SIZE: 2.5em; =
PADDING-BOTTOM: 0px; MARGIN: 0px 0px 2.5em; COLOR: #000; LINE-HEIGHT: =
1.2em; PADDING-TOP: 0px
}
#footer {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: url(../img/fbg.gif) =
repeat-x 0px 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; =
HEIGHT: 60px
}
#home-l {
	FLOAT: left; MARGIN: 0px 10px; WIDTH: 210px
}
#home-c {
	FLOAT: left; MARGIN: 0px 10px; WIDTH: 210px
}
#home-r {
	FLOAT: left; MARGIN: 0px 10px; WIDTH: 210px
}
#blog {
	PADDING-RIGHT: 7em; PADDING-LEFT: 7em; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
H1 {
	FONT-WEIGHT: normal; FONT-SIZE: 3em; MARGIN: 0.3em 0px; LETTER-SPACING: =
-1px
}
H1 SPAN {
	FONT-WEIGHT: bold; COLOR: #09f
}
H2 {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.7em; =
PADDING-BOTTOM: 0.5em; MARGIN: 0px; PADDING-TOP: 0px; BORDER-BOTTOM: =
#ffc 2px solid
}
#second H2 {
	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
FONT-WEIGHT: normal; BORDER-LEFT-WIDTH: 0px; FONT-SIZE: 2em; =
BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0.5em; MARGIN: 0px; =
PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
}
#blog H2 {
	BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
FONT-WEIGHT: normal; BORDER-LEFT-WIDTH: 0px; FONT-SIZE: 2em; =
BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0.5em; MARGIN: 0px; =
PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
}
H3 {
	FONT-SIZE: 1.5em; LINE-HEIGHT: 1.5em
}
H4 {
	FONT-SIZE: 1.2em; TEXT-TRANSFORM: uppercase
}
H5 {
	FONT-SIZE: 1.2em; COLOR: #666
}
#second P {
	FONT-SIZE: 1.3em; LINE-HEIGHT: 1.5em
}
#blog P {
	FONT-SIZE: 1.3em; LINE-HEIGHT: 1.5em
}
#footer P {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 2em; MARGIN: =
0px; COLOR: #fff; PADDING-TOP: 2em
}
TABLE {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; BORDER-RIGHT-WIDTH: 0px
}
TD {
	PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-SIZE: 9pt; =
PADDING-BOTTOM: 10px; PADDING-TOP: 10px
}
TD.shade {
	BACKGROUND-COLOR: #eee
}
#blog .post {
	PADDING-RIGHT: 0px; BORDER-TOP: #ffc 2px solid; PADDING-LEFT: 0px; =
FONT-SIZE: 1em; PADDING-BOTTOM: 5px; COLOR: #999; PADDING-TOP: 5px
}
.clear:unknown {
	CLEAR: both; DISPLAY: block; FONT-SIZE: 0px; VISIBILITY: hidden; =
HEIGHT: 0px; content: "."
}
.clear {
=09
}
 HTML .clear {
	HEIGHT: 1%
}
.clear {
	DISPLAY: block
}
.img-r {
	FLOAT: right; PADDING-BOTTOM: 10px; MARGIN: 0px 0px 0px 20px; WIDTH: =
300px
}
.img-l {
	FLOAT: left; PADDING-BOTTOM: 10px; MARGIN: 0px 20px 0px 0px; WIDTH: =
300px
}
#second .img-l P {
	FONT-SIZE: 1.5em; COLOR: #09f; TEXT-ALIGN: center
}
#second .img-r P {
	FONT-SIZE: 1.5em; COLOR: #09f; TEXT-ALIGN: center
}
HR {
	DISPLAY: none
}
CODE {
	COLOR: #963
}
A {
	COLOR: #345; BORDER-BOTTOM: #eee 1px solid; TEXT-DECORATION: none
}
A:visited {
	COLOR: #678
}
#nav A:visited {
	COLOR: #345
}
A:hover {
	COLOR: #f60
}
#nav A:hover {
	COLOR: #f60
}
H1 A {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; COLOR: #666; BORDER-RIGHT-WIDTH: 0px
}
H1 A:visited {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; COLOR: #666; BORDER-RIGHT-WIDTH: 0px
}
H1 A:hover {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; COLOR: #666; BORDER-RIGHT-WIDTH: 0px
}
A IMG {
	BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; BORDER-RIGHT-WIDTH: 0px
}

------=_NextPart_000_0005_01C7859D.6CEAB7F0--

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -