Skip to content

Commit

Permalink
net/tcp_timer: fix tcp RTO abnormally large after retransmission occurs
Browse files Browse the repository at this point in the history
when tcp retransmission only double conn->timer in Karn(tcp_timer.c L602), after retransmission in Jacobson
M is is now rtt test will become a negative value.
```
  signed char m;
  m = conn->rto - conn->timer; // M is now rtt test

  /* This is taken directly from VJs original code in his paper */

  m = m - (conn->sa >> 3);
  conn->sa += m;              //conn->sa is a negative value
  if (m < 0)
	{
	  m = -m;
	}

  m = m - (conn->sv >> 2);
  conn->sv += m;
  conn->rto = (conn->sa >> 3) + conn->sv; //rto
```
For example,we lost one ack packet, we will set conn->timer = 6 by backoff,conn->rto still 3.
After retransmission we will Do RTT estimation, then will get
```
conn->sa = 253
conn->rto = 46
```
Then if any packets lost it will wait for a long time before triggering a retransmission.

Test method.
We can reproduce this issue by adding drop ACK packets in tcp_input, and debug conn->rto after Jacobson.

Signed-off-by: meijian <[email protected]>
  • Loading branch information
Meissi-jian authored and jerpelea committed Dec 11, 2024
1 parent 3063f2c commit 9639051
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion net/tcp/tcp_timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -599,7 +599,8 @@ void tcp_timer(FAR struct net_driver_s *dev, FAR struct tcp_conn_s *conn)

/* Exponential backoff. */

conn->timer = TCP_RTO << (conn->nrtx > 4 ? 4: conn->nrtx);
conn->rto = TCP_RTO << (conn->nrtx > 4 ? 4: conn->nrtx);
tcp_update_retrantimer(conn, conn->rto);
conn->nrtx++;

/* Ok, so we need to retransmit. We do this differently
Expand Down

0 comments on commit 9639051

Please sign in to comment.