Добро пожаловать в проект Low-Level Network Mastery.
Цель этого проекта — дать вам глубокое, практическое понимание низкоуровневого сетевого программирования на C и C++.
Мы не будем прятаться за высокоуровневыми библиотеками и фреймворками. Мы пойдём туда, где живут пакеты, сокеты, заголовки и сырые байты.
Вы освоите:
- Сырые сокеты (raw sockets) — создание и разбор пакетов вручную
- Ethernet, ARP, IP, TCP, UDP — от заголовка до полезной нагрузки
- Блокирующий и неблокирующий ввод-вывод —
select,poll,epoll(Linux) - Мультиплексирование соединений — асинхронная работа с десятками тысяч сокетов
- Тонкая настройка TCP —
setsockopt, буферы, флаги, таймауты - Парсинг и сборка пакетов без аллокаций — работа с фиксированными буферами
Потому что, когда дело доходит до сети на самом нижнем уровне — вы не можете позволить себе лишних абстракций.
В Go, Python, Rust и других языках низкоуровневая работа с сетью либо невозможна (без unsafe), либо настолько завернута в безопасные обёртки, что вы теряете контроль. А контроль над каждым байтом — это единственное, что имеет значение, когда вы пишете:
- Сетевые снифферы
- Стейтлесс-фильтры и фаерволы
- Собственные протоколы поверх UDP/TCP
- Экспериментальные сетевые стеки
- Инструменты для анализа трафика
Мы не учим «как отправить HTTP-запрос». Мы учим, как работает сеть до того, как HTTP стал возможен.
/
├── 00_sockets_basics/ # Классические Berkeley sockets
├── 01_raw_ethernet/ # Работа с сетевыми интерфейсами на уровне L2
├── 02_arp/ # ARP-запросы и ответы вручную
├── 03_ip/ # Формирование IP-пакетов, фрагментация
├── 04_tcp/ # TCP без libc (почти), SYN, ACK, FIN, RST
├── 05_udp/ # Мультикаст, широковещательные рассылки
├── 06_nonblocking/ # select/poll/epoll — тысячи соединений
├── 07_tune/ # setsockopt, TCP_NODELAY, SO_REUSEADDR, буферы
└── 08_protocol/ # Создание собственного протокола поверх UDP
- Никакого HTTP. Мы не учим запросы к REST API.
- Никаких фреймворков. Только syscalls, сокеты и сырые буферы.
- Посокетные объяснения. Каждый системный вызов объяснён — зачем, почему именно так, какие есть альтернативы.
- Без магии. Вы будете видеть, куда идут байты, и сможете доказать это tcpdump'ом.
- Промышленные паттерны. Обработка EAGAIN, EWOULDBLOCK, частичная запись/чтение, обработка сигналов.
- Тем, кто хочет быстро написать чатик. Идите на WebSocket.
- Тем, кто боится
memcpyи утечек памяти. - Тем, кто считает, что
std::string— это всегда ответ.
// Отправить TCP SYN-пакет вручную, сформировав Ethernet+IP+TCP заголовки
// Поймать SYN-ACK через raw socket
// Разобрать его по полям, не используя ни одной библиотеки
// Изменить TTL, флаги DF/MF, окно TCP
// Убедиться, что tcpdump показывает ТОЧНО то, что вы отправилиВыберите папку 00_sockets_basics/ и откройте 01_tcp_echo_server.c.
Там не будет boost::asio. Там будет socket(), bind(), listen(), accept(), recv(), send() — и объяснение, ПОЧЕМУ они работают именно так, а не иначе.
Добро пожаловать под капот сети.
Там холодно, байты летят в лицо, и никто не подстрахует вашим любимым языком с GC.