mirror of
https://github.com/oxen-io/lokinet.git
synced 2024-11-05 21:20:38 +00:00
69 lines
2.4 KiB
Markdown
69 lines
2.4 KiB
Markdown
|
# libutp - The uTorrent Transport Protocol library.
|
||
|
Copyright (c) 2010 BitTorrent, Inc.
|
||
|
|
||
|
uTP is a TCP-like implementation of [LEDBAT][ledbat] documented as a BitTorrent
|
||
|
extension in [BEP-29][bep29]. uTP provides reliable, ordered delivery
|
||
|
while maintaining minimum extra delay. It is implemented on top of UDP to be
|
||
|
cross-platform and functional today. As a result, uTP is the primary transport
|
||
|
for uTorrent peer-to-peer connections.
|
||
|
|
||
|
uTP is written in C++, but the external interface is strictly C (ANSI C89).
|
||
|
|
||
|
## The Interface
|
||
|
|
||
|
The uTP socket interface is a bit different from the Berkeley socket API to
|
||
|
avoid the need for our own select() implementation, and to make it easier to
|
||
|
write event-based code with minimal buffering.
|
||
|
|
||
|
When you create a uTP socket, you register a set of callbacks. Most notably, the
|
||
|
on_read callback is a reactive callback which occurs when bytes arrive off the
|
||
|
network. The write side of the socket is proactive, and you call UTP_Write to
|
||
|
indicate the number of bytes you wish to write. As packets are created, the
|
||
|
on_write callback is called for each packet, so you can fill the buffers with
|
||
|
data.
|
||
|
|
||
|
The libutp interface is not thread-safe. It was designed for use in a
|
||
|
single-threaded asyncronous context, although with proper synchronization
|
||
|
it may be used from a multi-threaded environment as well.
|
||
|
|
||
|
See utp.h for more details and other API documentation.
|
||
|
|
||
|
## Example
|
||
|
|
||
|
See ucat.c. Build with:
|
||
|
|
||
|
make ucat
|
||
|
|
||
|
## Building
|
||
|
|
||
|
uTP has been known to build on Windows with MSVC and on linux and OS X with gcc.
|
||
|
On Windows, use the MSVC project files (utp.sln, and friends). On other platforms,
|
||
|
building the shared library is as simple as:
|
||
|
|
||
|
make
|
||
|
|
||
|
To build one of the examples, which will statically link in everything it needs
|
||
|
from libutp:
|
||
|
|
||
|
cd utp_test && make
|
||
|
|
||
|
## Packaging and API
|
||
|
|
||
|
The libutp API is considered unstable, and probably always will be. We encourage
|
||
|
you to test with the version of libutp you have, and be mindful when upgrading.
|
||
|
For this reason, it is probably also a good idea to bundle libutp with your
|
||
|
application.
|
||
|
|
||
|
## License
|
||
|
|
||
|
libutp is released under the [MIT][lic] license.
|
||
|
|
||
|
## Related Work
|
||
|
|
||
|
Research and analysis of congestion control mechanisms can be found [here.][survey]
|
||
|
|
||
|
[ledbat]: http://datatracker.ietf.org/wg/ledbat/charter/
|
||
|
[bep29]: http://www.bittorrent.org/beps/bep_0029.html
|
||
|
[lic]: http://www.opensource.org/licenses/mit-license.php
|
||
|
[survey]: http://datatracker.ietf.org/doc/draft-ietf-ledbat-survey/
|