1. Что такое активные сети?
2. Как распространять программы?
3. Как исполнять программы?
4. Как устанавливать доступ к ресурсам узла?
5. Как обеспечить безопасность?
6. Как перейти от Internet к активной сети?
7. Где использовать активные сети?
Заключение

"Сеть - это компьютер"
Sun Microsystems

Хотя в эпиграф и вынесены слова, ставшие девизом компании Sun Microsystems, в статье речь пойдет вовсе не о ее разработках. Хотелось бы рассказать об исследованиях, которые финансирует ARPA и проводят известные исследовательские организации США в области активных сетей (Active network).

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

1. Что такое активные сети?

Активная сеть - это технология, которая позволяет пользователям интегрировать свои программы или фрагменты кода в интеллектуальные узлы сети, типа маршрутизаторов и коммутаторов. Таким образом, у пользователя появляется возможность активно вмешиваться в механизмы поиска оптимального маршрута и даже видоизменять передаваемую по сети информацию (например, шифровать ее или сжимать). Причем программы, которые должны исполняться в узлах активной сети, будут передаваться вместе с данными в пакетах. Чтобы отличать обычный пакет данных от активного - содержащего программы, - назовем его "капсулой".

Капсулы активной сети должны удовлетворять трем, единым для современных технологий условиям:

  • Мобильности, что означает возможность использования любой платформы для запуска своей программы;
  • Безопасности ограничения доступа капсульных программ к ресурсам узлов;
  • Эффективности - исполнение программ в узлах должно осуществляться с максимально возможной производительностью.
  • Требование мобильности капсулы связано прежде всего с необходимостью запускать содержащиеся в ней программы на различном оборудовании, в том числе и не работающем в конкретный момент времени. Таким образом, технология активных сетей должна быть программной. Естественное требование к программной технологии - соблюдение правил разграничения доступа. Запуск программ в активных узлах сети может серьезно сказаться на защищенности всей сети. Эффективность сетевых технологий - это также требование времени, и от скорости работы сети сейчас во многом зависит эффективность и производительность больших программных комплексов.

    Чтобы удовлетворить перечисленным условиям, разработчики активной сети должны были решить следующие проблемы:

  • Выбрать модель распространения и инициализации капсульных программ;
  • Разработать соответствующую технологию исполнения программ;
  • Определить механизмы аутентификации, авторизации и других аспектов распределения ресурсов сетевого узла.
  • Причем решение этих проблем не всегда однозначно - разные разработчики могут по-разному организовать основные элементы активной сети, и тогда возникнет проблема несовместимости решений. Избежать этого можно с помощью разработки и утверждения стандартов на технологию активной сети, что может занять достаточно много времени.

    Существует и еще один аспект активной сети - переход от нынешних компьютерных сетей, построенных на основе TCP/IP, к новой, использующей технологию активной сети. Естественно, сделать такой переход в небольших сетях проще, но необходимо наметить пути перехода на новую технологию и в масштабах глобальной сети Internet.

    2. Как распространять программы?

    Для исполнения программ в сетевом узле можно использовать два различных подхода: дискретный и интегральный. В случае дискретного подхода каждое отдельное устройство имеет стандартный и заранее определенный набор функций. При этом устройство может реализовывать весь набор функций по-своему, гарантируя только правильность конечного результата. В этом случае программы, передаваемые в капсулах, представляют собой вызовы стандартных функций и аргументы к ним. При добавлении только вызовов стандартных функций в пакет его объем увеличивается незначительно - коды основных программ уже имеются в сети, и их нужно только инициализировать. Основной недостаток такого подхода - плохая гибкость капсульных программ, что серьезно ограничивает возможности новой технологии.

    Интегральный же подход к организации активной сети подразумевает включение в капсулу полного кода программы. Таким образом, капсула превращается из пакета данных с небольшим заголовком инструкций в полноценную программу. С ее помощью можно запрограммировать узел на выполнение любых действий, доступных для данной системы команд. Однако капсула может получиться слишком "тяжелой", и ее трудно будет передавать по неустойчивой сети. Кроме того, необходимо обеспечить переносимость программы между платформами и гарантировать надежность ее исполнения.

    Оба подхода распространения программ активной сети имеют свои достоинства и недостатки. Поэтому логично использовать их некоторую комбинацию. Это можно сделать, например, путем выделения набора самых распространенных функций и реализации их отдельно в каждом узле сети, а дополнительные функции, расширяющие возможности капсул, передавать внутри пакета. При такой архитектуре можно выделить следующие три компонента активной сети (рис. 1):

  • Стандартный набор функций, который хранится в каждом узле;
  • Сохраняемые переменные окружения (storage);
  • Функции расширения, которые передаются в капсулах.
  • Picture_1
    Рисунок 1.
    Структура активной сети.

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

    3. Как исполнять программы?

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

  • Интерпретацией;
  • Компиляцией "на лету";
  • Выполнением программ в виртуальной машине;
  • Использованием набора аппаратно-зависимых программ.
  • Для интерпретации обычно используется язык высокого уровня, который может понять даже человек (например, языки PostScript или Safe-Tcl). Причем последовательное выполнение команд такого языка позволяет полностью контролировать действия программы и корректно распределять полномочия. Такие программы легко составляются, например, с помощью методов визуального программирования. Однако интерпретируемые программы обычно громоздки, что может увеличить объем капсулы. Другим недостатком интерпретации является ее плохая производительность.

    Для увеличения производительности интерпретируемой программы используется метод компиляции "на лету". В этом случае текст программы выполняется не последовательно, а перед исполнением компилируется в аппаратно-зависимый код. Затем этот код запускается уже как обычная программа, что может существенно ускорить работу мобильной части капсулы. Такой способ увеличивает производительность больших или долго работающих программ, когда время компиляции значительно меньше времени исполнения программы. А в сетевом узле логично использовать небольшие и быстро выполняемые фрагменты кода. Кроме того, компиляция "на лету" не решает проблемы большого объема программы.

    Уменьшить объем программы можно с помощью специального кода, который сокращает длину программы, но делает ее нечитаемой для человека. Программа, написанная с помощью такого кода, может быть как интерпретируемой в виртуальной машине, так и компилированной "на лету". Такой метод исполнения программы реализован, например, в технологии Java. Применение спецкодов уменьшает только размер программы, а компилирование ее улучшает производительность. Однако достигнуть максимальной производительности для переносимых программ почти невозможно. Следует отметить, что исполнение программы в виртуальной машине по сути является кросс-платформой, поэтому можно указать еще один вариант исполнения сетевых программ: мобильные коды пишутся для одной самой распространенной платформы, а на других платформах исполняются в кросс-машине. Например, если в активной сети будет использована Java-технология, то это фактически будет означать, что на Java-процессорах капсульные коды будут исполняться напрямую, а во всех остальных устройствах - в кросс-системе виртуальной Java-машины.

    Максимум производительности можно достигнуть, очевидно, только с помощью аппаратно-зависимых программ. Но для их использования на любом сетевом оборудовании придется включать в капсулу версии программ для всех поддерживаемых платформ. Таким образом, увеличив объем капсулы, можно добиться ее оптимально быстрой обработки. Однако этот подход сработает только на высокоскоростных и надежных каналах, которые объединяют не очень производительные или перегруженные узлы. Кроме того, возникают проблемы с защитой от агрессивных кодов, так как аппаратно-зависимые программы будет труднее контролировать.

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

    4. Как устанавливать доступ к ресурсам узла?

    Программа, передаваемая по сети в составе капсулы, должна получить доступ к определенным ресурсам узла, на котором она находится. При это возникают вопросы: какие общие ресурсы должны быть в каждом активном узле сети и к каким из этих ресурсов и при каких условиях может получить доступ капсульная программа.

    Очевидно, что количество ресурсов, доступных для данного узла сети, может быть достаточно большим, но, видимо, нужно ограничиться минимально необходимым набором. Есть три ресурса, которые можно определить для любого активного сетевого узла: полоса пропускания его каналов связи, машинное время и доступная память. Тем не менее, для большей гибкости системы следует, видимо, ввести еще два ресурса: переменные окружения (storage) и логические ресурсы, типа таблиц маршрутизации.

    4.1 Полоса пропускания канала

    Этот ресурс обычно не рассматривается как разделяемый в большинстве реализаций операционных систем. Однако для сетевых устройств количество передаваемых по каналам байтов является одним из самых важных ресурсов. Поэтому программа, работающая в сетевом узле, должна иметь некоторую, желательно не нулевую скорость обмена со следующим и предыдущим активными узлами на пути к получателю. Операционная система, обслуживающая активный узел, должна корректно распределять этот ресурс между капсулами. Ширина полосы пропускания, выделенная для определенной капсулы (количество байтов, которые капсула может передать по каналу), может зависеть от ее объема, отношения скорости входящего и исходящего каналов и некоторых других параметров.

    4.2 Машинное время

    Рабочее время процессора, отведенное для каждой капсулы, распределять достаточно просто. Хотя в активном узле может быть несколько процессоров, капсула не должна знать об этом. Поэтому распределение машинного времени для каждой капсулы должно выполняться по простому алгоритму. В большинстве случаев достаточно отвести для капсулы рабочее время пропорционально выделенной ей полосе пропускания. Хотя в определенных случаях можно добавить некоторое время, например, для компрессии данных капсулы при передаче по медленным каналам.

    4.3 Оперативная память (transient storage)

    Для программы необходимо отвести область памяти, которую она могла бы занимать какое-то время. Распределение памяти между несколькими капсульными программами может проходить по двум координатам - объему памяти, необходимой на данном интервале времени, и величине этого интервала. Некоторые капсулы, выполняющие простые действия, могут заканчивать свою работу достаточно быстро, а некоторые будут ждать определенных внешних условий и находиться в "спящем" состоянии. Поэтому необходимо предусмотреть механизм переноса таких программ в область переменных окружения (в кэш). Кроме того, механизм распределения памяти должен выполнять функции "сбора мусора", чтобы вовремя освобождать уже неиспользуемую память. Это особенно важно для мобильных программ - логично вынести из их кода механизмы распределения памяти.

    4.4 Переменные окружения (active storage)

    Кроме хранения промежуточных результатов необходимо предусмотреть возможность хранения некоторых элементов капсулы еще какое-то время после завершения ее работы. Это позволяют сделать переменные окружения. Есть два типа переменных - динамические (soft) и статические (persistent). Динамические переменные нужны для кэширования объектов, они обычно хранят временную информацию, отсутствие которой не повлечет серьезных последствий для системы. Распределять ресурсы для этих переменных можно по простому алгоритму - неправильное распределение должно не сильно повлиять на работу сети. Статические же переменные присутствуют в системе и изменяются постоянно. Примером такой переменной может служить системный журнал. Для статических переменных важно не просто выделить память под сохранение, а правильно установить права доступа к ним для программ, пользователей и сервисов.

    4.5 Логические ресурсы

    Физических ресурсов в активном сетевом узле обычно немного, а вот логических может оказаться значительно больше. Это требует выработки универсального механизма именования объектов, включая такие ресурсы, как динамические и статические переменные. Сейчас уже разработано много различных схем именования, но необходимо выбрать из них механизмы, которые были бы доступны всем капсулам. Видимо, одним из прототипов такой схемы именования будут некоторые существующие нотации, типа SNMP Management Information Bases (MIBs), использование которых позволит быстрее адаптировать активные сети к существующей структуре Internet.

    Распределение этих ресурсов между капсулами должна выполнять операционная система сетевого узла. Причем правильное их распределение зависит не только от физических параметров системы, но и от полномочий каждого пользователя, сервиса или приложения.

    5. Как обеспечить безопасность?

    Защита активного узла от агрессивного или ошибочного кода состоит из трех частей:

  • Динамическое, но безопасное распределение доступных для капсулы ресурсов;
  • Подтверждение полномочий пользователя с помощью механизмов аутентификации и авторизации;
  • Автоматическое распространение авторизационной информации.
  • Динамическое распределение ресурсов должно выполняться со всеми требованиями безопасности, которые существуют для активных технологий типа Java. В этом случае программа взаимодействует с операционной средой только через внешние функции, которые контролируются операционной системой узла. Капсуле доступны только те ресурсы, которые установлены по умолчанию (полоса пропускания, память и процессорное время выделяются пропорционально размеру капсулы). Однако необходимо предусмотреть безопасные механизмы подключения к системе дополнительных модулей.

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

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

    6. Как перейти от Internet к активной сети?

    Как же начать использовать возможности активной сети? Вопрос этот важен, любая современная технология должна удовлетворять условию приемлемости поколений. Это означает, что необходимо предусмотреть механизмы перехода от стандартной сейчас технологии TCP/IP-сетей, таких как Internet, к новой активной сети. Причем переход этот должен быть постепенным и безболезненным.

    Создатели активной сети предложили такой вариант перехода: к заголовку IP-пакета добавляется новый заголовок активной сети, где располагаются все необходимые данные для интеграции в сетевые узлы небольших фрагментов кода (рис. 2). За этим новым заголовком следует TCP-заголовок и вся остальная информация более высокого уровня. Таким образом, маршрутизаторы, которые не знают протокола активной сети, просто не будут расшифровывать дополнительный заголовок и передавать капсулы без исполнения встроенных в них программ. Активный же узел, который знает о существовании дополнительного заголовка, корректно расшифрует его и выполнит описанную в нем программу.

    Picture_2
    Рисунок 2.
    Структура пакета и капсулы.

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

    7. Где использовать активные сети?

    Теперь нужно еще определить, где же будет в первую очередь применяться новая технология. Возможность тонкой настройки сетевых механизмов нужна, как правило, в некоторых ключевых узлах сети типа межсетевых экранов (брандмауэров), серверов удаленного доступа, кэширующих Web-агентах и т. п.

    7.1 Межсетевые экраны

    Защитные устройства типа межсетевых экранов уже сейчас активно обрабатывают пакеты информации, отсеивая опасные и ограничивая возможности "законных". Таким образом, экран уже сейчас пытается обрабатывать информацию активно. Однако возможности такой обработки весьма ограниченны. Многие экраны не могут обрабатывать UDP-пакеты - у них нет возможности проследить весь сеанс связи. Изменение же настройки защитного экрана в случае изменения сети также дело сложное и кропотливое. Если же пакет будет сам определять способ его обработки (например, содержать программу декодирования), то это упростит настройку защиты и увеличит ее эффективность. И, тем не менее, использовать активные технологии нужно осторожно. Необходимо обеспечить безопасность как самого устройства, так и проходящей через него информации.

    7.2 Кэширующий Web-агент (Web-proxy)

    Эти устройства используют для более эффективного распределения нагрузки на Сеть. Web-агенты ставятся в ключевые точки сети и хранят наиболее посещаемые страницы сети. Таким образом, можно избежать лишних обращений к очень удаленному Web-серверу. Пока страницы Web были статическими, Web-агенты обходились простым сохранением HTML-документов, однако использование активных технологий, таких как Java и ActiveX, предъявляет новые требования к Web-агентам. Активные программы, запускаемые на клиенте, могут изменять информацию на сервере, поэтому кэширующие агенты должны поддерживать когерентность данных, что невозможно реализовать с помощью пассивных кэшей. Возможность исполнять на Web-агенте небольшие фрагменты кода, аналогичные апплетам, позволяет строить более гибкие и эффективные системы. Поэтому возникает необходимость загружать в узлы сети небольшие программы и исполнять их с максимально доступной производительностью.

    7.3 Серверы удаленного доступа

    Именно к этим устройствам подключаются удаленные пользователи для получения доступа к компьютерным сетям. Такие устройства должны иметь определенные механизмы сжатия передаваемой информации, причем желательно использовать различные типы компрессии для различных типов данных: простого текста, изображений, программ и других мультимедиа-объектов. Эти возможности могут предоставить механизмы активной сети.

    Активные сети, видимо, найдут применение и в других устройствах. Например, при организации распределенных баз данных очень часто возникает необходимость перенаправления запроса пользователя от одной части базы данных к другой. Причем определить, к какой именно части данных нужно переправить запрос, может только сама база данных. Но если разработчики базы данных имеют возможность внедрять в сетевые узлы, расположенные между частями базы данных, какие-либо программы, тогда можно на уровне этих сетевых узлов перенаправлять запросы пользователей именно к той части базы, которая в состоянии ответить на данный запрос.

    Заключение

    Разработка технологии активной сети открывает новые перспективы для создания распределенных программных комплексов. Уже сейчас возникают технологии, позволяющие строить сложные распределенные системы, но они, как правило, опираются на пассивные сетевые технологии, что требует дополнительных ресурсов. Если же программисты сложных баз данных или различных промышленных систем смогут активно управлять сетевыми процессами, то это позволит перенести "в сеть" те вычисления, которые раньше выполнялись на серверах и клиентах. Таким образом, компьютерная сеть станет не просто пассивной средой передачи данных, но и дополнительной вычислительной платформой, решающей свои специфические задачи.