Скользящее окно TCP
Скользящее окно TCP — это механизм управления потоком данных и обеспечения надёжности в протоколе управления передачей (TCP), который позволяет отправителю передавать несколько сегментов данных без ожидания подтверждения (ACK) для каждого из них, при этом ограничивая объём неподтверждённых данных фиксированным размером окна. Данный метод повышает пропускную способность сети за счёт конвейерной обработки, предотвращая перегрузку приёмника и сети в целом.
История и развитие
Механизм скользящего окна был разработан в 1970-х годах в рамках создания протокола TCP для ARPANET, предшественника современного Интернета. Первоначальная спецификация TCP (RFC 793, 1981 год) описывала фиксированный размер окна в 16 бит, что ограничивало максимальный объём неподтверждённых данных 65 535 байтами. С ростом скоростей передачи данных (например, в сетях Gigabit Ethernet) это ограничение стало узким местом. В 1992 году был предложен механизм масштабирования окна TCP (RFC 1323, позже обновлён в RFC 7323), который позволил увеличить размер окна до 1 Гбайт, используя опцию TCP «Window Scale» при установке соединения. В последующие десятилетия алгоритмы скользящего окна были дополнены механизмами управления перегрузкой (TCP Reno, TCP Cubic, BBR), которые динамически регулируют размер окна в зависимости от состояния сети.
Принцип работы
Скользящее окно TCP базируется на концепции последовательной нумерации байтов передаваемых данных. Каждый байт имеет уникальный порядковый номер (sequence number). Отправитель ведёт три указателя:
- Отправлено и подтверждено (LastByteAcked) — последний байт, на который получено подтверждение.
- Отправлено, но не подтверждено (LastByteSent) — последний байт, отправленный в сеть.
- Готово к отправке (NextByteToSend) — следующий байт, который можно отправить.
Размер окна (Window Size) определяется приёмником и указывает, сколько байтов отправитель может передать без получения подтверждения. Приёмник в каждом сегменте TCP (в поле «Window» заголовка) сообщает текущий размер своего свободного буфера. Отправитель не может превысить этот лимит. Когда приходит подтверждение (ACK), указатель LastByteAcked сдвигается вперёд, и окно «скользит», освобождая место для новых данных.
Пример работы
- Отправитель передаёт сегменты 1, 2, 3 (размер окна = 3).
- Приёмник подтверждает получение сегментов 1 и 2 (ACK = 3).
- Окно сдвигается: отправитель может передать сегменты 4 и 5, но не более размера окна.
- Если подтверждение задерживается или теряется, отправитель останавливается, когда окно заполняется.
Виды и модификации
Статическое окно
Базовый вариант, где размер окна фиксирован на протяжении соединения. Используется в простых реализациях, но неэффективен при переменной загрузке сети.
Динамическое окно
Размер окна изменяется в зависимости от состояния сети и приёмника. Современные реализации TCP используют алгоритмы управления перегрузкой (Congestion Control), которые вводят дополнительное окно перегрузки (Congestion Window, cwnd). Реальный размер окна определяется как минимум от двух значений: окна, объявленного приёмником (rwnd), и окна перегрузки (cwnd). Это позволяет избежать перегрузки сети.
Масштабирование окна (Window Scaling)
Опция TCP, позволяющая умножать объявленный размер окна на коэффициент (от 0 до 14). Например, при коэффициенте 7 размер окна может достигать 65 535 × 128 = 8 388 480 байт. Эта опция согласовывается при трёхэтапном рукопожатии (SYN, SYN-ACK, ACK) и остаётся фиксированной на всё соединение.
Выборочное подтверждение (SACK)
Дополнительный механизм, работающий совместно со скользящим окном. Позволяет приёмнику сообщать отправителю о получении отдельных сегментов, а не только последнего непрерывного. Это уменьшает количество повторных передач при потерях пакетов.
Управление потоком и перегрузкой
Скользящее окно выполняет две ключевые функции:
- Управление потоком (Flow Control) — предотвращает переполнение буфера приёмника. Приёмник объявляет размер окна (rwnd) в каждом сегменте. Если буфер заполнен, он устанавливает rwnd = 0, и отправитель прекращает передачу до получения нового окна (используется механизм «persist timer»).
- Управление перегрузкой (Congestion Control) — предотвращает перегрузку сети. Алгоритмы (например, медленный старт, избегание перегрузки) динамически регулируют cwnd. При обнаружении потери пакета (по тайм-ауту или тройному дублированному ACK) cwnd уменьшается, что снижает скорость передачи.
Характеристики и ограничения
- Размер окна — максимальный объём неподтверждённых данных. Типичные значения: от 64 Кбайт (без масштабирования) до нескольких мегабайт (с масштабированием).
- Задержка — при большом окне и высокой задержке (например, спутниковые каналы) возможна ситуация, когда отправитель долго не получает подтверждения, что снижает эффективность.
- Потери пакетов — при потере одного сегмента в окне отправитель может повторно передать только его (при использовании SACK) или все неподтверждённые сегменты (в старых реализациях).
- Производительность — для максимальной пропускной способности размер окна должен быть не меньше произведения пропускной способности канала на задержку (Bandwidth-Delay Product, BDP).
Применение
Скользящее окно TCP является основой для всех современных сетевых приложений, работающих поверх TCP/IP: веб-серфинг (HTTP/HTTPS), электронная почта (SMTP, IMAP), передача файлов (FTP), потоковое видео (YouTube, Netflix), удалённый доступ (SSH, RDP) и многие другие. Без этого механизма надёжная передача данных в Интернете была бы невозможна из-за низкой эффективности.
Критика и альтернативы
Основной недостаток скользящего окна TCP — его чувствительность к потерям пакетов и задержкам. В высокоскоростных сетях с большими задержками (например, спутниковые или межконтинентальные каналы) классические алгоритмы управления перегрузкой могут приводить к неоправданному снижению пропускной способности. Альтернативные протоколы, такие как QUIC (разработан компанией Google, используется в HTTP/3), используют схожие принципы управления потоком, но работают поверх UDP и имеют улучшенные механизмы обработки потерь и мультиплексирования. В России QUIC применяется в некоторых сервисах, но его использование регулируется общими нормами законодательства о связи.
Интересные факты
- Размер окна TCP может быть «нулевым» — это сигнал приёмника о том, что его буфер полностью заполнен. Отправитель периодически отправляет зондирующие сегменты (Window Probe), чтобы проверить, освободилось ли место.
- В ранних реализациях TCP (до 1980-х годов) размер окна был жёстко зафиксирован, и при потере пакета приходилось повторно передавать все данные, начиная с потерянного сегмента (Go-Back-N). Современные реализации используют выборочное подтверждение (SACK), что значительно эффективнее.
- Механизм скользящего окна используется не только в TCP, но и в других протоколах, например, в HDLC (High-Level Data Link Control) и в некоторых версиях протокола SCTP.
Источники
- RFC 793 — Transmission Control Protocol (1981)
- RFC 1323 — TCP Extensions for High Performance (1992)
- RFC 7323 — TCP Extended Window Scale Option (2014)
- RFC 2018 — TCP Selective Acknowledgment Options (1996)
- Стивенс, У. Р. «TCP/IP Illustrated, Volume 1: The Protocols» (1994)
- Таненбаум, Э., Уэзеролл, Д. «Компьютерные сети» (5-е издание, 2012)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →