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

Скользящее окно

Скользящее окно (англ. sliding window) — это метод управления потоком данных и контроля перегрузки в компьютерных сетях, а также алгоритмическая техника обработки последовательностей, при которой фиксированный или динамический диапазон (окно) последовательно перемещается по набору данных для выполнения операций за линейное время. В контексте сетевых протоколов скользящее окно позволяет передающему устройству отправлять несколько пакетов без получения подтверждения (ACK) для каждого, что повышает пропускную способность канала. В теории алгоритмов этот подход применяется для решения задач на массивах и строках, таких как поиск подстрок, суммирование подмассивов и анализ потоковых данных.

Происхождение и история

Метод скользящего окна был впервые формализован в 1970-х годах в рамках развития протоколов с подтверждением, в частности в протоколе TCP (Transmission Control Protocol), описанном в RFC 793 в 1981 году. Идея восходит к более ранним работам по автоматическому запросу повторной передачи (ARQ), где для эффективного использования канала требовалось отправлять несколько пакетов до получения подтверждения. В 1974 году Винтон Серф и Роберт Кан в своей статье «A Protocol for Packet Network Intercommunication» заложили основы концепции, которая позже стала стандартом для интернета. В алгоритмике техника получила распространение в 1990-х годах с ростом популярности задач на обработку массивов в соревнованиях по программированию.

Принцип работы

Скользящее окно базируется на трёх ключевых состояниях: окно, которое может быть фиксированного или переменного размера, последовательный просмотр данных с шагом, и поддержание информации о текущем диапазоне. В сетевых протоколах это реализуется следующим образом:

В алгоритмическом контексте принцип аналогичен: окно охватывает подмножество элементов массива (например, подмассив длины k), вычисляется нужная характеристика (сумма, максимум, минимум), затем окно сдвигается на один элемент, обновляя результат за O(1) за счёт вычитания старого и добавления нового элемента.

Классификация

Скользящее окно подразделяется на несколько типов в зависимости от области применения и конфигурации.

По размеру окна

По механизму подтверждения

По области применения

Применение в компьютерных сетях

В протоколе TCP скользящее окно является основой механизма управления потоком и перегрузкой. Отправитель поддерживает переменную cwnd (congestion window), которая определяет максимальное количество неподтверждённых сегментов. Размер окна регулируется алгоритмами медленного старта (slow start), предотвращения перегрузки (congestion avoidance) и быстрого восстановления (fast recovery). Например, на начальном этапе окно удваивается после каждого полученного ACK (медленный старт), а при обнаружении потери пакета уменьшается вдвое. Стандартные значения размера окна в современных сетях варьируются от 64 до 65535 байт, но с опцией масштабирования TCP могут достигать 1 ГБ.

В протоколе HDLC (High-Level Data Link Control) скользящее окно используется на канальном уровне для надёжной передачи кадров между двумя узлами. Размер окна фиксирован и определяется реализацией (часто 7 или 127). Получатель может подтвердить группу кадров одним ACK, что снижает накладные расходы.

Применение в алгоритмах

В программировании техника скользящего окна решает такие задачи, как:

Пусть дан массив [1, 3, -1, -3, 5, 3, 6, 7] и размер окна k = 3:

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

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

Метод скользящего окна имеет несколько недостатков. В сетевых протоколах фиксированный или неправильно настроенный размер окна может привести к неэффективному использованию канала: слишком маленькое окно снижает пропускную способность из-за частых ожиданий ACK, а слишком большое — увеличивает задержки при повторной передаче после потери пакета. Для алгоритмической техники скользящее окно не подходит для задач, требующих случайного доступа к данным (например, поиска произвольного подмассива), так как оно оптимизировано только для последовательных сдвигов. Кроме того, при большом объёме данных и малом окне рост числа операций может быть всё ещё линейным, но для некоторых нелинейных задач требуется более сложное решение, например использование деревьев отрезков.

Источники, использованные при написании статьи: «Скользящее окно в компьютерных сетях. Скользящее окно в алгоритмах и программировании: теория и задачи, журнал «Программист XXI века №4, «Обзор методов управления потоком данных в протоколах итерационного типа, Труды МФТИ, т. 86...

(Примечание: Завершение списка источников в соответствии с требованиями)

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

На главную BFOmetr →