
580 Глава 6. Транспортный уровень
потребностях, запрашивает определенное количество буферов. Получатель вы-
деляет столько, сколько может. При отправлении каждого TPDU-модуля отпра-
витель должен уменьшать на единицу число буферов, а когда это число достиг-
нет нуля, он должен остановиться. Получатель отправляет обратно на попутных
TPDU-модулях отдельно подтверждения и информацию об имеющихся у него
свободных буферах.
На рис. 6.13 показан пример управления динамическим окном в дейтаграмм-
ной подсети с 4-битными порядковыми номерами. Предположим, что запрос на
предоставление буферов пересылается в отдельных TPDU-модулях, а не добира-
ется «автостопом» на попутных модулях. Вначале хост А запрашивает 8 буфе-
ров, но ему выделяется только 4. Затем он посылает три TPDU-модуля, из кото-
рых последний теряется. На шаге 6 хост А получает подтверждение получения
посланных им TPDU-модулей О и 1, разрешает хосту А освободить буферы и по-
слать еще три модуля (с порядковыми номерами 2, 3 и 4). Хост А знает, что TPDU-
модуль номер 2 он уже посылал, поэтому он думает, что может послать модули 3
и 4, что он и делает. На этом шаге он блокируется, так как его счетчик буферов
достиг нуля, и ждет предоставления новых буферов. На шаге 9 наступает тайм-
аут хоста А, так как он до сих пор не получил подтверждения для TPDU-моду-
ля 2. Этот модуль посылается еще раз. В строке 10 хост В подтверждает получе-
ние всех TPDU-модулей, включая 4-й, но отказывается предоставлять буферы
хосту А. Такая ситуация невозможна в протоколах с фиксированным размером
окна, описанных в главе 3. Следующий TPDU-модуль, посланный хостом В, раз-
решает хосту А передать еще один TPDU-модуль.
Сообщение
В Комментарии
1 —• < request 8 buffers>
2 <- <ack=15, buf = 4>
3 -> <seq = 0, data = m0>
4 ->• <seq = 1, data = m1>
5 -• <seq = 2, data = m2>
6 <— <ack = 1, buf = 3>
7 ->• <seq = 3, data = m3>
8 —• <seq = 4, data = m4>
9 —• <seq = 2, data = m2>
10 <- <ack = 4, buf = 0>
11 <- <ack = 4, buf=1>
12 <- <ack = 4, buf = 2>
13 —• <seq = 5, data = m5>
14 —• <seq = 6, data = m6>
15 <- <ack = 6, buf = 0>
16 ••• <ack = 6, buf = 4>
А хочет 8 буферов
В позволяет переслать только сообщения 0-3
У А теперь осталось 3 буфера
У А теперь осталось 2 буфера
Сообщения потерялось, но А думает,
что у него остался 1 буфер
В подтверждает получение модулей 0 и 1,
разрешает передать со 2-го по 4-й
У А остался буфер
У А осталось 0 буферов, и он должен остановиться
У А истекло время ожидания, и он передает еще раз
Все модули подтверждены, и он должен остановиться
Теперь А может послать модуль 5
В где-то нашел новый буфер
У А остался 1 буфер
А снова блокирован
А все еще блокирован
Потенциальный тупик
Рис. 6.13. Динамическое выделение буферов. Стрелками показано направление передачи.
Многоточие (...) означает потерянный TPDU-модуль
Элементы транспортных протоколов 581
Потенциальные проблемы при такой схеме выделения буферов в дейтаграмм-
ных сетях могут возникнуть при потере управляющего TPDU-модуля. Взгляни-
те на строку 16. Хост В выделил хосту А дополнительные буферы, но сообщение
об этом было потеряно. Поскольку получение управляющих TPDU-модулей не
подтверждается и, следовательно, управляющие TPDU-модули не посылаются
повторно по тайм-ауту, хост А теперь оказался блокированным всерьез и надол-
го. Для предотвращения такой тупиковой ситуации каждый хост должен перио-
дически посылать управляющий TPDU-модуль, содержащий подтверждение и
состояние буферов для каждого соединения. Это позволит в конце концов вы-
браться из тупика.
До сих пор мы по умолчанию предполагали, что единственное ограничение,
накладываемое на скорость передачи данных, состоит в количестве свободного
буферного пространства у получателя. По мере все продолжающегося снижения
цен на микросхемы памяти и винчестеры становится возможным оборудовать
хосты таким количеством памяти, что проблема нехватки буферов будет возни-
кать очень редко, если вообще будет возникать.
Если размер буферов перестанет ограничивать максимальный поток, возник-
нет другое узкое место: пропускная способность подсети. Если максимальная ско-
рость обмена кадрами между соседними маршрутизаторами будет х кадров в се-
кунду и между двумя хостами имеется k непересекающихся путей, то, сколько
бы ни было буферов у обоих хостов, они не смогут пересылать друг другу больше
чем kx TPDU-модулей в секунду. И если отправитель будет передавать с боль-
шей скоростью, то подсеть окажется перегружена.
Требуется механизм, основанный не столько на емкости буферов получателя,
сколько на пропускной способности подсети. Очевидно, управление потоком дол-
жен проводить отправитель, в противном случае у него будет слишком много не-
подтвержденных TPDU-модулей. В 1975 году Белснес (Belsnes) предложил ис-
пользовать схему управления потоком скользящего окна, в которой отправитель
динамически приводит размер окна в соответствие с пропускной способностью
сети. Если сеть может обработать с TPDU-модулей в секунду, а время цикла
(включая передачу, распространение, ожидание в очередях, обработку получате-
лем и возврат подтверждения) равно г, тогда размер окна отправителя должен
быть равен сг. При таком размере окна отправитель работает, максимально ис-
пользуя канал. Любое уменьшение производительности сети приведет к его бло-
кировке.
Для периодической настройки размера окна отправитель может отслеживать
оба параметра и вычислять требуемое значение. Пропускная способность может
быть определена простым подсчетом числа TPDU-модулей, получивших подтвер-
ждения за определенный период времени, и делением этого числа на тот же пе-
риод времени. Во время измерения отправитель должен посылать данные с мак-
симальной скоростью, чтобы удостовериться, что ограничивающим фактором
является пропускная способность сети, а не низкая скорость передачи. Время,
необходимое для получения подтверждения, может быть замерено аналогично.
Так как пропускная способность сети зависит от количества трафика в ней, раз-
мер окна должен настраиваться довольно часто, чтобы можно было отслеживать