tanenbaum_seti_all.pages (525408), страница 172
Текст из файла (страница 172)
Здесь может быть прил1енсна та же стратегия (на рис. 6.37 это не показано). Наконец, сетевой уровень передает полученный в результате пакет уровню передачи данных для отправки. Чтобы увидеть, как работает этот принцип на практике, рассмотрим случай ТСР/1Р. На рис. 6.38, а изображен ТСР-заголовок. Поля, одинаковые для заголовков послелующих ТР1)()-модулей в однонаправленном потоке, затенены. Все, что нужно сделать передающей транспортной сущности, это скопировать пять слов заголовка-прототипа в выходной буфер, заполнить поле порядкового номера (скопировав одно слово), сосчитать контрольную сумму и увеличить па единицу значение переменной, храпящей текущий порядковый номер. Затем она может передать заголовок и данные специальной 1Р-процедуре, предназначенной для отправки стандартного максимального ТРР()-модуля.
Затем 1Р-процедура копирует свой заголовок-прототип из пяти слов (см. рис, 6.38, б) в буфер, заполняет поле Иденгпификатор и вычисляет контрольную сумму заголовка. Теперь пакет готов к передаче. 646 Глава В. Транспортный уровень Рассмотрим тспсрь быстрый путь обработки пакета получающей стороной на рис. 6.37. Первый шаг состоит в нахождении для пришедшего ТРПТ)-модуля записи соединения. В протоколе ТСР запись соединения может храниться в хэштаблице, ключом к которой является какая-нибудь простая функция двух 1Р-адресов и двух портов. После обнаружения записи соединения следует проверить адреса и номера портов, чтобы убедиться, что найдена верная запись. Рис.
6.3В. ТСР-заголовок (а); )Р-заголовок (б). В обоих случаях затененные поля взяты у прототипа без изменений Процесс поиска нужной записи можно дополнительно ускорить, если установить указатель на последнюю использовавшуюся запись и сначала проверить ее. Кларк с соавторами книги, вышедшей в 1989 году, исследовал этот вопрос и пришел к выводу, что в этом случае доля успешных обращений превысит 90 %. Другие эвристические методы поиска описаны в (МсКеппеу и Поуе, 1992).
Затем ТРП13-модуль проверяется на адекватностгс соединение в состоянии ЕБТАВ715НЕР, ни одна сторона не пытается его разорвать, ТР01)-модуль является полным, специальные флаги пе установлены, и порядковый номер соответствует ожидающемуся. Программа, выполняющая всю эту проверку, состоит из довольно значительного количества инструкций. Если все эти условия удовлетворяются, вызывается специальная процедура быстрого пути ТСР-уровня.
Процедура быстрого пути обновляет запись соединения и копирует данные пользовател)о. Во время копирования она одновременно подсчитывает контрольную сумму, что уменьшает количество циклов обработки данных. Если контрольная сумма верна, запись соединения обновляется и отправляется подтверждение. Метод, реализованный в виде отделыюй процедуры, сначала производящей быструю проверку заголовка, чтобы убедиться, что заголовок именно такой, какой ожидается, называется предсказанием заголовка. Он применяется в большинстве реализаций протокола ТСР. Использование этого метода оптимизации вместе с остальными, описанными в данном разделе, позволяет протоколу ТСР достичь 90 % от скорости локального копирования из памяти в память при условии, что сама сеть достаточно быстрая.
Две другие области, в которых возможны основные улучшения производительности, — это управление буферами и управление таймерами. Как уже было сказано, при управлении буферами следует пытаться избегать излишнего копирования. При управлении таймерами следует учитывать, что они почти никогда не срабатывают. Они предназначены для обработки нестандартного случая по- Вопросы производительности 647 Гнездо Указатель на список таймеров для Т+ 12 0 1 2 3 4 в 6 Т 8 9 10 11 12 13 14 19 Текущее время, Т Указатель на список таймеров для Т+ 3 Указатель на список таймеров для 7+ ~10 Рис.
6.39. Колесо времени терь ТР1Н7-модулсй, но большинство ТР1111-модулей и их подтверждений прибывают успешно, и поэтому истечение периода ожидания является редким событием. В программе таймеры обычно реализуются в виде связанного списка таймеров, отсортированного по времени срабатывания..Заглавный элемент списка содержит счетчик, хранящий число минимальных интервалов времени, оставшихся до истечения периода ожидания. В каждом последующем элементе списка содержится счетчик, указывающий, через какой интервал времени относительно предыдущего элемента списка истечет время ожидания данного таймера. Например, если таймеры сработают чсрез 3, 10 и 12 интервалов времени, счетчики списка будут содержать значения 3, 7 и 2 соответственно.
При каждом импульсе сигнала времени часов счетчик головного элемента списка уменыпается на единицу. Когда значение счетчика достигает нуля, обрабатывается связанное с этим таймером событие, а головным элементом списка становится следующий элемент. При такой схеме добавление и удаление таймера является операцией, требующей затрат ресурсов, при этом время выполнения операции пропорционально длине списка.
Если максимальное значение таймера ограничено и известно заранее, то может быть применен более эффективный метод. Здесь можно использовать массив, называющийся колесом времени (рис. 6.39). Каждое гнездо соответствует одному импульсу сигнала времени. Тскузцее время, показанное на рисунке,— Т=4. Таймеры должны сработать через 3, 10 и 12 импульсов сигнала времени.
Если новый таймер должен сработать через 7 тиков, то все, что нужно сделать,— задать значение указателя в гнезде 11 на новый список таймеров. Аналогично, если таймер, установленный на время Т 4 10, должен быть отключсн, нужно всего лишь обнулить запись в гнезде 14. Обратите внимание на то, что массив на рис. 6.39 не может поддерживать таймеры за пределами Т+ 15. 643 Глава 6. Транспортный уровень При каждом импульсе сигнала времени часов указатсль текущего времени перемещается по колссу времени внсрсд (циклично) на одно гнездо.
Если гнездо, на которое он указывает, не нулевое, обрабатываются все таймеры списка, на который указывает гнездо. Многочисленные варианты основной илси обсуждаются в (ЧагйЬезе и ).энск, 1989). Протоколы для гигабитных сетей Появление гигабптных сетей приходится на начало 90-х годов. Сначала к ним пытались применить старые протоколы, но при этом сразу жс возникло множество проблем. Некоторые из этих проблем, а также мстоды их решения в протоколах будущих, даже болсс быстрых, сетей будут обсуждаться в данном разделе. Первая проблема заключается в том, что многие протоколы используют 32-разрядные порядковые номера. В прежние годы, когда типичная скорость выделенных линий между маршрутизаторами равнялась 56 Кбит/с, хосту, который, бешено вращая глазами, постоянно выдавал бы данные в сеть, потребовалось бы болыпс недели на то, чтобы у него закончились порядковые номера.
С точки зрения разработчиков ТСР, 2з' считалось неплохим приближснисм к бесконечности, поскольку вероятность блуждания пакетов по сети в течение недели практически равна нулю. В Е111сгпсг со скоростью 10 Мбит/с критическое время снизилось с одной недели до 57 минут.
Это, конечно, гораздо меньше, но даже с таким интервалом сщс можно иметь дело. Когда жс Е11чегпсг выдаст в Интернет данные со скоростью 1 Гбит/с, порядковые номера закончатся примерно через 34 с. Это уже никуда нс годится, поскольку максимальное время жизни пакета в Интернете равно 120 с. Внезапно оказалось, что 2" совер|пенно не подходит в качестве значения, приближенного к бесконечности, поскольку стало очевидно, что отправителях посылающему достаточно много пакетов, придется повторять их порядковые номера в то время, как старые пакеты все сше будут блуждать по сети. В КРС 1323 предлагается метод борьбы с этой ситуацией. Проблема состоит в том, что многие разработчики протоколов просто предполагали, что время цикла пространства порядковых номеров значительно превосхолит максимальное время жизни пакетов.
Соответственно, в этих протоколах даже не рассматривалась сама возможность того, что старые пакеты еще могут находиться глс-то в сети, когда порядковые номера опишут полный круг. В гига- битных сетях это предположение оказалось неверным. Вторая проблсма возникла, когда выяснилось, что скорости передачи данных увеличиваются значительно быстрее, чем скорости обработки данных. (Обращение к разработчикам компьютеров; идите и побейте разработчиков средств связи! Мы рассчитываем на вас.) В 70-е годы объединенная сеть АКРАКЕТ работала на скорости 56 Кбит/с и состояла из компьютеров с производительностью около 1 М1Р3 (1 млн инструкций в секунду).
Использовались пакеты размером 1008 бит — таким образом, сеть АКРАХЕТ могла доставлять около 56 пакетов в секунду. Поскольку время передачи пакета составляло около 18 мс, хост мог затратить 18 000 инструкций на обработку одного пакета. Конечно, это полностью загрузило бы цснтральпый процессор, однако можно было снизить это число до Вопросы производительности 649 9000 инструкций при половинной занятости процессора, предоставляя ему возможность выполнять всю необходимую работу. Сравните эти пифры с цифрами лля современных компьютеров, имеющих производительность 1000 М1РБ и обменивающихся 1500-байтными пакетами по гигабитной линии.
Пакеты могут прибывать с частотой свьпце 80 000 пакетов и секунду, поэтому, если мы хотим зарсзервировать половину мощности процессора для приложений, обработка пакета должна быть завершена за 6,25 мкс. За это время компьютер с производительностью 1000 млп инструкций в секунду может выполнить 6250 инструкций — лишь треть того, что было доступно хостам сети АКРАХЕТ. Более того, современные К18С-инструкции выполняют меньше действий, чем старые С1ЯС-инструкции, так что проблема, на самом деле, оказывается еще тяжелее, Отсюда можно сделать следующий вывод: у протокола осталось меньше времени на обработку пакстов, поэтому протоколы должны стать проще. Третья проблема состоит в том, что протокол с возвратом на и плохо работает в линиях с большим значением произведения пропускной способности на задержку.