Оптимизация задержек сети
Краткое резюме
Латентность = сумма маленьких задержек по цепочке. Улучшение достигается системно: сократите «прыжки» (Anycast/CDN), уменьшите RTT (маршруты/QoS), снизьте «болт» (DNS/TLS/TCP), держите очереди короткими (AQM/ECN), минимизируйте байты (сжатие/кэш) и постоянно измеряйте p95/p99. Любая оптимизация без измерений — гадание.
Бюджет латентности: из чего состоит задержка
Упростим разложение TTFB (Time To First Byte):
TTFB ≈ t_DNS + t_connect + t_TLS + t_queue + t_routing + t_app + t_first_byte
Где:
- t_DNS — резолв имени.
- t_connect — установление L4 (TCP/QUIC).
- t_TLS — рукопожатие TLS.
- t_queue/t_routing — очереди/переходы (буферизация, перегрузки, NAT).
- t_app — серверная обработка до первого байта.
Цель — задать SLO по каждому слагаемому и регулярно сверять.
SLO/метрики (ориентиры)
DNS p95: локально ≤ 20–30 мс, глобально ≤ 80–120 мс.
TCP connect p95: ≤ 80–120 мс регионально, ≤ 200–250 мс межрегионально.
TLS handshake p95: ≤ 80–120 мс (с OCSP stapling, resumption).
TTFB p95 (статик): ≤ 120–150 мс регионально.
TTFB p95 (API): ≤ 200–300 мс.
Jitter p95 (UDP/RT): ≤ 15–30 мс; потери ≤ 0.1–0.3%.
Алерты: рост p95/p99, всплеск `SYN retries`, падение `resumption`, рост `ECN CE` или `packet loss`.
DNS: быстрый старт
Anycast-авторитеты + близкие рекурсоры (DoH/DoT при необходимости).
Короткий TTL (60–300 с) для динамических имен; negative-TTL под контролем.
DNS-кеш рядом с приложением; `prefetch` горячих записей.
Исключить лишние переезды CNAME → CNAME → A/AAAA.
TLS/HTTP: меньше рукопожатий, быстрее сессии
Включите TLS 1.3, OCSP stapling, короткие цепочки CA.
Session resumption (tickets/IDs) и ALPN (`h2`, `h3`).
HTTP/2: мультиплексирование, меньше коннектов → ниже p95.
HTTP/3 (QUIC): 0-RTT (только для идемпотентных), лучшая устойчивость к потере/джиттеру.
Preconnect/Prewarm (edge/клиент): заранее открывайте соединения для «горячих» доменов.
Транспорт: TCP vs QUIC и стек ядра
TCP
Современный Congestion Control: BBR v2 (или CUBIC, если консервативно).
RACK/TLP для быстрого ретрансмита; включите SACK.
ECN + AQM (CoDel/FQ_CoDel): уменьшает буферблоат и джиттер.
TCP Fast Open — избегать для state-changing запросов; польза спорная.
QUIC (HTTP/3)
Меньше «головной блокировки» по сравнению с TCP+TLS+HTTP/2.
Устойчив к реордерингу/потерям; обновляйте реализацию (например, Envoy/HAProxy с H3).
Следите за UDP/443 и MTU/фрагментацией.
MTU/PMTUD и фрагментация
Единый MTU end-to-end; для туннелей (IPsec/WireGuard/VXLAN) учитывайте оверхед.
Включить PMTUD и ICMP «Fragmentation needed».
Для QUIC — следить за max datagram и не резать ICMP на периметре.
Маршрутизация и физика пути
Anycast для публичных IP API/edge-фронтов.
Geo/Latency routing (GSLB) + health-checks.
ECMP и BFD в фабрике (Leaf-Spine), чтобы исключать плохие тропы за <1 с.
Согласовывайте аплинки/пиры (IX) в регионах концентрации пользователей.
Очереди и QoS: держите буферы короткими
Классы: real-time (RT/VoIP), interactive (API), bulk (бэкапы/ETL).
LLQ/WRR, приоритизация API/платежей над bulk.
ECN (CE-маркировка) + AQM (CoDel/FQ_CoDel) на граничных очередях.
Резать/переносить бэкапы и большие синки из «пиковых минут».
NAT, прокси и middleboxes
Минимизируйте каскад NAT/фильтров.
Stateful middlebox критичен к асимметрии путей: баланс по 5-tuple, pin-ning потоков.
Поддержка keepalive и разумные idle-таймауты для долгоживущих коннектов (gRPC/WebSocket).
Кэш и размещение данных
CDN/origin-shield/tiered-cache — меньше походов в origin.
Версионированные ассеты (immutable, 1 год).
Короткий TTL + `stale-while-revalidate` для полу-динамики.
Geo-placement: горячие данные ближе к пользователю (read-replica/edge-KV), а запись — в «источник правды».
Оптимизация на уровне приложения
Сократите число запросов (bundling/HTTP/2 push уже не в моде — лучше prefetch/preconnect).
Уменьшите payload: сжатие (Brotli), веб-форматы изображений, бинарные протоколы (gRPC).
Идемпотентность запросов → безопасные ретраи и агрессивнейшие таймауты.
Async/streaming (SSE/gRPC streaming) для снижения TTFB.
Наблюдаемость: что мерить
Клиентская телеметрия (RUM): DNS/connect/TLS/TTFB, Geo/ASN, устройство.
Сетевая: RTT, потери, джиттер, ECN CE/ECT(0/1), очереди интерфейсов, ошибки/переполнения.
Транспорт: retransmits, out-of-order, cwnd/BBR state, handshake stats, resumption.
L7: p50/p95/p99, error rate, payload size, гистограммы по маршрутам/PoP.
Сегментируйте метрики по региону/ASN/оператору связи — именно там прячутся «горячие точки».
Мини-плейбуки
1) Быстрый аудит p95
1. Постройте бюджет латентности (DNS/TLS/connect/TTFB) из RUM.
2. Сопоставьте с сетевыми метриками (RTT/loss/ECN) по PoP/ASN.
3. Если `connect` и `TLS` доминируют → включите preconnect/resumption/HTTP/3.
4. Если `TTFB` высок → кэш/edge/реплика и оптимизация приложения.
2) Всплеск потерь/джиттера
1. Проверить uplink/интерфейсы (дропы/очереди).
2. Включить/подкрутить AQM (FQ_CoDel), снизить bulk-класс.
3. Проверить BFD/ECMP-путь, исключить флапающий линк.
4. Для клиентов — временно поднять ретраи и снизить время между ними.
3) Региональная деградация
1. Переключить GSLB на соседний PoP; withdraw Anycast /32 на деградном.
2. Снизить TTL, активировать `stale-while-revalidate`.
3. Отправить статус в статус-страницу, запустить RCA.
4) Миграция на HTTP/3
1. Открыть UDP/443, включить H3/ALPN `h3`.
2. Проводить A/B: сравнить p95 TTFB и error rate.
3. Наблюдать `udp loss`/активные клиенты/осцилляции cwnd.
Конфиг-шпаргалки
Nginx (HTTP/2, OCSP, TLS 1.3, Brotli)
nginx server {
listen 443 ssl http2 reuseport;
ssl_protocols TLSv1. 2 TLSv1. 3;
ssl_stapling on; ssl_stapling_verify on;
add_header Strict-Transport-Security "max-age=31536000" always;
Compression brotli on; brotli_comp_level 5; gzip on;
Cache static location/static/{
add_header Cache-Control "public, max-age=31536000, immutable" always;
try_files $uri =404;
}
Proxy to API location/api/{
proxy_set_header Connection "";
proxy_http_version 1. 1;
proxy_read_timeout 5s;
proxy_connect_timeout 1s;
proxy_pass https://backend;
}
}
sysctl (Linux сеть: ECN/SACK/RACK подсистема ядра — примерные параметры)
bash
SACK/RACK/TLP are typically included in modern cores; specify sysctl -w net for your distribution. ipv4. tcp_sack=1 sysctl -w net. ipv4. tcp_ecn=1 sysctl -w net. ipv4. tcp_fastopen=0 # carefully with TFO sysctl -w net. core. default_qdisc=fq_codel sysctl -w net. ipv4. tcp_congestion_control=bbr
QoS (Cisco-стиль, концепт)
class-map match-any REALTIME match dscp ef class-map match-any INTERACTIVE match dscp af31 af21 class-map match-any BULK match dscp cs1 policy-map WAN-QOS class REALTIME priority percent 10 class INTERACTIVE bandwidth percent 50 class BULK bandwidth percent 20 random-detect ecn
Процессы и операционные практики
Capacity planning: запас по пропускной способности ≥ 30% в пиковые часы.
Change-control: канареечные изменения маршрутов/PoP/шлюзов.
Регулярный PMTUD-тест и контроль ICMP.
Документация путей: где NAT/прокси/AQM/QoS, какие MTU, кто владелец.
Соглашение таймаутов между L7 и сетевыми ретраями.
Специфика для iGaming/финтех
Время событий (матчи/турниры): прогрев CDN/PoP, preconnect к критичным доменам, временное увеличение resumption-пула, «серые» маршруты для ботов.
Платежные шаги: выделенный QoS-класс, Anycast-эндпойнты, короткие цепочки TLS и строгие версии/шифры; ретраи только идемпотентные.
Региональные ограничения/PSP: geo-routing + белые списки ASN/IP; фиксированные egress-пулы.
Мобильные сети: предпочтение ChaCha20-Poly1305 (при слабом AES-NI у клиентов), агрессивная компрессия и HTTP/3.
Чек-лист внедрения
- Бюджет латентности (DNS/TLS/connect/TTFB) и SLO по каждому звену.
- Anycast/Geo-routing для публичных API/edge, резервные PoP.
- TLS 1.3, OCSP stapling, resumption ≥ 70%, HTTP/2/3 включены.
- BBR + FQ_CoDel, ECN, SACK; PMTUD работает, ICMP не блокируется.
- Единый MTU по цепочке, учет оверхеда туннелей.
- QoS: классы real-time/interactive/bulk, AQM на перегрузочных интерфейсах.
- CDN/Tiered-cache/Origin-shield; версионированные ассеты и SWR.
- RUM + сетевые метрики по Geo/ASN; алерты на p95/p99/ECN/потери.
- Плейбуки: деградация региона, всплеск потерь, перевод трафика.
Типичные ошибки
Блокировка ICMP/PMTUD → фрагментация/переотправки и высокий p95.
«Толстые» буферы без AQM → буферблоат и джиттер.
Длинные цепочки CA и отсутствие OCSP stapling → дорогой TLS.
NAT-каскады и асимметрия для stateful-фильтров → ретраи/таймауты.
Избыточный `Vary`/неверсио ассеты → низкий hit-ratio CDN.
Нет сегментации QoS → API конкурирует с бэкапами в пике.
Итог
Оптимизация задержек — это комбинация сетевой инженерии, правильного транспорта и экономии «болтов» на DNS/TLS/кэше. Внедрите Anycast/Geo-routing, TLS 1.3 + resumption, HTTP/3, BBR + FQ_CoDel/ECN, согласуйте MTU, задайте QoS и SLO, меряйте p95/p99 и автоматизируйте плейбуки. Тогда пользователи получат быстрый отклик даже в самые «горящие» минуты, а платформа — предсказуемость и запас прочности.