change to ping based RTO
parent
c09b312b05
commit
b051b3a81d
|
@ -148,7 +148,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
/// milliseconds or longer will be resent</summary>
|
/// milliseconds or longer will be resent</summary>
|
||||||
/// <remarks>Calculated from <seealso cref="SRTT"/> and <seealso cref="RTTVAR"/> using the
|
/// <remarks>Calculated from <seealso cref="SRTT"/> and <seealso cref="RTTVAR"/> using the
|
||||||
/// guidelines in RFC 2988</remarks>
|
/// guidelines in RFC 2988</remarks>
|
||||||
public int RTO;
|
public int m_RTO;
|
||||||
/// <summary>Number of bytes received since the last acknowledgement was sent out. This is used
|
/// <summary>Number of bytes received since the last acknowledgement was sent out. This is used
|
||||||
/// to loosely follow the TCP delayed ACK algorithm in RFC 1122 (4.2.3.2)</summary>
|
/// to loosely follow the TCP delayed ACK algorithm in RFC 1122 (4.2.3.2)</summary>
|
||||||
public int BytesSinceLastACK;
|
public int BytesSinceLastACK;
|
||||||
|
@ -190,7 +190,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
private byte[] m_packedThrottles;
|
private byte[] m_packedThrottles;
|
||||||
|
|
||||||
private int m_defaultRTO = 1000; // 1sec is the recommendation in the RFC
|
private int m_defaultRTO = 1000; // 1sec is the recommendation in the RFC
|
||||||
private int m_maxRTO = 60000;
|
private int m_maxRTO = 10000;
|
||||||
public bool m_deliverPackets = true;
|
public bool m_deliverPackets = true;
|
||||||
|
|
||||||
private float m_burstTime;
|
private float m_burstTime;
|
||||||
|
@ -264,7 +264,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
}
|
}
|
||||||
|
|
||||||
// Default the retransmission timeout to one second
|
// Default the retransmission timeout to one second
|
||||||
RTO = m_defaultRTO;
|
m_RTO = m_defaultRTO;
|
||||||
|
|
||||||
// Initialize this to a sane value to prevent early disconnects
|
// Initialize this to a sane value to prevent early disconnects
|
||||||
TickLastPacketReceived = Environment.TickCount & Int32.MaxValue;
|
TickLastPacketReceived = Environment.TickCount & Int32.MaxValue;
|
||||||
|
@ -719,63 +719,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Called when an ACK packet is received and a round-trip time for a
|
/// Called when we get a ping update
|
||||||
/// packet is calculated. This is used to calculate the smoothed
|
|
||||||
/// round-trip time, round trip time variance, and finally the
|
|
||||||
/// retransmission timeout
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="r">Round-trip time of a single packet and its
|
/// <param name="r"> ping time in ms
|
||||||
/// acknowledgement</param>
|
/// acknowledgement</param>
|
||||||
public void UpdateRoundTrip(float r)
|
public void UpdateRoundTrip(int p)
|
||||||
{
|
{
|
||||||
return;
|
p *= 5;
|
||||||
/*
|
if( p> m_maxRTO)
|
||||||
const float ALPHA = 0.125f;
|
p = m_maxRTO;
|
||||||
const float BETA = 0.25f;
|
else if(p < m_defaultRTO)
|
||||||
const float K = 4.0f;
|
p = m_defaultRTO;
|
||||||
|
|
||||||
if (RTTVAR == 0.0f)
|
m_RTO = p;
|
||||||
{
|
|
||||||
// First RTT measurement
|
|
||||||
SRTT = r;
|
|
||||||
RTTVAR = r * 0.5f;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Subsequence RTT measurement
|
|
||||||
RTTVAR = (1.0f - BETA) * RTTVAR + BETA * Math.Abs(SRTT - r);
|
|
||||||
SRTT = (1.0f - ALPHA) * SRTT + ALPHA * r;
|
|
||||||
}
|
|
||||||
|
|
||||||
int rto = (int)(SRTT + Math.Max(m_udpServer.TickCountResolution, K * RTTVAR));
|
|
||||||
|
|
||||||
// Clamp the retransmission timeout to manageable values
|
|
||||||
rto = Utils.Clamp(rto, m_defaultRTO, m_maxRTO);
|
|
||||||
|
|
||||||
RTO = rto;
|
|
||||||
|
|
||||||
//if (RTO != rto)
|
|
||||||
// m_log.Debug("[LLUDPCLIENT]: Setting RTO to " + RTO + "ms from " + rto + "ms with an RTTVAR of " +
|
|
||||||
//RTTVAR + " based on new RTT of " + r + "ms");
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Exponential backoff of the retransmission timeout, per section 5.5
|
|
||||||
/// of RFC 2988
|
|
||||||
/// </summary>
|
|
||||||
public void BackoffRTO()
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
// Reset SRTT and RTTVAR, we assume they are bogus since things
|
|
||||||
// didn't work out and we're backing off the timeout
|
|
||||||
/*
|
|
||||||
SRTT = 0.0f;
|
|
||||||
RTTVAR = 0.0f;
|
|
||||||
|
|
||||||
// Double the retransmission timeout
|
|
||||||
RTO = Math.Min(RTO * 2, m_maxRTO);
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const double MIN_CALLBACK_MS = 20.0;
|
const double MIN_CALLBACK_MS = 20.0;
|
||||||
|
|
|
@ -1120,13 +1120,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get a list of all of the packets that have been sitting unacked longer than udpClient.RTO
|
// Get a list of all of the packets that have been sitting unacked longer than udpClient.RTO
|
||||||
List<OutgoingPacket> expiredPackets = udpClient.NeedAcks.GetExpiredPackets(udpClient.RTO);
|
List<OutgoingPacket> expiredPackets = udpClient.NeedAcks.GetExpiredPackets(udpClient.m_RTO);
|
||||||
|
|
||||||
if (expiredPackets != null)
|
if (expiredPackets != null)
|
||||||
{
|
{
|
||||||
//m_log.Debug("[LLUDPSERVER]: Handling " + expiredPackets.Count + " packets to " + udpClient.AgentID + ", RTO=" + udpClient.RTO);
|
|
||||||
// Exponential backoff of the retransmission timeout
|
|
||||||
udpClient.BackoffRTO();
|
|
||||||
for (int i = 0; i < expiredPackets.Count; ++i)
|
for (int i = 0; i < expiredPackets.Count; ++i)
|
||||||
expiredPackets[i].UnackedMethod(expiredPackets[i]);
|
expiredPackets[i].UnackedMethod(expiredPackets[i]);
|
||||||
}
|
}
|
||||||
|
@ -1515,10 +1512,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
else if (packet.Type == PacketType.CompletePingCheck)
|
else if (packet.Type == PacketType.CompletePingCheck)
|
||||||
{
|
{
|
||||||
double t = Util.GetTimeStampMS() - udpClient.m_lastStartpingTimeMS;
|
double t = Util.GetTimeStampMS() - udpClient.m_lastStartpingTimeMS;
|
||||||
double c = udpClient.m_pingMS;
|
double c = 0.8 * udpClient.m_pingMS;
|
||||||
c = 800 * c + 200 * t;
|
c += 0.2 * t;
|
||||||
c /= 1000;
|
int p = (int)c;
|
||||||
udpClient.m_pingMS = (int)c;
|
udpClient.m_pingMS = p;
|
||||||
|
udpClient.UpdateRoundTrip(p);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -215,14 +215,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
// As with other network applications, assume that an acknowledged packet is an
|
// As with other network applications, assume that an acknowledged packet is an
|
||||||
// indication that the network can handle a little more load, speed up the transmission
|
// indication that the network can handle a little more load, speed up the transmission
|
||||||
ackedPacket.Client.FlowThrottle.AcknowledgePackets(1);
|
ackedPacket.Client.FlowThrottle.AcknowledgePackets(1);
|
||||||
|
|
||||||
if (!pendingAcknowledgement.FromResend)
|
|
||||||
{
|
|
||||||
// Calculate the round-trip time for this packet and its ACK
|
|
||||||
int rtt = pendingAcknowledgement.RemoveTime - ackedPacket.TickCount;
|
|
||||||
if (rtt > 0)
|
|
||||||
ackedPacket.Client.UpdateRoundTrip(rtt);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue