BitTorrent Zeroconf Client Extension

Robin Perkins
Draft 1
14 April 2006
http://www.ether.net.au/~robin/bittorrent_zeroconf_ext.rtf

Purpose
This document aims to outline an extension for BitTorrent clients to allow them to find peers on a local-link network using the zeroconf service discovery system. It was written in the hope that clients could standardise the way in which they found peers on the local-link in order to maximize the functionality of the BitTorrent protocol.

Many networks today consist of computers that have a fast network connection (tens of megabits) to a local area network, in addition to a relatively slower (parts or a few megabits) connection to the wider internet. Such networks exist in places such as university colleges, defence barracks and community wifi networks.  If two hosts on the same local-link network wish to download the same torrent at the moment they only share packets across their slow internet connection. The BitTorrent Zeroconf Client Extension will allow automatic discovery of these peers to each other so that packets can be quickly transfered across the fast local network  as opposed to across their slow internet connections. Effectively the effort of  downloading the torrent  can now be distributed between the hosts on a local-link network.

Requirements
In order to facilitate the BitTorrent Zeroconf Client Extension each host is going to be required to run a zeroconf service discovery daemon. This is relatively trivial as there are many available for free but two particularly good zeroconf implementations are:
•  Apple's Bonjour (http://developer.apple.com/networking/bonjour/) for Mac OS X (included by default), Windows and POSIX systems
and
• Avahi available from (http://avahi.org) recommended for Linux and BSD clients and already available in many Linux and BSD distributions.

Method
Each host will be required to publish (via zeroconf) the service type _bittorrent._tcp. with the instance name as the torrent peer-id (in hex). Then publish a subservice that is the torrent info hash (in hex). The result will be something in the form of:

<peer-id>._<info-hash>._bittorrent._tcp. 
e.g.
4d336d342d312d2d343834616435313564343437._32f17bbf96bdc77de85bb91ff8d56f124e817c0a._bittorrent._tcp.

The above-mentioned zeroconf implementations provide good documentation for developers on how to do this. If the client uses the same peer-id for all torrents it has loaded, then for each additional torrent file, only the subservice needs to be added. If the client uses a different peer-id for each torrent then a _bittorrent._tcp. service will have to be  added for each torrent file with the respective subservice. This is also true if each torrent uses a different port.

Clients will need to browse for _<info-hash>._bittorrent._tcp in order to discover peers participating in the same torrent. Once again good documentation is provided on how to browse for zeroconf services in  the above implementations. Note: The current Macintosh standard bittorrent client does have a zeroconf implementation built in that publishes its services in the form of: 

_bittorrent-<info-hash>._tcp.  
i.e.
_bittorrent-32f17bbf96bdc77de85bb91ff8d56f124e817c0a._tcp.

However this does not comply with RFC 2782 as the service name needs to be 14 characters or less in addition to the fact that it is not a service type but in fact a service instance it is advertising. Clients may choose to also browse for these services for backwards compatibility purposes (minimal - only one client is known to do this) however they should not publish in this format.

Considerations
Clients should consider a couple of options when implementing the BitTorrent Zeroconf Client Extension specifically:
• an option to not advertise torrents via zeroconf
• an option not to upload limit local-link peers (or possibly have a separate rule).