From 6b9278fdd328536569b2092ebe178fefb3b9cf87 Mon Sep 17 00:00:00 2001 From: orignal Date: Tue, 22 Jul 2025 18:41:24 -0400 Subject: [PATCH] request ack more often --- libi2pd/Streaming.cpp | 26 +++++++++++++++++++------- libi2pd/Streaming.h | 2 +- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/libi2pd/Streaming.cpp b/libi2pd/Streaming.cpp index 2a28f955..1b369516 100644 --- a/libi2pd/Streaming.cpp +++ b/libi2pd/Streaming.cpp @@ -96,7 +96,7 @@ namespace stream m_WindowDropTargetSize (0), m_WindowIncCounter (0), m_RTO (INITIAL_RTO), m_AckDelay (local.GetOwner ()->GetStreamingAckDelay ()), m_PrevRTTSample (INITIAL_RTT), m_Jitter (0), m_MinPacingTime (0), - m_PacingTime (INITIAL_PACING_TIME), m_PacingTimeRem (0), m_LastSendTime (0), m_LastACKRecieveTime (0), m_ACKRecieveInterval (local.GetOwner ()->GetStreamingAckDelay ()), m_RemoteLeaseChangeTime (0), m_LastWindowIncTime (0), + m_PacingTime (INITIAL_PACING_TIME), m_PacingTimeRem (0), m_LastSendTime (0), m_LastACKRecieveTime (0), m_ACKRecieveInterval (local.GetOwner ()->GetStreamingAckDelay ()), m_RemoteLeaseChangeTime (0), m_LastWindowIncTime (0), m_LastACKRequestTime (0), m_LastACKSendTime (0), m_PacketACKInterval (1), m_PacketACKIntervalRem (0), // for limit inbound speed m_NumResendAttempts (0), m_NumPacketsToSend (0), m_JitterAccum (0), m_JitterDiv (1), m_MTU (STREAMING_MTU) { @@ -123,7 +123,7 @@ namespace stream m_WindowSize (INITIAL_WINDOW_SIZE), m_MaxWindowSize (MAX_WINDOW_SIZE), m_LastWindowDropSize (0), m_WindowDropTargetSize (0), m_WindowIncCounter (0), m_RTO (INITIAL_RTO), m_AckDelay (local.GetOwner ()->GetStreamingAckDelay ()), m_PrevRTTSample (INITIAL_RTT), m_Jitter (0), m_MinPacingTime (0), - m_PacingTime (INITIAL_PACING_TIME), m_PacingTimeRem (0), m_LastSendTime (0), m_LastACKRecieveTime (0), m_ACKRecieveInterval (local.GetOwner ()->GetStreamingAckDelay ()), m_RemoteLeaseChangeTime (0), m_LastWindowIncTime (0), + m_PacingTime (INITIAL_PACING_TIME), m_PacingTimeRem (0), m_LastSendTime (0), m_LastACKRecieveTime (0), m_ACKRecieveInterval (local.GetOwner ()->GetStreamingAckDelay ()), m_RemoteLeaseChangeTime (0), m_LastWindowIncTime (0), m_LastACKRequestTime (0), m_LastACKSendTime (0), m_PacketACKInterval (1), m_PacketACKIntervalRem (0), // for limit inbound speed m_NumResendAttempts (0), m_NumPacketsToSend (0), m_JitterAccum (0), m_JitterDiv (1), m_MTU (STREAMING_MTU) { @@ -433,7 +433,7 @@ namespace stream if (delayRequested == DELAY_CHOKING_JAVA) // java detected { LogPrint (eLogDebug, "Streaming: limit window size for java client"); - m_MaxWindowSize = 32; + m_MaxWindowSize = 64; m_IsJavaClient = true; if (m_RoutingSession) m_RoutingSession->SetIsWithJava (true); } @@ -965,9 +965,21 @@ namespace stream else { // follow on packet - htobuf16 (packet + size, 0); - size += 2; // flags - htobuf16 (packet + size, 0); // no options + if (m_IsJavaClient && (!m_LastACKRequestTime || ts - m_LastACKRequestTime > m_MinRTT / 10)) + { + m_LastACKRequestTime = ts; + htobe16buf (packet + size, PACKET_FLAG_DELAY_REQUESTED); + size += 2; // flags + htobe16buf (packet + size, 2); // 2 bytes delay interval + htobe16buf (packet + size + 2, 0); // set immediate ack interval + size += 2; + } + else + { + htobuf16 (packet + size, 0); + size += 2; // flags + htobuf16 (packet + size, 0); // no options + } size += 2; // options size size += m_SendBuffer.Get(packet + size, m_MTU); // payload } @@ -1326,7 +1338,7 @@ namespace stream m_RTT = routingPath->rtt; } m_IsJavaClient = m_RoutingSession->IsWithJava (); - if (m_IsJavaClient) m_MaxWindowSize = 32; + if (m_IsJavaClient) m_MaxWindowSize = 64; } auto ts = i2p::util::GetMillisecondsSinceEpoch (); diff --git a/libi2pd/Streaming.h b/libi2pd/Streaming.h index 91cb59f7..b33102e4 100644 --- a/libi2pd/Streaming.h +++ b/libi2pd/Streaming.h @@ -311,7 +311,7 @@ namespace stream int m_WindowIncCounter, m_RTO, m_AckDelay, m_PrevRTTSample; double m_Jitter; uint64_t m_MinPacingTime, m_PacingTime, m_PacingTimeRem, // microseconds - m_LastSendTime, m_LastACKRecieveTime, m_ACKRecieveInterval, m_RemoteLeaseChangeTime, m_LastWindowIncTime; // milliseconds + m_LastSendTime, m_LastACKRecieveTime, m_ACKRecieveInterval, m_RemoteLeaseChangeTime, m_LastWindowIncTime, m_LastACKRequestTime; // milliseconds uint64_t m_LastACKSendTime, m_PacketACKInterval, m_PacketACKIntervalRem; // for limit inbound speed int m_NumResendAttempts, m_NumPacketsToSend; uint64_t m_JitterAccum;