network

package
v2.1.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 30, 2021 License: MIT Imports: 15 Imported by: 0

Documentation

Overview

Network contains a default implementation of the network.

Please see mtglib.Network interface to get some basic idea behind this abstraction.

Some notable feature of this implementation:

1. It detaches dialer from a network. Dialer is something which implements a real dialer and network completes it with more higher level details.

2. It uses only TCP connections. Even for DNS it uses DNS-Over-HTTPS

3. It has some simple implementation of DNS cache which is good enough for our purpose.

4. It sets uses SO_REUSEPORT port if applicable.

Index

Constants

View Source
const (
	// DefaultTimeout is a default timeout for establishing TCP
	// connection.
	DefaultTimeout = 10 * time.Second

	// DefaultHTTPTimeout defines a default timeout for making HTTP
	// request.
	DefaultHTTPTimeout = 10 * time.Second

	// 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

	// ProxyDialerOpenThreshold is used for load balancing SOCKS5 dialer
	// only.
	//
	// This dialer uses circuit breaker with of 3 stages: OPEN,
	// HALF_OPEN and CLOSED. If state is CLOSED, all requests go in
	// a normal mode. If you get more that ProxyDialerOpenThreshold
	// errors, circuit breaker goes into OPEN mode.
	//
	// When circuit breaker is in OPEN mode, it forbids all request to
	// a given proxy. But after ProxyDialerHalfOpenTimeout it gives a
	// second chance and opens an access for a SINGLE request. If this
	// request success, then circuit breaker closes, otherwise opens
	// again.
	//
	// When circuit breaker is closed, it clears an error states each
	// ProxyDialerResetFailuresTimeout.
	ProxyDialerOpenThreshold = 5

	// ProxyDialerHalfOpenTimeout defines a halfopen timeout for circuit
	// breaker.
	ProxyDialerHalfOpenTimeout = time.Minute

	// ProxyDialerResetFailuresTimeout defines a timeout for resetting a
	// failure.
	ProxyDialerResetFailuresTimeout = 10 * time.Second

	// DefaultDOHHostname defines a default IP address for DOH host.
	// Since mtg is simple, please pass IP address here. We do not
	// have bootstrap servers here embedded.
	DefaultDOHHostname = "9.9.9.9"

	// DNSTimeout defines a timeout for DNS queries.
	DNSTimeout = 5 * time.Second
)

Variables

View Source
var (
	// ErrCircuitBreakerOpened is returned when proxy is being accessed
	// but circuit breaker is opened.
	ErrCircuitBreakerOpened = errors.New("circuit breaker is opened")

	// ErrCannotDialWithAllProxies is returned when load balancing
	// client is trying to access proxies but all of them are failed.
	ErrCannotDialWithAllProxies = errors.New("cannot dial with all proxies")
)

Functions

func NewNetwork

func NewNetwork(dialer Dialer,
	userAgent, dohHostname string,
	httpTimeout time.Duration) (mtglib.Network, error)

NewNetwork assembles an mtglib.Network compatible structure based on a dialer and given params.

It brings simple DNS cache and DNS-Over-HTTPS when necessary.

func SetClientSocketOptions added in v2.1.1

func SetClientSocketOptions(conn net.Conn, bufferSize int) error

SetClientSocketOptions tunes a TCP socket that represents a connection to end user (not Telegram service or fronting domain).

func SetServerSocketOptions added in v2.1.1

func SetServerSocketOptions(conn net.Conn, bufferSize int) error

SetServerSocketOptions tunes a TCP socket that represents a connection to remote server like Telegram or fronting domain (but not end user).

Types

type Dialer

type Dialer interface {
	Dial(network, address string) (net.Conn, error)
	DialContext(ctx context.Context, network, address string) (net.Conn, error)
}

Dialer defines an interface which is required to bootstrap a network instance from.

func NewDefaultDialer

func NewDefaultDialer(timeout time.Duration, bufferSize int) (Dialer, error)

NewDefaultDialer build a new dialer which dials bypassing proxies etc.

The most default one you can imagine. But it has tunes TCP connections and setups SO_REUSEPORT.

func NewLoadBalancedSocks5Dialer

func NewLoadBalancedSocks5Dialer(baseDialer Dialer, proxyURLs []*url.URL) (Dialer, error)

NewLoadBalancedSocks5Dialer builds a new load balancing SOCKS5 dialer.

The main difference from one which is made by NewSocks5Dialer is that we actually have a list of these proxies. When dial is requested, any proxy is picked and used. If proxy fails for some reason, we try another one.

So, it is mostly useful if you have some routes with proxies which are not always online or having buggy network.

func NewSocks5Dialer

func NewSocks5Dialer(baseDialer Dialer, proxyURL *url.URL) (Dialer, error)

NewSocks5Dialer build a new dialer from a given one (so, in theory you can chain here). Proxy parameters are passed with URI in a form of:

socks5://[user:[password]]@host:port

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL