NAME
Net::uTP - Micro Transport Protocol (μTP, BEP 29)
SYNOPSIS
use Net::uTP;
my $utp = Net::uTP->new(
conn_id_send => 1234,
conn_id_recv => 1235
);
# Initiate connection
my $syn_pkt = $utp->connect( );
# Handle incoming UDP data
my $reply = $utp->receive_packet( $raw_udp_payload );
# Send data (returns one or more μTP packets)
my $pkts = $utp->send_data( 'Hello World' );
# Periodically handle retransmissions
my $resends = $utp->tick( 0.1 );
DESCRIPTION
Net::uTP implements μTP, the Micro Transport Protocol (originally μTorrent transport protocol), a congestion-controlled UDP transport designed to prevent background traffic from "choking" other internet activity (like VoIP or gaming) on the same network.
While originally developed for BitTorrent, this module is general-purpose and can be used for any application requiring high-throughput, low-impact data transfer.
Key Mechanisms
LEDBAT Congestion Control: Uses one-way delay measurements to detect network congestion before packet loss occurs. It targets a specific queuing delay (100ms) and yields to other traffic.
Selective ACKs (SACK): Efficiently recovers from packet loss by acknowledging specific received packets out-of-order, reducing redundant retransmissions.
Out-of-Order Reassembly: Automatically buffers and re-sequences packets received out of order, delivering a contiguous stream to the application.
Fast Retransmit: Detects dropped packets via duplicate ACKs and resends them immediately.
METHODS
connect( )
Transitions to SYN_SENT state and returns the raw ST_SYN packet to be sent over UDP.
receive_packet( $data )
Processes an incoming raw μTP packet.
- Updates congestion windows and delay metrics.
- Emits
dataorconnectedevents. - Returns a
ST_STATE(ACK) packet if a response is required.
send_data( $payload )
Fragments the payload into 1400-byte μTP data packets and returns them. Data is only sent if within the current congestion window.
tick( $delta )
Handles timers for retransmissions. If a packet has not been ACKed within the current RTO (Retransmission TimeOut), it is resent.
state( )
Returns the current connection state: CLOSED, SYN_SENT, CONNECTED, etc.
on( $event, $callback )
Registers a handler for:
connected: Handshake successful.data: contiguous payload received.closed: Connection lost or reset.
AUTHOR
Sanko Robinson <sanko@cpan.org>
COPYRIGHT
Copyright (C) 2026 by Sanko Robinson.
This library is free software; you can redistribute it and/or modify it under the terms of the Artistic License 2.0.