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

RFC 793

RFC 793 — это документ, опубликованный в сентябре 1981 года Инженерным советом Интернета (IETF), который определяет спецификацию Протокола управления передачей (TCPTransmission Control Protocol). RFC 793 является одним из основополагающих стандартов стека протоколов TCP/IP, лежащего в основе работы глобальной сети Интернет. Документ описывает механизмы установления, поддержания и разрыва соединений, формат сегментов, алгоритмы управления потоком и обработки ошибок, а также процедуры тайм-аутов и повторной передачи данных.

История создания

Предпосылки разработки

В 1970-х годах в США активно развивалась сеть ARPANET, финансируемая Министерством обороны США. Изначально в ARPANET использовался протокол NCP (Network Control Protocol), который обеспечивал связь между узлами, но имел существенные ограничения: он не гарантировал доставку данных, не поддерживал мультиплексирование потоков и был привязан к конкретной сетевой архитектуре. В 1973 году Виктор Серф и Роберт Кан начали работу над новым протоколом, который должен был обеспечить надёжную передачу данных между разнородными сетями. Результатом их работы стал проект TCP, опубликованный в 1974 году в статье «A Protocol for Packet Network Intercommunication».

Эволюция спецификаций

Первая версия спецификации TCP была представлена в RFC 675 (декабрь 1974 года). В последующие годы протокол неоднократно дорабатывался и уточнялся. Ключевым этапом стало разделение функций TCP и IP (Internet Protocol), что было зафиксировано в RFC 760 (январь 1980 года) и RFC 761 (январь 1980 года). Однако эти документы всё ещё содержали неоднозначности и не полностью описывали все аспекты работы протокола.

Публикация RFC 793

В сентябре 1981 года вышла окончательная версия спецификации TCP — RFC 793. Автором документа выступила группа разработчиков под руководством Джона Постела (Jon Postel). RFC 793 объединил и систематизировал все предыдущие наработки, устранив противоречия и добавив новые механизмы, такие как алгоритм медленного старта (хотя в явном виде он был описан позже) и управление перегрузкой. С этого момента RFC 793 стал основным стандартом TCP, который используется до сих пор, хотя и был дополнен множеством последующих RFC (например, RFC 1122, RFC 5681, RFC 6298).

Структура и основные положения

Формат сегмента TCP

RFC 793 определяет структуру сегмента TCP, который состоит из заголовка и поля данных. Заголовок имеет фиксированную часть длиной 20 байт и может содержать опции (до 40 байт). Основные поля заголовка:

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

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

RFC 793 описывает процедуру установления соединения, известную как «трёхэтапное рукопожатие» (three-way handshake):

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

Этот механизм гарантирует, что обе стороны готовы к обмену данными и синхронизируют порядковые номера.

Передача данных и управление потоком

Протокол TCP обеспечивает надёжную доставку данных путём:

  • Нумерации байтов: каждый байт данных имеет порядковый номер, что позволяет обнаруживать потери и дубликаты.
  • Подтверждений: получатель отправляет сегменты с флагом ACK, указывая номер следующего ожидаемого байта.
  • Тайм-аутов и повторной передачи: если отправитель не получает подтверждение в течение заданного времени (RTO — Retransmission Timeout), он повторно отправляет неподтверждённые данные.
  • Управления потоком: получатель указывает в поле «Размер окна» количество байт, которое он готов принять, предотвращая переполнение буфера.

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

Для разрыва соединения используется процедура с четырьмя шагами (four-way handshake):

  1. Одна из сторон отправляет сегмент с флагом FIN.
  2. Другая сторона подтверждает FIN сегментом с флагом ACK.
  3. Затем вторая сторона отправляет свой FIN.
  4. Первая сторона подтверждает FIN-ACK.

После этого соединение закрывается. RFC 793 также описывает механизм полузакрытия (half-close), когда одна сторона прекращает отправку данных, но продолжает их приём.

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

Отсутствие защиты от перегрузки

Изначальная версия RFC 793 не содержала алгоритмов управления перегрузкой сети. Это приводило к коллапсу перегрузки (congestion collapse) в 1980-х годах, когда множество пакетов терялось из-за переполнения буферов маршрутизаторов. Впоследствии были разработаны алгоритмы медленного старта (RFC 2001, 1997) и предотвращения перегрузки (RFC 5681, 2009), которые стали обязательными для современных реализаций TCP.

Уязвимости безопасности

RFC 793 не предусматривал шифрования или аутентификации, что делало TCP уязвимым для атак типа «человек посередине» (MITM), подмены сегментов и предсказания порядковых номеров. В 1995 году была описана атака на предсказание ISN (RFC 1948), что привело к внедрению случайной генерации начальных номеров. Современные протоколы безопасности (TLS, IPsec) работают поверх TCP для защиты данных.

Неэффективность для некоторых приложений

TCP ориентирован на надёжную доставку, что приводит к задержкам и избыточности для приложений, где важна скорость, а не гарантия доставки (например, потоковое видео, онлайн-игры). Для таких случаев разработаны альтернативные протоколы (UDP, QUIC).

Влияние и наследие

Основа современных сетей

RFC 793 стал фундаментом для всех последующих версий TCP. Несмотря на многочисленные дополнения (RFC 1122, RFC 1323, RFC 2018, RFC 5681), основные принципы, заложенные в 1981 году, остаются неизменными. TCP используется в подавляющем большинстве интернет-приложений: веб-серфинг (HTTP/HTTPS), электронная почта (SMTP, IMAP), передача файлов (FTP), удалённый доступ (SSH) и многие другие.

Эволюция стандартов

После RFC 793 было опубликовано более 200 RFC, уточняющих и расширяющих протокол. Наиболее значимые из них:

  • RFC 1122 (1989) — требования к хостам Интернета, включая обязательные реализации TCP.
  • RFC 1323 (1992) — масштабирование окна и временные метки для высокоскоростных сетей.
  • RFC 2018 (1996) — выборочное подтверждение (SACK) для эффективной обработки множественных потерь пакетов.
  • RFC 5681 (2009) — обновлённые алгоритмы управления перегрузкой.

Современные реализации

Сегодня TCP реализован во всех основных операционных системах (Windows, Linux, macOS, iOS, Android) и встроен в ядра сетевых стеков. В России TCP используется в государственных информационных системах, корпоративных сетях и инфраструктуре Рунета. Спецификация RFC 793 переведена на русский язык и доступна в открытых источниках.

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

  • RFC 793 был напечатан на пишущей машинке и опубликован в виде бумажного документа. Электронная версия появилась позже.
  • Джон Постел, главный редактор RFC 793, также известен как автор RFC 791 (IP) и RFC 768 (UDP). Он внёс огромный вклад в развитие Интернета.
  • В 2011 году RFC 793 был включён в список «STD 7» (стандарт Интернета), что подтверждает его статус как одного из ключевых протоколов.

Источники

  • RFC 793 — Transmission Control Protocol (1981)
  • RFC 1122 — Requirements for Internet Hosts — Communication Layers (1989)
  • RFC 5681 — TCP Congestion Control (2009)
  • Postel, J. (1981). «Transmission Control Protocol». IETF.
  • Stevens, W. Richard (1994). «TCP/IP Illustrated, Volume 1: The Protocols». Addison-Wesley.

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

На главную BFOmetr →