Протокол TCP
Протокол TCP (англ. Transmission Control Protocol — протокол управления передачей) — один из основных протоколов транспортного уровня модели OSI и стека протоколов TCP/IP, обеспечивающий надёжную, упорядоченную и проверяемую на ошибки доставку потока данных между приложениями, работающими на узлах компьютерной сети. TCP является протоколом с установлением соединения: перед началом передачи данных между отправителем и получателем устанавливается логическое соединение, которое поддерживается на протяжении всего сеанса связи. Протокол гарантирует доставку данных в том же порядке, в котором они были отправлены, и автоматически повторяет передачу потерянных или повреждённых сегментов.
История
Разработка TCP началась в 1970-х годах в рамках проекта ARPANET, финансируемого Министерством обороны США. Первоначальная спецификация была предложена в 1974 году в статье Винтона Серфа и Роберта Канна «A Protocol for Packet Network Intercommunication». В 1978 году протокол был разделён на две части: TCP (отвечающий за надёжную доставку) и IP (отвечающий за маршрутизацию). В 1981 году была опубликована спецификация RFC 793, которая стала основой современного TCP. В последующие годы протокол неоднократно дополнялся — были введены алгоритмы управления перегрузкой (TCP Tahoe, Reno, Cubic), механизмы выборочного подтверждения (SACK), масштабирование окна и другие улучшения, описанные в серии RFC.
Архитектура и принципы работы
Установление соединения (тройное рукопожатие)
TCP использует процедуру тройного рукопожатия (three-way handshake) для установления соединения:
- Клиент отправляет серверу сегмент с флагом SYN (synchronize) и начальным порядковым номером (ISN — Initial Sequence Number).
- Сервер отвечает сегментом с флагами SYN и ACK (acknowledge), подтверждая получение SYN и указывая свой ISN.
- Клиент отправляет сегмент с флагом ACK, подтверждая получение SYN от сервера. После этого соединение считается установленным.
Передача данных
Данные передаются в виде сегментов, каждый из которых содержит порядковый номер (sequence number) и номер подтверждения (acknowledgment number). Порядковые номера позволяют получателю восстанавливать исходный порядок байтов и обнаруживать потери. Получатель отправляет подтверждения (ACK) на успешно принятые сегменты. Если отправитель не получает ACK в течение тайм-аута, он повторно передаёт сегмент.
Завершение соединения
Соединение завершается с помощью четырёхэтапной процедуры (four-way handshake):
- Одна из сторон отправляет сегмент с флагом FIN (finish).
- Другая сторона подтверждает получение FIN (ACK).
- Вторая сторона также отправляет свой FIN.
- Первая сторона подтверждает получение FIN (ACK). После этого соединение закрывается.
Формат заголовка TCP
Заголовок TCP имеет минимальную длину 20 байт (без опций) и содержит следующие поля:
- Порт источника (16 бит) — номер порта отправляющего приложения.
- Порт назначения (16 бит) — номер порта принимающего приложения.
- Порядковый номер (32 бита) — номер первого байта данных в сегменте.
- Номер подтверждения (32 бита) — номер следующего ожидаемого байта (используется только при установленном флаге ACK).
- Длина заголовка (4 бита) — длина заголовка в 32-битных словах (указывает начало данных).
- Резерв (3 бита) — зарезервировано для будущего использования.
- Флаги (9 бит) — управляющие биты: URG, ACK, PSH, RST, SYN, FIN и другие.
- Размер окна (16 бит) — количество байтов, которое получатель готов принять (управление потоком).
- Контрольная сумма (16 бит) — проверка целостности заголовка и данных.
- Указатель срочности (16 бит) — смещение до срочных данных (используется с флагом URG).
- Опции (переменная длина) — дополнительные параметры, такие как масштабирование окна, временные метки, выборочное подтверждение (SACK).
Управление потоком и перегрузкой
Управление потоком (Flow Control)
TCP использует механизм скользящего окна (sliding window) для предотвращения переполнения буфера получателя. Размер окна (window size) указывается получателем в каждом сегменте ACK. Отправитель не может передать больше данных, чем позволяет текущее окно.
Управление перегрузкой (Congestion Control)
Для предотвращения перегрузки сети TCP применяет несколько алгоритмов:
- Медленный старт (Slow Start) — после начала передачи или после тайм-аута окно перегрузки (cwnd) увеличивается экспоненциально (на 1 MSS за каждый полученный ACK) до порога (ssthresh).
- Предотвращение перегрузки (Congestion Avoidance) — после достижения ssthresh окно увеличивается линейно (на 1 MSS за каждый RTT).
- Быстрая повторная передача (Fast Retransmit) — если отправитель получает три одинаковых ACK, он немедленно повторно передаёт потерянный сегмент, не дожидаясь тайм-аута.
- Быстрое восстановление (Fast Recovery) — после быстрой повторной передачи окно перегрузки уменьшается, но не до 1 MSS, что позволяет быстрее восстановить скорость.
Порты и сокеты
TCP-соединение однозначно идентифицируется четырьмя параметрами: IP-адрес источника, порт источника, IP-адрес назначения, порт назначения. Эта комбинация называется сокетом (socket). Номера портов делятся на три диапазона:
- Хорошо известные порты (0–1023) — зарезервированы для стандартных служб (HTTP — 80, HTTPS — 443, FTP — 21, SSH — 22, SMTP — 25).
- Зарегистрированные порты (1024–49151) — используются приложениями, зарегистрированными в IANA.
- Динамические/частные порты (49152–65535) — временно назначаются клиентским приложениям.
Применение
TCP используется в большинстве приложений, требующих надёжной доставки данных:
- Веб-серфинг — HTTP и HTTPS.
- Электронная почта — SMTP, POP3, IMAP.
- Передача файлов — FTP, SFTP.
- Удалённый доступ — SSH, Telnet.
- Мессенджеры и потоковое аудио/видео — некоторые протоколы (например, XMPP, RTMP).
- Базы данных — клиент-серверные соединения (MySQL, PostgreSQL).
Ограничения и критика
Несмотря на широкое распространение, TCP имеет ряд недостатков:
- Накладные расходы — заголовок TCP (20–60 байт) и процедура установления/завершения соединения увеличивают задержку и трафик.
- Головная блокировка (Head-of-Line blocking) — потеря одного сегмента может задержать доставку всех последующих, даже если они уже получены.
- Неэффективность для реального времени — для приложений, чувствительных к задержкам (голосовая связь, видеоконференции), часто предпочтительнее протокол UDP.
- Сложность реализации — механизмы управления перегрузкой и потоком требуют тщательной настройки и могут вести к неоптимальной производительности в некоторых сценариях (например, в высокоскоростных сетях с большой задержкой).
Альтернативы
Для задач, где надёжность не критична или требуется минимальная задержка, используется UDP (User Datagram Protocol). Существуют также протоколы, сочетающие свойства TCP и UDP: QUIC (на базе UDP, разработан Google, используется в HTTP/3), SCTP (Stream Control Transmission Protocol) и DCCP (Datagram Congestion Control Protocol).
Интересные факты
- TCP был назван одним из самых важных изобретений в истории Интернета — в 2005 году Винтон Серф и Роберт Канн получили за его разработку Премию Тьюринга.
- Алгоритм медленного старта был впервые реализован в версии TCP Tahoe (1988 год), а алгоритм быстрого восстановления — в TCP Reno (1990 год).
- В современных операционных системах по умолчанию используется алгоритм управления перегрузкой Cubic (Linux) или Compound TCP (Windows).
- Максимальный размер окна TCP без масштабирования составляет 65535 байт, но с опцией масштабирования (RFC 1323) может достигать 1 Гбайт.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →