Механизм контроля перегрузок в TCP
В этом разделе мы вновь возвращаемся к протоколу TCP. Как вы знаете (см. раздел «Протокол TCP — передача с установлением соединения»), TCP предоставляет службу надежной передачи данных прикладным процессам, выполняющимся на разных хостах. Другим ключевым компонентом протокола TCP является механизм контроля перегрузок. В предыдущем разделе мы отметили, что TCP осуществляет контроль перегрузок самостоятельно, поскольку протокол сетевого уровня IP не имеет механизмов поддержания явной обратной связи между сетевыми устройствами и оконечными системами, которые позволили бы информировать отправителей о наличии перегрузок в сети.
Подход, применяемый в TCP, заключается в ограничении скорости передачи источников в зависимости от наблюдаемой перегрузки. Если перегрузки в сети не наблюдаются, источник может увеличивать скорость передачи; в противном случае скорость передачи принудительно снижается. При подобном подходе возникают три вопроса. Во-первых, каким образом ограничить скорость передачи данных источником? Во-вторых, как источник может определить наличие перегрузки на пути между ним и приемником? В-третьих, каков алгоритм изменения скорости передачи в зависимости от перегрузки? Мы рассмотрим эти вопросы на примере алгоритма Reno, использующегося в современных операционных системах для контроля перегрузки ТСР-соединений. Для определенности будем считать, что источник осуществляет передачу большого файла данных.
Сначала рассмотрим, каким образом в TCP удается ограничивать скорость передачи данных. Как мы узнали из раздела «Протокол TCP — передача с установлением соединения», каждая сторона TCP-соединения состоит из буферов передачи и приема, а также набора переменных (LasttByteRead, RcvWindow и т. д.). Механизм контроля перегрузки использует дополнительную переменную CongWin, называемую окном перегрузки. Окно перегрузки влияет на скорость передачи данных в сеть следующим образом: объем неподтвержденных данных, которые может передать источник, не превышает минимального из значений CongWin и RcvWindow, то есть выполняется неравенство
LastByteSent — LastByteAcked < min{CongWin, RcvWindow}.
Для того чтобы наглядно представить разницу между контролем перегрузок и контролем потока, предположим, что объем приемного буфера TCP настолько велик, что ограничение, накладываемое окном приема, можно считать несущественным. Таким образом, количество неподтвержденных данных определяется только переменной CongWin.
Ограничение объема неподтвержденных данных косвенно влияет на скорость передачи источника. Представьте себе соединение, в котором отсутствуют потери и задержки пакетов. Если в начале времени оборота источнику разрешается передача CongWin байтов, а по истечении времени оборота он получает квитанции для переданных данных, то скорость его передачи равна отношению CongWin ко времени оборота. Таким образом, меняя значение CongWin, протокол TCP может регулировать скорость передачи данных через соединение.
Теперь рассмотрим, каким образом TCP определяет наличие перегрузок на пути соединения. Введем событие «потеря пакета», наступающее по истечении интервала ожидания или при получении тройного подтверждения от принимающей стороны.
При значительных перегрузках в сети буферы одного или нескольких маршрутизаторов переполняются, что приводит к потере дейтаграммы. Потеря дейтаграммы обнаруживается источником при наступлении события «потеря пакета», то есть по истечении интервала ожидания либо при получении трех дублирующих квитанций. Потеря пакета является признаком перегрузок в сети.
Итак, мы приступаем к рассмотрению алгоритма, используемого передающей стороной TCP для регулирования скорости передачи в зависимости от наличия перегрузок в сети. Этот алгоритм обычно называют алгоритмом контроля перегрузки протокола TCP. В нем выделяют три основные составляющие: аддитивное увеличение вместе с мультипликативным уменьшением, медленный старт, реакция на истечение интервала ожидания.
дайте подробную информацию пожалуйста