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 ¶
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 ¶
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
SetClientSocketOptions tunes a TCP socket that represents a connection to end user (not Telegram service or fronting domain).
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 ¶
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 ¶
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.