Граф знанийНастройки

Обновлено: 23 июня 2026 г. в 08:31

Протокол TCP

средний

Надёжная доставка байтового потока: рукопожатие, подтверждения, управление потоком и перегрузкой, а также влияние сети на поведение TCP.

Глава про TCP важна тем, что показывает цену надёжной доставки: соединение, порядок байтов, контроль потока и перегрузки всегда оплачиваются задержкой, памятью и состоянием.

На практике это помогает проектировать повторные попытки, повторное использование соединений, стриминг и обратное давление с пониманием того, как транспортный слой меняет задержку и пропускную способность приложения.

В интервью и архитектурных обсуждениях материал полезен тем, что позволяет объяснять выбор транспорта и поведение системы под нагрузкой через реальные механизмы TCP, а не через общие слова о надёжности.

Практическая польза главы

Надежная доставка

Помогает понимать цену подтверждений, повторных передач и сохранения порядка для задержки и устойчивости сервиса.

Поведение при перегрузке

Учит учитывать управление перегрузкой при проектировании потоков данных и политик повторных попыток.

Жизненный цикл соединения

Показывает, как рукопожатие, поддержание соединения и очереди влияют на путь пользовательского запроса.

Глубина на интервью

Усиливает обсуждение транспортного слоя в кейсах с высокими требованиями к надежности.

RFC

RFC 9293 (TCP)

Действующий первоисточник по TCP: формат сегмента, состояния соединения и правила работы протокола — то, на что стоит сослаться вместо устаревших обзоров.

Перейти на сайт

Ярлык «надёжный транспорт» закрывает только половину разговора. На практике протокол TCP — это слой, который переводит качество сети в конкретные задержки, расход памяти, цену соединения и поведение сервиса под нагрузкой.

Для системного дизайна полезно понимать, как строит соединение, зачем ему и почему вместе с и определяют устойчивость сервиса не меньше, чем код приложения.

На скорость передачи влияют , , , и . Именно они объясняют, почему номинальная ширина канала ещё не гарантирует высокую и низкую .

Для архитектора отсюда следуют прикладные решения: когда держать , как настраивать и , как реагировать на , где нужен и почему фаза или могут неожиданно испортить путь пользовательского запроса.

Ключевые свойства протокола TCP

Надёжная доставка

Байтовый поток сохраняется в порядке: сегменты подтверждаются, потерянные — уходят на повторную передачу без участия приложения.

Работа через соединение

До первого байта полезной нагрузки стороны согласуют состояние сеанса и базовые параметры. Это плата за предсказуемость потока.

Подтверждения и повторные передачи

Подтверждение (ACK) даёт отправителю обратную связь о доставке и позволяет восстановить поток после сетевых сбоев, не дожидаясь жалобы пользователя.

Управление потоком

Окно приёма не даёт отправителю утопить буферы получателя — сколько уместится, столько и придёт.

Управление перегрузкой

Темп задаёт не отправитель, а сигналы сети: потери, задержки, явные пометки. Максимальная скорость любой ценой ломает соседей по каналу.

Как устроен заголовок сегмента протокола TCP

В заголовке нет ничего лишнего: каждое поле отвечает за конкретный механизм — порядок доставки, подтверждения, согласование окна, контроль ошибок и реакцию на потери.

Базовый заголовок сегмента протокола TCP

20-60 байт

Порт источника

16 бит

Порт назначения

16 бит

Номер последовательности

32 бит

Номер подтверждения

32 бит

Длина заголовка

4 бит

Резерв

4 бит

Флаги

8 бит

Размер окна

16 бит

Контрольная сумма

16 бит

Указатель срочных данных

16 бит

Опции и выравнивание (необязательно)

32 бит

Базовый заголовок обычно занимает 20 байт. Опции вроде максимального размера сегмента (MSS), масштабирования окна, SACK Permitted и Timestamps могут расширить его до 60 байт.

Жизненный цикл соединения протокола TCP

Установка соединения

SYN -> SYN с подтверждением ACK -> подтверждение ACK. Стороны договариваются о начальных номерах последовательности, максимальном размере сегмента (MSS) и параметрах окна — без этого первый байт данных не пойдёт.

Передача данных

Байтовый поток режется на сегменты, подтверждения ACK сигналят о доставке, окно приёма дышит вместе с буферами получателя, потерянные сегменты уходят на повторную передачу.

Завершение соединения

FIN и подтверждения ACK обмениваются в обе стороны, активная сторона садится в TIME_WAIT. Это страховка: чтобы старые сегменты не приклеились к следующему соединению на тех же портах.

Трёхшаговое рукопожатие протокола TCP

Рукопожатие — это не «открытие сокета», а синхронизация номеров последовательности, проверка достижимости второй стороны и создание состояния соединения. За это состояние потом приходится платить задержкой на каждом новом запросе и памятью на сервере.

Трёхшаговое рукопожатие TCP

Выберите шаг или используйте кнопки, чтобы заново пройти установку соединения.

Состояние

Нажмите «Начать», чтобы пройти все шаги установки TCP-соединения.

КлиентСервер
Клиент
-
Сервер
После трёх шагов соединение считается установленным.

Соединение установлено — и протокол TCP начинает балансировать между желанием ускориться и сигналами, что сеть уже на пределе. В этой фазе видно, где упираемся: в получателя, в очереди по дороге или в ширину канала.

Контроль потока и перегрузок в динамике

Прокрутите шаги по RTT, чтобы увидеть, как меняются окно перегрузки и окно приёма.

ШагRTT 1 (1 из 8)
cwndrwnd

Окно перегрузки (cwnd)

2 MSS

Окно приёма (rwnd)

18 MSS

Эффективное окно отправки

2 MSS

Загрузка очереди

8%

Высокая заполненность очереди увеличивает хвостовую задержку даже без крупных потерь.

RTT

18 ms

Потери

0.0%

Оценка пропускной способности

1.3 Mbps

MSS = 1460B

Фаза: Медленный старт

Что происходит на этом шаге: Соединение только стартовало: отправитель быстро наращивает cwnd, а сеть пока почти не ограничивает поток.

Расшифровка обозначений

  • cwnd = окно перегрузки - Ограничение на стороне отправителя: меняется по сигналам перегрузки и задаёт объём данных в полёте.
  • rwnd = окно приёма - Ограничение на стороне получателя: передаётся в ACK и показывает доступный буфер.
  • окно отправки = min(cwnd, rwnd) - Фактический лимит отправки всегда определяется меньшим из этих двух окон.

Связанная глава

IPv4 и IPv6: эволюция IP-адресации

Почему свойства IP-маршрутизации задают потолок пропускной способности и устойчивости протокола TCP сильнее, чем кажется.

Открыть главу

Как маршрутизация и сеть меняют поведение протокола TCP

Время прохождения и произведение пропускной способности на задержку (BDP)

Чем выше время прохождения туда и обратно (RTT) и произведение пропускной способности на задержку, тем шире должно быть эффективное окно — иначе канал простаивает в ожидании подтверждений.

Потери и рост очередей

Каждая потеря и переполнение очереди ужимают окно перегрузки (cwnd). Хвостовая задержка растёт, восстановление потока заметно затягивается.

Асимметрия маршрутов

Прямой и обратный пути нередко расходятся: сегменты приходят не по порядку, появляются лишние дублирующие подтверждения ACK и ложные сигналы потерь.

Максимальный размер блока передачи (MTU) и фрагментация

Сломанное определение максимального размера блока передачи (MTU) на пути даёт фрагментацию, чёрные дыры и тяжёлые циклы повторной передачи — а в логах сервиса это выглядит как «иногда подвисает».

Тайм-ауты простоя у преобразования сетевых адресов (NAT) и балансировщиков

Долгоживущие сеансы протокола TCP молча обрываются на промежуточных устройствах. Сервис получает обрыв соединения и принимает его за сетевой инцидент, хотя проблема в политике преобразования сетевых адресов или балансировщика.

Почему это важно для системного дизайна

  • Стоимость рукопожатия и прогрев соединений напрямую попадают в 95-й перцентиль (p95) и 99-й перцентиль (p99) на входе в сервис — это первое, что замечает пользователь.
  • Реальную пропускную способность задают размер окна, время прохождения туда и обратно (RTT) и управление перегрузкой, а не номинальная ширина канала в договоре с провайдером.
  • Неаккуратные тайм-ауты и повторные попытки под нагрузкой превращают единичную деградацию в каскадный сбой быстрее, чем успевает сработать алерт.
  • Когда понятно, как ведёт себя транспорт, сетевой инцидент отличается от ошибки в бизнес-логике на минутах, а не на часах.

Частые ошибки

Считать транспортный слой стабильным по умолчанию и закрывать глаза на хвостовую задержку на сетевых участках.

Сваливать признаки перегрузки сети и тайм-ауты приложения в одну метрику — потом невозможно понять, где именно сломалось.

Не держать пул соединений и поддержание соединения (keep-alive): каждый запрос платит за рукопожатие, 95-й перцентиль раздувается на пустом месте.

Одни и те же тайм-ауты и политики повторных попыток для трафика внутри дата-центра и между регионами — гарантированный путь к каскадным сбоям.

Связанные главы

  • Модель OSI - ставит протокол TCP на транспортный уровень и даёт способ разбирать сетевые инциденты по слоям, а не вслепую.
  • IPv4 и IPv6: эволюция IP-адресации - разбирает, как маршрутизация IP и формат адресов под ногами протокола TCP меняют его поведение под нагрузкой.
  • Протокол UDP - альтернатива для случаев, когда встроенные гарантии протокола TCP стоят дороже, чем приложение готово платить — и гарантии переносятся в код.
  • Протокол HTTP - верхний этаж над TCP в большинстве сервисов: видно, как прикладной протокол переиспользует соединения и где он усиливает узкие места транспорта.
  • Протокол WebSocket - сценарий долгоживущих соединений по протоколу TCP, где обрывы преобразования сетевых адресов (NAT) и стоимость памяти на сервере выходят на первый план.
  • Балансировка трафика - L4/L7-балансировка, закрепление соединений и тайм-ауты сетевых устройств — три места, где сеансы протокола TCP чаще всего рвутся незаметно для приложения.
  • Подходы к удалённым вызовам - поверх транспорта — прикладной слой: тайм-ауты, повторные попытки и нарастающие паузы, которые должны согласовываться с поведением протокола TCP, а не воевать с ним.
  • Зачем нужны распределённые системы и консистентность - следующий шаг разговора: от механики одного соединения к компромиссам, которые архитектор делает на уровне всей распределённой системы.

Чтобы отмечать прохождение, включи трекинг в Настройки