@@ -127,7 +127,8 @@ type KCP struct {
127
127
conv , mtu , mss , state uint32
128
128
snd_una , snd_nxt , rcv_nxt uint32
129
129
ssthresh uint32
130
- rx_rttvar , rx_srtt , rx_rto , rx_minrto uint32
130
+ rx_rttvar , rx_srtt int32
131
+ rx_rto , rx_minrto uint32
131
132
snd_wnd , rcv_wnd , rmt_wnd , cwnd , probe uint32
132
133
interval , ts_flush , xmit uint32
133
134
nodelay , updated uint32
@@ -340,29 +341,24 @@ func (kcp *KCP) update_ack(rtt int32) {
340
341
// https://tools.ietf.org/html/rfc6298
341
342
var rto uint32
342
343
if kcp .rx_srtt == 0 {
343
- kcp .rx_srtt = uint32 ( rtt )
344
- kcp .rx_rttvar = uint32 ( rtt ) >> 1
344
+ kcp .rx_srtt = rtt
345
+ kcp .rx_rttvar = rtt >> 1
345
346
} else {
346
347
delta := rtt - int32 (kcp .rx_srtt )
348
+ kcp .rx_srtt += delta >> 3
347
349
if delta < 0 {
348
350
delta = - delta
349
351
}
350
-
351
- kcp .rx_srtt = (7 * kcp .rx_srtt + uint32 (rtt )) >> 3
352
- if kcp .rx_srtt < 1 {
353
- kcp .rx_srtt = 1
354
- }
355
-
356
352
if rtt < int32 (kcp .rx_srtt - kcp .rx_rttvar ) {
357
353
// if the new RTT sample is below the bottom of the range of
358
354
// what an RTT measurement is expected to be.
359
355
// give an 8x reduced weight versus its normal weighting
360
- kcp .rx_rttvar = (31 * kcp .rx_rttvar + uint32 ( delta ) ) >> 5
356
+ kcp .rx_rttvar + = (delta - kcp .rx_rttvar ) >> 5
361
357
} else {
362
- kcp .rx_rttvar = (3 * kcp .rx_rttvar + uint32 ( delta ) ) >> 2
358
+ kcp .rx_rttvar + = (delta - kcp .rx_rttvar ) >> 2
363
359
}
364
360
}
365
- rto = kcp .rx_srtt + _imax_ (kcp .interval , 4 * kcp .rx_rttvar )
361
+ rto = uint32 ( kcp .rx_srtt ) + _imax_ (kcp .interval , uint32 ( kcp .rx_rttvar ) << 2 )
366
362
kcp .rx_rto = _ibound_ (kcp .rx_minrto , rto , IKCP_RTO_MAX )
367
363
}
368
364
0 commit comments