Outline SDK основан на ряде базовых концепций, реализованных в виде совместимых интерфейсов, которые можно комбинировать и легко использовать повторно.
Подключения
Подключения обеспечивают связь между двумя конечными точками через абстрактный протокол. Существует два типа подключений:
transport.StreamConn
: потоковое подключение, например TCP и тип сокета POSIXSOCK_STREAM
.transport.PacketConn
: подключение на основе датаграммы, например UDP и тип сокета PosixSOCK_DGRAM
. Мы используем Packet вместо Datagram, поскольку так принято в стандартной библиотеке Go.
Подключения можно упаковывать, создавая вложенные подключения через новые протоколы.
Например, StreamConn
может работать поверх TCP, поверх TLS поверх TCP, поверх HTTP поверх TLS поверх TCP, поверх QUIC и других вариантов.
Дайлеры
Дайлеры позволяют создавать подключения по адресу вида host:port, при этом инкапсулируя используемый транспортный или прокси-протокол.
Типы StreamDialer
и PacketDialer
создают подключения StreamConn
и PacketConn
исходя из заданного адреса. Дайлеры также могут быть вложенными.
Например, дайлер TLS Stream может использовать дайлер TCP, чтобы создать StreamConn
на основе TCP-подключения, а затем создать TLS StreamConn
на основе TCP StreamConn
. Дайлер типа SOCKS5-over-TLS может использовать дайлер TLS, чтобы установить TLS-подключение StreamConn
с прокси-сервером перед выполнением SOCKS5-подключения к целевому адресу.
Резолверы
Резолверы (dns.Resolver
) позволяют отвечать на DNS-запросы, инкапсулируя реализацию алгоритма или протокола.
В первую очередь они используются для сопоставления доменных имен с IP-адресами.