From: Yuchung Cheng <ycheng@google.com>
To: davem@davemloft.net, edumazet@google.com
Cc: netdev@vger.kernel.org, ncardwell@google.com, soheil@google.com,
Yuchung Cheng <ycheng@google.com>
Subject: [PATCH net-next 4/8] tcp: undo init congestion window on false SYNACK timeout
Date: Mon, 29 Apr 2019 15:46:16 -0700 [thread overview]
Message-ID: <20190429224620.151064-5-ycheng@google.com> (raw)
In-Reply-To: <20190429224620.151064-1-ycheng@google.com>
Linux implements RFC6298 and use an initial congestion window
of 1 upon establishing the connection if the SYNACK packet is
retransmitted 2 or more times. In cellular networks SYNACK timeouts
are often spurious if the wireless radio was dormant or idle. Also
some network path is longer than the default SYNACK timeout. In
both cases falsely starting with a minimal cwnd are detrimental
to performance.
This patch avoids doing so when the final ACK's TCP timestamp
indicates the original SYNACK was delivered. It remembers the
original SYNACK timestamp when SYNACK timeout has occurred and
re-uses the function to detect spurious SYN timeout conveniently.
Note that a server may receives multiple SYNs from and immediately
retransmits SYNACKs without any SYNACK timeout. This often happens
on when the client SYNs have timed out due to wireless delay
above. In this case since the server will still use the default
initial congestion (e.g. 10) because tp->undo_marker is reset in
tcp_init_metrics(). This is an intentional design because packets
are not lost but delayed.
This patch only covers regular TCP passive open. Fast Open is
supported in the next patch.
Signed-off-by: Yuchung Cheng <ycheng@google.com>
Signed-off-by: Neal Cardwell <ncardwell@google.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
---
net/ipv4/tcp_input.c | 2 ++
net/ipv4/tcp_minisocks.c | 5 +++++
2 files changed, 7 insertions(+)
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 30c6a42b1f5b..53b4c5a3113b 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -6101,6 +6101,8 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
*/
tcp_rearm_rto(sk);
} else {
+ tcp_try_undo_spurious_syn(sk);
+ tp->retrans_stamp = 0;
tcp_init_transfer(sk, BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB);
tp->copied_seq = tp->rcv_nxt;
}
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c
index 79900f783e0d..9c2a0d36fb20 100644
--- a/net/ipv4/tcp_minisocks.c
+++ b/net/ipv4/tcp_minisocks.c
@@ -522,6 +522,11 @@ struct sock *tcp_create_openreq_child(const struct sock *sk,
newtp->rx_opt.ts_recent_stamp = 0;
newtp->tcp_header_len = sizeof(struct tcphdr);
}
+ if (req->num_timeout) {
+ newtp->undo_marker = treq->snt_isn;
+ newtp->retrans_stamp = div_u64(treq->snt_synack,
+ USEC_PER_SEC / TCP_TS_HZ);
+ }
newtp->tsoffset = treq->ts_off;
#ifdef CONFIG_TCP_MD5SIG
newtp->md5sig_info = NULL; /*XXX*/
--
2.21.0.593.g511ec345e18-goog
next prev parent reply other threads:[~2019-04-29 22:46 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-29 22:46 [PATCH net-next 0/8] undo congestion window on spurious SYN or SYNACK timeout Yuchung Cheng
2019-04-29 22:46 ` [PATCH net-next 1/8] tcp: avoid unconditional congestion window undo on SYN retransmit Yuchung Cheng
2019-04-29 22:46 ` [PATCH net-next 2/8] tcp: undo initial congestion window on false SYN timeout Yuchung Cheng
2019-04-29 22:46 ` [PATCH net-next 3/8] tcp: better SYNACK sent timestamp Yuchung Cheng
2019-04-29 22:46 ` Yuchung Cheng [this message]
2019-06-19 15:54 ` [PATCH net-next 4/8] tcp: undo init congestion window on false SYNACK timeout Eric Dumazet
2019-04-29 22:46 ` [PATCH net-next 5/8] tcp: lower congestion window on Fast Open " Yuchung Cheng
2019-04-29 22:46 ` [PATCH net-next 6/8] tcp: undo cwnd on Fast Open spurious SYNACK retransmit Yuchung Cheng
2019-04-29 22:46 ` [PATCH net-next 7/8] tcp: refactor to consolidate TFO passive open code Yuchung Cheng
2019-04-29 22:46 ` [PATCH net-next 8/8] tcp: refactor setting the initial congestion window Yuchung Cheng
2019-05-01 15:55 ` [PATCH net-next 0/8] undo congestion window on spurious SYN or SYNACK timeout David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190429224620.151064-5-ycheng@google.com \
--to=ycheng@google.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=ncardwell@google.com \
--cc=netdev@vger.kernel.org \
--cc=soheil@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox