Протокол TCP¶
Протокол TCP (Transmission Control Protocol, протокол управления передачей) — это один из основных протоколов транспортного уровня стека TCP/IP, обеспечивающий надёжную, упорядоченную и проверяемую на ошибки доставку потока данных между приложениями, работающими на узлах компьютерной сети. TCP является ориентированным на установление соединения протоколом, что означает необходимость предварительной установки логического канала связи между отправителем и получателем перед началом передачи данных. Он гарантирует, что данные будут доставлены в том же порядке, в котором были отправлены, без потерь и дублирования, а также контролирует перегрузку сети.
¶История создания
Разработка протокола TCP началась в 1970-х годах в рамках проекта ARPANET, финансируемого Министерством обороны США. Первоначальная спецификация была описана в документе RFC 675 (1974 год), авторами которого стали Винтон Серф, Йохан Постел и другие. Изначально TCP и IP были единым протоколом, но в 1978 году их разделили на два отдельных: TCP (отвечающий за надёжность и сборку данных) и IP (отвечающий за адресацию и маршрутизацию). Окончательная версия TCP была стандартизирована в 1981 году в документе RFC 793, который остаётся базовым описанием протокола до настоящего времени. С тех пор протокол неоднократно дополнялся и уточнялся в последующих RFC, в частности, были добавлены механизмы управления перегрузкой (RFC 2581, RFC 5681) и алгоритмы быстрой повторной передачи.
¶Принцип работы
TCP работает на транспортном уровне модели OSI, располагаясь между прикладным уровнем (например, HTTP, FTP, SMTP) и сетевым уровнем (IP). Основная задача TCP — предоставить приложениям абстракцию надёжного потока данных, скрывая сложности нижележащей сети.
¶Установление соединения (тройное рукопожатие)
Перед началом передачи данных TCP устанавливает соединение с помощью процедуры, называемой «тройное рукопожатие» (three-way handshake):
- SYN: Клиент отправляет серверу сегмент с флагом SYN (synchronize) и случайным начальным порядковым номером (sequence number), например,
x. - SYN-ACK: Сервер отвечает сегментом с флагами SYN и ACK (acknowledgement), подтверждая получение SYN и отправляя свой начальный порядковый номер
y. Поле подтверждения (acknowledgment number) устанавливается вx+1. - ACK: Клиент отправляет серверу сегмент с флагом ACK, подтверждая получение SYN-ACK. Поле подтверждения устанавливается в
y+1. После этого соединение считается установленным, и начинается передача данных.
¶Передача данных и подтверждение
Данные передаются в виде сегментов. Каждый сегмент имеет заголовок, содержащий, помимо прочего, порядковые номера и номера подтверждений. Получатель отправляет подтверждения (ACK) на успешно принятые сегменты. Если отправитель не получает подтверждение в течение определённого времени (тайм-аут), он повторно передаёт сегмент. TCP использует скользящее окно (sliding window) для управления потоком: получатель сообщает отправителю, сколько данных он может принять в данный момент (размер окна). Это предотвращает переполнение буфера получателя.
¶Завершение соединения
Завершение соединения может происходить в четыре этапа (четырёхстороннее рукопожатие):
- Одна сторона отправляет сегмент с флагом FIN (finish).
- Другая сторона подтверждает получение FIN (ACK).
- Другая сторона отправляет свой FIN.
- Первая сторона подтверждает получение FIN (ACK). После этого соединение закрывается.
¶Структура сегмента TCP
Сегмент TCP состоит из заголовка и поля данных. Заголовок имеет минимальную длину 20 байт (без опций) и может быть расширен за счёт опций.
| Поле | Размер (бит) | Описание |
|---|---|---|
| Порт источника | 16 | Номер порта приложения-отправителя. |
| Порт назначения | 16 | Номер порта приложения-получателя. |
| Порядковый номер | 32 | Номер первого байта данных в этом сегменте (для SYN-пакета — начальный номер). |
| Номер подтверждения | 32 | Номер следующего байта, который ожидает получить отправитель (подтверждение получения данных до этого номера). |
| Смещение данных | 4 | Длина заголовка TCP в 32-битных словах. |
| Зарезервировано | 3 | Зарезервировано для будущего использования. |
| Флаги | 9 | Набор управляющих битов (URG, ACK, PSH, RST, SYN, FIN и др.). |
| Размер окна | 16 | Количество байт, которое готов принять получатель (управление потоком). |
| Контрольная сумма | 16 | Проверка целостности заголовка и данных. |
| Указатель важности | 16 | Указывает на последний байт срочных данных (используется с флагом URG). |
| Опции | Переменный | Дополнительные параметры, например, масштабирование окна, временные метки. |
¶Ключевые механизмы
¶Управление потоком (Flow Control)
Реализуется с помощью механизма скользящего окна. Получатель в каждом сегменте отправляет значение поля «Размер окна», которое указывает, сколько байт данных он может принять в текущий момент. Отправитель не может отправить больше данных, чем указано в окне, что предотвращает переполнение буфера получателя.
¶Управление перегрузкой (Congestion Control)
TCP динамически регулирует скорость отправки данных в зависимости от загруженности сети. Основные алгоритмы:
- Медленный старт (Slow Start): Начинает передачу с небольшого окна перегрузки (cwnd), которое удваивается каждый раунд (RTT) до достижения порога медленного старта (ssthresh).
- Предотвращение перегрузки (Congestion Avoidance): После достижения ssthresh окно перегрузки увеличивается линейно (на 1 сегмент за RTT).
- Быстрая повторная передача (Fast Retransmit): Если отправитель получает три одинаковых ACK (дублирующих подтверждения), он немедленно повторно отправляет потерянный сегмент, не дожидаясь тайм-аута.
- Быстрое восстановление (Fast Recovery): После быстрой повторной передачи окно перегрузки уменьшается, но не до 1, а до половины от текущего, что позволяет быстрее восстановить скорость передачи.
¶Контроль целостности
Каждый сегмент TCP содержит 16-битную контрольную сумму, которая вычисляется по всему сегменту (заголовок + данные) и псевдозаголовку (содержащему IP-адреса отправителя и получателя). Получатель пересчитывает контрольную сумму и, если она не совпадает, отбрасывает сегмент.
¶Применение
TCP является основой для большинства протоколов прикладного уровня, где требуется надёжная доставка данных:
- HTTP/HTTPS: Передача веб-страниц и данных между браузером и сервером.
- FTP: Передача файлов.
- SMTP, POP3, IMAP: Отправка и получение электронной почты.
- SSH: Удалённое управление серверами.
- Telnet: Удалённый доступ к терминалу (устаревший, но всё ещё используется).
- WebSocket: Установление дуплексного канала связи поверх TCP.
¶Критика и ограничения
- Задержки: Установление соединения (тройное рукопожатие) и механизмы управления перегрузкой вносят дополнительную задержку, что критично для приложений реального времени (VoIP, онлайн-игры).
- Головная блокировка (Head-of-Line blocking): Если один сегмент потерян, все последующие сегменты, которые уже были доставлены, будут задерживаться в буфере получателя до повторной передачи потерянного сегмента.
- Отсутствие шифрования: TCP не обеспечивает шифрование данных. Для безопасной передачи используется TLS (Transport Layer Security), работающий поверх TCP.
- Избыточность для некоторых задач: Для потокового видео или аудио, где потеря отдельных пакетов допустима, более эффективным может быть протокол UDP (User Datagram Protocol).
¶Альтернативы
Основной альтернативой TCP на транспортном уровне является UDP (User Datagram Protocol). UDP не устанавливает соединение, не гарантирует доставку, порядок или целостность данных, но обеспечивает минимальную задержку и низкие накладные расходы. Он используется в приложениях, где скорость важнее надёжности: DNS, DHCP, потоковое видео, онлайн-игры, VoIP.
¶Источники
- RFC 793 — Transmission Control Protocol (1981)
- RFC 1122 — Requirements for Internet Hosts — Communication Layers (1989)
- RFC 2581 — TCP Congestion Control (1999)
- RFC 5681 — TCP Congestion Control (2009)
- Стивенс, У. Р. «TCP/IP. Иллюстрированное руководство. Том 1. Протоколы» (2003)
- Компьютерные сети. Э. Таненбаум, Д. Уэзеролл (2012)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →


