4.2.3.3 Когда передавать Window Update
Протокол TCP должен включать алгоритм предотвращения SWS на приемной стороне [RFC813].
- Реализация
Алгоритм предотвращения SWS на приемной стороне определяет когда может быть анонсировано расширение правого края окна (обновление окна — updating the window). Этот алгоритм используют совместно с задержкой подтверждений ACK (см. 4.2.3.2) для определения момента передачи получателю сегмента ACK, содержащего текущее окно. При описании мы будем использовать обозначения, принятые в RFC 793 (см. рис. 4 и 5 в этом документе).
Решением для приемной стороны является предотвращение анонсов смещения правого края окна RCV.NXT+RCV.WND с небольшим инкрементом даже при получении из сети мелких сегментов.
Предположим, что на приемной стороне имеется буфер RCV.BUFF. В любой момент времени RCV.USER октетов из этого буфера может быть связано с данными, которые уже получены и подтверждены, но еще не восприняты пользовательским процессом. Когда соединение находится в статичном состоянии, RCV.WND = RCV.BUFF и RCV.USER = 0.
Сохранение правого края окна неподвижным при получении и подтверждении данных требует чтобы приемник анонсировал пространство, которое меньше его реального буфера, т. е., приемник должен задавать значение RCV.WND, которое позволит сохранить постоянной сумму RCV.NXT+RCV.WND при возрастании RCV.NXT. Таким образом, общее пространство буфера RCV.BUFF в общем случае делится на три части:
|<------- RCV.BUFF ---------------->| 1 2 3 ----|---------|------------------|------|---- RCV.NXT ^ (Fixed)
- RCV.USER — полученные, но не воспринятые приложением данные;
- RCV.WND — пространство, анонсируемое отправителю;
- Reduction — доступное, но еще не анонсированное пространство.
Предлагаемый алгоритм предотвращения SWS для приемной стороны сохраняет фиксированное значение RCV.NXT+RCV.WND до тех пор, пока выполняется условие:
RCV.BUFF - RCV.USER - RCV.WND >= min( Fr * RCV.BUFF, Eff.snd.MSS )
гле Fr — часть, рекомендуемое значение которой составляет 1/2, а Eff.snd.MSS — эффективное значение MSS для передачи в данном соединении (см. 4.2.2.6). При выполнении условий неравенства устанавливается RCV.WND = RCV.BUFF-RCV.USER.
Отметим, что общим эффектом этого алгоритма является анонсирование RCV.WND с инкрементом Eff.snd.MSS (для разумных буферов на приемной стороне Eff.snd.MSS < RCV.BUFF/2). Отметим также, что приемная сторона должна использовать свое значение Eff.snd.MSS, предполагая, что оно совпадает со значением для передающей стороны.