From 1664d083fb1751c06b49d02ab77942a3b43a6de1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Tue, 7 Apr 2026 14:14:19 +0800 Subject: [PATCH] Reduce iOS TCP buffers --- stack_gvisor.go | 63 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/stack_gvisor.go b/stack_gvisor.go index cc488f6..ca7dcdc 100644 --- a/stack_gvisor.go +++ b/stack_gvisor.go @@ -87,7 +87,7 @@ func (t *GVisor) Start() error { return err } linkEndpoint = &LinkEndpointFilter{linkEndpoint, t.broadcastAddr, t.tun} - ipStack, err := NewGVisorStackWithOptions(linkEndpoint, nicOptions, false) + ipStack, err := newGVisorStack(linkEndpoint, nicOptions, false, true) if err != nil { return err } @@ -135,6 +135,10 @@ func NewGVisorStack(ep stack.LinkEndpoint) (*stack.Stack, error) { } func NewGVisorStackWithOptions(ep stack.LinkEndpoint, opts stack.NICOptions, allowRawEndpoint bool) (*stack.Stack, error) { + return newGVisorStack(ep, opts, allowRawEndpoint, false) +} + +func newGVisorStack(ep stack.LinkEndpoint, opts stack.NICOptions, allowRawEndpoint bool, isLocalStack bool) (*stack.Stack, error) { stackOptions := stack.Options{ NetworkProtocols: []stack.NetworkProtocolFactory{ ipv4.NewProtocol, @@ -175,23 +179,46 @@ func NewGVisorStackWithOptions(ep stack.LinkEndpoint, opts stack.NICOptions, all tcpRecoveryOpt := tcpip.TCPRecovery(0) err = ipStack.SetTransportProtocolOption(tcp.ProtocolNumber, &tcpRecoveryOpt) } - tcpRXBufOpt := tcpip.TCPReceiveBufferSizeRangeOption{ - Min: tcpRXBufMinSize, - Default: tcpRXBufDefSize, - Max: tcpRXBufMaxSize, - } - err = ipStack.SetTransportProtocolOption(tcp.ProtocolNumber, &tcpRXBufOpt) - if err != nil { - return nil, gonet.TranslateNetstackError(err) - } - tcpTXBufOpt := tcpip.TCPSendBufferSizeRangeOption{ - Min: tcpTXBufMinSize, - Default: tcpTXBufDefSize, - Max: tcpTXBufMaxSize, - } - err = ipStack.SetTransportProtocolOption(tcp.ProtocolNumber, &tcpTXBufOpt) - if err != nil { - return nil, gonet.TranslateNetstackError(err) + if isLocalStack || runtime.GOOS == "ios" { + const iOSBufferDefault = 1 << 15 + const iOSBufferMax = 1 << 17 + tcpRXBufOpt := tcpip.TCPReceiveBufferSizeRangeOption{ + Min: tcpRXBufMinSize, + Default: iOSBufferDefault, + Max: iOSBufferMax, + } + err = ipStack.SetTransportProtocolOption(tcp.ProtocolNumber, &tcpRXBufOpt) + if err != nil { + return nil, gonet.TranslateNetstackError(err) + } + tcpTXBufOpt := tcpip.TCPSendBufferSizeRangeOption{ + Min: tcpTXBufMinSize, + Default: iOSBufferDefault, + Max: iOSBufferMax, + } + err = ipStack.SetTransportProtocolOption(tcp.ProtocolNumber, &tcpTXBufOpt) + if err != nil { + return nil, gonet.TranslateNetstackError(err) + } + } else { + tcpRXBufOpt := tcpip.TCPReceiveBufferSizeRangeOption{ + Min: tcpRXBufMinSize, + Default: tcpRXBufDefSize, + Max: tcpRXBufMaxSize, + } + err = ipStack.SetTransportProtocolOption(tcp.ProtocolNumber, &tcpRXBufOpt) + if err != nil { + return nil, gonet.TranslateNetstackError(err) + } + tcpTXBufOpt := tcpip.TCPSendBufferSizeRangeOption{ + Min: tcpTXBufMinSize, + Default: tcpTXBufDefSize, + Max: tcpTXBufMaxSize, + } + err = ipStack.SetTransportProtocolOption(tcp.ProtocolNumber, &tcpTXBufOpt) + if err != nil { + return nil, gonet.TranslateNetstackError(err) + } } return ipStack, nil }