TCP
TCP (Transmission Control Protocol, протокол управления передачей) — это один из основных протоколов транспортного уровня модели OSI и модели TCP/IP, обеспечивающий надёжную, упорядоченную и проверяемую на ошибки доставку потока данных между приложениями, работающими на узлах компьютерной сети. TCP является основой для большинства интернет-приложений, таких как веб-серфинг (HTTP/HTTPS), электронная почта (SMTP, IMAP, POP3) и передача файлов (FTP).
История
Разработка TCP началась в 1970-х годах в рамках проекта ARPANET, финансируемого Министерством обороны США. Первоначально протокол был частью единого стека TCP/IP, где TCP отвечал и за передачу, и за маршрутизацию. В 1974 году Винтон Серф и Роберт Кан опубликовали статью «A Protocol for Packet Network Intercommunication», в которой описали принципы работы протокола.
В 1978 году протокол был разделён на два независимых: TCP (транспортный уровень) и IP (сетевой уровень). В 1981 году была опубликована спецификация RFC 793, которая до сих пор является основным стандартом TCP. В последующие десятилетия протокол неоднократно дополнялся и уточнялся, в частности, были добавлены механизмы управления перегрузкой (RFC 2001, RFC 5681), улучшена производительность для высокоскоростных сетей (RFC 3649) и введены расширения для мобильных устройств (RFC 793, обновления).
Принцип работы
TCP работает как протокол с установлением соединения (connection-oriented). Перед началом передачи данных между двумя узлами устанавливается логическое соединение — сессия. После завершения передачи соединение разрывается. Основные этапы работы TCP:
- Установление соединения (тройное рукопожатие):
- Клиент отправляет серверу SYN-пакет (synchronize) с начальным порядковым номером (ISN).
- Сервер отвечает SYN-ACK-пакетом (synchronize-acknowledge), подтверждая получение SYN и отправляя свой ISN.
- Клиент отправляет ACK-пакет (acknowledge), подтверждая получение SYN-ACK. Соединение считается установленным.
- Передача данных: Данные разбиваются на сегменты, каждый из которых получает порядковый номер. Получатель отправляет подтверждения (ACK) о получении каждого или нескольких сегментов. Если подтверждение не получено в течение тайм-аута, отправитель повторно передаёт сегмент.
- Завершение соединения: Для разрыва соединения используется четырёхэтапное рукопожатие (FIN-пакеты). Одна сторона отправляет FIN (finish), другая подтверждает его ACK, затем отправляет свой FIN, и первая сторона подтверждает его.
Ключевые характеристики
Надёжность
TCP гарантирует доставку данных в том же порядке, в котором они были отправлены. Механизмы контроля включают:
- Порядковые номера: каждый байт данных нумеруется, что позволяет восстановить порядок и обнаружить потери.
- Подтверждения (ACK): получатель отправляет ACK с номером следующего ожидаемого байта.
- Тайм-ауты и повторная передача: при отсутствии ACK в заданный срок отправитель повторяет отправку.
- Контрольная сумма: каждый сегмент содержит контрольную сумму для обнаружения ошибок при передаче.
Управление потоком
TCP использует механизм «скользящего окна» (sliding window). Получатель сообщает отправителю размер своего буфера (окно приёма), ограничивая объём данных, который может быть отправлен без подтверждения. Это предотвращает переполнение буфера получателя.
Управление перегрузкой
Для предотвращения коллапса сети TCP динамически регулирует скорость отправки данных. Основные алгоритмы:
- Медленный старт (Slow Start): после начала передачи или потери пакета скорость отправки экспоненциально увеличивается до порога.
- Предотвращение перегрузки (Congestion Avoidance): после достижения порога скорость растёт линейно.
- Быстрая повторная передача (Fast Retransmit): при получении трёх одинаковых ACK отправитель немедленно повторно отправляет потерянный сегмент, не дожидаясь тайм-аута.
- Быстрое восстановление (Fast Recovery): после быстрой повторной передачи скорость отправки снижается, но не до нуля.
Структура сегмента TCP
Сегмент TCP состоит из заголовка (обычно 20 байт, может быть больше с опциями) и поля данных.
| Поле | Размер (бит) | Описание |
|---|---|---|
| Порт источника | 16 | Номер порта отправителя |
| Порт назначения | 16 | Номер порта получателя |
| Порядковый номер | 32 | Номер первого байта данных в сегменте |
| Номер подтверждения | 32 | Номер следующего ожидаемого байта (если установлен флаг ACK) |
| Смещение данных | 4 | Длина заголовка в 32-битных словах |
| Зарезервировано | 3 | Зарезервировано для будущего использования |
| Флаги | 9 | Набор управляющих битов (URG, ACK, PSH, RST, SYN, FIN и др.) |
| Размер окна | 16 | Размер окна приёма отправителя |
| Контрольная сумма | 16 | Контрольная сумма заголовка и данных |
| Указатель срочности | 16 | Указывает на последний байт срочных данных (если установлен флаг URG) |
| Опции | 0-320 | Дополнительные параметры (например, масштабирование окна, временные метки) |
| Данные | переменный | Полезная нагрузка |
Понятие порта
Для идентификации конкретного приложения на узле TCP использует номера портов. Порт — это 16-битное число (от 0 до 65535). Порты делятся на три диапазона:
- Хорошо известные порты (0–1023): зарезервированы для стандартных служб (например, 80 — HTTP, 443 — HTTPS, 25 — SMTP).
- Зарегистрированные порты (1024–49151): используются для приложений, зарегистрированных в IANA.
- Динамические/частные порты (49152–65535): временно назначаются клиентским приложениям при установлении соединения.
Сравнение с UDP
Основным альтернативным протоколом транспортного уровня является UDP (User Datagram Protocol). В отличие от TCP, UDP не устанавливает соединение, не гарантирует доставку и не контролирует порядок пакетов. TCP предпочтителен для приложений, где важна надёжность (веб, почта, файлы), а UDP — для приложений, где критична скорость и допустимы потери (видеозвонки, онлайн-игры, DNS).
Применение
TCP используется практически во всех интернет-протоколах прикладного уровня, требующих надёжной передачи:
- HTTP/HTTPS: передача веб-страниц и данных.
- FTP: передача файлов.
- SMTP, IMAP, POP3: отправка и получение электронной почты.
- SSH: удалённое управление серверами.
- Telnet: протокол удалённого терминала.
- BitTorrent: пиринговый обмен файлами (частично использует UDP, но трекеры и метаданные часто передаются по TCP).
Недостатки
Несмотря на широкое распространение, TCP имеет ряд ограничений:
- Накладные расходы: установление соединения, подтверждения и повторные передачи увеличивают задержку и объём служебного трафика.
- Чувствительность к задержкам: для приложений реального времени (VoIP, видеоконференции) TCP менее эффективен, чем UDP.
- Проблема «головы очереди» (Head-of-Line Blocking): если один сегмент потерян, все последующие сегменты, даже если они уже получены, не будут переданы приложению до повторной отправки потерянного.
- Медленный старт: начальная скорость передачи может быть низкой, что критично для коротких сессий.
Интересные факты
- Протокол TCP был назван в честь Винтона Серфа и Роберта Кана, которые получили за его разработку Премию Тьюринга в 2004 году.
- Размер окна TCP (16 бит) изначально ограничивал максимальный объём неподтверждённых данных до 65 535 байт. Для высокоскоростных сетей было введено масштабирование окна (Window Scaling), позволяющее увеличить его до 1 ГБ.
- Алгоритм медленного старта был разработан после того, как в 1986 году произошёл первый крупный коллапс сети ARPANET из-за перегрузки.
Источники
- RFC 793 — Transmission Control Protocol (основной стандарт).
- RFC 1122 — Requirements for Internet Hosts — Communication Layers.
- RFC 5681 — TCP Congestion Control.
- RFC 7323 — TCP Extensions for High Performance.
- Стивенс, У. Р. «TCP/IP Illustrated, Volume 1: The Protocols» (1994).
- Таненбаум, Э., Уэзеролл, Д. «Компьютерные сети» (5-е издание, 2012).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →