mirror of
https://github.com/tailscale/tailscale.git
synced 2026-11-05 19:49:42 +09:00
Since 1.104.0 (#21303), netstack's TCP uses gVisor's RACK-TLP loss detection again. In the gVisor that go.mod pins, RACK's loss marks do not reduce the SACK recovery pipe, and after an RTO, RACK starts fast recovery for the same flight, with ssthresh 2 and cwnd 5. After a burst loss, the sender can then retransmit about two segments per RTO for seconds to tens of seconds, and for minutes when the client does not offer TCP timestamps (Windows' default), because the RTO then keeps backing off. That stalls TCP that netstack terminates, such as tailscale serve, Tailscale SSH and tsnet, while kernel TCP over the same path does not stall. Add TS_NETSTACK_ENABLE_RACK as an explicit opt-out without changing the default. Unset keeps gVisor's default, RACK on; true keeps it on explicitly. Setting it to false brings back the RFC 6675 SACK loss recovery that netstack used from 1.82 through 1.102, until go.mod has a gVisor with the fixes (google/gvisor#15432 and google/gvisor#16081). Keep RACK enabled by default because disabling it is several times slower on paths that reorder packets (#20893). Test the default, explicitly enabled, and explicitly disabled cases. Updates #21946 Fixes #22045 Signed-off-by: Aditya Merchant <adityamerchant08@gmail.com> Signed-off-by: James Tucker <james@tailscale.com> Co-authored-by: James Tucker <james@tailscale.com> Change-Id: I7d8012beed8a5722fb026203625299b5597fdadc