-
Notifications
You must be signed in to change notification settings - Fork 718
Incorrect SRTT calculation when SRTT >= 8 and actual RTT < 8 ms #161
Copy link
Copy link
Open
Description
The SRTT and RTT variance logic (shown below) does not properly handle the case where the peer->roundTripTime >= 8 and roundTripTime < 8.
Lines 863 to 876 in cf735e6
| peer -> roundTripTimeVariance -= peer -> roundTripTimeVariance / 4; | |
| if (roundTripTime >= peer -> roundTripTime) | |
| { | |
| enet_uint32 diff = roundTripTime - peer -> roundTripTime; | |
| peer -> roundTripTimeVariance += diff / 4; | |
| peer -> roundTripTime += diff / 8; | |
| } | |
| else | |
| { | |
| enet_uint32 diff = peer -> roundTripTime - roundTripTime; | |
| peer -> roundTripTimeVariance += diff / 4; | |
| peer -> roundTripTime -= diff / 8; | |
| } |
In this case, what will happen is diff will be < 7, so diff / 8 will be 0. As a result, peer -> roundTripTime -= diff / 8; will never result in the SRTT decreasing.
The effect of this bug is that the SRTT is effectively latched at 8 ms if it has ever exceeded 8 ms, even if the actual RTT has dropped back below 8 ms.
The RTT variance is also affected by a similar bug when peer -> roundTripTimeVariance is < 4, because peer -> roundTripTimeVariance / 4 will be 0.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels