Перейти к содержанию

Сети

Сетевое программирование в Linux построено вокруг сокетов — расширения файлового интерфейса на межпроцессное и межмашинное взаимодействие. Сокет — это file descriptor, к которому применимы знакомые read, write, close; разница только в том, что данные идут не на диск, а через сетевой стек ядра в другой процесс на этом или другом хосте.

Этот раздел рассказывает, как устроен Berkeley sockets API, чем TCP отличается от UDP под капотом и какие тонкости транспортного уровня нужно знать для написания корректных сетевых приложений.

Темы

Страница Что рассматривается
Сокеты: API и базовые понятия socket, bind, listen, accept, connect, address family, byte order, echo-сервер/клиент
TCP и UDP: протоколы и тонкости Three-way handshake, state machine, TIME_WAIT, flow/congestion control, Nagle, MSS, SO_REUSEPORT
I/O multiplexing (select, poll, epoll) fd_set, pollfd, edge-triggered vs level-triggered, C10K, внутреннее устройство epoll
io_uring Submission/completion queues, SQE/CQE, SQPOLL, fixed buffers, linked SQEs, liburing
Сетевой стек Linux изнутри Путь пакета RX/TX, sk_buff, NAPI, qdisc, RSS/RPS/RFS, GRO/GSO, netfilter hooks, XDP/TC eBPF, диагностика
netfilter, iptables, nftables, conntrack 5 hooks, таблицы и chains, NAT (SNAT/DNAT/MASQUERADE), nftables VM, conntrack state machine, Docker/k8s интеграция