Открыть сервис

Transmission Control Protocol

Transmission Control Protocol (TCP) — это один из основных протоколов передачи данных стека протоколов TCP/IP, обеспечивающий надёжную, упорядоченную и проверяемую на ошибки доставку потока данных между приложениями, работающими на узлах компьютерной сети. TCP функционирует на транспортном уровне модели OSI и является ориентированным на соединение протоколом, что означает необходимость установления логического соединения между отправителем и получателем перед началом обмена данными.

История

Разработка TCP началась в 1970-х годах в рамках проекта ARPANET, финансируемого Министерством обороны США. Первоначально протокол был описан в 1974 году в статье Винтона Серфа и Роберта Кана «A Protocol for Packet Network Intercommunication». Изначально TCP объединял функции как транспортного, так и сетевого уровня. Однако в 1978 году протокол был разделён на две части: TCP (транспортный уровень) и IP (Internet Protocol, сетевой уровень). Этот разделённый стек стал основой современного Интернета.

Стандартизация TCP была закреплена в документе RFC 793 (1981 год), который остаётся базовым описанием протокола. В последующие десятилетия вносились уточнения и расширения, такие как TCP Reno (алгоритм управления перегрузкой), TCP Vegas (альтернативный алгоритм) и опции, описанные в RFC 1323 (масштабирование окна, временные метки). На 2025 год TCP остаётся доминирующим транспортным протоколом в Интернете, несмотря на появление альтернатив, таких как QUIC и SCTP.

Принцип работы

Установление соединения (трёхэтапное рукопожатие)

TCP использует механизм трёхэтапного рукопожатия (three-way handshake) для установления соединения:

  1. SYN: клиент отправляет серверу сегмент с флагом SYN (synchronize) и случайным начальным порядковым номером (sequence number, ISN).
  2. SYN-ACK: сервер отвечает сегментом с флагами SYN и ACK (acknowledgement), подтверждая получение SYN и отправляя собственный ISN.
  3. ACK: клиент отправляет сегмент с флагом ACK, подтверждая получение SYN-ACK. После этого соединение считается установленным, и начинается передача данных.

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

Данные передаются в виде сегментов, каждый из которых имеет порядковый номер. Получатель отправляет подтверждения (ACK) с указанием следующего ожидаемого байта. Если отправитель не получает ACK в течение заданного времени (timeout), он повторно отправляет сегмент. TCP гарантирует, что данные будут доставлены в том же порядке, в котором были отправлены, и без дублирования.

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

Для разрыва соединения используется четырёхэтапная процедура:

  1. Одна из сторон отправляет сегмент с флагом FIN (finish).
  2. Другая сторона подтверждает получение FIN сегментом с ACK.
  3. Затем вторая сторона отправляет собственный FIN.
  4. Первая сторона подтверждает этот FIN сегментом с ACK. После этого соединение закрывается.

Структура сегмента TCP

Сегмент TCP состоит из заголовка и поля данных. Заголовок имеет минимальный размер 20 байт (без опций) и включает следующие поля:

  • Порт источника (16 бит): номер порта отправляющего приложения.
  • Порт назначения (16 бит): номер порта принимающего приложения.
  • Порядковый номер (32 бита): номер первого байта данных в сегменте.
  • Номер подтверждения (32 бита): номер следующего ожидаемого байта.
  • Смещение данных (4 бита): длина заголовка в 32-битных словах.
  • Зарезервированные биты (3 бита): не используются.
  • Флаги (9 бит): управляющие биты, включая SYN, ACK, FIN, RST (сброс), PSH (push), URG (срочность).
  • Размер окна (16 бит): количество байтов, которое получатель готов принять.
  • Контрольная сумма (16 бит): проверка целостности заголовка и данных.
  • Указатель срочности (16 бит): указывает на срочные данные, если установлен флаг URG.
  • Опции (переменная длина): дополнительные параметры, такие как масштабирование окна, временные метки, максимальный размер сегмента (MSS).

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

TCP включает механизмы для предотвращения перегрузки сети. Основные алгоритмы:

Медленный старт (Slow Start)

После установления соединения TCP отправляет данные с небольшим окном перегрузки (congestion window, cwnd), которое удваивается с каждым полученным ACK. Это продолжается до достижения порога медленного старта (ssthresh) или до потери пакета.

Предотвращение перегрузки (Congestion Avoidance)

После достижения порога ssthresh cwnd увеличивается линейно (на один сегмент за каждый RTT — round-trip time), а не экспоненциально. При обнаружении потери пакета (по тайм-ауту или тройному дублированному ACK) cwnd резко уменьшается.

Быстрая повторная передача и быстрое восстановление (Fast Retransmit and Fast Recovery)

При получении трёх дублированных ACK отправитель немедленно повторно отправляет потерянный сегмент, не дожидаясь тайм-аута. Затем cwnd уменьшается, и протокол переходит в режим предотвращения перегрузки.

Классификация и варианты

Существует несколько реализаций TCP, различающихся алгоритмами управления перегрузкой:

  • TCP Tahoe: базовая реализация с медленным стартом, предотвращением перегрузки и быстрой повторной передачей.
  • TCP Reno: добавляет быстрое восстановление после потери пакета.
  • TCP NewReno: улучшенная версия Reno, более эффективно обрабатывающая множественные потери.
  • TCP Vegas: использует измерение RTT для прогнозирования перегрузки, а не только потерь пакетов.
  • TCP CUBIC: оптимизирован для высокоскоростных сетей с большой задержкой; используется по умолчанию в ядре Linux.

Применение

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

  • Веб-серфинг: протокол HTTP/HTTPS работает поверх TCP.
  • Электронная почта: SMTP, POP3, IMAP используют TCP.
  • Передача файлов: FTP, SFTP.
  • Удалённый доступ: SSH, Telnet.
  • Потоковое видео и аудио: хотя для реального времени часто используется UDP, TCP применяется в системах, где важна целостность данных (например, YouTube использует QUIC, который основан на UDP, но многие старые сервисы всё ещё используют TCP).

Критика и ограничения

Несмотря на широкое распространение, TCP имеет ряд недостатков:

  • Задержка при установлении соединения: трёхэтапное рукопожатие добавляет как минимум один RTT перед началом передачи данных.
  • Головная блокировка (head-of-line blocking): если один сегмент потерян, все последующие данные задерживаются до его повторной передачи, даже если они относятся к разным потокам.
  • Неэффективность в сетях с высокой задержкой и потерями: классические алгоритмы управления перегрузкой могут значительно снижать пропускную способность.
  • Отсутствие шифрования: TCP не обеспечивает конфиденциальность данных; для этого используются протоколы более высокого уровня, такие как TLS.

В ответ на эти ограничения был разработан протокол QUIC (основан на UDP), который сочетает надёжность TCP с меньшей задержкой и встроенным шифрованием. QUIC используется в Chrome и других современных браузерах, но TCP остаётся основой Интернета.

Интересные факты

  • TCP был назван одним из «самых важных протоколов» в истории компьютерных сетей.
  • В 2005 году Винтон Серф и Роберт Кан получили Премию Тьюринга за вклад в разработку TCP/IP.
  • Порт 80 зарезервирован для HTTP, порт 443 — для HTTPS; оба используют TCP.
  • В России TCP/IP является основой для работы государственных информационных систем, включая портал «Госуслуги».

Источники

  • RFC 793 — Transmission Control Protocol (1981)
  • RFC 5681 — TCP Congestion Control (2009)
  • RFC 7323 — TCP Extensions for High Performance (2014)
  • Стивенс, У. Р. «TCP/IP Illustrated, Volume 1: The Protocols» (1994)
  • Таненбаум, Э. «Компьютерные сети» (5-е издание, 2012)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →