// values are biased towards higher throughput on high bandwidth-delay // product paths, except on memory-constrained platforms. tcpRXBufOpt := tcpip.TCPReceiveBufferSizeRangeOption{ ... Max: tcpRXBufMaxSize, } tcpipErr := ipstack.SetTransportProtocolOption(tcp.ProtocolNumber, &tcpRXBufOpt) ... tcpTXBufOpt := tcpip.TCPSendBufferSizeRangeOption{ ... Max: tcpTXBufMaxSize, } tcpipErr = ipstack.SetTransportProtocolOption(tcp.ProtocolNumber, &tcpTXBufOpt) ... sackEnabledOpt := tcpip.TCPSACKEnabled(true) // TCP SACK is disabled by default tcpipErr := ipstack.SetTransportProtocolOption(tcp.ProtocolNumber, &sackEnabledOpt) ... // See https://github.com/tailscale/tailscale/issues/9707 // gVisor's RACK performs poorly. ACKs do not appear to be handled in a // timely manner, leading to spurious retransmissions and a reduced // congestion window. tcpRecoveryOpt := tcpip.TCPRecovery(0) tcpipErr = ipstack.SetTransportProtocolOption(tcp.ProtocolNumber, &tcpRecoveryOpt) ... // gVisor defaults to reno at the time of writing. We explicitly set reno // See https://github.com/google/gvisor/issues/11632 renoOpt := tcpip.CongestionControlOption("reno") tcpipErr = ipstack.SetTransportProtocolOption(tcp.ProtocolNumber, &renoOpt)