diff --git a/internal/cli/run_proxy.go b/internal/cli/run_proxy.go index a4fd81e..7ba313d 100644 --- a/internal/cli/run_proxy.go +++ b/internal/cli/run_proxy.go @@ -38,10 +38,9 @@ func makeNetwork(conf *config.Config, version string) (mtglib.Network, error) { tcpTimeout := conf.Network.Timeout.TCP.Get(network.DefaultTimeout) httpTimeout := conf.Network.Timeout.HTTP.Get(network.DefaultHTTPTimeout) dohIP := conf.Network.DOHIP.Get(net.ParseIP(network.DefaultDOHHostname)).String() - bufferSize := conf.TCPBuffer.Get(network.DefaultBufferSize) userAgent := "mtg/" + version - baseDialer, err := network.NewDefaultDialer(tcpTimeout, int(bufferSize)) + baseDialer, err := network.NewDefaultDialer(tcpTimeout, 0) if err != nil { return nil, fmt.Errorf("cannot build a default dialer: %w", err) } @@ -181,7 +180,6 @@ func runProxy(conf *config.Config, version string) error { EventStream: eventStream, Secret: conf.Secret, - BufferSize: conf.TCPBuffer.Get(mtglib.DefaultBufferSize), DomainFrontingPort: conf.DomainFrontingPort.Get(mtglib.DefaultDomainFrontingPort), PreferIP: conf.PreferIP.Get(mtglib.DefaultPreferIP), @@ -193,7 +191,7 @@ func runProxy(conf *config.Config, version string) error { return fmt.Errorf("cannot create a proxy: %w", err) } - listener, err := utils.NewListener(conf.BindTo.Get(""), int(opts.BufferSize)) + listener, err := utils.NewListener(conf.BindTo.Get(""), 0) if err != nil { return fmt.Errorf("cannot start proxy: %w", err) } diff --git a/internal/cli/simple_run.go b/internal/cli/simple_run.go index a0bb25d..893c889 100644 --- a/internal/cli/simple_run.go +++ b/internal/cli/simple_run.go @@ -38,10 +38,6 @@ func (s *SimpleRun) Run(cli *CLI, version string) error { // nolint: cyclop return fmt.Errorf("incorrect concurrency: %w", err) } - if err := conf.TCPBuffer.Set(s.TCPBuffer); err != nil { - return fmt.Errorf("incorrect tcp-buffer: %w", err) - } - if err := conf.PreferIP.Set(s.PreferIP); err != nil { return fmt.Errorf("incorrect prefer-ip: %w", err) } diff --git a/internal/config/config.go b/internal/config/config.go index c072dad..486576b 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -13,7 +13,6 @@ type Config struct { AllowFallbackOnUnknownDC TypeBool `json:"allowFallbackOnUnknownDc"` Secret mtglib.Secret `json:"secret"` BindTo TypeHostPort `json:"bindTo"` - TCPBuffer TypeBytes `json:"tcpBuffer"` PreferIP TypePreferIP `json:"preferIp"` DomainFrontingPort TypePort `json:"domainFrontingPort"` TolerateTimeSkewness TypeDuration `json:"tolerateTimeSkewness"` diff --git a/internal/config/parse.go b/internal/config/parse.go index a364712..dd10073 100644 --- a/internal/config/parse.go +++ b/internal/config/parse.go @@ -13,7 +13,6 @@ type tomlConfig struct { AllowFallbackOnUnknownDC bool `toml:"allow-fallback-on-unknown-dc" json:"allowFallbackOnUnknownDc,omitempty"` Secret string `toml:"secret" json:"secret"` BindTo string `toml:"bind-to" json:"bindTo"` - TCPBuffer string `toml:"tcp-buffer" json:"tcpBuffer,omitempty"` PreferIP string `toml:"prefer-ip" json:"preferIp,omitempty"` DomainFrontingPort uint `toml:"domain-fronting-port" json:"domainFrontingPort,omitempty"` TolerateTimeSkewness string `toml:"tolerate-time-skewness" json:"tolerateTimeSkewness,omitempty"` diff --git a/internal/utils/net_listener.go b/internal/utils/net_listener.go index c168e88..496f51b 100644 --- a/internal/utils/net_listener.go +++ b/internal/utils/net_listener.go @@ -9,8 +9,6 @@ import ( type Listener struct { net.Listener - - bufferSize int } func (l Listener) Accept() (net.Conn, error) { @@ -19,7 +17,7 @@ func (l Listener) Accept() (net.Conn, error) { return nil, err // nolint: wrapcheck } - if err := network.SetClientSocketOptions(conn, l.bufferSize); err != nil { + if err := network.SetClientSocketOptions(conn, 0); err != nil { conn.Close() return nil, fmt.Errorf("cannot set TCP options: %w", err) @@ -35,7 +33,6 @@ func NewListener(bindTo string, bufferSize int) (net.Listener, error) { } return Listener{ - Listener: base, - bufferSize: bufferSize, + Listener: base, }, nil } diff --git a/mtglib/proxy_opts.go b/mtglib/proxy_opts.go index 8993de7..ddede9f 100644 --- a/mtglib/proxy_opts.go +++ b/mtglib/proxy_opts.go @@ -45,6 +45,8 @@ type ProxyOpts struct { // buffers: to and from. // // This is an optional setting. + // + // Deprecated: this setting is no longer makes any effect. BufferSize uint // Concurrency is a size of the worker pool for connection management. diff --git a/network/default.go b/network/default.go index e976daa..7500bd8 100644 --- a/network/default.go +++ b/network/default.go @@ -9,8 +9,6 @@ import ( type defaultDialer struct { net.Dialer - - bufferSize int } func (d *defaultDialer) Dial(network, address string) (net.Conn, error) { @@ -30,7 +28,7 @@ func (d *defaultDialer) DialContext(ctx context.Context, network, address string } // we do not need to call to end user. End users call us. - if err := SetServerSocketOptions(conn, d.bufferSize); err != nil { + if err := SetServerSocketOptions(conn, 0); err != nil { conn.Close() return nil, fmt.Errorf("cannot set socket options: %w", err) @@ -44,26 +42,20 @@ func (d *defaultDialer) DialContext(ctx context.Context, network, address string // // The most default one you can imagine. But it has tunes TCP // connections and setups SO_REUSEPORT. +// +// bufferSize is deprecated and ignored. It is kept here for backward +// compatibility. func NewDefaultDialer(timeout time.Duration, bufferSize int) (Dialer, error) { switch { case timeout < 0: return nil, fmt.Errorf("timeout %v should be positive number", timeout) - case bufferSize < 0: - return nil, fmt.Errorf("buffer size %d should be positive number", bufferSize) - } - - if timeout == 0 { + case timeout == 0: timeout = DefaultTimeout } - if bufferSize == 0 { - bufferSize = DefaultBufferSize - } - return &defaultDialer{ Dialer: net.Dialer{ Timeout: timeout, }, - bufferSize: bufferSize, }, nil } diff --git a/network/init.go b/network/init.go index c12c7a0..45884f5 100644 --- a/network/init.go +++ b/network/init.go @@ -33,10 +33,16 @@ const ( // request. DefaultHTTPTimeout = 10 * time.Second + // Deprecated: + // // DefaultBufferSize defines a TCP buffer size. Both read and write, so // for real size, please multiply this number by 2. DefaultBufferSize = 16 * 1024 // 16 kib + // DefaultTCPKeepAlivePeriod defines a time period between 2 + // consequitive probes. + DefaultTCPKeepAlivePeriod = 10 * time.Second + // ProxyDialerOpenThreshold is used for load balancing SOCKS5 dialer // only. // diff --git a/network/sockopts.go b/network/sockopts.go index 241b034..ab1fea4 100644 --- a/network/sockopts.go +++ b/network/sockopts.go @@ -7,41 +7,27 @@ import ( // SetClientSocketOptions tunes a TCP socket that represents a connection to // end user (not Telegram service or fronting domain). +// +// bufferSize setting is deprecated and ignored. func SetClientSocketOptions(conn net.Conn, bufferSize int) error { - tcpConn := conn.(*net.TCPConn) // nolint: forcetypeassert - - if err := tcpConn.SetNoDelay(false); err != nil { - return fmt.Errorf("cannot disable TCP_NO_DELAY: %w", err) - } - - return setCommonSocketOptions(tcpConn, bufferSize) + return setCommonSocketOptions(conn.(*net.TCPConn)) } // SetServerSocketOptions tunes a TCP socket that represents a connection to // remote server like Telegram or fronting domain (but not end user). func SetServerSocketOptions(conn net.Conn, bufferSize int) error { - tcpConn := conn.(*net.TCPConn) // nolint: forcetypeassert - - if err := tcpConn.SetNoDelay(true); err != nil { - return fmt.Errorf("cannot enable TCP_NO_DELAY: %w", err) - } - - return setCommonSocketOptions(tcpConn, bufferSize) + return setCommonSocketOptions(conn.(*net.TCPConn)) } -func setCommonSocketOptions(conn *net.TCPConn, bufferSize int) error { - if err := conn.SetReadBuffer(bufferSize); err != nil { - return fmt.Errorf("cannot set read buffer size: %w", err) - } - - if err := conn.SetWriteBuffer(bufferSize); err != nil { - return fmt.Errorf("cannot set write buffer size: %w", err) - } - - if err := conn.SetKeepAlive(false); err != nil { +func setCommonSocketOptions(conn *net.TCPConn) error { + if err := conn.SetKeepAlive(true); err != nil { return fmt.Errorf("cannot disable TCP keepalive probes: %w", err) } + if err := conn.SetKeepAlivePeriod(DefaultTCPKeepAlivePeriod); err != nil { + return fmt.Errorf("cannot set time period of TCP keepalive probes: %w", err) + } + if err := conn.SetLinger(tcpLingerTimeout); err != nil { return fmt.Errorf("cannot set TCP linger timeout: %w", err) } @@ -51,7 +37,7 @@ func setCommonSocketOptions(conn *net.TCPConn, bufferSize int) error { return fmt.Errorf("cannot get underlying raw connection: %w", err) } - if err := setSocketReuseAddrPort(rawConn, bufferSize); err != nil { + if err := setSocketReuseAddrPort(rawConn); err != nil { return fmt.Errorf("cannot setup SO_REUSEADDR/PORT: %w", err) } diff --git a/network/sockopts_unix.go b/network/sockopts_unix.go index b45b95d..b7c5f10 100644 --- a/network/sockopts_unix.go +++ b/network/sockopts_unix.go @@ -10,7 +10,7 @@ import ( "golang.org/x/sys/unix" ) -func setSocketReuseAddrPort(conn syscall.RawConn, bufferSize int) error { +func setSocketReuseAddrPort(conn syscall.RawConn) error { var err error conn.Control(func(fd uintptr) { // nolint: errcheck diff --git a/network/sockopts_windows.go b/network/sockopts_windows.go index fbeae83..32a702a 100644 --- a/network/sockopts_windows.go +++ b/network/sockopts_windows.go @@ -5,6 +5,6 @@ package network import "syscall" -func setSocketReuseAddrPort(conn syscall.RawConn, bufferSize int) error { +func setSocketReuseAddrPort(conn syscall.RawConn) error { return nil }