lsalzman / enet

ENet reliable UDP networking library
MIT License
2.71k stars 669 forks source link

Incorrect SRTT calculation when SRTT >= 8 and actual RTT < 8 ms #161

Open cgutman opened 3 years ago

cgutman commented 3 years ago

The SRTT and RTT variance logic (shown below) does not properly handle the case where the peer->roundTripTime >= 8 and roundTripTime < 8. https://github.com/lsalzman/enet/blob/cf735e639e5c9e3d2d84d71f1dbf789e8c2f3fd0/protocol.c#L863-L876

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.