PHP code example of tourze / quic-recovery

1. Go to this page and download the library: Download tourze/quic-recovery library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

tourze / quic-recovery example snippets




use Tourze\QUIC\Recovery\Recovery;

// Create recovery instance with initial RTT of 333ms
$recovery = new Recovery(333.0);

// When sending a packet
$recovery->onPacketSent(
    packetNumber: 1,
    packet: $packet,
    sentTime: microtime(true) * 1000,
    ackEliciting: true
);

// When receiving a packet
$recovery->onPacketReceived(
    packetNumber: 1,
    receiveTime: microtime(true) * 1000,
    ackEliciting: true
);

// Check if should send ACK immediately
if ($recovery->shouldSendAckImmediately(microtime(true) * 1000)) {
    $ackFrame = $recovery->generateAckFrame(microtime(true) * 1000);
    // Send ACK frame...
}

use Tourze\QUIC\Recovery\Recovery;

// Create recovery mechanism with initial RTT of 333ms
$recovery = new Recovery(333.0);

use Tourze\QUIC\Packets\Packet;

// Record sent packet
$recovery->onPacketSent(
    packetNumber: 1,
    packet: $packet,
    sentTime: microtime(true) * 1000,
    ackEliciting: true
);

// Record received packet
$recovery->onPacketReceived(
    packetNumber: 1,
    receiveTime: microtime(true) * 1000,
    ackEliciting: true
);

// Check if should send ACK immediately
if ($recovery->shouldSendAckImmediately(microtime(true) * 1000)) {
    $ackFrame = $recovery->generateAckFrame(microtime(true) * 1000);
    // Send ACK frame...
}

use Tourze\QUIC\Frames\AckFrame;

// When receiving ACK frame
$recovery->onAckReceived($ackFrame, microtime(true) * 1000);

$currentTime = microtime(true) * 1000;
$actions = $recovery->onTimeout($currentTime);

foreach ($actions as $action) {
    switch ($action['type']) {
        case 'retransmit_lost':
            // Retransmit lost packets
            foreach ($action['packets'] as $packetNumber) {
                // Retransmission logic...
            }
            break;
            
        case 'pto_probe':
            // Send PTO probe packets
            foreach ($action['packets'] as $probeInfo) {
                // Probe logic...
            }
            break;
            
        case 'send_ack':
            // Send ACK frame
            $ackFrame = $action['frame'];
            // Send logic...
            break;
    }
}

$stats = $recovery->getStats();

echo "Current RTT: " . $recovery->getCurrentRtt() . "ms\n";
echo "Retransmission Rate: " . ($recovery->getRetransmissionRate() * 100) . "%\n";
echo "Connection Healthy: " . ($recovery->isConnectionHealthy() ? 'Yes' : 'No') . "\n";
echo "Congestion Advice: " . $recovery->getCongestionAdvice() . "\n";

// Get RTT estimator
$rttEstimator = $recovery->getRttEstimator();
$smoothedRtt = $rttEstimator->getSmoothedRtt();

// Get packet tracker
$packetTracker = $recovery->getPacketTracker();
$unackedCount = $packetTracker->getAckElicitingOutstanding();

// Get loss detection
$lossDetection = $recovery->getLossDetection();
$ptoCount = $lossDetection->getPtoCount();

// Periodic cleanup of expired records (recommended every minute)
$recovery->cleanup(microtime(true) * 1000);

// Custom initial RTT
$recovery = new Recovery(500.0); // 500ms initial RTT

// Reset recovery state
$recovery->reset();