twisterp2pblockchainnetworkbittorrentmicrobloggingipv6social-networkdhtdecentralizedtwisterarmyp2p-networktwister-servertwister-ipv6twister-core
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
5.8 KiB
161 lines
5.8 KiB
11 years ago
|
==================
|
||
|
libtorrent hacking
|
||
|
==================
|
||
|
|
||
|
:Author: Arvid Norberg, arvid@rasterbar.com
|
||
|
:Version: 1.0.0
|
||
|
|
||
|
.. contents:: Table of contents
|
||
|
:depth: 2
|
||
|
:backlinks: none
|
||
|
|
||
|
This describe some of the internals of libtorrent. If you're looking for
|
||
|
something to contribute, please take a look at the `todo list`_.
|
||
|
|
||
|
.. _`todo list`: todo.html
|
||
|
|
||
|
terminology
|
||
|
===========
|
||
|
|
||
|
This section describes some of the terminology used throughout the
|
||
|
libtorrent source. Having a good understanding of some of these keywords
|
||
|
helps understanding what's going on.
|
||
|
|
||
|
A *piece* is a part of the data of a torrent that has a SHA-1 hash in
|
||
|
the .torrent file. Pieces are almost always a power of two in size, but not
|
||
|
necessarily. Each piece is plit up in *blocks*, which is a 16 kiB. A block
|
||
|
never spans two pieces. If a piece is smaller than 16 kiB or not divisible
|
||
|
by 16 kiB, there are blocks smaller than that.
|
||
|
|
||
|
16 kiB is a de-facto standard of the largest transfer unit in the bittorrent
|
||
|
protocol. Clients typically reject any request for larger pieces than this.
|
||
|
|
||
|
The *piece picker* is the part of a bittorrent client that is responsible for
|
||
|
the logic to determine which requests to send to peers. It doesn't actually
|
||
|
pick full pieces, but blocks (from pieces).
|
||
|
|
||
|
The file layout of a torrent is represented by *file storage* objects. This
|
||
|
class contains a list of all files in the torrent (in a well defined order),
|
||
|
the size of the pieces and implicitly the total size of the whole torrent and
|
||
|
number of pieces. The file storage determines the mapping from *pieces*
|
||
|
to *files*. This representation may be quite complex in order to keep it extremely
|
||
|
compact. This is useful to load very large torrents without exploding in memory
|
||
|
usage.
|
||
|
|
||
|
A *torrent* object represents all the state of swarm download. This includes
|
||
|
a piece picker, a list of peer connections, file storage (torrent file). One
|
||
|
important distiction is between a connected peer (*peer_connection*) and a peer
|
||
|
we just know about, and may have been connected to, and may connect to in the
|
||
|
future (*policy::peer*). The list of (not connected) peers may grow very large
|
||
|
if not limited (through tracker responses, DHT and peer exchange). This list
|
||
|
is typically limited to a few thousand peers.
|
||
|
|
||
|
The *policy* in libtorrent is somewhat poorly named. It was initially intended
|
||
|
to be a customization point where a client could define peer selection behavior
|
||
|
and unchoke logic. It didn't end up being though, and a more accurate name would
|
||
|
be peer_list. It really just maintains a potentially large list of known peers
|
||
|
for a swarm (not necessarily connected).
|
||
|
|
||
|
structure
|
||
|
=========
|
||
|
|
||
|
This is the high level structure of libtorrent. Bold types are part of the public
|
||
|
interface:
|
||
|
|
||
|
.. parsed-literal::
|
||
|
|
||
|
+=========+ pimpl +-------------------+
|
||
|
| **session** | ---------> | aux::session_impl |
|
||
|
+=========+ +-------------------+
|
||
|
m_torrents[] | |
|
||
|
+================+ | |
|
||
|
| **torrent_handle** | ------+ | |
|
||
|
+================+ | | |
|
||
|
| | | m_connections[]
|
||
|
| | |
|
||
|
| | +---------------------+
|
||
|
m_picker v v |
|
||
|
+--------------+ +---------+---------+-- . . |
|
||
|
| piece_picker | <--+-| torrent | torrent | to |
|
||
|
+--------------+ | +---------+---------+-- . . |
|
||
|
m_torrent_file | | m_connections[] |
|
||
|
+==============+ | | |
|
||
|
| **torrent_info** | <--+ v v
|
||
|
+==============+ | +-----------------+-----------------+-- . .
|
||
|
m_policy | | peer_connection | peer_connection | pe
|
||
|
+--------+ | +-----------------+-----------------+-- . .
|
||
|
| policy | <--------+ | | m_socket
|
||
|
+--------+ | |
|
||
|
| m_peers[] | v
|
||
|
| | +-----------------------+
|
||
|
| | | socket_type (variant) |
|
||
|
v | +-----------------------+
|
||
|
+--------------+ |
|
||
|
| policy::peer | |
|
||
|
+--------------+ |
|
||
|
| policy::peer | |
|
||
|
+--------------+ m_peer_info|
|
||
|
| policy::peer | <----------+
|
||
|
+--------------+
|
||
|
. .
|
||
|
+ - - - - - - -+
|
||
|
|
||
|
session_impl
|
||
|
------------
|
||
|
|
||
|
This is the session state object, containing all session global information, such as:
|
||
|
|
||
|
* the list of all torrents ``m_torrent``.
|
||
|
* the list of all peer connections ``m_connections``.
|
||
|
* the global rate limits ``m_settings``.
|
||
|
* the DHT state ``m_dht``.
|
||
|
* the port mapping state, ``m_upnp`` and ``m_natpmp``.
|
||
|
|
||
|
session
|
||
|
-------
|
||
|
|
||
|
This is the public interface to the session. It implements pimpl (pointer to implementation)
|
||
|
in order to hide the internal representation of the ``session_impl`` object from the user and
|
||
|
make binary compatibility simpler to maintain.
|
||
|
|
||
|
torrent_handle
|
||
|
--------------
|
||
|
|
||
|
This is the public interface to a ``torrent``. It holds a weak reference to the internal
|
||
|
``torrent`` object and manipulates it by sending messages to the network thread.
|
||
|
|
||
|
torrent
|
||
|
-------
|
||
|
|
||
|
peer_connection
|
||
|
---------------
|
||
|
|
||
|
policy
|
||
|
------
|
||
|
|
||
|
piece_picker
|
||
|
------------
|
||
|
|
||
|
torrent_info
|
||
|
------------
|
||
|
|
||
|
threads
|
||
|
=======
|
||
|
|
||
|
libtorrent starts 2 or 3 threads.
|
||
|
|
||
|
* The first thread is the main thread that will sit
|
||
|
idle in a ``kqueue()`` or ``epoll`` call most of the time.
|
||
|
This thread runs the main loop that will send and receive
|
||
|
data on all connections.
|
||
|
|
||
|
* The second thread is the disk I/O thread. All disk read and write operations
|
||
|
are passed to this thread and messages are passed back to the main thread when
|
||
|
the operation completes. The disk thread also verifies the piece hashes.
|
||
|
|
||
|
* The third and forth threads are spawned by asio on systems that don't support
|
||
|
non-blocking host name resolution to simulate non-blocking getaddrinfo().
|
||
|
|
||
|
|
||
|
|