Сетевые протоколы
Go прячет сеть за удобными вызовами: вы пишете http.Get, net.Dial, поднимаете сервер парой строк — и не видите ни рукопожатий, ни сегментов, ни потерянных пакетов. Но в проде эта абстракция протекает. Соединение висит, HTTP/2 тормозит из-за одного потерянного TCP-пакета, а мобильный клиент рвёт загрузку при переходе с Wi-Fi на мобильную сеть. Объяснение каждого случая лежит в самих сетевых протоколах — и backend-инженера на собеседовании проверяют именно здесь.
Темы группируются вокруг одного размена — надёжность против задержки. Внизу два транспорта: TCP даёт надёжную упорядоченную доставку ценой задержки, UDP ничего не гарантирует, но не ждёт. Поверх TCP живёт текстовый HTTP со своими версиями — от keep-alive до мультиплексирования в HTTP/2. А QUIC и HTTP/3 переехали поверх UDP, чтобы обойти жёсткость TCP и его head-of-line blocking. Эта тема разбирает сетевой слой под рантаймом Go по частям.
Карта темы
- TCP против UDP — надёжная упорядоченная доставка против быстрой доставки без гарантий, и когда оправдан UDP.
- Устройство HTTP — текстовый запрос/ответ: стартовая строка, заголовки, тело, коды состояния, stateless-природа и версии.
- QUIC и HTTP/3 — транспорт поверх UDP со встроенным TLS 1.3, независимыми потоками и миграцией соединения.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
Говорить «TCP надёжнее, значит всегда лучше» | У UDP своя ниша: real-time, игры, DNS, QUIC — там задержка важнее гарантии пакета |
Думать, что UDP «гарантирует доставку, просто быстрее» | UDP не гарантирует ничего: датаграмма может потеряться, продублироваться или прийти не по порядку |
Считать, что QUIC построен на TCP | QUIC работает поверх UDP и сам реализует надёжность и порядок per-stream |
| Думать, что HTTP «помнит» пользователя между запросами | HTTP stateless; состояние сессии несут cookie/токены в каждом запросе |
| Путать классы кодов состояния | 4xx — ошибка клиента, 5xx — ошибка сервера; не наоборот |
Считать, что HTTP/2 полностью убил head-of-line blocking | Он убрал HOL на уровне HTTP, но TCP HOL-блок остался — его решает уже QUIC/HTTP/3 |
Называть QUIC «новой версией HTTP» | QUIC — транспортный протокол поверх UDP; HTTP/3 — лишь HTTP-семантика поверх него |
Значение для собеседований
Сетевые протоколы — обязательная секция backend-интервью на Go. Проверяют не знание команд, а модель: где проходит граница надёжности и задержки, как устроен HTTP под http.Get и зачем индустрия переехала на QUIC.
Что обычно проверяют:
- Чем
TCPотличается отUDPпо механизму — рукопожатие,ACK, переотправка, порядок против датаграмм без гарантий. - Когда оправдан
UDP— real-time, игры,DNS,QUIC— и что вы строите надёжность сами поверх него. - Из чего состоит HTTP-запрос и ответ — стартовая строка, заголовки, пустая строка, тело, классы кодов.
- Почему HTTP stateless и при чём тут cookie и токены.
- Что такое head-of-line blocking и почему
HTTP/2поверхTCPот него не свободен. - Зачем нужен
QUIC— независимые потоки, встроенныйTLS 1.3, миграция соединения по connection ID.
Типичный неверный ответ: «QUIC — это просто новая версия HTTP, и она построена на TCP». Это запускает разбор того, что QUIC — транспортный протокол поверх UDP, который сам реализует надёжность и порядок per-stream, а HTTP/3 — лишь HTTP-семантика, которая по нему ездит.