https://g2.doxu.org/api.php?action=feedcontributions&user=Dcat&feedformat=atomGnutella2 - User contributions [en]2024-03-29T02:26:18ZUser contributionsMediaWiki 1.38.4https://g2.doxu.org/index.php?title=Sandbox&diff=85163Sandbox2022-10-18T19:23:04Z<p>Dcat: Blanked the page</p>
<hr />
<div></div>Dcathttps://g2.doxu.org/index.php?title=Query_Hash_Tables&diff=85162Query Hash Tables2022-10-18T19:18:05Z<p>Dcat: Reverted edits by Straightener (talk) to last revision by Dcat</p>
<hr />
<div>== Introduction ==<br />
<br />
Building an efficient network topology is not viable without means to restrict the flow<br />
of information appropriately. In the Gnutella2 network architecture, neighbouring<br />
nodes exchange compressed hash filter tables describing the content, which can be<br />
reached by communicating with them. These tables are updated dynamically as<br />
necessary.<br />
<br />
The concept of filtering hash tables in file sharing was pioneered by Limegroup for<br />
the LimeWire Gnutella application.<br />
<br />
== Table Properties ==<br />
<br />
Query hash tables or QHTs provide enough information to know with certainty that a<br />
particular node (and possibly its descendants) will not be able to provide any<br />
matching objects for a given query. Conversely, the QHT may reveal that a node or<br />
its descendants may be able to provide matching objects.<br />
<br />
This property means that queries can be discarded confidently when a transmission<br />
is known to be unnecessary, while not providing the filtering or forwarding node, any<br />
actual information about the searchable content. Neighbours know what their<br />
neighbours do not have, but cannot say for sure what they do have. QHTs are also<br />
very efficient, both in terms of exchange and maintenance and lookup cost.<br />
<br />
== Table Content ==<br />
<br />
A QHT is a table of 2<sup>N</sup> bits, where each bit represents a unique word-hash value.<br />
For example a table of 20 bits has 2<sup>20</sup> = 1048576 possible word-hash values. If<br />
stored uncompressed this table would be 128 KB in size.<br />
<br />
In an empty table, every word-hash value bit will be "1", which represents "empty".<br />
To populate the table with searchable content, an application must:<br />
<br />
* Locate every plain-text word and URN which could be searched for and produce a match/hit<br />
* Hash the word with a simple hash function to produce a word-hash value which is 0 <= value < 2<sup>N</sup>.<br />
* Set the appropriate bit in the table to zero, representing "full".<br />
<br />
== Word Hashing ==<br />
<br />
Words are strings of one or more alphanumeric characters which are not all numeric.<br />
<br />
To convert a word into a hash value, the following case-insensitive algorithm is used:<br />
<br />
<pre><br />
<nowiki><br />
// HashWord( string_ptr, char_count, table_bit_count );<br />
DWORD CQueryHashTable::HashWord(LPCTSTR psz, int nLength, int nBits)<br />
{<br />
DWORD nNumber = 0;<br />
int nByte = 0;<br />
for ( ; nLength > 0 ; nLength--, psz++ )<br />
{<br />
int nValue = tolower( *psz ) & 0xFF;<br />
nValue = nValue << ( nByte * 8 );<br />
nByte = ( nByte + 1 ) & 3;<br />
nNumber = nNumber ^ nValue;<br />
}<br />
return HashNumber( nNumber, nBits );<br />
}<br />
<br />
DWORD CQueryHashTable::HashNumber(DWORD nNumber, int nBits)<br />
{<br />
WORD64 nProduct = (WORD64)nNumber * (WORD64)0x4F1BBCDC;<br />
WORD64 nHash = ( nProduct << 32 ) >> ( 32 + ( 32 - nBits ) );<br />
return (DWORD)nHash;<br />
}<br />
</nowiki><br />
</pre><br />
<br />
== URNs - A Special Case ==<br />
<br />
URNs are treated as a special case: rather than dividing them up into word tokens,<br />
they are hashed as a complete fixed length string. For example:<br />
<br />
<pre><br />
<nowiki><br />
urn:sha1:WIXYJFVJMIWNMUWPRPBGUTODIV52RMJA<br />
</nowiki><br />
</pre><br />
<br />
Bitprint URNs are actually composite values which include both a SHA1 and<br />
TigerTree root value. Rather than adding the whole bitprint to the table, each of the<br />
constituent URNs are added separately. This allows SHA1-only querying and TigerTree-only<br />
querying. A root TigerTree URN takes the form:<br />
<br />
<pre><br />
<nowiki><br />
urn:tree:tiger/:CN25MLNU3XNN7IHKZMNOA63XG6SKDJ2W7Z3HONA<br />
</nowiki><br />
</pre><br />
<br />
Other URNs should be expressed in their most natural form before being fed to the<br />
word hash function.<br />
<br />
== Word Prefix Extensions ==<br />
<br />
For words consisting of at least five characters, it is often useful to be able to match<br />
substrings within the word. Unfortunately, adding every possible substring of each<br />
word would increase the density of the QHT, however, a simple and effective<br />
compromise is available:<br />
<br />
For words with 5 or more characters:<br />
<br />
* Hash and add the whole word<br />
* Hash and add the whole word minus the last character<br />
* Hash and add the whole word minus the last two characters<br />
<br />
This allows searching on prefixes of the word, for example "match" will now match<br />
"matches".<br />
<br />
== Table Exchange ==<br />
<br />
Nodes must keep their neighbouring hubs up-to-date with their latest local query<br />
hash table at all times. Rather than sending the whole table whenever it changes,<br />
nodes may opt to send a "table patch", which includes only the difference between<br />
the old and new table.<br />
<br />
The /[[QHT]] packet is used to supply a query hash table update to a neighbouring hub.<br />
Its format is compatible with the Gnutella1 "query routing protocol", except that<br />
Gnutella2 requires a 1-bit per value table, while Gnutella1 requires a 4 or 8 bit per<br />
value table. Gnutella2 supports patch compression using the deflate algorithm,<br />
however, this should not be applied if the TCP link itself is compressed.<br />
<br />
== Table Access ==<br />
<br />
A table of 2<sup>N</sup> bits can be stored in an array of bytes 2<sup>N</sup>/8 long. To resolve a<br />
hash-value into a byte and bit number, use the following equations:<br />
<br />
<pre><br />
<nowiki><br />
int nByte = ( nHashValue >> 3 );<br />
int nBit = ( nHashValue & 7 );<br />
</nowiki><br />
</pre><br />
<br />
The least significant bit is numbered 0; the most significant bit is numbered 7. To set<br />
a bit as empty (setting it to 1):<br />
<br />
<pre><br />
<nowiki><br />
table_ptr[ nByte ] |= ( 1 << nBit );<br />
</nowiki><br />
</pre><br />
<br />
To set a bit as full (setting it to zero):<br />
<br />
<pre><br />
<nowiki><br />
table_ptr[ nByte ] &= ~( 1 << nBit );<br />
</nowiki><br />
</pre><br />
<br />
== The Aggregate or Superset Table ==<br />
<br />
Nodes operating in hub mode must maintain an aggregate or superset query hash<br />
table, consisting of their own searchable content combined with the QHTs supplied<br />
by all connected leaves. This aggregate table is supplied to neighbouring hubs,<br />
allowing them to completely filter traffic for the local hub and its leaves.<br />
<br />
This has two important implications:<br />
* When a change is detected in either the local content or a connected leaf node's QHT, the aggregate table must be rebuilt and patches dispatched to neighbouring hubs. This will happen often, so an appropriate minimum time between updates should be used. One minute is effective.<br />
* An aggregate table representing 400 leaves will be much denser than a table representing one node. This means that all tables must be large enough that the aggregate table remains productively sparse.<br />
<br />
To create an aggregate table, start with an empty table of fixed size containing all<br />
1's. For each contributing table, copy any zero (full) bits to the aggregate table. This<br />
is effectively an AND operation. If a source table is smaller than the aggregate table,<br />
a single 0 bit in the source will equate to several zero bits in the aggregate. If the<br />
source table is larger than the aggregate table, a single zero bit will map to a single<br />
bit with some loss of accuracy.<br />
<br />
It is of great importance that all QHTs in the system be sufficiently large to allow an<br />
aggregate table to remain suitably sparse. Ideally each leaf node should provide a<br />
table less than 1% dense.<br />
<br />
== Query Filtering ==<br />
<br />
Before transmitting a query packet to a connection that has provided a query hash<br />
table, match the words and URNs in the query against the QHT.<br />
<br />
* If any of the lookups based on URNs found a hit, send the query packet<br />
* If at least two thirds of lookups based on words found a hit, send<br />
* Otherwise, drop the packet<br />
<br />
It is important to apply the "two thirds" rule only for words. URNs must provide an<br />
automatic match.<br />
<br />
Consider all text content in the query, including generic search text and metadata<br />
search text if it is present. When dealing with simple query language that involves<br />
quoted phrases and exclusions, apply the following rules:<br />
<br />
* Tokenize quoted phrases into words, ignoring the phrase at this level<br />
* Ignore excluded words - these do not count as table hits or misses<br />
* Remember to apply exclusion to every word in an excluded phrase<br />
<br />
See the section on the [[Simple Query Language and Metadata|simple query language]] for more information.</div>Dcathttps://g2.doxu.org/index.php?title=Main_Page&diff=85161Main Page2022-10-18T19:11:11Z<p>Dcat: </p>
<hr />
<div><table width=&quot;100%&quot; ><tr><br />
<td align=&quot;left&quot;><br />
== Gnutella2 Developer Network ==<br />
Welcome to the Gnutella2 Developer Network.<br />
The Gnutella2 Developer Network (or G2DN) is a convenient central location for discussing, developing and documenting all aspects of Gnutella2. Like the Gnutella2 platform itself, this website is designed to evolve through community support and participation. Everyone is free to contribute discussion, proposal documents, developer resources or any other relevant material.<br />
<br />
<p>Although the G2DN is primarily geared toward developers and technical enthusiasts, users of Gnutella2-enabled software are also welcome to participate. Those who are new to Gnutella2 may wish to check out some of the [[Gnutella2-powered software]].</p><br />
<br />
Feel free to contribute to the wiki after reading [[Gnutella2:Community Portal]] to learn about editing policy.<br />
</td><br />
<td width=&quot;20px&quot;></td><br />
<td align=&quot;right&quot; valign=&quot;bottom&quot; width=&quot;200px&quot;><br />
__TOC__<br />
</td></tr><br />
</table><br />
<br />
==Wiki Edit Privileges==<br />
<br />
In order to combat spam various extensions have been added. These extensions may accidentally prevent legitimate users from registering or editing.<br />
<br />
If you are having problems join IRC to ask for help:<br />
* Server: irc.p2pchat.net<br />
* Channel: #sharelin<br />
<br />
--[[User:Dcat|Dcat]] ([[User talk:Dcat|talk]]) 14:32, 1 September 2013 (UTC)<br />
<br />
==News==<br />
* ''2022-10-18'' - '''MediaWiki upgraded to 1.38.4. HTTPS enabled.'''<br />
* ''2016-02-14'' - '''MediaWiki upgraded to 1.26.2'''<br />
* ''2013-08-03'' - '''G2 wiki moved to g2.doxu.org. g2.trillinux.org will remain as a redirect.'''<br />
* ''2007-03-29'' - '''[[TCP Stream Connection and Handshaking]] specification updated.'''<br />
<br />
== The Gnutella 2 Network==<br />
# [[Gnutella2|What is Gnutella2]]<br />
# [[Gnutella2 Standard]]<br />
# [[Network Architecture]]<br />
# [[Node Types and Responsibilities]]<br />
# [[Background|Background / Archive]]<br />
<br />
== The Protocol==<br />
# [[TCP Stream Connection and Handshaking]]<br />
# [[UDP Transceiver]]<br />
# [[Packet Structure]]<br />
# [[Datatypes]]<br />
# [[Basic Network Maintenance]]<br />
# [[Known Hub Cache and Hub Cluster Cache]]<br />
# [[Node Route Cache and Addressed Packet Forwarding]]<br />
# [[Query Hash Tables]]<br />
# [[Object Search Mechanism]]<br />
# [[Search Security]]<br />
# [[Search Description]]<br />
# [[Search Acknowledgement]]<br />
# [[Search Results]]<br />
# [[Simple Query Language and Metadata]]<br />
# [[Server for Uploading]]<br />
# [[Client for Downloading]]<br />
# [[User Profile Challenge and Delivery]]<br />
# [[Browse Host]]<br />
<br />
== Root Packets ==<br />
{{Root packet list}}<br />
<br />
== Proposals==<br />
* [[Active Source Exchange]] (ASE) by Kevin O'Toole<br />
* 2007-07-01 - [[Source Exchange (x-G2alt)]]<br />
<br />
== Additional Information==<br />
Since Gnutella2 somehow evolved from the original Gnutella protocol you might find the following links useful:<br />
* [http://limewire.negatis.com/index.php?title=GDF The GDF Wiki]<br />
* [http://groups.yahoo.com/group/the_gdf/ Gnutella Developer forum]<br />
* [http://rfc-gnutella.sourceforge.net/ RFC Gnutella]<br />
* [http://crawler.doxu.org/ Gnutella2 Crawler]</div>Dcathttps://g2.doxu.org/index.php?title=Main_Page&diff=85153Main Page2016-02-14T23:11:13Z<p>Dcat: /* News */</p>
<hr />
<div><table width=&quot;100%&quot; ><tr><br />
<td align=&quot;left&quot;><br />
== Gnutella2 Developer Network ==<br />
Welcome to the Gnutella2 Developer Network.<br />
The Gnutella2 Developer Network (or G2DN) is a convenient central location for discussing, developing and documenting all aspects of Gnutella2. Like the Gnutella2 platform itself, this website is designed to evolve through community support and participation. Everyone is free to contribute discussion, proposal documents, developer resources or any other relevant material.<br />
<br />
<p>Although the G2DN is primarily geared toward developers and technical enthusiasts, users of Gnutella2-enabled software are also welcome to participate. Those who are new to Gnutella2 may wish to check out some of the [[Gnutella2-powered software]].</p><br />
<br />
Feel free to contribute to the wiki after reading [[Gnutella2:Community Portal]] to learn about editing policy.<br />
</td><br />
<td width=&quot;20px&quot;></td><br />
<td align=&quot;right&quot; valign=&quot;bottom&quot; width=&quot;200px&quot;><br />
__TOC__<br />
</td></tr><br />
</table><br />
<br />
==Wiki Edit Privileges==<br />
<br />
In order to combat spam various extensions have been added. These extensions may accidentally prevent legitimate users from registering or editing.<br />
<br />
If you are having problems join IRC to ask for help:<br />
* Server: irc.p2pchat.net<br />
* Channel: #sharelin<br />
<br />
--[[User:Dcat|Dcat]] ([[User talk:Dcat|talk]]) 14:32, 1 September 2013 (UTC)<br />
<br />
==News==<br />
* ''2016-02-14'' - '''MediaWiki upgraded to 1.26.2'''<br />
* ''2013-08-03'' - '''G2 wiki moved to g2.doxu.org. g2.trillinux.org will remain as a redirect.'''<br />
* ''2007-03-29'' - '''[[TCP Stream Connection and Handshaking]] specification updated.'''<br />
<br />
== The Gnutella 2 Network==<br />
# [[Gnutella2|What is Gnutella2]]<br />
# [[Gnutella2 Standard]]<br />
# [[Network Architecture]]<br />
# [[Node Types and Responsibilities]]<br />
# [[Background|Background / Archive]]<br />
<br />
== The Protocol==<br />
# [[TCP Stream Connection and Handshaking]]<br />
# [[UDP Transceiver]]<br />
# [[Packet Structure]]<br />
# [[Datatypes]]<br />
# [[Basic Network Maintenance]]<br />
# [[Known Hub Cache and Hub Cluster Cache]]<br />
# [[Node Route Cache and Addressed Packet Forwarding]]<br />
# [[Query Hash Tables]]<br />
# [[Object Search Mechanism]]<br />
# [[Search Security]]<br />
# [[Search Description]]<br />
# [[Search Acknowledgement]]<br />
# [[Search Results]]<br />
# [[Simple Query Language and Metadata]]<br />
# [[Server for Uploading]]<br />
# [[Client for Downloading]]<br />
# [[User Profile Challenge and Delivery]]<br />
# [[Browse Host]]<br />
<br />
== Root Packets ==<br />
{{Root packet list}}<br />
<br />
== Proposals==<br />
* [[Active Source Exchange]] (ASE) by Kevin O'Toole<br />
* 2007-07-01 - [[Source Exchange (x-G2alt)]]<br />
<br />
== Additional Information==<br />
Since Gnutella2 somehow evolved from the original Gnutella protocol you might find the following links useful:<br />
* [http://limewire.negatis.com/index.php?title=GDF The GDF Wiki]<br />
* [http://groups.yahoo.com/group/the_gdf/ Gnutella Developer forum]<br />
* [http://rfc-gnutella.sourceforge.net/ RFC Gnutella]<br />
* [http://crawler.doxu.org/ Gnutella2 Crawler]</div>Dcathttps://g2.doxu.org/index.php?title=Main_Page&diff=85122Main Page2013-09-01T14:32:56Z<p>Dcat: </p>
<hr />
<div><table width=&quot;100%&quot; ><tr><br />
<td align=&quot;left&quot;><br />
== Gnutella2 Developer Network ==<br />
Welcome to the Gnutella2 Developer Network.<br />
The Gnutella2 Developer Network (or G2DN) is a convenient central location for discussing, developing and documenting all aspects of Gnutella2. Like the Gnutella2 platform itself, this website is designed to evolve through community support and participation. Everyone is free to contribute discussion, proposal documents, developer resources or any other relevant material.<br />
<br />
<p>Although the G2DN is primarily geared toward developers and technical enthusiasts, users of Gnutella2-enabled software are also welcome to participate. Those who are new to Gnutella2 may wish to check out some of the [[Gnutella2-powered software]].</p><br />
<br />
Feel free to contribute to the wiki after reading [[Gnutella2:Community Portal]] to learn about editing policy.<br />
</td><br />
<td width=&quot;20px&quot;></td><br />
<td align=&quot;right&quot; valign=&quot;bottom&quot; width=&quot;200px&quot;><br />
__TOC__<br />
</td></tr><br />
</table><br />
<br />
==Wiki Edit Privileges==<br />
<br />
In order to combat spam various extensions have been added. These extensions may accidentally prevent legitimate users from registering or editing.<br />
<br />
If you are having problems join IRC to ask for help:<br />
* Server: irc.p2pchat.net<br />
* Channel: #sharelin<br />
<br />
--[[User:Dcat|Dcat]] ([[User talk:Dcat|talk]]) 14:32, 1 September 2013 (UTC)<br />
<br />
==News==<br />
* ''2013-08-03'' - '''G2 wiki moved to g2.doxu.org. g2.trillinux.org will remain as a redirect.'''<br />
* ''2007-03-29'' - '''[[TCP Stream Connection and Handshaking]] specification updated.'''<br />
<br />
== The Gnutella 2 Network==<br />
# [[Gnutella2|What is Gnutella2]]<br />
# [[Gnutella2 Standard]]<br />
# [[Network Architecture]]<br />
# [[Node Types and Responsibilities]]<br />
# [[Background|Background / Archive]]<br />
<br />
== The Protocol==<br />
# [[TCP Stream Connection and Handshaking]]<br />
# [[UDP Transceiver]]<br />
# [[Packet Structure]]<br />
# [[Datatypes]]<br />
# [[Basic Network Maintenance]]<br />
# [[Known Hub Cache and Hub Cluster Cache]]<br />
# [[Node Route Cache and Addressed Packet Forwarding]]<br />
# [[Query Hash Tables]]<br />
# [[Object Search Mechanism]]<br />
# [[Search Security]]<br />
# [[Search Description]]<br />
# [[Search Acknowledgement]]<br />
# [[Search Results]]<br />
# [[Simple Query Language and Metadata]]<br />
# [[Server for Uploading]]<br />
# [[Client for Downloading]]<br />
# [[User Profile Challenge and Delivery]]<br />
# [[Browse Host]]<br />
<br />
== Root Packets ==<br />
{{Root packet list}}<br />
<br />
== Proposals==<br />
* [[Active Source Exchange]] (ASE) by Kevin O'Toole<br />
* 2007-07-01 - [[Source Exchange (x-G2alt)]]<br />
<br />
== Additional Information==<br />
Since Gnutella2 somehow evolved from the original Gnutella protocol you might find the following links useful:<br />
* [http://limewire.negatis.com/index.php?title=GDF The GDF Wiki]<br />
* [http://groups.yahoo.com/group/the_gdf/ Gnutella Developer forum]<br />
* [http://rfc-gnutella.sourceforge.net/ RFC Gnutella]<br />
* [http://crawler.doxu.org/ Gnutella2 Crawler]</div>Dcathttps://g2.doxu.org/index.php?title=Main_Page&diff=85121Main Page2013-09-01T13:50:06Z<p>Dcat: /* Proposals */</p>
<hr />
<div><table width=&quot;100%&quot; ><tr><br />
<td align=&quot;left&quot;><br />
== Gnutella2 Developer Network ==<br />
Welcome to the Gnutella2 Developer Network.<br />
The Gnutella2 Developer Network (or G2DN) is a convenient central location for discussing, developing and documenting all aspects of Gnutella2. Like the Gnutella2 platform itself, this website is designed to evolve through community support and participation. Everyone is free to contribute discussion, proposal documents, developer resources or any other relevant material.<br />
<br />
<p>Although the G2DN is primarily geared toward developers and technical enthusiasts, users of Gnutella2-enabled software are also welcome to participate. Those who are new to Gnutella2 may wish to check out some of the [[Gnutella2-powered software]].</p><br />
<br />
Feel free to contribute to the wiki after reading [[Gnutella2:Community Portal]] to learn about editing policy.<br />
</td><br />
<td width=&quot;20px&quot;></td><br />
<td align=&quot;right&quot; valign=&quot;bottom&quot; width=&quot;200px&quot;><br />
__TOC__<br />
</td></tr><br />
</table><br />
<br />
==News==<br />
* ''2013-08-03'' - '''G2 wiki moved to g2.doxu.org. g2.trillinux.org will remain as a redirect.'''<br />
* ''2007-03-29'' - '''[[TCP Stream Connection and Handshaking]] specification updated.'''<br />
<br />
== The Gnutella 2 Network==<br />
# [[Gnutella2|What is Gnutella2]]<br />
# [[Gnutella2 Standard]]<br />
# [[Network Architecture]]<br />
# [[Node Types and Responsibilities]]<br />
# [[Background|Background / Archive]]<br />
<br />
== The Protocol==<br />
# [[TCP Stream Connection and Handshaking]]<br />
# [[UDP Transceiver]]<br />
# [[Packet Structure]]<br />
# [[Datatypes]]<br />
# [[Basic Network Maintenance]]<br />
# [[Known Hub Cache and Hub Cluster Cache]]<br />
# [[Node Route Cache and Addressed Packet Forwarding]]<br />
# [[Query Hash Tables]]<br />
# [[Object Search Mechanism]]<br />
# [[Search Security]]<br />
# [[Search Description]]<br />
# [[Search Acknowledgement]]<br />
# [[Search Results]]<br />
# [[Simple Query Language and Metadata]]<br />
# [[Server for Uploading]]<br />
# [[Client for Downloading]]<br />
# [[User Profile Challenge and Delivery]]<br />
# [[Browse Host]]<br />
<br />
== Root Packets ==<br />
{{Root packet list}}<br />
<br />
== Proposals==<br />
* [[Active Source Exchange]] (ASE) by Kevin O'Toole<br />
* 2007-07-01 - [[Source Exchange (x-G2alt)]]<br />
<br />
== Additional Information==<br />
Since Gnutella2 somehow evolved from the original Gnutella protocol you might find the following links useful:<br />
* [http://limewire.negatis.com/index.php?title=GDF The GDF Wiki]<br />
* [http://groups.yahoo.com/group/the_gdf/ Gnutella Developer forum]<br />
* [http://rfc-gnutella.sourceforge.net/ RFC Gnutella]<br />
* [http://crawler.doxu.org/ Gnutella2 Crawler]</div>Dcathttps://g2.doxu.org/index.php?title=Main_Page&diff=85120Main Page2013-08-03T22:35:55Z<p>Dcat: /* Additional Information */</p>
<hr />
<div><table width=&quot;100%&quot; ><tr><br />
<td align=&quot;left&quot;><br />
== Gnutella2 Developer Network ==<br />
Welcome to the Gnutella2 Developer Network.<br />
The Gnutella2 Developer Network (or G2DN) is a convenient central location for discussing, developing and documenting all aspects of Gnutella2. Like the Gnutella2 platform itself, this website is designed to evolve through community support and participation. Everyone is free to contribute discussion, proposal documents, developer resources or any other relevant material.<br />
<br />
<p>Although the G2DN is primarily geared toward developers and technical enthusiasts, users of Gnutella2-enabled software are also welcome to participate. Those who are new to Gnutella2 may wish to check out some of the [[Gnutella2-powered software]].</p><br />
<br />
Feel free to contribute to the wiki after reading [[Gnutella2:Community Portal]] to learn about editing policy.<br />
</td><br />
<td width=&quot;20px&quot;></td><br />
<td align=&quot;right&quot; valign=&quot;bottom&quot; width=&quot;200px&quot;><br />
__TOC__<br />
</td></tr><br />
</table><br />
<br />
==News==<br />
* ''2013-08-03'' - '''G2 wiki moved to g2.doxu.org. g2.trillinux.org will remain as a redirect.'''<br />
* ''2007-03-29'' - '''[[TCP Stream Connection and Handshaking]] specification updated.'''<br />
<br />
== The Gnutella 2 Network==<br />
# [[Gnutella2|What is Gnutella2]]<br />
# [[Gnutella2 Standard]]<br />
# [[Network Architecture]]<br />
# [[Node Types and Responsibilities]]<br />
# [[Background|Background / Archive]]<br />
<br />
== The Protocol==<br />
# [[TCP Stream Connection and Handshaking]]<br />
# [[UDP Transceiver]]<br />
# [[Packet Structure]]<br />
# [[Datatypes]]<br />
# [[Basic Network Maintenance]]<br />
# [[Known Hub Cache and Hub Cluster Cache]]<br />
# [[Node Route Cache and Addressed Packet Forwarding]]<br />
# [[Query Hash Tables]]<br />
# [[Object Search Mechanism]]<br />
# [[Search Security]]<br />
# [[Search Description]]<br />
# [[Search Acknowledgement]]<br />
# [[Search Results]]<br />
# [[Simple Query Language and Metadata]]<br />
# [[Server for Uploading]]<br />
# [[Client for Downloading]]<br />
# [[User Profile Challenge and Delivery]]<br />
# [[Browse Host]]<br />
<br />
== Root Packets ==<br />
{{Root packet list}}<br />
<br />
== Proposals==<br />
* [[Active Source Exchange]] (ASE) by Kevin O'Toole<br />
* [[Source Exchange (x-G2alt)]]<br />
<br />
== Additional Information==<br />
Since Gnutella2 somehow evolved from the original Gnutella protocol you might find the following links useful:<br />
* [http://limewire.negatis.com/index.php?title=GDF The GDF Wiki]<br />
* [http://groups.yahoo.com/group/the_gdf/ Gnutella Developer forum]<br />
* [http://rfc-gnutella.sourceforge.net/ RFC Gnutella]<br />
* [http://crawler.doxu.org/ Gnutella2 Crawler]</div>Dcathttps://g2.doxu.org/index.php?title=Main_Page&diff=85119Main Page2013-08-03T22:32:00Z<p>Dcat: </p>
<hr />
<div><table width=&quot;100%&quot; ><tr><br />
<td align=&quot;left&quot;><br />
== Gnutella2 Developer Network ==<br />
Welcome to the Gnutella2 Developer Network.<br />
The Gnutella2 Developer Network (or G2DN) is a convenient central location for discussing, developing and documenting all aspects of Gnutella2. Like the Gnutella2 platform itself, this website is designed to evolve through community support and participation. Everyone is free to contribute discussion, proposal documents, developer resources or any other relevant material.<br />
<br />
<p>Although the G2DN is primarily geared toward developers and technical enthusiasts, users of Gnutella2-enabled software are also welcome to participate. Those who are new to Gnutella2 may wish to check out some of the [[Gnutella2-powered software]].</p><br />
<br />
Feel free to contribute to the wiki after reading [[Gnutella2:Community Portal]] to learn about editing policy.<br />
</td><br />
<td width=&quot;20px&quot;></td><br />
<td align=&quot;right&quot; valign=&quot;bottom&quot; width=&quot;200px&quot;><br />
__TOC__<br />
</td></tr><br />
</table><br />
<br />
==News==<br />
* ''2013-08-03'' - '''G2 wiki moved to g2.doxu.org. g2.trillinux.org will remain as a redirect.'''<br />
* ''2007-03-29'' - '''[[TCP Stream Connection and Handshaking]] specification updated.'''<br />
<br />
== The Gnutella 2 Network==<br />
# [[Gnutella2|What is Gnutella2]]<br />
# [[Gnutella2 Standard]]<br />
# [[Network Architecture]]<br />
# [[Node Types and Responsibilities]]<br />
# [[Background|Background / Archive]]<br />
<br />
== The Protocol==<br />
# [[TCP Stream Connection and Handshaking]]<br />
# [[UDP Transceiver]]<br />
# [[Packet Structure]]<br />
# [[Datatypes]]<br />
# [[Basic Network Maintenance]]<br />
# [[Known Hub Cache and Hub Cluster Cache]]<br />
# [[Node Route Cache and Addressed Packet Forwarding]]<br />
# [[Query Hash Tables]]<br />
# [[Object Search Mechanism]]<br />
# [[Search Security]]<br />
# [[Search Description]]<br />
# [[Search Acknowledgement]]<br />
# [[Search Results]]<br />
# [[Simple Query Language and Metadata]]<br />
# [[Server for Uploading]]<br />
# [[Client for Downloading]]<br />
# [[User Profile Challenge and Delivery]]<br />
# [[Browse Host]]<br />
<br />
== Root Packets ==<br />
{{Root packet list}}<br />
<br />
== Proposals==<br />
* [[Active Source Exchange]] (ASE) by Kevin O'Toole<br />
* [[Source Exchange (x-G2alt)]]<br />
<br />
== Additional Information==<br />
Since Gnutella2 somehow evolved from the original Gnutella protocol you might find the following links useful:<br />
* [http://limewire.negatis.com/index.php?title=GDF The GDF Wiki]<br />
* [http://groups.yahoo.com/group/the_gdf/ Gnutella Developer forum]<br />
* [http://rfc-gnutella.sourceforge.net/ RFC Gnutella]<br />
* [http://crawler.trillinux.org/ Gnutella2 Crawler]</div>Dcathttps://g2.doxu.org/index.php?title=Main_Page&diff=85118Main Page2013-08-03T22:30:31Z<p>Dcat: /* News */</p>
<hr />
<div><table width=&quot;100%&quot; ><tr><br />
<td align=&quot;left&quot;><br />
== Gnutella2 Developer Network ==<br />
Welcome to the Gnutella2 Developer Network.<br />
The Gnutella2 Developer Network (or G2DN) is a convenient central location for discussing, developing and documenting all aspects of Gnutella2. Like the Gnutella2 platform itself, this website is designed to evolve through community support and participation. Everyone is free to contribute discussion, proposal documents, developer resources or any other relevant material.<br />
<br />
<p>Although the G2DN is primarily geared toward developers and technical enthusiasts, users of Gnutella2-enabled software are also welcome to participate. Those who are new to Gnutella2 may wish to check out some of the [[Gnutella2-powered software]].</p></td><br />
<td width=&quot;20px&quot;></td><br />
<td align=&quot;right&quot; valign=&quot;bottom&quot; width=&quot;200px&quot;><br />
__TOC__<br />
</td></tr><br />
</table><br />
<br />
==News==<br />
* ''2013-08-03'' - '''G2 wiki moved to g2.doxu.org. g2.trillinux.org will remain as a redirect.'''<br />
* ''2007-03-29'' - '''[[TCP Stream Connection and Handshaking]] specification updated.'''<br />
<br />
Feel free to contribute to the wiki after reading [[Gnutella2:Community Portal]] to learn about editing policy.<br />
<br />
== The Gnutella 2 Network==<br />
# [[Gnutella2|What is Gnutella2]]<br />
# [[Gnutella2 Standard]]<br />
# [[Network Architecture]]<br />
# [[Node Types and Responsibilities]]<br />
# [[Background|Background / Archive]]<br />
<br />
== The Protocol==<br />
# [[TCP Stream Connection and Handshaking]]<br />
# [[UDP Transceiver]]<br />
# [[Packet Structure]]<br />
# [[Datatypes]]<br />
# [[Basic Network Maintenance]]<br />
# [[Known Hub Cache and Hub Cluster Cache]]<br />
# [[Node Route Cache and Addressed Packet Forwarding]]<br />
# [[Query Hash Tables]]<br />
# [[Object Search Mechanism]]<br />
# [[Search Security]]<br />
# [[Search Description]]<br />
# [[Search Acknowledgement]]<br />
# [[Search Results]]<br />
# [[Simple Query Language and Metadata]]<br />
# [[Server for Uploading]]<br />
# [[Client for Downloading]]<br />
# [[User Profile Challenge and Delivery]]<br />
# [[Browse Host]]<br />
<br />
== Root Packets ==<br />
{{Root packet list}}<br />
<br />
== Proposals==<br />
* [[Active Source Exchange]] (ASE) by Kevin O'Toole<br />
* [[Source Exchange (x-G2alt)]]<br />
<br />
== Additional Information==<br />
Since Gnutella2 somehow evolved from the original Gnutella protocol you might find the following links useful:<br />
* [http://limewire.negatis.com/index.php?title=GDF The GDF Wiki]<br />
* [http://groups.yahoo.com/group/the_gdf/ Gnutella Developer forum]<br />
* [http://rfc-gnutella.sourceforge.net/ RFC Gnutella]<br />
* [http://crawler.trillinux.org/ Gnutella2 Crawler]</div>Dcathttps://g2.doxu.org/index.php?title=HAW&diff=2962HAW2011-10-29T05:37:08Z<p>Dcat: /* Receiving */</p>
<hr />
<div>{{Packets}}<br />
<br />
= /HAW - Hub Advertising Walker =<br />
<br />
The HAW packet is used to spread hub addresses to the far edges of the network to ensure that the network stays well connected. Each hub periodically creates a HAW packet with its own address in the packet and then sends it to a neighboring hub. That neighboring hub stores the address in its host cache and forwards it to one of its neighbors. The neighbor also stores the address in its host cache and forwards it to the next neighbor. The packet continues to be forwarded until its TTL reaches 0.<br />
<br />
== Sending ==<br />
<br />
The /HAW packet should only be sent by a hub to another hub. A timer should be maintained for each neighbor that tracks when a HAW packet was last sent to that neighbor. Approximately every 5 minutes a new HAW packet should be created and sent to the neighbor.<br />
<br />
A new HAW packet should have a TTL of 100 and hops set to 0. The GUID must be randomly generated for each HAW packet. The GUID should<br />
be recorded as having been sent to that particular neighbor. In this way if the same HAW packet is received again it can be forwarded to a neighbor that hasn't seen it before. There must be an NA child packet that contains the address of the hub that originated the HAW packet.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving HAW packet, store the hub address from the NA child packet into the host cache and then forward the packet to another neighbour with the following rules:<br />
* If the TTL is 0 then do not forward the packet<br />
* Otherwise, reduce the TTL by 1 and increase the hops by 1<br />
* Then, select a random neighbour hub that has not already seen this HAW packet<br />
<br />
The GUID for this HAW should be recorded along with the hub that sent it so that it won't be forwarded to that hub if the same HAW packet is received again.<br />
<br />
== Payload ==<br />
<br />
* 1 byte TTL<br />
* 1 byte Hops<br />
* 16 byte GUID<br />
<br />
When a new HAW packet is created the TTL should be 100 and Hops should be set to 0. The GUID is not the node ID, instead it is packet ID to identify where the packet has already been routed. So it should be uniquely generated for every new HAW.<br />
<br />
== Children ==<br />
<br />
The /HAW packet has the following child packets defined:<br />
<br />
* /HAW/NA - Network Address<br />
* /HAW/HS - Hub Status<br />
* /HAW/V - Vendor Code</div>Dcathttps://g2.doxu.org/index.php?title=HAW&diff=2961HAW2011-10-28T03:03:19Z<p>Dcat: /* Payload */</p>
<hr />
<div>{{Packets}}<br />
<br />
= /HAW - Hub Advertising Walker =<br />
<br />
The HAW packet is used to spread hub addresses to the far edges of the network to ensure that the network stays well connected. Each hub periodically creates a HAW packet with its own address in the packet and then sends it to a neighboring hub. That neighboring hub stores the address in its host cache and forwards it to one of its neighbors. The neighbor also stores the address in its host cache and forwards it to the next neighbor. The packet continues to be forwarded until its TTL reaches 0.<br />
<br />
== Sending ==<br />
<br />
The /HAW packet should only be sent by a hub to another hub. A timer should be maintained for each neighbor that tracks when a HAW packet was last sent to that neighbor. Approximately every 5 minutes a new HAW packet should be created and sent to the neighbor.<br />
<br />
A new HAW packet should have a TTL of 100 and hops set to 0. The GUID must be randomly generated for each HAW packet. The GUID should<br />
be recorded as having been sent to that particular neighbor. In this way if the same HAW packet is received again it can be forwarded to a neighbor that hasn't seen it before. There must be an NA child packet that contains the address of the hub that originated the HAW packet.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving HAW packet, store the hub address from the NA child packet into the host cache and then forward the packet to another neighbour with the following rules:<br />
* Reduce the TTL by 1 and increase the hops by 1<br />
* Select a random neighbor hub that has not already seen this HAW packet<br />
<br />
The GUID for this HAW should be recorded along with the hub that sent it so that it won't be forwarded to that hub if the same HAW packet is received again.<br />
<br />
== Payload ==<br />
<br />
* 1 byte TTL<br />
* 1 byte Hops<br />
* 16 byte GUID<br />
<br />
When a new HAW packet is created the TTL should be 100 and Hops should be set to 0. The GUID is not the node ID, instead it is packet ID to identify where the packet has already been routed. So it should be uniquely generated for every new HAW.<br />
<br />
== Children ==<br />
<br />
The /HAW packet has the following child packets defined:<br />
<br />
* /HAW/NA - Network Address<br />
* /HAW/HS - Hub Status<br />
* /HAW/V - Vendor Code</div>Dcathttps://g2.doxu.org/index.php?title=HAW&diff=2960HAW2011-10-28T03:02:36Z<p>Dcat: /* Payload */</p>
<hr />
<div>{{Packets}}<br />
<br />
= /HAW - Hub Advertising Walker =<br />
<br />
The HAW packet is used to spread hub addresses to the far edges of the network to ensure that the network stays well connected. Each hub periodically creates a HAW packet with its own address in the packet and then sends it to a neighboring hub. That neighboring hub stores the address in its host cache and forwards it to one of its neighbors. The neighbor also stores the address in its host cache and forwards it to the next neighbor. The packet continues to be forwarded until its TTL reaches 0.<br />
<br />
== Sending ==<br />
<br />
The /HAW packet should only be sent by a hub to another hub. A timer should be maintained for each neighbor that tracks when a HAW packet was last sent to that neighbor. Approximately every 5 minutes a new HAW packet should be created and sent to the neighbor.<br />
<br />
A new HAW packet should have a TTL of 100 and hops set to 0. The GUID must be randomly generated for each HAW packet. The GUID should<br />
be recorded as having been sent to that particular neighbor. In this way if the same HAW packet is received again it can be forwarded to a neighbor that hasn't seen it before. There must be an NA child packet that contains the address of the hub that originated the HAW packet.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving HAW packet, store the hub address from the NA child packet into the host cache and then forward the packet to another neighbour with the following rules:<br />
* Reduce the TTL by 1 and increase the hops by 1<br />
* Select a random neighbor hub that has not already seen this HAW packet<br />
<br />
The GUID for this HAW should be recorded along with the hub that sent it so that it won't be forwarded to that hub if the same HAW packet is received again.<br />
<br />
== Payload ==<br />
<br />
* 1byte TTL<br />
* 1byte Hops<br />
* 16byte GUID<br />
<br />
When a new HAW packet is created the TTL should be 100 and Hops should be set to 0. The GUID is not the node ID, instead it is packet ID to identify where the packet has already been routed. So it should be uniquely generated for every new HAW.<br />
<br />
== Children ==<br />
<br />
The /HAW packet has the following child packets defined:<br />
<br />
* /HAW/NA - Network Address<br />
* /HAW/HS - Hub Status<br />
* /HAW/V - Vendor Code</div>Dcathttps://g2.doxu.org/index.php?title=HAW&diff=2959HAW2011-10-28T02:58:15Z<p>Dcat: /* /HAW - Hub Advertising Walker */</p>
<hr />
<div>{{Packets}}<br />
<br />
= /HAW - Hub Advertising Walker =<br />
<br />
The HAW packet is used to spread hub addresses to the far edges of the network to ensure that the network stays well connected. Each hub periodically creates a HAW packet with its own address in the packet and then sends it to a neighboring hub. That neighboring hub stores the address in its host cache and forwards it to one of its neighbors. The neighbor also stores the address in its host cache and forwards it to the next neighbor. The packet continues to be forwarded until its TTL reaches 0.<br />
<br />
== Sending ==<br />
<br />
The /HAW packet should only be sent by a hub to another hub. A timer should be maintained for each neighbor that tracks when a HAW packet was last sent to that neighbor. Approximately every 5 minutes a new HAW packet should be created and sent to the neighbor.<br />
<br />
A new HAW packet should have a TTL of 100 and hops set to 0. The GUID must be randomly generated for each HAW packet. The GUID should<br />
be recorded as having been sent to that particular neighbor. In this way if the same HAW packet is received again it can be forwarded to a neighbor that hasn't seen it before. There must be an NA child packet that contains the address of the hub that originated the HAW packet.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving HAW packet, store the hub address from the NA child packet into the host cache and then forward the packet to another neighbour with the following rules:<br />
* Reduce the TTL by 1 and increase the hops by 1<br />
* Select a random neighbor hub that has not already seen this HAW packet<br />
<br />
The GUID for this HAW should be recorded along with the hub that sent it so that it won't be forwarded to that hub if the same HAW packet is received again.<br />
<br />
== Payload ==<br />
<br />
* 1byte TTL<br />
* 1byte Hops<br />
* 16byte GUID<br />
<br />
TTL should probably be 100 and Hops should be set to 0 when packet first created. GUID is not node ID, it is packet ID for determine where the packet should be routed. rule of routing is if TTL has enough amount, and the packet has ever been to routed to the neighbour. as GUID on HAW packet is not node ID, it can be used to determine if the packet has been routed to the neighbour or not.<br />
<br />
<br />
== Children ==<br />
<br />
The /HAW packet has the following child packets defined:<br />
<br />
* /HAW/NA - Network Address<br />
* /HAW/HS - Hub Status<br />
* /HAW/V - Vendor Code</div>Dcathttps://g2.doxu.org/index.php?title=HAW&diff=2958HAW2011-10-28T02:26:28Z<p>Dcat: /* Sending */</p>
<hr />
<div>{{Packets}}<br />
<br />
= /HAW - Hub Advertising Walker =<br />
<br />
The HAW packet ...<br />
<br />
== Sending ==<br />
<br />
The /HAW packet should only be sent by a hub to another hub. A timer should be maintained for each neighbor that tracks when a HAW packet was last sent to that neighbor. Approximately every 5 minutes a new HAW packet should be created and sent to the neighbor.<br />
<br />
A new HAW packet should have a TTL of 100 and hops set to 0. The GUID must be randomly generated for each HAW packet. The GUID should<br />
be recorded as having been sent to that particular neighbor. In this way if the same HAW packet is received again it can be forwarded to a neighbor that hasn't seen it before. There must be an NA child packet that contains the address of the hub that originated the HAW packet.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving HAW packet, store the hub address from the NA child packet into the host cache and then forward the packet to another neighbour with the following rules:<br />
* Reduce the TTL by 1 and increase the hops by 1<br />
* Select a random neighbor hub that has not already seen this HAW packet<br />
<br />
The GUID for this HAW should be recorded along with the hub that sent it so that it won't be forwarded to that hub if the same HAW packet is received again.<br />
<br />
== Payload ==<br />
<br />
* 1byte TTL<br />
* 1byte Hops<br />
* 16byte GUID<br />
<br />
TTL should probably be 100 and Hops should be set to 0 when packet first created. GUID is not node ID, it is packet ID for determine where the packet should be routed. rule of routing is if TTL has enough amount, and the packet has ever been to routed to the neighbour. as GUID on HAW packet is not node ID, it can be used to determine if the packet has been routed to the neighbour or not.<br />
<br />
<br />
== Children ==<br />
<br />
The /HAW packet has the following child packets defined:<br />
<br />
* /HAW/NA - Network Address<br />
* /HAW/HS - Hub Status<br />
* /HAW/V - Vendor Code</div>Dcathttps://g2.doxu.org/index.php?title=HAW&diff=2957HAW2011-10-28T02:25:10Z<p>Dcat: /* Receiving */</p>
<hr />
<div>{{Packets}}<br />
<br />
= /HAW - Hub Advertising Walker =<br />
<br />
The HAW packet ...<br />
<br />
== Sending ==<br />
<br />
The /HAW packet should only be sent by a hub to another hub. A timer should be maintained for each neighbor that tracks when a HAW packet was last sent to that neighbor. Approximately every 5 minutes a new HAW packet should be created and sent to the neighbor.<br />
<br />
A new HAW packet should have a TTL of 100 and hops set to 0. The GUID must be randomly generated for each HAW packet. The GUID should<br />
be recorded as having been sent to that particular neighbor. In this way if the same HAW packet is received again it can be forwarded to a neighbor that hasn't seen it before.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving HAW packet, store the hub address from the NA child packet into the host cache and then forward the packet to another neighbour with the following rules:<br />
* Reduce the TTL by 1 and increase the hops by 1<br />
* Select a random neighbor hub that has not already seen this HAW packet<br />
<br />
The GUID for this HAW should be recorded along with the hub that sent it so that it won't be forwarded to that hub if the same HAW packet is received again.<br />
<br />
== Payload ==<br />
<br />
* 1byte TTL<br />
* 1byte Hops<br />
* 16byte GUID<br />
<br />
TTL should probably be 100 and Hops should be set to 0 when packet first created. GUID is not node ID, it is packet ID for determine where the packet should be routed. rule of routing is if TTL has enough amount, and the packet has ever been to routed to the neighbour. as GUID on HAW packet is not node ID, it can be used to determine if the packet has been routed to the neighbour or not.<br />
<br />
<br />
== Children ==<br />
<br />
The /HAW packet has the following child packets defined:<br />
<br />
* /HAW/NA - Network Address<br />
* /HAW/HS - Hub Status<br />
* /HAW/V - Vendor Code</div>Dcathttps://g2.doxu.org/index.php?title=HAW&diff=2956HAW2011-10-28T02:17:05Z<p>Dcat: /* Sending */</p>
<hr />
<div>{{Packets}}<br />
<br />
= /HAW - Hub Advertising Walker =<br />
<br />
The HAW packet ...<br />
<br />
== Sending ==<br />
<br />
The /HAW packet should only be sent by a hub to another hub. A timer should be maintained for each neighbor that tracks when a HAW packet was last sent to that neighbor. Approximately every 5 minutes a new HAW packet should be created and sent to the neighbor.<br />
<br />
A new HAW packet should have a TTL of 100 and hops set to 0. The GUID must be randomly generated for each HAW packet. The GUID should<br />
be recorded as having been sent to that particular neighbor. In this way if the same HAW packet is received again it can be forwarded to a neighbor that hasn't seen it before.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving HAW packet, re-send packet to another neighbour. reduce TTL and increase Hops should be done before re-send.<br />
<br />
== Payload ==<br />
<br />
* 1byte TTL<br />
* 1byte Hops<br />
* 16byte GUID<br />
<br />
TTL should probably be 100 and Hops should be set to 0 when packet first created. GUID is not node ID, it is packet ID for determine where the packet should be routed. rule of routing is if TTL has enough amount, and the packet has ever been to routed to the neighbour. as GUID on HAW packet is not node ID, it can be used to determine if the packet has been routed to the neighbour or not.<br />
<br />
<br />
== Children ==<br />
<br />
The /HAW packet has the following child packets defined:<br />
<br />
* /HAW/NA - Network Address<br />
* /HAW/HS - Hub Status<br />
* /HAW/V - Vendor Code</div>Dcathttps://g2.doxu.org/index.php?title=Main_Page&diff=2955Main Page2011-07-12T02:19:34Z<p>Dcat: Reverted edits by Divreyg (Talk) to last revision by Dcat</p>
<hr />
<div><table width=&quot;100%&quot; ><tr><br />
<td align=&quot;left&quot;><br />
== Gnutella2 Developer Network ==<br />
Welcome to the Gnutella2 Developer Network.<br />
The Gnutella2 Developer Network (or G2DN) is a convenient central location for discussing, developing and documenting all aspects of Gnutella2. Like the Gnutella2 platform itself, this website is designed to evolve through community support and participation. Everyone is free to contribute discussion, proposal documents, developer resources or any other relevant material.<br />
<br />
<p>Although the G2DN is primarily geared toward developers and technical enthusiasts, users of Gnutella2-enabled software are also welcome to participate. Those who are new to Gnutella2 may wish to check out some of the [[Gnutella2-powered software]].</p></td><br />
<td width=&quot;20px&quot;></td><br />
<td align=&quot;right&quot; valign=&quot;bottom&quot; width=&quot;200px&quot;><br />
__TOC__<br />
</td></tr><br />
</table><br />
<br />
==News==<br />
* ''29th, March, 2007'' - '''[[TCP Stream Connection and Handshaking]] specification updated.'''<br />
<br />
Feel free to contribute to the wiki after reading [[Gnutella2:Community Portal]] to learn about editing policy.<br />
<br />
== The Gnutella 2 Network==<br />
# [[Gnutella2|What is Gnutella2]]<br />
# [[Gnutella2 Standard]]<br />
# [[Network Architecture]]<br />
# [[Node Types and Responsibilities]]<br />
# [[Background|Background / Archive]]<br />
<br />
== The Protocol==<br />
# [[TCP Stream Connection and Handshaking]]<br />
# [[UDP Transceiver]]<br />
# [[Packet Structure]]<br />
# [[Datatypes]]<br />
# [[Basic Network Maintenance]]<br />
# [[Known Hub Cache and Hub Cluster Cache]]<br />
# [[Node Route Cache and Addressed Packet Forwarding]]<br />
# [[Query Hash Tables]]<br />
# [[Object Search Mechanism]]<br />
# [[Search Security]]<br />
# [[Search Description]]<br />
# [[Search Acknowledgement]]<br />
# [[Search Results]]<br />
# [[Simple Query Language and Metadata]]<br />
# [[Server for Uploading]]<br />
# [[Client for Downloading]]<br />
# [[User Profile Challenge and Delivery]]<br />
# [[Browse Host]]<br />
<br />
== Root Packets ==<br />
{{Root packet list}}<br />
<br />
== Proposals==<br />
* [[Active Source Exchange]] (ASE) by Kevin O'Toole<br />
* [[Source Exchange (x-G2alt)]]<br />
<br />
== Additional Information==<br />
Since Gnutella2 somehow evolved from the original Gnutella protocol you might find the following links useful:<br />
* [http://limewire.negatis.com/index.php?title=GDF The GDF Wiki]<br />
* [http://groups.yahoo.com/group/the_gdf/ Gnutella Developer forum]<br />
* [http://rfc-gnutella.sourceforge.net/ RFC Gnutella]<br />
* [http://crawler.trillinux.org/ Gnutella2 Crawler]</div>Dcathttps://g2.doxu.org/index.php?title=Main_Page&diff=2944Main Page2011-05-14T23:13:00Z<p>Dcat: /* Additional Information */</p>
<hr />
<div><table width=&quot;100%&quot; ><tr><br />
<td align=&quot;left&quot;><br />
== Gnutella2 Developer Network ==<br />
Welcome to the Gnutella2 Developer Network.<br />
The Gnutella2 Developer Network (or G2DN) is a convenient central location for discussing, developing and documenting all aspects of Gnutella2. Like the Gnutella2 platform itself, this website is designed to evolve through community support and participation. Everyone is free to contribute discussion, proposal documents, developer resources or any other relevant material.<br />
<br />
<p>Although the G2DN is primarily geared toward developers and technical enthusiasts, users of Gnutella2-enabled software are also welcome to participate. Those who are new to Gnutella2 may wish to check out some of the [[Gnutella2-powered software]].</p></td><br />
<td width=&quot;20px&quot;></td><br />
<td align=&quot;right&quot; valign=&quot;bottom&quot; width=&quot;200px&quot;><br />
__TOC__<br />
</td></tr><br />
</table><br />
<br />
==News==<br />
* ''29th, March, 2007'' - '''[[TCP Stream Connection and Handshaking]] specification updated.'''<br />
<br />
Feel free to contribute to the wiki after reading [[Gnutella2:Community Portal]] to learn about editing policy.<br />
<br />
== The Gnutella 2 Network==<br />
# [[Gnutella2|What is Gnutella2]]<br />
# [[Gnutella2 Standard]]<br />
# [[Network Architecture]]<br />
# [[Node Types and Responsibilities]]<br />
# [[Background|Background / Archive]]<br />
<br />
== The Protocol==<br />
# [[TCP Stream Connection and Handshaking]]<br />
# [[UDP Transceiver]]<br />
# [[Packet Structure]]<br />
# [[Datatypes]]<br />
# [[Basic Network Maintenance]]<br />
# [[Known Hub Cache and Hub Cluster Cache]]<br />
# [[Node Route Cache and Addressed Packet Forwarding]]<br />
# [[Query Hash Tables]]<br />
# [[Object Search Mechanism]]<br />
# [[Search Security]]<br />
# [[Search Description]]<br />
# [[Search Acknowledgement]]<br />
# [[Search Results]]<br />
# [[Simple Query Language and Metadata]]<br />
# [[Server for Uploading]]<br />
# [[Client for Downloading]]<br />
# [[User Profile Challenge and Delivery]]<br />
# [[Browse Host]]<br />
<br />
== Root Packets ==<br />
{{Root packet list}}<br />
<br />
== Proposals==<br />
* [[Active Source Exchange]] (ASE) by Kevin O'Toole<br />
* [[Source Exchange (x-G2alt)]]<br />
<br />
== Additional Information==<br />
Since Gnutella2 somehow evolved from the original Gnutella protocol you might find the following links useful:<br />
* [http://limewire.negatis.com/index.php?title=GDF The GDF Wiki]<br />
* [http://groups.yahoo.com/group/the_gdf/ Gnutella Developer forum]<br />
* [http://rfc-gnutella.sourceforge.net/ RFC Gnutella]<br />
* [http://crawler.trillinux.org/ Gnutella2 Crawler]</div>Dcathttps://g2.doxu.org/index.php?title=Main_Page&diff=2943Main Page2011-05-14T23:10:15Z<p>Dcat: /* Additional Information */</p>
<hr />
<div><table width=&quot;100%&quot; ><tr><br />
<td align=&quot;left&quot;><br />
== Gnutella2 Developer Network ==<br />
Welcome to the Gnutella2 Developer Network.<br />
The Gnutella2 Developer Network (or G2DN) is a convenient central location for discussing, developing and documenting all aspects of Gnutella2. Like the Gnutella2 platform itself, this website is designed to evolve through community support and participation. Everyone is free to contribute discussion, proposal documents, developer resources or any other relevant material.<br />
<br />
<p>Although the G2DN is primarily geared toward developers and technical enthusiasts, users of Gnutella2-enabled software are also welcome to participate. Those who are new to Gnutella2 may wish to check out some of the [[Gnutella2-powered software]].</p></td><br />
<td width=&quot;20px&quot;></td><br />
<td align=&quot;right&quot; valign=&quot;bottom&quot; width=&quot;200px&quot;><br />
__TOC__<br />
</td></tr><br />
</table><br />
<br />
==News==<br />
* ''29th, March, 2007'' - '''[[TCP Stream Connection and Handshaking]] specification updated.'''<br />
<br />
Feel free to contribute to the wiki after reading [[Gnutella2:Community Portal]] to learn about editing policy.<br />
<br />
== The Gnutella 2 Network==<br />
# [[Gnutella2|What is Gnutella2]]<br />
# [[Gnutella2 Standard]]<br />
# [[Network Architecture]]<br />
# [[Node Types and Responsibilities]]<br />
# [[Background|Background / Archive]]<br />
<br />
== The Protocol==<br />
# [[TCP Stream Connection and Handshaking]]<br />
# [[UDP Transceiver]]<br />
# [[Packet Structure]]<br />
# [[Datatypes]]<br />
# [[Basic Network Maintenance]]<br />
# [[Known Hub Cache and Hub Cluster Cache]]<br />
# [[Node Route Cache and Addressed Packet Forwarding]]<br />
# [[Query Hash Tables]]<br />
# [[Object Search Mechanism]]<br />
# [[Search Security]]<br />
# [[Search Description]]<br />
# [[Search Acknowledgement]]<br />
# [[Search Results]]<br />
# [[Simple Query Language and Metadata]]<br />
# [[Server for Uploading]]<br />
# [[Client for Downloading]]<br />
# [[User Profile Challenge and Delivery]]<br />
# [[Browse Host]]<br />
<br />
== Root Packets ==<br />
{{Root packet list}}<br />
<br />
== Proposals==<br />
* [[Active Source Exchange]] (ASE) by Kevin O'Toole<br />
* [[Source Exchange (x-G2alt)]]<br />
<br />
== Additional Information==<br />
Since Gnutella2 somehow evolved from the original Gnutella protocol you might find the following links useful:<br />
* [http://limewire.negatis.com/index.php?title=GDF The GDF Wiki]<br />
* [http://groups.yahoo.com/group/the_gdf/ Gnutella Developer forum]<br />
* [http://rfc-gnutella.sourceforge.net/ RFC Gnutella]<br />
* [http://draketo.de/inhalt/krude-ideen/gnufu_en.html Gnutella for Users (GnuFU)]<br />
* [http://crawler.trillinux.org/ Gnutella2 Crawler]</div>Dcathttps://g2.doxu.org/index.php?title=Browse_Host&diff=2942Browse Host2010-05-23T16:50:56Z<p>Dcat: Created page with 'Browse host allows a user to get a list of all the files another user is sharing. == Handshaking == To browse a host initiate a TCP HTTP connection to the host and request the /…'</p>
<hr />
<div>Browse host allows a user to get a list of all the files another user is sharing.<br />
<br />
== Handshaking ==<br />
To browse a host initiate a TCP HTTP connection to the host and request the / resource<br />
and send the header 'Accept: application/x-gnutella2'. That header indicates that G2<br />
packets will be sent in response.<br />
<br />
== Response ==<br />
The response is a stream of [[QH2]] packets.<br />
<br />
=== Tree structure ===<br />
The browsed host may also send along [[VF]] and [[PF]] packets which create a tree structure<br />
for the query hit results.</div>Dcathttps://g2.doxu.org/index.php?title=Main_Page&diff=2941Main Page2010-05-23T16:34:06Z<p>Dcat: /* The Protocol */</p>
<hr />
<div><table width=&quot;100%&quot; ><tr><br />
<td align=&quot;left&quot;><br />
== Gnutella2 Developer Network ==<br />
Welcome to the Gnutella2 Developer Network.<br />
The Gnutella2 Developer Network (or G2DN) is a convenient central location for discussing, developing and documenting all aspects of Gnutella2. Like the Gnutella2 platform itself, this website is designed to evolve through community support and participation. Everyone is free to contribute discussion, proposal documents, developer resources or any other relevant material.<br />
<br />
<p>Although the G2DN is primarily geared toward developers and technical enthusiasts, users of Gnutella2-enabled software are also welcome to participate. Those who are new to Gnutella2 may wish to check out some of the [[Gnutella2-powered software]].</p></td><br />
<td width=&quot;20px&quot;></td><br />
<td align=&quot;right&quot; valign=&quot;bottom&quot; width=&quot;200px&quot;><br />
__TOC__<br />
</td></tr><br />
</table><br />
<br />
==News==<br />
* ''29th, March, 2007'' - '''[[TCP Stream Connection and Handshaking]] specification updated.'''<br />
<br />
Feel free to contribute to the wiki after reading [[Gnutella2:Community Portal]] to learn about editing policy.<br />
<br />
== The Gnutella 2 Network==<br />
# [[Gnutella2|What is Gnutella2]]<br />
# [[Gnutella2 Standard]]<br />
# [[Network Architecture]]<br />
# [[Node Types and Responsibilities]]<br />
# [[Background|Background / Archive]]<br />
<br />
== The Protocol==<br />
# [[TCP Stream Connection and Handshaking]]<br />
# [[UDP Transceiver]]<br />
# [[Packet Structure]]<br />
# [[Datatypes]]<br />
# [[Basic Network Maintenance]]<br />
# [[Known Hub Cache and Hub Cluster Cache]]<br />
# [[Node Route Cache and Addressed Packet Forwarding]]<br />
# [[Query Hash Tables]]<br />
# [[Object Search Mechanism]]<br />
# [[Search Security]]<br />
# [[Search Description]]<br />
# [[Search Acknowledgement]]<br />
# [[Search Results]]<br />
# [[Simple Query Language and Metadata]]<br />
# [[Server for Uploading]]<br />
# [[Client for Downloading]]<br />
# [[User Profile Challenge and Delivery]]<br />
# [[Browse Host]]<br />
<br />
== Root Packets ==<br />
{{Root packet list}}<br />
<br />
== Proposals==<br />
* [[Active Source Exchange]] (ASE) by Kevin O'Toole<br />
* [[Source Exchange (x-G2alt)]]<br />
<br />
== Additional Information==<br />
Since Gnutella2 somehow evolved from the original Gnutella protocol you might find the following links useful:<br />
* [http://www.the-gdf.org The GDF Wiki]<br />
* [http://groups.yahoo.com/group/the_gdf/ Gnutella Developer forum]<br />
* [http://rfc-gnutella.sourceforge.net/ RFC Gnutella]<br />
* [http://draketo.de/inhalt/krude-ideen/gnufu_en.html Gnutella for Users (GnuFU)]<br />
* [http://crawler.trillinux.org/ Gnutella2 Crawler]</div>Dcathttps://g2.doxu.org/index.php?title=Gnutella2-powered_software&diff=2940Gnutella2-powered software2010-05-19T03:19:20Z<p>Dcat: split the name and description into two columns</p>
<hr />
<div>==Gnutella2 Clients==<br />
<br />
The following clients support Gnutella2:<br />
<br />
<table width="100%" border="0" cellpadding="6" cellspacing="1" bgcolor="#A5CAD2"><br />
<tr> <br />
<th width="15%">Name</th><br />
<th width="40%">Description</th><br />
<th width="23%">Platform</th><br />
<th width="22%">Development Status</th><br />
</tr><br />
<tr valign="top"> <br />
<td bgcolor="#F2F2F2">[http://shareaza.sourceforge.net/ Shareaza]</td><br />
<td bgcolor="#F2F2F2">Shareaza pioneered the Gnutella2 platform and continues to play an active role in its development. Connects to several additional networks as well.</td><br />
<td bgcolor="#F2F2F2">Windows</td><br />
<td bgcolor="#F2F2F2">Active</td><br />
</tr><br />
<br />
<tr align="left" valign="top"> <br />
<td bgcolor="#FFFFFF">[http://sharelin.sourceforge.net/ Sharelin]</td><br />
<td bgcolor="#FFFFFF">Sharelin is an open source terminal leaf-mode client for Linux and UNIX.</td><br />
<td bgcolor="#FFFFFF">Linux/Unix</td><br />
<td bgcolor="#FFFFFF">Active</td><br />
</tr><br />
<br />
<tr align="left" valign="top"> <br />
<td bgcolor="#F2F2F2">[http://www.gnucleus.com/ Gnucleus]</td><br />
<td bgcolor="#F2F2F2">Gnucleus is one of the first Gnutella clients and is an open source Gnutella2 client. It is based on GnucDNA, a Gnutella2 library.</td><br />
<td bgcolor="#F2F2F2">Windows</td><br />
<td bgcolor="#F2F2F2">Inactive</td><br />
</tr><br />
<br />
<tr align="left" valign="top" class="normal"> <br />
<td bgcolor="#FFFFFF">Morpheus</td><br />
<td bgcolor="#FFFFFF">Morpheus is a mainstream P2P client which switched from the FastTrack network to the Gnutella network and now to the Gnutella2 network. Morpheus is no longer officially available.</td><br />
<td bgcolor="#FFFFFF">Windows</td><br />
<td bgcolor="#FFFFFF">Inactive</td><br />
</tr><br />
<br />
<tr align="left" valign="top"> <br />
<td bgcolor="#F2F2F2">[http://sourceforge.net/projects/agio/ Adagio]</td><br />
<td bgcolor="#F2F2F2">Adagio is a Gnutella2 server which aims to provide a very configurable, highly reliable cross-platform daemon.</td><br />
<td bgcolor="#F2F2F2">Cross-Platform</td><br />
<td bgcolor="#F2F2F2">Inactive</td><br />
</tr><br />
<br />
<tr align="left" valign="top"> <br />
<td bgcolor="#FFFFFF">[http://www.filescope.com/ FileScope]</td><br />
<td bgcolor="#FFFFFF">FileScope is a file sharing program that connects to multiple peer-to-peer (P2P) networks and allows for finding and downloading all types of files. Written in C#.</td><br />
<td bgcolor="#FFFFFF">Windows</td><br />
<td bgcolor="#FFFFFF">Inactive</td><br />
</tr><br />
<br />
<tr align="left" valign="top"> <br />
<td bgcolor="#F2F2F2">MLDonkey</td><br />
<td bgcolor="#F2F2F2">An open source deamon client. Has many different GUI's you can use. Also connects to many other networks in addition to Gnutella2.</td><br />
<td bgcolor="#F2F2F2">Cross-Platform</td><br />
<td bgcolor="#F2F2F2">Inactive?</td><br />
</tr><br />
<br />
<tr align="left" valign="top"><br />
<td bgcolor="#FFFFFF">Pocket G2</td><br />
<td bgcolor="#FFFFFF">Pocket G2 is a Gnutella2 client written in VB.net for Pocket PCs.</td><br />
<td bgcolor="#FFFFFF">Windows Mobile</td><br />
<td bgcolor="#FFFFFF">Inactive</td><br />
</tr><br />
<br />
</table></div>Dcathttps://g2.doxu.org/index.php?title=Gnutella2-powered_software&diff=2939Gnutella2-powered software2010-05-19T03:11:54Z<p>Dcat: updating current programs</p>
<hr />
<div>==Gnutella2 Clients==<br />
<br />
The following clients support Gnutella2:<br />
<br />
<table width="100%" border="0" cellpadding="6" cellspacing="1" bgcolor="#A5CAD2"><br />
<tr> <br />
<th width="55%">Client Name</th><br />
<th width="23%">Platform</th><br />
<th width="22%">Development Status</th><br />
</tr><br />
<tr align="left" valign="top"> <br />
<td bgcolor="#F2F2F2">[http://shareaza.sourceforge.net/ Shareaza]<br><br />
Shareaza pioneered the Gnutella2 platform and continues to play an active role in its development. Connects to several additional networks as well.</td><br />
<td bgcolor="#F2F2F2">Windows</td><br />
<td bgcolor="#F2F2F2">Active</td><br />
</tr><br />
<br />
<tr align="left" valign="top"> <br />
<td bgcolor="#FFFFFF">[http://sharelin.sourceforge.net/ Sharelin]<br><br />
Sharelin is an open source terminal leaf-mode client for Linux and UNIX.</td><br />
<td bgcolor="#FFFFFF">Linux/Unix</td><br />
<td bgcolor="#FFFFFF">Active</td><br />
</tr><br />
<br />
<tr align="left" valign="top"> <br />
<td bgcolor="#F2F2F2">[http://www.gnucleus.com/ Gnucleus]<br><br />
Gnucleus is one of the first Gnutella clients and is an open source Gnutella2 client. It is based on GnucDNA, a Gnutella2 library.</td><br />
<td bgcolor="#F2F2F2">Windows</td><br />
<td bgcolor="#F2F2F2">Inactive</td><br />
</tr><br />
<br />
<tr align="left" valign="top" class="normal"> <br />
<td bgcolor="#FFFFFF">Morpheus<br><br />
Morpheus is a mainstream P2P client which switched from the FastTrack network to the Gnutella network and now to the Gnutella2 network. Morpheus is no longer officially available.</td><br />
<td bgcolor="#FFFFFF">Windows</td><br />
<td bgcolor="#FFFFFF">Inactive</td><br />
</tr><br />
<br />
<tr align="left" valign="top"> <br />
<td bgcolor="#F2F2F2">[http://sourceforge.net/projects/agio/ Adagio]<br><br />
Adagio is a Gnutella2 server which aims to provide a very configurable, highly reliable cross-platform daemon.</td><br />
<td bgcolor="#F2F2F2">Cross-Platform</td><br />
<td bgcolor="#F2F2F2">Inactive</td><br />
</tr><br />
<br />
<tr align="left" valign="top"> <br />
<td bgcolor="#FFFFFF">[http://www.filescope.com/ FileScope]<br><br />
FileScope is a file sharing program that connects to multiple peer-to-peer (P2P) networks and allows for finding and downloading all types of files. Written in C#.</td><br />
<td bgcolor="#FFFFFF">Windows</td><br />
<td bgcolor="#FFFFFF">Inactive</td><br />
</tr><br />
<br />
<tr align="left" valign="top"> <br />
<td bgcolor="#F2F2F2">MLDonkey<br><br />
An open source deamon client. Has many different GUI's you can use. Also connects to many other networks in addition to Gnutella2.</td><br />
<td bgcolor="#F2F2F2">Cross-Platform</td><br />
<td bgcolor="#F2F2F2">Inactive?</td><br />
</tr><br />
<br />
<tr align="left" valign="top"><br />
<td bgcolor="#FFFFFF">Pocket G2<br><br />
Pocket G2 is a Gnutella2 client written in VB.net for Pocket PCs.</td><br />
<td bgcolor="#FFFFFF">Windows Mobile</td><br />
<td bgcolor="#FFFFFF">Inactive</td><br />
</tr><br />
<br />
</table></div>Dcathttps://g2.doxu.org/index.php?title=Main_Page&diff=2886Main Page2009-03-07T16:59:06Z<p>Dcat: </p>
<hr />
<div><table width=&quot;100%&quot; ><tr><br />
<td align=&quot;left&quot;><br />
== Gnutella2 Developer Network ==<br />
Welcome to the Gnutella2 Developer Network.<br />
The Gnutella2 Developer Network (or G2DN) is a convenient central location for discussing, developing and documenting all aspects of Gnutella2. Like the Gnutella2 platform itself, this website is designed to evolve through community support and participation. Everyone is free to contribute discussion, proposal documents, developer resources or any other relevant material.<br />
<br />
<p>Although the G2DN is primarily geared toward developers and technical enthusiasts, users of Gnutella2-enabled software are also welcome to participate. Those who are new to Gnutella2 may wish to check out some of the [[Gnutella2-powered software]].</p></td><br />
<td width=&quot;20px&quot;></td><br />
<td align=&quot;right&quot; valign=&quot;bottom&quot; width=&quot;200px&quot;><br />
__TOC__<br />
</td></tr><br />
</table><br />
<br />
==News==<br />
* ''29th, March, 2007'' - '''[[TCP Stream Connection and Handshaking]] specification updated.'''<br />
<br />
Feel free to contribute to the wiki after reading [[Gnutella2:Community Portal]] to learn about editing policy.<br />
<br />
== The Gnutella 2 Network==<br />
# [[Gnutella2|What is Gnutella2]]<br />
# [[Gnutella2 Standard]]<br />
# [[Network Architecture]]<br />
# [[Node Types and Responsibilities]]<br />
# [[Background|Background / Archive]]<br />
<br />
== The Protocol==<br />
# [[TCP Stream Connection and Handshaking]]<br />
# [[UDP Transceiver]]<br />
# [[Packet Structure]]<br />
# [[Datatypes]]<br />
# [[Basic Network Maintenance]]<br />
# [[Known Hub Cache and Hub Cluster Cache]]<br />
# [[Node Route Cache and Addressed Packet Forwarding]]<br />
# [[Query Hash Tables]]<br />
# [[Object Search Mechanism]]<br />
# [[Search Security]]<br />
# [[Search Description]]<br />
# [[Search Acknowledgement]]<br />
# [[Search Results]]<br />
# [[Simple Query Language and Metadata]]<br />
# [[Server for Uploading]]<br />
# [[Client for Downloading]]<br />
# [[User Profile Challenge and Delivery]]<br />
<br />
== Root Packets ==<br />
{{Root packet list}}<br />
<br />
== Proposals==<br />
* [[Active Source Exchange]] (ASE) by Kevin O'Toole<br />
* [[Source Exchange (x-G2alt)]]<br />
<br />
== Additional Information==<br />
Since Gnutella2 somehow evolved from the original Gnutella protocol you might find the following links useful:<br />
* [http://www.the-gdf.org The GDF Wiki]<br />
* [http://groups.yahoo.com/group/the_gdf/ Gnutella Developer forum]<br />
* [http://rfc-gnutella.sourceforge.net/ RFC Gnutella]<br />
* [http://draketo.de/inhalt/krude-ideen/gnufu_en.html Gnutella for Users (GnuFU)]<br />
* [http://crawler.trillinux.org/ Gnutella2 Crawler]</div>Dcathttps://g2.doxu.org/index.php?title=Gnutella2:Community_Portal&diff=2921Gnutella2:Community Portal2009-03-07T16:58:05Z<p>Dcat: /* General Policy */</p>
<hr />
<div>== General Policy ==<br />
<br />
This wiki is for maintaining the '''official''' Gnutella2 specification and as such requires special rules on how changes will be accepted in to the specification. The Talk pages will be the primary way of discussing changes. There is no definitive list of people who have to approve changes or a voting procedure for changes to the specification. For now it is an informal process which should be arrived at naturally and diplomatically. Changes that aren't backward compatible should be avoided at all costs. It is very unlikely that anyone will agree to such changes anyway.<br />
<br />
== Spelling and Grammar Policy ==<br />
<br />
Fixing spelling and grammar do not require a consensus. Only if the specification is being changed it will require a consensus. This is so that the wiki will be as readable as possible for all developers.<br />
<br />
== Packets Policy ==<br />
<br />
{{Packets}}<br />
<br />
The packets pages can be handled slightly differently. Extensions to them that a vendor has made and is using in the wild can be added to the respective packet page in the wiki. These extensions should be clearly marked with which vendors support them so that other developers will know whether they are required and who to expect them from.</div>Dcathttps://g2.doxu.org/index.php?title=Main_Page&diff=2885Main Page2009-03-07T16:57:22Z<p>Dcat: /* News */</p>
<hr />
<div><table width=&quot;100%&quot; ><tr><br />
<td align=&quot;left&quot;><br />
== Gnutella2 Developer Network ==<br />
Welcome to the Gnutella2 Developer Network.<br />
The Gnutella2 Developer Network (or G2DN) is a convenient central location for discussing, developing and documenting all aspects of Gnutella2. Like the Gnutella2 platform itself, this website is designed to evolve through community support and participation. Everyone is free to contribute discussion, proposal documents, developer resources or any other relevant material.<br />
<br />
<p>Although the G2DN is primarily geared toward developers and technical enthusiasts, users of Gnutella2-enabled software are also welcome to participate. Those who are new to Gnutella2 may wish to check out some of the [[Gnutella2-powered software]].</p></td><br />
<td width=&quot;20px&quot;></td><br />
<td align=&quot;right&quot; valign=&quot;bottom&quot; width=&quot;200px&quot;><br />
__TOC__<br />
</td></tr><br />
</table><br />
<br />
==News==<br />
* ''29th, March, 2007'' - '''[[TCP Stream Connection and Handshaking]] specification updated.'''<br />
<br />
Feel free to contribute to the wiki after reading [[Gnutella2:Community Portal]] to learn about editing policy.<br />
<br />
==Mailing List==<br />
To allow communication among developers of Gnutella2 clients, there exists a [[mailing list]]. You can access it too via regular news reader at the news-to-mail gateway [http://www.gmane.org Gmane] (list page [http://dir.gmane.org/gmane.network.gnutella2.devel here]).<br />
<br />
== The Gnutella 2 Network==<br />
# [[Gnutella2|What is Gnutella2]]<br />
# [[Gnutella2 Standard]]<br />
# [[Network Architecture]]<br />
# [[Node Types and Responsibilities]]<br />
# [[Background|Background / Archive]]<br />
<br />
== The Protocol==<br />
# [[TCP Stream Connection and Handshaking]]<br />
# [[UDP Transceiver]]<br />
# [[Packet Structure]]<br />
# [[Datatypes]]<br />
# [[Basic Network Maintenance]]<br />
# [[Known Hub Cache and Hub Cluster Cache]]<br />
# [[Node Route Cache and Addressed Packet Forwarding]]<br />
# [[Query Hash Tables]]<br />
# [[Object Search Mechanism]]<br />
# [[Search Security]]<br />
# [[Search Description]]<br />
# [[Search Acknowledgement]]<br />
# [[Search Results]]<br />
# [[Simple Query Language and Metadata]]<br />
# [[Server for Uploading]]<br />
# [[Client for Downloading]]<br />
# [[User Profile Challenge and Delivery]]<br />
<br />
== Root Packets ==<br />
{{Root packet list}}<br />
<br />
== Proposals==<br />
* [[Active Source Exchange]] (ASE) by Kevin O'Toole<br />
* [[Source Exchange (x-G2alt)]]<br />
<br />
== Additional Information==<br />
Since Gnutella2 somehow evolved from the original Gnutella protocol you might find the following links useful:<br />
* [http://www.the-gdf.org The GDF Wiki]<br />
* [http://groups.yahoo.com/group/the_gdf/ Gnutella Developer forum]<br />
* [http://rfc-gnutella.sourceforge.net/ RFC Gnutella]<br />
* [http://draketo.de/inhalt/krude-ideen/gnufu_en.html Gnutella for Users (GnuFU)]<br />
* [http://crawler.trillinux.org/ Gnutella2 Crawler]</div>Dcathttps://g2.doxu.org/index.php?title=Template:Packets&diff=2935Template:Packets2009-02-07T15:50:45Z<p>Dcat: </p>
<hr />
<div><div style="border: 1px solid #333; background-color: #9cf; padding: 0.2em 0.5em; margin: 1em 0.5em; width: 15em; float:right; text-align: center"><br />
<span style="font: 18px bold">Root Packets</span><br />
<br><br />
[[CRAWLA]] - [[CRAWLR]]<br />
<br><br />
[[HAW]] - [[LNI]]<br />
<br><br />
[[KHL]] - [[KHLA]] - [[KHLR]]<br />
<br><br />
[[PI]] - [[PO]] - [[PUSH]]<br />
<br><br />
[[QKA]] - [[QKR]]<br />
<br><br />
[[Q2]] - [[QA]] - [[QH2]] - [[QHT]]<br />
<br><br />
[[UPROC]] - [[UPROD]]<br />
</div></div>Dcathttps://g2.doxu.org/index.php?title=LNI&diff=2893LNI2009-01-18T18:13:39Z<p>Dcat: /* Children */</p>
<hr />
<div>{{Packets}}<br />
<br />
= /LNI - Local Node Information =<br />
<br />
The local node information packet is used to convey essential information about the<br />
node on either end of a TCP stream connection.<br />
<br />
== Sending ==<br />
<br />
The /LNI packet should be sent to a TCP neighbour upon connection, and at regular<br />
intervals following that if the information within it has changed. A minimum update<br />
time of one minute is recommended.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving a /LNI packet, the information within should be stored for subsequent<br />
use.<br />
<br />
== Payload ==<br />
<br />
This packet has no payload at the current time.<br />
<br />
== Children ==<br />
<br />
The /LNI packet has many child packet types defined at the current time:<br />
<br />
* /LNI/NA - Node Address<br />
* /LNI/GU - GUID<br />
* /LNI/V - Vendor Code<br />
* /LNI/LS - Library Statistics<br />
* /LNI/HS - Hub Status<br />
* /LNI/FW - Firewalled<br />
* /LNI/QK - Query Key Caching<br />
* /LNI/HA - Hub Able<br />
* /LNI/RTR - Router<br />
* /LNI/UP - Uptime<br />
<br />
== /LNI/NA - Node Address ==<br />
<br />
The /LNI/NA child packet specifies the node or network address of the sending node.<br />
<br />
=== Sending ===<br />
<br />
This child is required.<br />
<br />
=== Payload ===<br />
<br />
The physical network address of the sending node. See [[datatypes]] for more<br />
information.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /LNI/GU - GUID ==<br />
<br />
The /LNI/GU child packet specifies the globally unique identifier of the sending node.<br />
<br />
=== Sending ===<br />
<br />
This child is required.<br />
<br />
=== Payload ===<br />
<br />
The 16 byte globally unique node identifier of the sending node.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /LNI/V - Vendor Code ==<br />
<br />
The /LNI/V child packet specifies the vendor code of the software operating the<br />
sending node.<br />
<br />
=== Sending ===<br />
<br />
This child is optional.<br />
<br />
=== Payload ===<br />
<br />
A four byte vendor code.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /LNI/LS - Library Statistics ==<br />
<br />
The /LNI/LS packet provides information about the content library of the sending<br />
node.<br />
<br />
=== Sending ===<br />
<br />
This child is optional.<br />
<br />
=== Payload ===<br />
<br />
Two 32-bit integers representing the number of files in the local library, and the total<br />
KB in the local library respectively. If the sending node is a hub these statistics are<br />
combined with the known statistics from all connected leaves. The payload may grow<br />
beyond 8 bytes in the future.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /LNI/HS - Hub Status ==<br />
<br />
The /LNI/HS packet is included only if the sending node is a hub, and contains the<br />
status of the hub.<br />
<br />
=== Sending ===<br />
<br />
This child packet should only be sent by hub nodes. Leaf nodes should not transmit<br />
it, and if it is received from a leaf node, it should be ignored.<br />
<br />
=== Payload ===<br />
<br />
Two 16-bit integers representing the current leaf count and the maximum leaf count<br />
respectively. This packet may grow beyond 4 bytes in the future.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.</div>Dcathttps://g2.doxu.org/index.php?title=Query_Hash_Tables&diff=2898Query Hash Tables2009-01-18T02:04:38Z<p>Dcat: /* Introduction */</p>
<hr />
<div>== Introduction ==<br />
<br />
Building an efficient network topology is not viable without means to restrict the flow<br />
of information appropriately. In the Gnutella2 network architecture, neighbouring<br />
nodes exchange compressed hash filter tables describing the content, which can be<br />
reached by communicating with them. These tables are updated dynamically as<br />
necessary.<br />
<br />
The concept of filtering hash tables in file sharing was pioneered by Limegroup for<br />
the LimeWire Gnutella application.<br />
<br />
== Table Properties ==<br />
<br />
Query hash tables or QHTs provide enough information to know with certainty that a<br />
particular node (and possibly its descendants) will not be able to provide any<br />
matching objects for a given query. Conversely, the QHT may reveal that a node or<br />
its descendants may be able to provide matching objects.<br />
<br />
This property means that queries can be discarded confidently when a transmission<br />
is known to be unnecessary, while not providing the filtering or forwarding node, any<br />
actual information about the searchable content. Neighbours know what their<br />
neighbours do not have, but cannot say for sure what they do have. QHTs are also<br />
very efficient, both in terms of exchange and maintenance and lookup cost.<br />
<br />
== Table Content ==<br />
<br />
A QHT is a table of 2<sup>N</sup> bits, where each bit represents a unique word-hash value.<br />
For example a table of 20 bits has 2<sup>20</sup> = 1048576 possible word-hash values. If<br />
stored uncompressed this table would be 128 KB in size.<br />
<br />
In an empty table, every word-hash value bit will be "1", which represents "empty".<br />
To populate the table with searchable content, an application must:<br />
<br />
* Locate every plain-text word and URN which could be searched for and produce a match/hit<br />
* Hash the word with a simple hash function to produce a word-hash value which is 0 <= value < 2<sup>N</sup>.<br />
* Set the appropriate bit in the table to zero, representing "full".<br />
<br />
== Word Hashing ==<br />
<br />
Words are strings of one or more alphanumeric characters which are not all numeric.<br />
<br />
To convert a word into a hash value, the following case-insensitive algorithm is used:<br />
<br />
<pre><br />
<nowiki><br />
// HashWord( string_ptr, char_count, table_bit_count );<br />
DWORD CQueryHashTable::HashWord(LPCTSTR psz, int nLength, int nBits)<br />
{<br />
DWORD nNumber = 0;<br />
int nByte = 0;<br />
for ( ; nLength > 0 ; nLength--, psz++ )<br />
{<br />
int nValue = tolower( *psz ) & 0xFF;<br />
nValue = nValue << ( nByte * 8 );<br />
nByte = ( nByte + 1 ) & 3;<br />
nNumber = nNumber ^ nValue;<br />
}<br />
return HashNumber( nNumber, nBits );<br />
}<br />
<br />
DWORD CQueryHashTable::HashNumber(DWORD nNumber, int nBits)<br />
{<br />
WORD64 nProduct = (WORD64)nNumber * (WORD64)0x4F1BBCDC;<br />
WORD64 nHash = ( nProduct << 32 ) >> ( 32 + ( 32 - nBits ) );<br />
return (DWORD)nHash;<br />
}<br />
</nowiki><br />
</pre><br />
<br />
== URNs - A Special Case ==<br />
<br />
URNs are treated as a special case: rather than dividing them up into word tokens,<br />
they are hashed as a complete fixed length string. For example:<br />
<br />
<pre><br />
<nowiki><br />
urn:sha1:WIXYJFVJMIWNMUWPRPBGUTODIV52RMJA<br />
</nowiki><br />
</pre><br />
<br />
Bitprint URNs are actually composite values which include both a SHA1 and<br />
TigerTree root value. Rather than adding the whole bitprint to the table, each of the<br />
constituent URNs are added separately. This allows SHA1-only querying and TigerTree-only<br />
querying. A root TigerTree URN takes the form:<br />
<br />
<pre><br />
<nowiki><br />
urn:tree:tiger/:CN25MLNU3XNN7IHKZMNOA63XG6SKDJ2W7Z3HONA<br />
</nowiki><br />
</pre><br />
<br />
Other URNs should be expressed in their most natural form before being fed to the<br />
word hash function.<br />
<br />
== Word Prefix Extensions ==<br />
<br />
For words consisting of at least five characters, it is often useful to be able to match<br />
substrings within the word. Unfortunately, adding every possible substring of each<br />
word would increase the density of the QHT, however, a simple and effective<br />
compromise is available:<br />
<br />
For words with 5 or more characters:<br />
<br />
* Hash and add the whole word<br />
* Hash and add the whole word minus the last character<br />
* Hash and add the whole word minus the last two characters<br />
<br />
This allows searching on prefixes of the word, for example "match" will now match<br />
"matches".<br />
<br />
== Table Exchange ==<br />
<br />
Nodes must keep their neighbouring hubs up-to-date with their latest local query<br />
hash table at all times. Rather than sending the whole table whenever it changes,<br />
nodes may opt to send a "table patch", which includes only the difference between<br />
the old and new table.<br />
<br />
The /[[QHT]] packet is used to supply a query hash table update to a neighbouring hub.<br />
Its format is compatible with the Gnutella1 "query routing protocol", except that<br />
Gnutella2 requires a 1-bit per value table, while Gnutella1 requires a 4 or 8 bit per<br />
value table. Gnutella2 supports patch compression using the deflate algorithm,<br />
however, this should not be applied if the TCP link itself is compressed.<br />
<br />
== Table Access ==<br />
<br />
A table of 2<sup>N</sup> bits can be stored in an array of bytes 2<sup>N</sup>/8 long. To resolve a<br />
hash-value into a byte and bit number, use the following equations:<br />
<br />
<pre><br />
<nowiki><br />
int nByte = ( nHashValue >> 3 );<br />
int nBit = ( nHashValue & 7 );<br />
</nowiki><br />
</pre><br />
<br />
The least significant bit is numbered 0; the most significant bit is numbered 7. To set<br />
a bit as empty (setting it to 1):<br />
<br />
<pre><br />
<nowiki><br />
table_ptr[ nByte ] |= ( 1 << nBit );<br />
</nowiki><br />
</pre><br />
<br />
To set a bit as full (setting it to zero):<br />
<br />
<pre><br />
<nowiki><br />
table_ptr[ nByte ] &= ~( 1 << nBit );<br />
</nowiki><br />
</pre><br />
<br />
== The Aggregate or Superset Table ==<br />
<br />
Nodes operating in hub mode must maintain an aggregate or superset query hash<br />
table, consisting of their own searchable content combined with the QHTs supplied<br />
by all connected leaves. This aggregate table is supplied to neighbouring hubs,<br />
allowing them to completely filter traffic for the local hub and its leaves.<br />
<br />
This has two important implications:<br />
* When a change is detected in either the local content or a connected leaf node's QHT, the aggregate table must be rebuilt and patches dispatched to neighbouring hubs. This will happen often, so an appropriate minimum time between updates should be used. One minute is effective.<br />
* An aggregate table representing 400 leaves will be much denser than a table representing one node. This means that all tables must be large enough that the aggregate table remains productively sparse.<br />
<br />
To create an aggregate table, start with an empty table of fixed size containing all<br />
1's. For each contributing table, copy any zero (full) bits to the aggregate table. This<br />
is effectively an AND operation. If a source table is smaller than the aggregate table,<br />
a single 0 bit in the source will equate to several zero bits in the aggregate. If the<br />
source table is larger than the aggregate table, a single zero bit will map to a single<br />
bit with some loss of accuracy.<br />
<br />
It is of great importance that all QHTs in the system be sufficiently large to allow an<br />
aggregate table to remain suitably sparse. Ideally each leaf node should provide a<br />
table less than 1% dense.<br />
<br />
== Query Filtering ==<br />
<br />
Before transmitting a query packet to a connection that has provided a query hash<br />
table, match the words and URNs in the query against the QHT.<br />
<br />
* If any of the lookups based on URNs found a hit, send the query packet<br />
* If at least two thirds of lookups based on words found a hit, send<br />
* Otherwise, drop the packet<br />
<br />
It is important to apply the "two thirds" rule only for words. URNs must provide an<br />
automatic match.<br />
<br />
Consider all text content in the query, including generic search text and metadata<br />
search text if it is present. When dealing with simple query language that involves<br />
quoted phrases and exclusions, apply the following rules:<br />
<br />
* Tokenize quoted phrases into words, ignoring the phrase at this level<br />
* Ignore excluded words - these do not count as table hits or misses<br />
* Remember to apply exclusion to every word in an excluded phrase<br />
<br />
See the section on the [[Simple Query Language and Metadata|simple query language]] for more information.</div>Dcathttps://g2.doxu.org/index.php?title=LNI&diff=2892LNI2009-01-17T14:53:46Z<p>Dcat: /* Children */</p>
<hr />
<div>{{Packets}}<br />
<br />
= /LNI - Local Node Information =<br />
<br />
The local node information packet is used to convey essential information about the<br />
node on either end of a TCP stream connection.<br />
<br />
== Sending ==<br />
<br />
The /LNI packet should be sent to a TCP neighbour upon connection, and at regular<br />
intervals following that if the information within it has changed. A minimum update<br />
time of one minute is recommended.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving a /LNI packet, the information within should be stored for subsequent<br />
use.<br />
<br />
== Payload ==<br />
<br />
This packet has no payload at the current time.<br />
<br />
== Children ==<br />
<br />
The /LNI packet has many child packet types defined at the current time:<br />
<br />
* /LNI/NA - Node Address<br />
* /LNI/GU - GUID<br />
* /LNI/V - Vendor Code<br />
* /LNI/LS - Library Statistics<br />
* /LNI/HS - Hub Status<br />
* /LNI/FW - Firewalled<br />
* /LNI/QK - Query Key Caching<br />
<br />
== /LNI/NA - Node Address ==<br />
<br />
The /LNI/NA child packet specifies the node or network address of the sending node.<br />
<br />
=== Sending ===<br />
<br />
This child is required.<br />
<br />
=== Payload ===<br />
<br />
The physical network address of the sending node. See [[datatypes]] for more<br />
information.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /LNI/GU - GUID ==<br />
<br />
The /LNI/GU child packet specifies the globally unique identifier of the sending node.<br />
<br />
=== Sending ===<br />
<br />
This child is required.<br />
<br />
=== Payload ===<br />
<br />
The 16 byte globally unique node identifier of the sending node.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /LNI/V - Vendor Code ==<br />
<br />
The /LNI/V child packet specifies the vendor code of the software operating the<br />
sending node.<br />
<br />
=== Sending ===<br />
<br />
This child is optional.<br />
<br />
=== Payload ===<br />
<br />
A four byte vendor code.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /LNI/LS - Library Statistics ==<br />
<br />
The /LNI/LS packet provides information about the content library of the sending<br />
node.<br />
<br />
=== Sending ===<br />
<br />
This child is optional.<br />
<br />
=== Payload ===<br />
<br />
Two 32-bit integers representing the number of files in the local library, and the total<br />
KB in the local library respectively. If the sending node is a hub these statistics are<br />
combined with the known statistics from all connected leaves. The payload may grow<br />
beyond 8 bytes in the future.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /LNI/HS - Hub Status ==<br />
<br />
The /LNI/HS packet is included only if the sending node is a hub, and contains the<br />
status of the hub.<br />
<br />
=== Sending ===<br />
<br />
This child packet should only be sent by hub nodes. Leaf nodes should not transmit<br />
it, and if it is received from a leaf node, it should be ignored.<br />
<br />
=== Payload ===<br />
<br />
Two 16-bit integers representing the current leaf count and the maximum leaf count<br />
respectively. This packet may grow beyond 4 bytes in the future.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.</div>Dcathttps://g2.doxu.org/index.php?title=CRAWLA&diff=2923CRAWLA2009-01-11T21:54:20Z<p>Dcat: /* Children */</p>
<hr />
<div>{{Packets}}<br />
<br />
= /CRAWLA - Crawler Answer =<br />
<br />
The crawl answer packet is the response to a [[CRAWLR|crawl request packet]]. It contains information about the current node for a Gnutella2 crawler.<br />
<br />
== Sending ==<br />
<br />
The /CRAWLA packet ... TODO<br />
<br />
== Receiving ==<br />
<br />
A /CRAWLA packet should only be received by a crawler in response to a [[CRAWLR|/CRAWLR]] packet, which should use it to gather information about the Gnutella2 network.<br />
<br />
== Payload ==<br />
<br />
This packet has no payload at the current time.<br />
<br />
== Children ==<br />
<br />
The /CRAWLA packet has the following child packets defined:<br />
<br />
* /CRAWLA/SELF - Vendor Code and Version<br />
* /CRAWLA/SELF/HUB - Only present if the host is a hub<br />
* /CRAWLA/SELF/LEAF - Only present if the host is a leaf<br />
* /CRAWLA/NH - Neighbouring Hub<br />
* /CRAWLA/NL - Neighbouring Leaf<br />
* /CRAWLA/*/NA - Network Address<br />
* /CRAWLA/*/HS - Hub Status<br />
* /CRAWLA/*/GPS - GPS information<br />
* /CRAWLA/*/NAME - Nickname</div>Dcathttps://g2.doxu.org/index.php?title=QKR&diff=2903QKR2009-01-11T20:31:04Z<p>Dcat: /* Children */</p>
<hr />
<div>{{Packets}}<br />
<br />
= /QKR - Query Key Request =<br />
<br />
The query key request asks a destination hub to provide a query key that the<br />
requesting node can use to securely perform queries. This mechanism ensures that<br />
the network cannot be used to direct unsolicited packets to external hosts.<br />
<br />
== Sending ==<br />
<br />
A query key request should be sent to a hub via the connectionless transport if a key<br />
is not already available for that hub for the local node address, or if a previously<br />
acquired key no longer works or has expired. There is no reason to request a query<br />
key via a TCP link.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving a query key request, a hub should respond with a query key answer<br />
(/[[QKA]]) packet if it is willing to supply a query key. The answer packet should be<br />
dispatched to the return address indicated in the request packet only, and the<br />
allocated key should be locked to that address.<br />
<br />
== Payload ==<br />
<br />
This packet has no payload at the current time.<br />
<br />
== Children ==<br />
<br />
The QKR packet has these child packets defined at the current time:<br />
<br />
* /QKR/RNA<br />
* /QKR/QNA<br />
* /QKR/SNA<br />
* /QKR/REF<br />
<br />
== /QKR/RNA - Requesting Node Address ==<br />
<br />
A query key may be requested for a node address other than that of the sender, for<br />
example when a UDP-firewalled leaf node wishes to acquire a query key for a remote<br />
hub that it will route through a locally connected hub. In this case it must request a<br />
query key for the node address of a connected hub.<br />
<br />
=== Sending ===<br />
<br />
This child is required to ensure that the sender knows its address.<br />
<br />
=== Payload ===<br />
<br />
The network address of the requesting node. See [[Datatypes]] for more information.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /QKR/QNA - Queried Node Address ==<br />
<br />
This packet should only be transmitted over a TCP link from a leaf to a hub. It asks<br />
the hub to look in its query key cache and return a key matching the requested address.<br />
<br />
=== Sending ===<br />
<br />
This packet is sent by a leaf that is firewalled to one of its hubs that it will use to proxy<br />
its search results.<br />
<br />
=== Receiving ===<br />
<br />
When a hub receives this packet it should see if the node has already issued it a query key.<br />
If so then it will return the query key to the leaf in a [[QKA]]. Otherwise it will send a new<br />
[[QKR]] over UDP to the node and attach the leaf's address in an SNA packet. <br />
See /QKR/SNA for more information.<br />
<br />
=== Payload ===<br />
<br />
The network address of the node that the leaf needs a query key for. See [[Datatypes]] for more information.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /QKR/SNA - Sending Node Address ==<br />
<br />
This packet indicates the original initiator of the query key proxy request.<br />
It is needed by the hub so it knows who to forward the query key onto when it <br />
eventually receives a [[QKA]]<br />
<br />
=== Sending ===<br />
<br />
This packet is sent by a hub over UDP to another hub on behalf of the leaf in SNA<br />
that is firewalled.<br />
<br />
=== Receiving ===<br />
<br />
When a hub receives this packet it should issue a query key for hub that sent the packet.<br />
The [[QKA]] response should include an identical SNA packet so the recipient knows which<br />
leaf to notify that it now has a query key.<br />
<br />
=== Payload ===<br />
<br />
The network address of the leaf that initiated the query key request. See [[Datatypes]] for more information.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /QKR/REF - Refresh the query key ==<br />
<br />
Indicates that the query key for /QKR/QNA should not be retrieved from cache but instead<br />
the node in /QKR/QNA should be asked for its key. <br />
This packet appears to not be in widespread use.<br />
<br />
=== Payload ===<br />
<br />
This packet has no payload at the current time.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.</div>Dcathttps://g2.doxu.org/index.php?title=QKR&diff=2902QKR2009-01-11T20:02:01Z<p>Dcat: </p>
<hr />
<div>{{Packets}}<br />
<br />
= /QKR - Query Key Request =<br />
<br />
The query key request asks a destination hub to provide a query key that the<br />
requesting node can use to securely perform queries. This mechanism ensures that<br />
the network cannot be used to direct unsolicited packets to external hosts.<br />
<br />
== Sending ==<br />
<br />
A query key request should be sent to a hub via the connectionless transport if a key<br />
is not already available for that hub for the local node address, or if a previously<br />
acquired key no longer works or has expired. There is no reason to request a query<br />
key via a TCP link.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving a query key request, a hub should respond with a query key answer<br />
(/[[QKA]]) packet if it is willing to supply a query key. The answer packet should be<br />
dispatched to the return address indicated in the request packet only, and the<br />
allocated key should be locked to that address.<br />
<br />
== Payload ==<br />
<br />
This packet has no payload at the current time.<br />
<br />
== Children ==<br />
<br />
The QKR packet has these child packets defined at the current time:<br />
<br />
* /QKR/RNA<br />
* /QKR/SNA<br />
* /QKR/QNA<br />
* /QKR/REF<br />
<br />
== /QKR/RNA - Requesting Node Address ==<br />
<br />
A query key may be requested for a node address other than that of the sender, for<br />
example when a UDP-firewalled leaf node wishes to acquire a query key for a remote<br />
hub that it will route through a locally connected hub. In this case it must request a<br />
query key for the node address of a connected hub.<br />
<br />
=== Sending ===<br />
<br />
This child is required to ensure that the sender knows its address.<br />
<br />
=== Payload ===<br />
<br />
The network address of the requesting node. See [[Datatypes]] for more information.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /QKR/QNA - Queried Node Address ==<br />
<br />
This packet should only be transmitted over a TCP link from a leaf to a hub. It asks<br />
the hub to look in its query key cache and return a key matching the requested address.<br />
<br />
=== Sending ===<br />
<br />
This packet is sent by a leaf that is firewalled to one of its hubs that it will use to proxy<br />
its search results.<br />
<br />
=== Receiving ===<br />
<br />
When a hub receives this packet it should see if the node has already issued it a query key.<br />
If so then it will return the query key to the leaf in a [[QKA]]. Otherwise it will send a new<br />
[[QKR]] over UDP to the node and attach the leaf's address in an SNA packet. <br />
See /QKR/SNA for more information.<br />
<br />
=== Payload ===<br />
<br />
The network address of the node that the leaf needs a query key for. See [[Datatypes]] for more information.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /QKR/SNA - Sending Node Address ==<br />
<br />
This packet indicates the original initiator of the query key proxy request.<br />
It is needed by the hub so it knows who to forward the query key onto when it <br />
eventually receives a [[QKA]]<br />
<br />
=== Sending ===<br />
<br />
This packet is sent by a hub over UDP to another hub on behalf of the leaf in SNA<br />
that is firewalled.<br />
<br />
=== Receiving ===<br />
<br />
When a hub receives this packet it should issue a query key for hub that sent the packet.<br />
The [[QKA]] response should include an identical SNA packet so the recipient knows which<br />
leaf to notify that it now has a query key.<br />
<br />
=== Payload ===<br />
<br />
The network address of the leaf that initiated the query key request. See [[Datatypes]] for more information.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /QKR/REF - Refresh the query key ==<br />
<br />
Indicates that the query key for /QKR/QNA should not be retrieved from cache but instead<br />
the node in /QKR/QNA should be asked for its key. <br />
This packet appears to not be in widespread use.<br />
<br />
=== Payload ===<br />
<br />
This packet has no payload at the current time.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.</div>Dcathttps://g2.doxu.org/index.php?title=QKA&diff=2908QKA2009-01-11T19:30:19Z<p>Dcat: /* /QKA/CACHED - The query key is from cache */</p>
<hr />
<div>{{Packets}}<br />
<br />
= /QKA - Query Key Answer =<br />
<br />
The query key answer packet is sent in response to a [[QKR|query key request]] or in the<br />
event that a query with an incorrect or omitted query key is received. It advises the<br />
receiver of the correct query key to be used when contacting the sending hub to<br />
execute a remote cluster query.<br />
<br />
== Sending ==<br />
<br />
The query key answer packet should be sent by a hub when a query key has been<br />
requested. It should contain a key unique to the local hub and the requesting node<br />
address supplied in the request, and should be sent to that address only.<br />
The query key answer packet may also be sent upon receiving a query with a<br />
missing or invalid query key. In this case no query should be performed.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving a query key answer packet, the supplied query key should be stored<br />
for later use. If the answer packet contains a sending node address (/QKA/SNA) child<br />
which does not match the local node address, it may be forwarded to a connected<br />
leaf node via TCP with a matching address. In the forwarding case, a query node<br />
address (/QKA/QNA) child is added prior to forwarding to retain the remote (queried)<br />
hub's address.<br />
<br />
== Payload ==<br />
<br />
This packet has no payload at the current time.<br />
<br />
== Children ==<br />
<br />
The QKA packet has these child packets defined at the current time:<br />
<br />
* /QKA/QK<br />
* /QKA/SNA<br />
* /QKA/QNA<br />
* /QKA/CACHED<br />
<br />
== /QKA/QK - Query Key ==<br />
<br />
The /QKA/QK child contains the query key that was requested.<br />
<br />
=== Sending ===<br />
<br />
This child is required if a key is being issued. Sending a /QKA without a /QKA/QK<br />
indicates that the hub does not wish to authorise the requesting node to query it or<br />
its cluster.<br />
<br />
=== Payload ===<br />
<br />
A 32-bit query key which is unique to the hub and the sending node address.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /QKA/SNA - Sending Node Address ==<br />
<br />
This child specifies the node address for which the key has been issued. This is not<br />
necessarily the node that physically transmitted the key request or the query.<br />
<br />
=== Sending ===<br />
<br />
This child is required.<br />
<br />
=== Payload ===<br />
<br />
The node address (with port number optional) of the node which requested the<br />
query key.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /QKA/QNA - Queried Node Address ==<br />
<br />
If this query key answer packet has been forwarded to a firewalled leaf from a<br />
connected hub, a /QKA/QNA child will have been added to indicate the address of<br />
the remote hub from which the query key has been issued.<br />
<br />
=== Sending ===<br />
<br />
This child should be added by a hub when relaying a received query key answer on<br />
to a leaf via TCP.<br />
<br />
=== Receiving ===<br />
<br />
If this child is present, the query key answer should be treated as if it originated<br />
from the stored address rather than the TCP neighbour.<br />
<br />
=== Payload ===<br />
<br />
The node address (with port number optional) of the remote hub.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /QKA/CACHED - Query Key Cached ==<br />
<br />
Indicates that the query key returned was retrieved from cache.<br />
<br />
=== Sending ===<br />
<br />
This packet should be added by a hub in response to a /QKR/QNA over TCP from a leaf.<br />
<br />
=== Receiving ===<br />
<br />
Indicates to the leaf that the query key in the response was retrieved from cache.<br />
<br />
=== Payload ===<br />
<br />
This packet has no payload at the current time.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.</div>Dcathttps://g2.doxu.org/index.php?title=QKA&diff=2907QKA2009-01-11T19:28:41Z<p>Dcat: /* /QKA/QNA - Queried Node Address */</p>
<hr />
<div>{{Packets}}<br />
<br />
= /QKA - Query Key Answer =<br />
<br />
The query key answer packet is sent in response to a [[QKR|query key request]] or in the<br />
event that a query with an incorrect or omitted query key is received. It advises the<br />
receiver of the correct query key to be used when contacting the sending hub to<br />
execute a remote cluster query.<br />
<br />
== Sending ==<br />
<br />
The query key answer packet should be sent by a hub when a query key has been<br />
requested. It should contain a key unique to the local hub and the requesting node<br />
address supplied in the request, and should be sent to that address only.<br />
The query key answer packet may also be sent upon receiving a query with a<br />
missing or invalid query key. In this case no query should be performed.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving a query key answer packet, the supplied query key should be stored<br />
for later use. If the answer packet contains a sending node address (/QKA/SNA) child<br />
which does not match the local node address, it may be forwarded to a connected<br />
leaf node via TCP with a matching address. In the forwarding case, a query node<br />
address (/QKA/QNA) child is added prior to forwarding to retain the remote (queried)<br />
hub's address.<br />
<br />
== Payload ==<br />
<br />
This packet has no payload at the current time.<br />
<br />
== Children ==<br />
<br />
The QKA packet has these child packets defined at the current time:<br />
<br />
* /QKA/QK<br />
* /QKA/SNA<br />
* /QKA/QNA<br />
* /QKA/CACHED<br />
<br />
== /QKA/QK - Query Key ==<br />
<br />
The /QKA/QK child contains the query key that was requested.<br />
<br />
=== Sending ===<br />
<br />
This child is required if a key is being issued. Sending a /QKA without a /QKA/QK<br />
indicates that the hub does not wish to authorise the requesting node to query it or<br />
its cluster.<br />
<br />
=== Payload ===<br />
<br />
A 32-bit query key which is unique to the hub and the sending node address.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /QKA/SNA - Sending Node Address ==<br />
<br />
This child specifies the node address for which the key has been issued. This is not<br />
necessarily the node that physically transmitted the key request or the query.<br />
<br />
=== Sending ===<br />
<br />
This child is required.<br />
<br />
=== Payload ===<br />
<br />
The node address (with port number optional) of the node which requested the<br />
query key.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /QKA/QNA - Queried Node Address ==<br />
<br />
If this query key answer packet has been forwarded to a firewalled leaf from a<br />
connected hub, a /QKA/QNA child will have been added to indicate the address of<br />
the remote hub from which the query key has been issued.<br />
<br />
=== Sending ===<br />
<br />
This child should be added by a hub when relaying a received query key answer on<br />
to a leaf via TCP.<br />
<br />
=== Receiving ===<br />
<br />
If this child is present, the query key answer should be treated as if it originated<br />
from the stored address rather than the TCP neighbour.<br />
<br />
=== Payload ===<br />
<br />
The node address (with port number optional) of the remote hub.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /QKA/CACHED - The query key is from cache ==<br />
<br />
Indicates that the query key returned was retrieved from cache.<br />
<br />
=== Sending ===<br />
<br />
This packet should be added by a hub in response to a /QKR/QNA over TCP from a leaf.<br />
<br />
=== Receiving ===<br />
<br />
Indicates to the leaf that the query key in the response was retrieved from cache.<br />
<br />
=== Payload ===<br />
<br />
This packet has no payload at the current time.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.</div>Dcathttps://g2.doxu.org/index.php?title=QKR&diff=2901QKR2009-01-11T18:45:24Z<p>Dcat: </p>
<hr />
<div>{{Packets}}<br />
<br />
= /QKR - Query Key Request =<br />
<br />
The query key request asks a destination hub to provide a query key that the<br />
requesting node can use to securely perform queries. This mechanism ensures that<br />
the network cannot be used to direct unsolicited packets to external hosts.<br />
<br />
== Sending ==<br />
<br />
A query key request should be sent to a hub via the connectionless transport if a key<br />
is not already available for that hub for the local node address, or if a previously<br />
acquired key no longer works or has expired. There is no reason to request a query<br />
key via a TCP link.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving a query key request, a hub should respond with a query key answer<br />
(/[[QKA]]) packet if it is willing to supply a query key. The answer packet should be<br />
dispatched to the return address indicated in the request packet only, and the<br />
allocated key should be locked to that address.<br />
<br />
== Payload ==<br />
<br />
This packet has no payload at the current time.<br />
<br />
== Children ==<br />
<br />
The QKR packet has these child packets defined at the current time:<br />
<br />
* /QKR/RNA<br />
* /QKR/SNA<br />
* /QKR/QNA<br />
* /QKR/REF<br />
<br />
== /QKR/RNA - Requesting Node Address ==<br />
<br />
A query key may be requested for a node address other than that of the sender, for<br />
example when a UDP-firewalled leaf node wishes to acquire a query key for a remote<br />
hub that it will route through a locally connected hub. In this case it must request a<br />
query key for the node address of a connected hub.<br />
<br />
=== Sending ===<br />
<br />
This child is required to ensure that the sender knows its address.<br />
<br />
=== Payload ===<br />
<br />
The network address of the requesting node. See [[Datatypes]] for more information.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /QKR/REF - Refresh the query key ==<br />
<br />
Indicates that the query key for /QKR/QNA should not be retrieved from cache but instead<br />
the node in /QKR/QNA should be asked for its key. <br />
This packet appears to not be in widespread use.<br />
<br />
=== Payload ===<br />
<br />
This packet has no payload at the current time.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.</div>Dcathttps://g2.doxu.org/index.php?title=QKA&diff=2906QKA2009-01-11T18:34:19Z<p>Dcat: /* /QKA/CACHED */</p>
<hr />
<div>{{Packets}}<br />
<br />
= /QKA - Query Key Answer =<br />
<br />
The query key answer packet is sent in response to a [[QKR|query key request]] or in the<br />
event that a query with an incorrect or omitted query key is received. It advises the<br />
receiver of the correct query key to be used when contacting the sending hub to<br />
execute a remote cluster query.<br />
<br />
== Sending ==<br />
<br />
The query key answer packet should be sent by a hub when a query key has been<br />
requested. It should contain a key unique to the local hub and the requesting node<br />
address supplied in the request, and should be sent to that address only.<br />
The query key answer packet may also be sent upon receiving a query with a<br />
missing or invalid query key. In this case no query should be performed.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving a query key answer packet, the supplied query key should be stored<br />
for later use. If the answer packet contains a sending node address (/QKA/SNA) child<br />
which does not match the local node address, it may be forwarded to a connected<br />
leaf node via TCP with a matching address. In the forwarding case, a query node<br />
address (/QKA/QNA) child is added prior to forwarding to retain the remote (queried)<br />
hub's address.<br />
<br />
== Payload ==<br />
<br />
This packet has no payload at the current time.<br />
<br />
== Children ==<br />
<br />
The QKA packet has these child packets defined at the current time:<br />
<br />
* /QKA/QK<br />
* /QKA/SNA<br />
* /QKA/QNA<br />
* /QKA/CACHED<br />
<br />
== /QKA/QK - Query Key ==<br />
<br />
The /QKA/QK child contains the query key that was requested.<br />
<br />
=== Sending ===<br />
<br />
This child is required if a key is being issued. Sending a /QKA without a /QKA/QK<br />
indicates that the hub does not wish to authorise the requesting node to query it or<br />
its cluster.<br />
<br />
=== Payload ===<br />
<br />
A 32-bit query key which is unique to the hub and the sending node address.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /QKA/SNA - Sending Node Address ==<br />
<br />
This child specifies the node address for which the key has been issued. This is not<br />
necessarily the node that physically transmitted the key request or the query.<br />
<br />
=== Sending ===<br />
<br />
This child is required.<br />
<br />
=== Payload ===<br />
<br />
The node address (with port number optional) of the node which requested the<br />
query key.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /QKA/QNA - Queried Node Address ==<br />
<br />
If this query key answer packet has been forwarded to a firewalled leaf from a<br />
connected hub, a /QKA/QNA child will have been added to indicate the address of<br />
the remote hub.<br />
<br />
=== Sending ===<br />
<br />
This child should be added by a hub when relaying a received query key answer on<br />
to a leaf via TCP.<br />
<br />
=== Receiving ===<br />
<br />
If this child is present, the query key answer should be treated as if it originated<br />
from the stored address rather than the TCP neighbour.<br />
<br />
=== Payload ===<br />
<br />
The node address (with port number optional) of the remote hub.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /QKA/CACHED - The query key is from cache ==<br />
<br />
Indicates that the query key returned was retrieved from cache.<br />
<br />
=== Sending ===<br />
<br />
This packet should be added by a hub in response to a /QKR/QNA over TCP from a leaf.<br />
<br />
=== Receiving ===<br />
<br />
Indicates to the leaf that the query key in the response was retrieved from cache.<br />
<br />
=== Payload ===<br />
<br />
This packet has no payload at the current time.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.</div>Dcathttps://g2.doxu.org/index.php?title=QKA&diff=2905QKA2009-01-11T18:32:41Z<p>Dcat: </p>
<hr />
<div>{{Packets}}<br />
<br />
= /QKA - Query Key Answer =<br />
<br />
The query key answer packet is sent in response to a [[QKR|query key request]] or in the<br />
event that a query with an incorrect or omitted query key is received. It advises the<br />
receiver of the correct query key to be used when contacting the sending hub to<br />
execute a remote cluster query.<br />
<br />
== Sending ==<br />
<br />
The query key answer packet should be sent by a hub when a query key has been<br />
requested. It should contain a key unique to the local hub and the requesting node<br />
address supplied in the request, and should be sent to that address only.<br />
The query key answer packet may also be sent upon receiving a query with a<br />
missing or invalid query key. In this case no query should be performed.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving a query key answer packet, the supplied query key should be stored<br />
for later use. If the answer packet contains a sending node address (/QKA/SNA) child<br />
which does not match the local node address, it may be forwarded to a connected<br />
leaf node via TCP with a matching address. In the forwarding case, a query node<br />
address (/QKA/QNA) child is added prior to forwarding to retain the remote (queried)<br />
hub's address.<br />
<br />
== Payload ==<br />
<br />
This packet has no payload at the current time.<br />
<br />
== Children ==<br />
<br />
The QKA packet has these child packets defined at the current time:<br />
<br />
* /QKA/QK<br />
* /QKA/SNA<br />
* /QKA/QNA<br />
* /QKA/CACHED<br />
<br />
== /QKA/QK - Query Key ==<br />
<br />
The /QKA/QK child contains the query key that was requested.<br />
<br />
=== Sending ===<br />
<br />
This child is required if a key is being issued. Sending a /QKA without a /QKA/QK<br />
indicates that the hub does not wish to authorise the requesting node to query it or<br />
its cluster.<br />
<br />
=== Payload ===<br />
<br />
A 32-bit query key which is unique to the hub and the sending node address.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /QKA/SNA - Sending Node Address ==<br />
<br />
This child specifies the node address for which the key has been issued. This is not<br />
necessarily the node that physically transmitted the key request or the query.<br />
<br />
=== Sending ===<br />
<br />
This child is required.<br />
<br />
=== Payload ===<br />
<br />
The node address (with port number optional) of the node which requested the<br />
query key.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /QKA/QNA - Queried Node Address ==<br />
<br />
If this query key answer packet has been forwarded to a firewalled leaf from a<br />
connected hub, a /QKA/QNA child will have been added to indicate the address of<br />
the remote hub.<br />
<br />
=== Sending ===<br />
<br />
This child should be added by a hub when relaying a received query key answer on<br />
to a leaf via TCP.<br />
<br />
=== Receiving ===<br />
<br />
If this child is present, the query key answer should be treated as if it originated<br />
from the stored address rather than the TCP neighbour.<br />
<br />
=== Payload ===<br />
<br />
The node address (with port number optional) of the remote hub.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /QKA/CACHED ==<br />
<br />
Indicates that the query key returned was retrieved from cache.<br />
<br />
=== Sending ===<br />
<br />
This packet should be added in response to a /QKR/QNA over TCP.<br />
<br />
=== Receiving ===<br />
<br />
Indicates that the query key in the response was retrieved from cache.<br />
<br />
=== Payload ===<br />
<br />
This packet has no payload at the current time.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.</div>Dcathttps://g2.doxu.org/index.php?title=Gnutella2-powered_software&diff=2919Gnutella2-powered software2009-01-01T18:05:17Z<p>Dcat: </p>
<hr />
<div>==Gnutella2 Clients==<br />
<br />
The following clients support Gnutella2:<br />
<br />
<table width="100%" border="0" cellpadding="6" cellspacing="1" bgcolor="#A5CAD2"><br />
<tr> <br />
<th width="55%">Client Name</th><br />
<th width="23%">Platform</th><br />
<th width="22%">Support</th><br />
</tr><br />
<tr align="left" valign="top"> <br />
<td bgcolor="#FFFFFF">[http://shareaza.sourceforge.net/ Shareaza]<br><br />
Shareaza pioneered the Gnutella2 platform and continues to play an active role in its development. Connects to several additional networks as well.</td><br />
<td align="center" valign="middle" bgcolor="#FFFFFF">Windows</td><br />
<td align="center" valign="middle" bgcolor="#FFFFFF">Full 1.0 Support</td><br />
</tr><br />
<br />
<tr align="left" valign="top"> <br />
<td bgcolor="#F2F2F2">[http://www.gnucleus.com/ Gnucleus]<br><br />
Gnucleus is one of the first Gnutella clients and is an open source Gnutella2 client. It is based on GnucDNA, a Gnutella2 library.</td><br />
<td align="center" valign="middle" bgcolor="#F2F2F2">Windows</td><br />
<td align="center" valign="middle" bgcolor="#F2F2F2">Full 1.0 Support</td><br />
</tr><br />
<br />
<tr align="left" valign="top" class="normal"> <br />
<td bgcolor="#FFFFFF">Morpheus<br><br />
Morpheus is a mainstream P2P client which switched from the FastTrack network to the Gnutella network and now to the Gnutella2 network. Morpheus is no longer officially available.</td><br />
<td align="center" valign="middle" bgcolor="#FFFFFF">Windows</td><br />
<td align="center" valign="middle" bgcolor="#FFFFFF">Uses GnucDNA</td><br />
</tr><br />
<br />
<tr align="left" valign="top"> <br />
<td bgcolor="#F2F2F2">[http://sourceforge.net/projects/agio/ Adagio]<br><br />
Adagio is a Gnutella2 server which aims to provide a very configurable, highly reliable cross-platform daemon.</td><br />
<td align="center" valign="middle" bgcolor="#F2F2F2">Cross-Platform</td><br />
<td align="center" valign="middle" bgcolor="#F2F2F2">1.0 Support</td><br />
</tr><br />
<br />
<tr align="left" valign="top"> <br />
<td bgcolor="#F2F2F2">[http://www.filescope.com/ FileScope]<br><br />
FileScope is a file sharing program that connects to multiple peer-to-peer (P2P) networks and allows for finding and downloading all types of files. Written in C#.</td><br />
<td align="center" valign="middle" bgcolor="#F2F2F2">Windows</td><br />
<td align="center" valign="middle" bgcolor="#F2F2F2">1.0 Support (Beta)</td><br />
</tr><br />
<br />
<tr align="left" valign="top"> <br />
<td bgcolor="#FFFFFF">MLDonkey<br><br />
An open source deamon client. Has many different GUI's you can use. Also connects to many other networks in addition to Gnutella2.</td><br />
<td align="center" valign="middle" bgcolor="#FFFFFF">Cross-Platform</td><br />
<td align="center" valign="middle" bgcolor="#FFFFFF">1.0 Support (Beta)</td><br />
</tr><br />
<br />
<tr align="left" valign="top"><br />
<td bgcolor="#F2F2F2">Pocket G2<br><br />
Pocket G2 is a Gnutella2 client written in VB.net for Pocket PCs.</td><br />
<td align="center" valign="middle" bgcolor="#F2F2F2">Windows Mobile</td><br />
<td align="center" valign="middle" bgcolor="#F2F2F2">1.0 Support (Alpha)</td><br />
</tr><br />
<br />
</table></div>Dcathttps://g2.doxu.org/index.php?title=Template:Packets&diff=2934Template:Packets2009-01-01T16:04:58Z<p>Dcat: </p>
<hr />
<div><div style="border: 1px solid #333; background-color: #9cf; padding: 0.2em 0.5em; margin: 1em 0.5em; width: 15em; float:right; text-align: center"><br />
<span style="font: 18px bold">Root Packets</span><br />
<br><br />
[[CRAWLA]] - [[CRAWLR]]<br />
<br><br />
[[HAW]] - [[KHL]] - [[LNI]]<br />
<br><br />
[[PI]] - [[PO]] - [[PUSH]]<br />
<br><br />
[[QKA]] - [[QKR]]<br />
<br><br />
[[Q2]] - [[QA]] - [[QH2]] - [[QHT]]<br />
<br><br />
[[UPROC]] - [[UPROD]]<br />
</div></div>Dcathttps://g2.doxu.org/index.php?title=Template:Packets&diff=2933Template:Packets2009-01-01T15:39:38Z<p>Dcat: </p>
<hr />
<div><div style="border: 1px solid #333; background-color: #9cf; padding: 0.2em 0.5em; margin: 1em 0; width: 15em; float:right; text-align: center"><br />
<span style="font: 18px bold">Root Packets</span><br />
<br><br />
[[CRAWLA]] - [[CRAWLR]]<br />
<br><br />
[[HAW]] - [[KHL]] - [[LNI]]<br />
<br><br />
[[PI]] - [[PO]] - [[PUSH]]<br />
<br><br />
[[QKA]] - [[QKR]]<br />
<br><br />
[[Q2]] - [[QA]] - [[QH2]] - [[QHT]]<br />
<br><br />
[[UPROC]] - [[UPROD]]<br />
</div></div>Dcathttps://g2.doxu.org/index.php?title=KHL&diff=2895KHL2009-01-01T04:30:18Z<p>Dcat: /* Payload */</p>
<hr />
<div>{{Packets}}<br />
<br />
= /KHL =<br />
<br />
The known hub list packet is used to exchange a list of known Gnutella2 hubs with<br />
neighbouring nodes. It is exchanged regularly over all TCP connections, between<br />
hubs and between hubs and leaves (and vice versa). It enables a completely up to<br />
date picture of the local hub cluster, and the gradual propagation of cached hub<br />
records.<br />
<br />
== Sending ==<br />
<br />
This packet should be sent through TCP links at regular intervals. One minute is<br />
suggested for busy links, leaves may send to hubs less often. Note that unlike /LNI,<br />
/KHL must be sent regularly even if the information does not change in order to<br />
refresh timestamps and keep time-sorted caches in the correct order.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving a known hub list, the detailed hubs should be stored in appropriate<br />
data structures. Neighbouring hubs must be retained in the hub cluster records,<br />
while cached hubs should be merged with the local accessible hub cache.<br />
<br />
== Payload ==<br />
<br />
This packet has no payload at the current time.<br />
<br />
== Children ==<br />
<br />
This packet has several child packet types defined at the current time:<br />
<br />
* /KHL/TS - Timestamp<br />
* /KHL/NH - Neighbouring Hub<br />
* /KHL/CH - Cached Hub<br />
<br />
== /KHL/TS - Timestamp ==<br />
<br />
The /KHL/TS child provides a timestamp representing the current universal time at<br />
the sending node. This can be used as a reference when considering other<br />
timestamps in the packet, allowing them to be adjusted to eliminate differences<br />
between the time setting on the local and remote node.<br />
<br />
=== Sending ===<br />
<br />
This child is optional but recommended.<br />
<br />
=== Payload ===<br />
<br />
A 32-bit integer representing the current UNIX time, or time (NULL).<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /KHL/NH - Neighbouring Hub ==<br />
<br />
This child packet represents a neighbouring hub.<br />
<br />
=== Sending ===<br />
<br />
One should be included for each Gnutella2 neighbour hub, with the possible<br />
exception of the one to which this packet is being sent.<br />
<br />
=== Payload ===<br />
<br />
The node address of the hub. See [[datatypes]] for more information.<br />
<br />
=== Children ===<br />
<br />
This packet has several child packet types defined at the current time:<br />
<br />
* /KHL/NH/GU - GUID<br />
* /KHL/NH/V - Vendor Code<br />
* /KHL/NH/LS - Library Statistics<br />
* /KHL/NH/HS - Hub Status<br />
<br />
=== /KHL/NH/GU - GUID ===<br />
<br />
The /KHL/NH/GU child packet specifies the globally unique identifier of the hub.<br />
<br />
==== Sending ====<br />
<br />
This child is optional.<br />
<br />
==== Payload ====<br />
<br />
The 16 byte globally unique node identifier of the hub.<br />
<br />
==== Children ====<br />
<br />
This packet has no known children at the current time.<br />
<br />
=== /KHL/NH/V - Vendor Code ===<br />
<br />
The /KHL/NH/V child packet specifies the vendor code of the software operating the<br />
hub.<br />
<br />
==== Sending ====<br />
<br />
This child is optional.<br />
<br />
==== Payload ====<br />
<br />
A four byte vendor code.<br />
<br />
==== Children ====<br />
<br />
This packet has no known children at the current time.<br />
<br />
=== /KHL/NH/LS - Library Statistics ===<br />
<br />
The /KHL/NH/LS packet provides information about the content library of the hub<br />
and its connected leaves.<br />
<br />
==== Sending ====<br />
<br />
This child is optional.<br />
<br />
==== Payload ====<br />
<br />
Two 32-bit integers representing the number of files, and the total KB of available<br />
content in the hub's own library and the libraries of its connected leaves. The<br />
payload may grow beyond 8 bytes in the future.<br />
<br />
==== Children ====<br />
<br />
This packet has no known children at the current time.<br />
<br />
=== /KHL/NH/HS - Hub Status ===<br />
<br />
The /KHL/NH/HS packet contains the status of the hub.<br />
<br />
==== Sending ====<br />
<br />
This child is optional.<br />
<br />
==== Payload ====<br />
<br />
Two 16-bit integers representing the current leaf count and the maximum leaf count<br />
respectively. This packet may grow beyond 4 bytes in the future.<br />
<br />
==== Children ====<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /KHL/CH - Cached Hub ==<br />
<br />
This child packet represents a hub from the hub cache.<br />
<br />
=== Sending ===<br />
<br />
An arbitrary number of these children should be included, constrained by space and<br />
the number of available cached hubs. A selection of freshly time stamped but<br />
previously unknown hubs should be included, and the list should not include hubs in<br />
the local cluster.<br />
<br />
=== Payload ===<br />
<br />
The node address of the hub, followed by the time this hub was last seen as a 32-bit<br />
timestamp. The last seen time can be adjusted based on the difference between the<br />
/KHL/TS timestamp and the local time. Note that the node address is of variable<br />
length, so it is important to consider the last 4 bytes as the timestamp rather than<br />
assuming a fixed length node address.<br />
<br />
=== Children ===<br />
<br />
This packet has several child packet types defined at the current time:<br />
<br />
* /KHL/CH/GU - GUID<br />
* /KHL/CH/V - Vendor Code<br />
* /KHL/CH/LS - Library Statistics<br />
* /KHL/CH/HS - Hub Status<br />
<br />
This extra information is considered less relevant for a cached hub because it is<br />
unlikely to be up to date enough to be useful.<br />
<br />
=== /KHL/CH/GU - GUID ===<br />
<br />
The /KHL/CH/GU child packet specifies the globally unique identifier of the hub.<br />
<br />
==== Sending ====<br />
<br />
This child is optional.<br />
<br />
==== Payload ====<br />
<br />
The 16 byte globally unique node identifier of the hub.<br />
<br />
==== Children ====<br />
<br />
This packet has no known children at the current time.<br />
<br />
=== /KHL/CH/V - Vendor Code ===<br />
<br />
The /KHL/CH/V child packet specifies the vendor code of the software operating the<br />
hub.<br />
<br />
==== Sending ====<br />
<br />
This child is optional.<br />
<br />
==== Payload ====<br />
<br />
A four byte vendor code.<br />
<br />
==== Children ====<br />
<br />
This packet has no known children at the current time.<br />
<br />
=== /KHL/CH/LS - Library Statistics ===<br />
<br />
The /KHL/NH/LS packet provides information about the content library of the hub<br />
and its connected leaves.<br />
<br />
==== Sending ====<br />
<br />
This child is optional.<br />
<br />
==== Payload ====<br />
<br />
Two 32-bit integers representing the number of files, and the total KB of available<br />
content in the hub's own library and the libraries of its connected leaves. The<br />
payload may grow beyond 8 bytes in the future.<br />
<br />
==== Children ====<br />
<br />
This packet has no known children at the current time.<br />
<br />
=== /KHL/CH/HS - Hub Status ===<br />
<br />
The /KHL/CH/HS packet contains the status of the hub.<br />
<br />
==== Sending ====<br />
<br />
This child is optional.<br />
<br />
==== Payload ====<br />
<br />
Two 16-bit integers representing the current leaf count and the maximum leaf count<br />
respectively. This packet may grow beyond 4 bytes in the future.<br />
<br />
==== Children ====<br />
<br />
This packet has no known children at the current time.</div>Dcathttps://g2.doxu.org/index.php?title=LNI&diff=2891LNI2009-01-01T04:25:07Z<p>Dcat: /* Payload */</p>
<hr />
<div>{{Packets}}<br />
<br />
= /LNI - Local Node Information =<br />
<br />
The local node information packet is used to convey essential information about the<br />
node on either end of a TCP stream connection.<br />
<br />
== Sending ==<br />
<br />
The /LNI packet should be sent to a TCP neighbour upon connection, and at regular<br />
intervals following that if the information within it has changed. A minimum update<br />
time of one minute is recommended.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving a /LNI packet, the information within should be stored for subsequent<br />
use.<br />
<br />
== Payload ==<br />
<br />
This packet has no payload at the current time.<br />
<br />
== Children ==<br />
<br />
The /LNI packet has many child packet types defined at the current time:<br />
<br />
* /LNI/NA - Node Address<br />
* /LNI/GU - GUID<br />
* /LNI/V - Vendor Code<br />
* /LNI/LS - Library Statistics<br />
* /LNI/HS - Hub Status<br />
<br />
== /LNI/NA - Node Address ==<br />
<br />
The /LNI/NA child packet specifies the node or network address of the sending node.<br />
<br />
=== Sending ===<br />
<br />
This child is required.<br />
<br />
=== Payload ===<br />
<br />
The physical network address of the sending node. See [[datatypes]] for more<br />
information.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /LNI/GU - GUID ==<br />
<br />
The /LNI/GU child packet specifies the globally unique identifier of the sending node.<br />
<br />
=== Sending ===<br />
<br />
This child is required.<br />
<br />
=== Payload ===<br />
<br />
The 16 byte globally unique node identifier of the sending node.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /LNI/V - Vendor Code ==<br />
<br />
The /LNI/V child packet specifies the vendor code of the software operating the<br />
sending node.<br />
<br />
=== Sending ===<br />
<br />
This child is optional.<br />
<br />
=== Payload ===<br />
<br />
A four byte vendor code.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /LNI/LS - Library Statistics ==<br />
<br />
The /LNI/LS packet provides information about the content library of the sending<br />
node.<br />
<br />
=== Sending ===<br />
<br />
This child is optional.<br />
<br />
=== Payload ===<br />
<br />
Two 32-bit integers representing the number of files in the local library, and the total<br />
KB in the local library respectively. If the sending node is a hub these statistics are<br />
combined with the known statistics from all connected leaves. The payload may grow<br />
beyond 8 bytes in the future.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.<br />
<br />
== /LNI/HS - Hub Status ==<br />
<br />
The /LNI/HS packet is included only if the sending node is a hub, and contains the<br />
status of the hub.<br />
<br />
=== Sending ===<br />
<br />
This child packet should only be sent by hub nodes. Leaf nodes should not transmit<br />
it, and if it is received from a leaf node, it should be ignored.<br />
<br />
=== Payload ===<br />
<br />
Two 16-bit integers representing the current leaf count and the maximum leaf count<br />
respectively. This packet may grow beyond 4 bytes in the future.<br />
<br />
=== Children ===<br />
<br />
This packet has no known children at the current time.</div>Dcathttps://g2.doxu.org/index.php?title=Datatypes&diff=2887Datatypes2009-01-01T04:21:16Z<p>Dcat: /* Strings */</p>
<hr />
<div>[[Packet_Structure|<< Packet Structure]] | [[Basic_Network_Maintenance|Basic Network Maintenance >>]] | [[Main_Page|Main Page]]<br />
<br />
<br />
== Introduction ==<br />
<br />
The format of a packet payload is defined by the packet type and can consist of any<br />
binary data; however, there are a number of conventions in place for serializing<br />
common datatypes.<br />
<br />
== Multi-Byte Integers ==<br />
<br />
Multi-byte integers are serialized in the byte-order of the topmost packet. Little endian<br />
is the default byte-order; however, big-endian byte order can be selected for<br />
those who want it.<br />
<br />
== Network/Node Addresses ==<br />
<br />
A network or node address consists of a physical address and a port number, and are<br />
of variable length, depending on the address family.<br />
In IPv4, a network/node address is six bytes long: 4 bytes for an IP address and 2<br />
bytes for a port number as follows:<br />
<br />
<pre><br />
<nowiki><br />
typedef struct<br />
{<br />
BYTE ip[4];<br />
SHORT port;<br />
} IPV4_ENDPOINT;<br />
</nowiki><br />
</pre><br />
<br />
Note that this is considered an array of 4 8-bit integers (bytes), followed by a 16-bit<br />
integer (short). Byte order does not affect bytes, but it will affect the 16-bit port<br />
number.<br />
<br />
IPv6 addresses are longer and are not yet defined within the scope of Gnutella2,<br />
however, applications should be aware that if the node address is not 6 bytes, it is of<br />
a different address family.<br />
<br />
== GUIDs ==<br />
<br />
Globally unique identifiers (GUIDs) are used to identify nodes on the network. GUIDs<br />
are serialized as an array of 16 bytes.<br />
<br />
== Strings ==<br />
<br />
Strings are encoded with UTF-8 encoding and serialized as a zero-terminated<br />
sequence of 8 bit integers.<br />
<br />
A zero character (0x00) marks the end of the string, however, if the string data meets<br />
the end of the packet (or child packet) payload, the terminator is not required. This<br />
means that packets whose payload consists of a string, do not need to include a zero<br />
string terminator and their payload length will be the byte length of the encoded<br />
string exactly.<br />
<br />
UTF-8 encoding is required for all strings present in the packet payload. This means<br />
that 7-bit characters may be passed as-is, while extended characters are encoded<br />
with multi-byte sequences.<br />
<br />
All applications must be able to parse UTF-8 encoded strings, however, it is up to the<br />
individual application whether to store the string in Unicode, or convert it to the<br />
local code page for processing. In situations where a packet must be processed ''and''<br />
forwarded, the original packet must be forwarded rather than a regenerated version.<br />
This ensures that both locally unsupported encodings and packet extensions are<br />
preserved.<br />
<br />
Applications should never send ANSI strings directly if they contain extended<br />
characters with the MSB set. These should be encoded with UTF-8. If this is not<br />
done, the decoding process may fail and the packet will be discarded or contain<br />
bogus information.</div>Dcathttps://g2.doxu.org/index.php?title=Main_Page&diff=2884Main Page2009-01-01T04:16:47Z<p>Dcat: </p>
<hr />
<div><table width=&quot;100%&quot; ><tr><br />
<td align=&quot;left&quot;><br />
== Gnutella2 Developer Network ==<br />
Welcome to the Gnutella2 Developer Network.<br />
The Gnutella2 Developer Network (or G2DN) is a convenient central location for discussing, developing and documenting all aspects of Gnutella2. Like the Gnutella2 platform itself, this website is designed to evolve through community support and participation. Everyone is free to contribute discussion, proposal documents, developer resources or any other relevant material.<br />
<br />
<p>Although the G2DN is primarily geared toward developers and technical enthusiasts, users of Gnutella2-enabled software are also welcome to participate. Those who are new to Gnutella2 may wish to check out some of the [[Gnutella2-powered software]].</p></td><br />
<td width=&quot;20px&quot;></td><br />
<td align=&quot;right&quot; valign=&quot;bottom&quot; width=&quot;200px&quot;><br />
__TOC__<br />
</td></tr><br />
</table><br />
<br />
==News==<br />
* ''29th, March, 2007'' - '''[[TCP Stream Connection and Handshaking]] specification updated.'''<br />
* ''10th, April, 2005'' - '''Gnutella2 website re-opened'''<br />
<p>After server problems we're proud to re-launch the Gnutella2 website. It is now based on MediaWiki (like Wikipedia). The forums are gone, but we now have a [[mailing list]] for Gnutella2 related discussion. Feel free to contribute to the wiki after reading [[Gnutella2:Community Portal]] to learn about editing policy.</p><br />
<br />
==Mailing List==<br />
To allow communication among developers of Gnutella2 clients, there exists a [[mailing list]]. You can access it too via regular news reader at the news-to-mail gateway [http://www.gmane.org Gmane] (list page [http://dir.gmane.org/gmane.network.gnutella2.devel here]).<br />
<br />
== The Gnutella 2 Network==<br />
# [[Gnutella2|What is Gnutella2]]<br />
# [[Gnutella2 Standard]]<br />
# [[Network Architecture]]<br />
# [[Node Types and Responsibilities]]<br />
# [[Background|Background / Archive]]<br />
<br />
== The Protocol==<br />
# [[TCP Stream Connection and Handshaking]]<br />
# [[UDP Transceiver]]<br />
# [[Packet Structure]]<br />
# [[Datatypes]]<br />
# [[Basic Network Maintenance]]<br />
# [[Known Hub Cache and Hub Cluster Cache]]<br />
# [[Node Route Cache and Addressed Packet Forwarding]]<br />
# [[Query Hash Tables]]<br />
# [[Object Search Mechanism]]<br />
# [[Search Security]]<br />
# [[Search Description]]<br />
# [[Search Acknowledgement]]<br />
# [[Search Results]]<br />
# [[Simple Query Language and Metadata]]<br />
# [[Server for Uploading]]<br />
# [[Client for Downloading]]<br />
# [[User Profile Challenge and Delivery]]<br />
<br />
== Root Packets ==<br />
{{Root packet list}}<br />
<br />
== Proposals==<br />
* [[Active Source Exchange]] (ASE) by Kevin O'Toole<br />
* [[Source Exchange (x-G2alt)]]<br />
<br />
== Additional Information==<br />
Since Gnutella2 somehow evolved from the original Gnutella protocol you might find the following links useful:<br />
* [http://www.the-gdf.org The GDF Wiki]<br />
* [http://groups.yahoo.com/group/the_gdf/ Gnutella Developer forum]<br />
* [http://rfc-gnutella.sourceforge.net/ RFC Gnutella]<br />
* [http://draketo.de/inhalt/krude-ideen/gnufu_en.html Gnutella for Users (GnuFU)]<br />
* [http://crawler.trillinux.org/ Gnutella2 Crawler]</div>Dcathttps://g2.doxu.org/index.php?title=Template:Root_packet_list&diff=2917Template:Root packet list2009-01-01T04:16:12Z<p>Dcat: Template:Root packets moved to Template:Root packet list: more appropriate name</p>
<hr />
<div>* /[[CRAWLA]] - Crawler Answer<br />
* /[[CRAWLR]] - Crawler Request<br />
* /[[HAW]] - Hub Advertisement Walker<br />
* /[[KHL]] - Known Hub List<br />
* /[[LNI]] - Local Node Information<br />
* /[[PI]] - Ping<br />
* /[[PO]] - Pong<br />
* /[[PUSH]] - Push<br />
* /[[QKA]] - Query Key Acknowledgement<br />
* /[[QKR]] - Query Key Request<br />
* /[[Q2]] - Gnutella2 Query<br />
* /[[QA]] - Query Acknowledgement<br />
* /[[QH2]] - Gnutella2 Query Hit<br />
* /[[QHT]] - Query Hash Table<br />
* /[[UPROC]] - User Profile Challenge<br />
* /[[UPROD]] - User Profile Delivery</div>Dcathttps://g2.doxu.org/index.php?title=Gnutella2:Community_Portal&diff=2920Gnutella2:Community Portal2009-01-01T04:14:33Z<p>Dcat: /* Packets Policy */</p>
<hr />
<div>== General Policy ==<br />
<br />
This wiki is for maintaining the '''official''' Gnutella2 specification and as such requires special rules on how changes will be accepted in to the specification. The Talk pages and the [[mailing list]] will be the two primary ways of discussing changes. There is no definitive list of people who have to approve or a voting procedure for changes to the specification. For now it is an informal process which should be arrived at naturally and diplomatically. Changes that aren't backward compatible should be avoided at all costs. It is very unlikely that anyone will agree to such changes anyway.<br />
<br />
== Spelling and Grammar Policy ==<br />
<br />
Fixing spelling and grammar do not require a consensus. Only if the specification is being changed it will require a consensus. This is so that the wiki will be as readable as possible for all developers.<br />
<br />
== Packets Policy ==<br />
<br />
{{Packets}}<br />
<br />
The packets pages can be handled slightly differently. Extensions to them that a vendor has made and is using in the wild can be added to the respective packet page in the wiki. These extensions should be clearly marked with which vendors support them so that other developers will know whether they are required and who to expect them from.</div>Dcathttps://g2.doxu.org/index.php?title=UPROD&diff=2926UPROD2009-01-01T04:12:29Z<p>Dcat: </p>
<hr />
<div>{{Packets}}<br />
<br />
= /UPROD - User Profile Delivery =<br />
<br />
Delivers a user profile.<br />
<br />
== Sending ==<br />
<br />
Send this packet in response to a user profile challenge (/[[UPROC]])<br />
<br />
== Payload ==<br />
<br />
No payload.<br />
<br />
== Children ==<br />
<br />
* /UPROD/XML: A single child containing the XML data string.<br />
<br />
== /UPROD/XML - User Profile Delivery - XML payload ==<br />
<br />
Delivers a user profile.<br />
<br />
== Sending ==<br />
<br />
Send this packet in response to a user profile challenge (/[[UPROC]])<br />
<br />
== Payload ==<br />
<br />
An XML string, adhering to the Gnutella user profile schema.<br />
<br />
== Children ==<br />
<br />
This packet has no known children at the current time.</div>Dcathttps://g2.doxu.org/index.php?title=UPROC&diff=2913UPROC2009-01-01T04:12:17Z<p>Dcat: </p>
<hr />
<div>{{Packets}}<br />
<br />
= /UPROC - User Profile Challenge =<br />
<br />
Requests the user profile of a node.<br />
<br />
== Sending ==<br />
<br />
Send this packet to request the user profile of another node.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving this packet, respond with a user profile if one is available.<br />
<br />
== Payload ==<br />
<br />
No payload is defined at the current time.<br />
<br />
== Children ==<br />
<br />
This packet has no known children at the current time.</div>Dcathttps://g2.doxu.org/index.php?title=QHT&diff=2899QHT2009-01-01T04:12:05Z<p>Dcat: </p>
<hr />
<div>{{Packets}}<br />
<br />
= /QHT - Query Hash Table =<br />
<br />
The query hash table update packet supplies an update to the query hash table for<br />
the sending node. It supports two operations: clear existing table, and patch existing<br />
table with new data.<br />
<br />
== Sending ==<br />
<br />
The /QHT packet should be sent when the local or aggregate query hash table has<br />
changed.<br />
<br />
== Receiving ==<br />
<br />
Upon receiving a /QHT packet, the local hub should patch the query hash table for<br />
the connection on which the packet was received. If the connection is to a leaf node,<br />
the hub should update its aggregate table and queue a propagation of that table to<br />
neighbouring hubs in the cluster.<br />
<br />
== Payload ==<br />
<br />
The payload is of the same format as Gnutella1's "query routing protocol" message:<br />
The first byte is a command byte, 0x00 indicates a reset command, while 0x01<br />
indicates a patch command.<br />
<br />
=== Reset ===<br />
<br />
<pre><br />
<nowiki><br />
typedef struct<br />
{<br />
BYTE command; // = 0 (reset)<br />
LONG table_size_in_entries; // = 2^(size_in_bits)<br />
BYTE infinity; // = 1<br />
} QHT_RESET;<br />
</nowiki><br />
</pre><br />
<br />
A reset packet establishes a new table and clears it (replacing any existing table). In<br />
Gnutella2 the value of infinity must always be 1. Note that the table size is measured<br />
in entries rather than bits, so it is equal to 2<sup>N</sup> where N is the number of bits.<br />
<br />
=== Patch ===<br />
<br />
<pre><br />
<nowiki><br />
typedef struct<br />
{<br />
BYTE command; // = 1 (patch)<br />
BYTE fragment_no; // = number of this patch fragment<br />
BYTE fragment_count; // = number of patch fragments<br />
BYTE compression; // = 0 for none, = 1 for deflate<br />
BYTE bits; // = 1 for Gnutella2<br />
(data)<br />
} QHT_PATCH;<br />
</nowiki><br />
</pre><br />
<br />
Patches may be fragmented into more than one packet if necessary, in which case<br />
the fragment number and count fields are used to reassemble the patch. Note that<br />
fragments must be sent in correct order.<br />
<br />
Patches may be compressed - in this case the whole patch is compressed, rather<br />
than compressing fragments individually. One compression type is defined: deflate<br />
compression.<br />
<br />
Gnutella2 always uses tables with 1 bit per entry, so the bit count must be 1.<br />
<br />
The patch data in uncompressed form is of (2<sup>N</sup>)/8 bytes length, where N is the<br />
table bit size. This is exactly the same size as the table which is being patched. To<br />
apply the patch, simply XOR the existing table with the patch data. In other words,<br />
whenever there is a 1 bit, the bit in the existing table is toggled.</div>Dcat