Немаловажным фактором, который учитывают поисковые системы, анализируя написанные нами статьи, является объем статьи, количество ключевых слов, и т.д.
Для облегчения жизни как блоггерам, так и профессиональным копирайтерам двое талантливых программистов Денис Каплунов и Даниил Абрамов создали замечательную программу Textus Pro. Она совершенно бесплатна, за что ребятам отдельное большое человеческое спасибо!
Данный софт позволяет подсчитать количество символов, слов с пробелами и без пробелов, количество ключевых слов в тексте. Для копирайтеров предусмотрен практичный расчет стоимости статьи в соответствии цена за 1000 символов.
Какие возможности предоставляет вам эта программа?
Статистика использования ключевых слов – частота и плотность. Причем есть отдельная опция, которая позволяет учитывать при подсчете не только прямые вхождения, но и словоформы. В результате подсчета, выбранные ключевые слова выделяются в тексте синей подсветкой.
Статистика использования всех слов в тексте – частота и плотность. Вы получите четкое представление о том, какие слова в тексте используются и в каком количестве. Если вы заметите, что некоторые ваши словесные обороты излишне часто употребляются в тексте – вы сможете их заменить синонимами, чтобы увеличить качество и читабельность.
Вы получите возможность проводить такой анализ, указывая необходимые личные параметры (учет стоп-слов, чисел, коротких слов).
При работе с исходным текстом вы сможете выбрать удобный для вас шрифт, увеличить/уменьшить размер текста, приглушить стоп-слова и знаки препинания.
Также перед вами будет нужная статистика самого текста: количество слов и знаков (с пробелами и без пробелов), тошнота текста.
Вы сможете рассчитать точную стоимость вашей работы исходя из количества символов и цены за 1000 знаков.
Масса других «фишек», чтобы ваша работа с программой была максимально удобной.
Книга ориентирована как на обычных пользователей Интернета, которым нужно в кратчайшие сроки создать свой сайт, так и на разработчиков, которые заинтересованы в построении собственной системы управления сайтом. Рассмотрены три уже готовые системы управления сайтом — Joomla!, Slaed, PHP-Nuke. С позиции пользователя описывается, как установить, настроить, разработать графическую тему и расширить возможности каждой системы. Для разработчиков описано программирование собственных расширений для рассмотренных движков, а также создание собственной системы управления сайтом. Отдельное внимание уделяется защите от взлома разрабатываемой системы, а также интеграции с популярным форумом phpBB из файла задания.
Environmental Audio (дословно окружающий звук)- это новый стандарт звука, разработанный фирмой Creative Labs, создающий эффекты окружающей среды реального мира на компьютере. Environmental Audio сегодня ужк много больше простого surround -звука и 3D моделирования. Это и настоящее моделирование окружающей среды с помощью мощных эффектов с учётом размеров комнаты, её звуковых особенностей, реверберации, эхо и многих других эффектов, создающих ощущение реального аудио мира.
Как работает Environmental Audio
Эффекты окружающей среды моделируются при помощи технологии E-mu Environmental Modeling, поддерживаемой аудиопроцессором EMU10K1, установленного на серии звуковых карт SBLive! Технология Environmental Audio разработана с учётом работы на наушниках, двух или четырёх колонках. Чип EMU10K1 раскладывает любой звуковой поток на множество каналов, где накладывает эффекты в реальном времени. За счёт этого создаются уже новые звуки, такие, как они должны быть в природе. На стадии обработки звука кроме его пололжения в пространстве должны быть учтены, как минимум, два фактора: размер помещения и реверберация, так как человеческое ухо слышит не просто оригинальный звук, а звук с учётом дистанции, местоположения и громкости. Стандарт Environmental Audio обрабатывает все эти условия для получения высококачественного реального звука.
Environmental Audio использует координаты X, Y, Z, а также реверберацию и отражения звука. Эти координаты используются при базовой подготовки каналов аудио источника и эффектов "окраски" звуковой сцены. Основная мощность аудиопроцессора расходуется на обработку каждого звукового источника по всем каналам и на добаление эффектов в реальном времени. Как уже говорилось, для создания ощущения реального звука нужно учитывать как минимум 3 фактора: расстояние до источника звука, размер звукового помещения и реверберацию.
Environmental Audio Extensions (EAX)
Это API, разработанный фирмой Creative Labs для достижения реальных звуковых эффектов в компьютерных играх. EAX- это расширение API DirectSound3D от фирмы Microsoft На 18 Октября 1999 года единственной звуковой картой, поддерживающей этот стандарт является Sound Blaster Live! (в разных модификациях). На сегодня Creative выпустила три версии этого стандарта.
DirectSound3D управляет местоположением в 3D пространстве игры источников звука и слушателя. Например, игра может использовать DirectSound3D для создания раздельных источников звука для каждого существа в игре, получая, таким образом, звуки выстрелов и голоса в разных местах 3D-мира. Эти звуки, также как и слушатель, могут перемещаться в пространстве. Разработчики игр могут использовать такие звуковые возможности, как палитра направлений (звук в одном направлении может идти громче, чем в другом), эффект Допплера (звук может нарастать, достигнув слушателя, и потом спадать, как бы удаляясь в пространство).
EAX улучшает DirectSound3D созданием виртуального окружающего аудио мира вокруг источников звука и слушателя. Эта технология эмулирует реверберации и отражения, идущие со всех сторон от слушателя. Эти эффекты создают впечатление, что вокруг слушателя существует реальный мир со своими параметрами, как то: размер помещения, отражающие и поглощающие свойства стен и другие. Программисты игр могут создавать различные акустические эффекты для разных помещений. Таким образом, игрок, который играет в EAX игру может слышать разницу в звуке при переходе из коридора в пещеру.
В дополнении к созданию окружающих эффектов, EAX 1.0 может изменять параметры различных источников звука. При изменении местоположения источника звука относительно слушателя автоматически изменяются параметры реверберации.
Что касается программирования, то здесь EAX предоставляет следующие возможности.
* Выбор среди большого числа "пресетов" для моделирования эффектов окружающей среды.
* Возможность изменять параметры пресетов окружающей среды для каждого источника в отдельности.
* Автоматическое изменение критических параметров, применяемых к позиции. Когда источник звука движется по отношению к слушателю, EAX автоматически изменяет параметры отражения звука и реверберации для создания более реальных звуковых эффектов при движении источника звука через 3D звуковой мир.
Occlusions и Obstructions
Эффект occlusions создаёт впечатление, что источник звука находится в другой комнате, в другом месте, за стеной. Это свойство позволяет изменять параметры передачи звуковой характеристики для получения эффекта различных материалов стен и их толщину. Например, программа может использовать это свойство для создания звука, идущего из-за двери, или из-за стены.
Эффект obstructions позволяет эмулировать звуковые препятствия, создавая ощущение, что источник звука находится в той же комнате, но за препятствием. Например, можно сделать так, что звук будет идти из-за большого камня, находящегося в той же пещере, что и слушатель.
Геометрическое моделирование и EAX
Геометрическая модель сцены используется как в графических целях, так и для создания 3D звука. Для создания геометрической модели компьютер должен иметь данные о физических свойствах мира: какие объекты где расположены, какие звуконепроницаемые, какие звукопоглощающие и так далее. После того, как эта информация получена, производится расчёт некоторого количества слышимых отражений и поглощений звука от этих объектов для каждого источника звука. Это приводит к затуханиям звука, из-за препятствий, звуконепроницаемых стен и так далее. Расчёты отражений методом "зеркала" широко используются для создания акустики зданий. Этот метод подразумевает, что звук отражается прямо (как от зеркала) без преломлений и поглощений. На самом же деле, вместо того, чтобы в реальном времени рассчитывать все отражения и особенности среды (что на самом деле процесс трудоёмкий) используются заранее рассчитанные упрощённые модели геометрических аудио сред, которые отличаются от графических представлений о среде. То есть в игре используются одновременно отдельная среда для визуальных эффектов и более простая для звуковых эффектов. Это создаёт проблемы, как, например, если бы вы захотели передвинуть часть стены в комнате, то вам пришлось бы создавать новую среду для звука. В настоящее время над геометрическим моделирование звука ведутся работы во многих звуковых лабораториях.
EAX для разработчиков
EAX не требует того, чтобы источники звука привязывались к графическому представлению об окружающей среде. Но при желании разработчик, который хочет создать звуковые эффекты "повышенной реальности", которые максимально близки к графическому представлению о сцене может использовать дополнительное управление ранними отражениями, преломлениями и поглощениями. При создании своих эффектов EAX использует статические модели среды, а не её геометрические параметры. Эти модели автоматически рассчитывают реверберации и отражения относительно слушателя с учётом размеров помещения, направления звука и других параметров, которые программист может добавлять, для каждого источника звука. Поэтому EAX намного проще других стандартов, так как он не требует описания геометрической среды сцены, а использует подготовленные заранее модели. Игра может менять звуковые модели при переходе от одного места к другому для создания реальных эффектов. Я хочу рассмотреть это подробней. Допустим, у вас есть сцена в игре ввиде каменной пещеры. Есть два способа получить высокореалистичные эффекты. Первый из них- рассчитать геометрическую модель и использовать её как аудио маску для сцены, причём новые технологии будут позволять делать это в реальном времени. Второй способ- взять готовый пресет и, при необходимости, изменить его для получения более качественных эффектов. Разумеется, первый способ даст больший реализм, чем второй, но и потратит ресурсов в несколько раз больше. А если учитывать лень программистов, то в этом случае EAX наиболее благоприятный вариант.
Различия между EAX 1.0, 2.0 и 3.0
EAX 1.0
* Поддерживает изменение места в игре реверберации и отражений.
* Имеет большое количество пресетов.
* Позволяет (ограниченно) изменять реверберацию окружения.
* Позволяет автоматически изменять интенсивность реверберации, в зависимости от положения источника звука относительно слушателя.
EAX 1.0 строит звуковую сцену на основе заранее созданных пресетов, учитывая дистанцию между источниками звука и слушателем. Соответственно, EAX 1.0 предоставляет большой набор пресетов "на каждый случай жизни". Также имеется возможность изменять параметры поздней реверберации (дэмпинг, уровень) и автоматическое изменение уровня в зависимости от расстояния. Благодаря этому происходит улучшенное восприятие расстояния до источника.
EAX 2.0
* Обновлена реверберационная модель.
* Добавлены эффекты звуковых преград (Obstructions) и поглощений (Occlusions).
* Отдельное управление начальными отражениями и поздними реверберациями. Продолжительный контроль размеров помещений. Улучшенная дистанционная модель для автоматического управления реверберациями и начальными отражениями, основанными на местоположении источника звука относительно слушателя.
* Возможность учитывать звуковые свойства воздуха (поглощение звука).
* Теперь для использования эффектов Environmental Audio не не требуется описание геометрии помещения.
EAX 2.0 построен на возможностях первой версии и создаёт ещё более реалистичные эффекты засчёт поддержки преграждения и отражения звука, а также на улучшенной технологии определения направления звука.
EAX 3.0
* Контроль за ранними реверберациями и отражениями для каждого источника звука.
* Динамический переход между окружающими моделями.
* Улучшенная дистанционная модель для автоматического управления реверберацией и начальными отражениями в зависимости от положения источников звука относительно слушателя.
* Расчёты Ray-Tracing (отражение лучей) для получения параметров отражения для каждого источника звука.
* Отдельные отражения для дальних эхо.
* Улучшенное дистанционное представление, призванное заменить статические реверберационные модели.
EAX 3.0 совмещает вторую версию с более мощными возможностями. Новый уровень реализма достигается засчёт поддержки местных отражений, изолированных отражений, продолжительных переходов между звуковыми сценами и другими особенностями.
Вывод: по всему вышесказанному можно судить о том, что на сегодня EAX является очень перспективным и конкурентоспособным стандартом. Любой программист, несведующий в особенностях 3D звука сможет создавать реальные эффекты для своих игр с помощью пресетов. Что касается качества 3D звука, то оно вне конкуренции. Сейчас большинство игр не поддерживает (или поддерживает криво) такие эффекты, как преграждение и поглощение звука. Первой игрой, полностью поддерживающей EAX 2.0 обещает быть Unreal Tournament, если его не опередят. Там будет видно.
P.S. Я специально не стал сравнивать EAX с другими стандартами, как, например, A3D. Для этого нужны игры, поддерживающие одновременно и то и другое в полной форме. На сегодня таких игр нет.
Из приложений Delphi вы можете получить доступ к .MDB-файлам Microsoft Access, используя драйверы ODBC. Delphi действительно может дать все необходимое, но некоторые вещи не столь очевидные. Вот шаги для достижения вашей цели.
Что вам нужно: Первое: проверьте, установлен ли ODBC Administrator (файл ODBCADM.EXE в WINDOWS\SYSTEM, вам также необходим файл DBCINST.DLL для установки новых драйверов и ODBC.DLL). Администратор ODBC должен присутствовать в Панели Управления в виде иконки ODBC. Если у вас его не было, то после установки Delphi он должен появиться. Если вы получаете сообщение типа "Your ODBC is not up-to-date IDAPI needs ODBC greater then 2.0", у вас имеется старая версия администратора и вы должны обновить ее до версии, включенной в поставку Delphi. Проверьте, имеете ли вы доступ к драйверу Access ODBC, установленному в Windows. Вы можете сделать это, щелкнув на "Drivers" в диалоговом окне "Data Sources", появляющемся при запуске ODBC Administrator. Delphi должна в диалоге добавить пункты Access Files (*.mdb) и Access Data (*.mdb), работающие с файлами Access 1.10 и использующие драйвер SIMBA.DLL (имейте в виду, что для данного DLL необходимы также файлы RED110.DLL и SIMADMIN.DLL, устанавливаемые для вас Delphi). Данные файлы должны поставляться с дистрибутивом вашей программы как часть ReportSmith Runtime библиотеки. Если вы хотите работать с файлами Access 2.0 или 2.5, вам необходимо иметь другой набор драйверов от Microsoft. Ключевой файл - MSAJT200.DLL, также необходимы файлы MSJETERR.DLL и MSJETINT.DLL. В США набор ODBC Desktop Drivers, Version 2.0. стоит $10.25. Он также доступен в январском выпуске MSDN, Level 2 (Development Platform) CD4 \ODBC\X86 как часть ODBC 2.1 SDK. Очевидно есть обновление этих драйверов для файлов Access 2.5 на форуме MSACCESS CompuServe. Имейте в виду, что драйвер Access ODBC, поставляемый с некоторыми приложениями Microsoft (например, MS Office) могут использоваться только другими MS-приложениями. К сожалению, они могут сыграть с вами злую шутку: сначала заработать, а потом отказать в совершенно неподходящий момент! Поэтому не обращайте внимания (запретите себе обращать внимание!) на строчку "Access 2.0 for MS Office (*.mdb)" в списке драйверов ODBC Administrator. Вы можете установить новые ODBC драйверы с помощью ODBC Administrator в Панели Управления.
Добавление источника данных ODBC (Data Source): если у вас имеются все необходимые файлы, можете начинать. Представленный здесь пример использует драйвер Access 1.10, обеспечиваемый Delphi. Используя ODBC Administrator, установите источник данных для ваших файлов Access: щелчок на кнопке "Add" в окне "data sources" выведет диалог "Add Data Source", выберите Access Files (*.mdb) (или что-либо подходящее, в зависимости от установленных драйверов). В диалоге "ODBC Microsoft Access Setup" необходимо ввести имя в поле "Data Source Name". В данном примере мы используем "My Test". Введите описание "Data Source" в поле Description. Щелкните на "Select Database" для открытия диалога "Select Database". Перейдите в директорию, где хранятся ваши Access .MDB-файлы и выберите один. Мы выберем файл TEST.MDB в директории C:\DELPROJ\ACCESS. Нажмите OK в диалоге "Setup". Теперь в списке источников данных (Data Sources) должен появиться "My Test" (Access Files *.mdb). Нажмите Close для выхода из ODBC Administrator. Используя этот метод, вы можете установить и другие, необходимые вам, источники данных.
Настройка Borland Database Engine: загрузите теперь Borland Database Engine (BDE) Configuration Utility. На странице "Drivers" щелкните на кнопке New ODBC Driver. Имейте в виду, что это добавит драйвер Access в BDE и полностью отдельное управление дополнительно к драйверам Access в Windows, устанавливаемым при помощи ODBC Administrator. В открывшемся диалоге Add ODBC Driver в верхнем поле редактировании введите ACCESS (или что-то типа этого). BDE автоматически добавит на первое место ODBC_. В combobox, расположенном немного ниже, выберите Access Files (*.mdb). Выберите Data Source в следующем combobox (Default Data Source Name), это должен быть источник данных, который вы установили с помощью ODBC Administration Utility. Здесь можно не беспокоиться о вашем выборе, поскольку позднее это можно изменить (позже вы узнаете как это можно сделать). Нажмите OK. После установки драйвера BDE, вы можете использовать его более чем с одним источником данных ODBC, применяя различные псевдонимы (Alias) для каждого ODBC Data Source. Для установки псевдонима переключитесь на страницу "Aliases" и нажмите на кнопку "New Alias". В диалоговом окне "Add New Alias" введите необходимое имя псевдонима в поле "Alias Name". В нашем примере мы используем MY_TEST (не забывайте, что пробелы в псевдониме недопустимы). В combobox Alias Type выберите имя ODBC-драйвера, который вы только что создали (в нашем случае ODBC_ACCESS). Нажмите OK. Если вы имеете более одного ODBC Data Source, измените параметр ODBC DSN ("DSN" = "Data Source Name") в списке "Parameters" псевдонима на подходящий источник данных ODBC Data Source, как установлено в ODBC Administrator. Имейте в виду, что вы не должны ничего добавлять в параметр Path (путь), так как ODBC Data Source уже имеет эту информацию. Если вы добавляете параметр Path, убедитесь, что путь правильный, в противном случае ничего работать не будет! Теперь сохраните конфигурацию BDE, выбирая пункты меню File|Save, и выходите из Database Engine Configuration Utility.
В Delphi: Создайте новый проект и расположите на форме компоненты Table и DataSource из вкладки Data Access палитры компонентов. Затем из вкладки Data Controls выберите компонент DBGrid и также расположите его на форме. В Table, в Инспекторе Объектов, назначьте свойству DatabaseName псевдоним MY_TEST, установленный нами в BDE Configuration Utility. Теперь спуститесь ниже и раскройте список TableName. Вас попросят зарегистрироваться в базе данных Access MY_TEST. Обратите внимание, что если бюджет не установлен, то User Name и Password можно не заполнять, просто нажмите на кнопку OK. После некоторой паузы раскроется список, содержащий доступные таблицы для ODBC Data Source указанного псевдонима BDE. Выберите TEST. В DataSource, в Инспекторе Объектов, назначьте свойству DataSet таблицу Table1. В DBGrid, также в Инспекторе Объектов, назначьте свойству DataSource значение DataSource1. Возвратитесь к таблице, и в том же Инспекторе Объектов установите свойство Active в True. Данные из таблицы TEST отобразятся в табличной сетке. Это все! Одну вещь все-таки стоит упомянуть: если вы создаете приложение, использующее таблицы Access и запускаете его из-под Delphi IDE, то при попытке изменения данных в таблице(ах) вы получите ошибку. Если же вы запустите скомпилированный .EXE-файл вне Delphi (предварительно Delphi закрыв), то все будет ОК. Сообщения об ошибках ODBC, к несчастью, очень туманные и бывает достаточно трудно понять его источник в вашем приложении, в этом случае проверьте установку ODBC Administrator и BDE Configuration Utility, они также могут помочь понять источник ошибки. Для получения дополнительной информации обратитесь к ODBC 2.0 Programmer's Reference или SDK Guide от Microsoft Press (ISBN 1-55615-658-8, цена в США составляет $24.95). В этом документе вы получите исчерпывающую информацию о возможных ошибках при использовании Access-файлов посредством ODBC. Также здесь вы можете найти рапорты пользователей о найденных ошибках, в том числе и при использовании Delphi. Более того, я выяснил, что большинство описанных проблем возникает при неправильных настройках ODBC, т.е. те шаги, которые я описал выше. Надеюсь, что с развитием технологии доступа к базам данных такие сложности уйдут в прошлое. Кроме того, имейте в виду, что если вам необходимо создать новую таблицу Access 1.10, вы можете воспользоваться Database Desktop, включаемый в поставку Delphi.
Авторы данной технологии Ralph Friedman (CompuServe 100064,3102), Bob Swart и Chris Frizelle.
Взято из Советов по Delphi от Валентина Озерова
--------------------------------------------------------------------------------
Может кто-нибудь, предпочтительно из персонала Borland, ПОЖАЛУЙСТА, дать мне ПОЛНЫЙ рассказ о том, как с помощью Delphi и сопутствующего программного обеспечения получить доступ и работать с базами данных MS Access. Среди прочего, мне необходимо узнать...
Нижеследующая инструкция в точности повторяет ту технологию, с которой я работаю на данный момент, надеюсь, что это поможет.
Драйвер ODBC, предусмотренный для доступа к Access 2.0, разработан только для работы в пределах среды Microsoft Office. Для работы со связкой ODBC/Access в Delphi, вам необходим Microsoft ODBC Desktop Driver kit, part# 273-054-030, доступный через Microsoft Direct за $10.25US (если вы живете не в США, воспользуйтесь службой WINEXT). Он также доступен в январском выпуске MSDN, Level 2 (Development Platform) CD4 \ODBC\X86 как часть ODBC 2.1 SDK. Имейте в виду, что смена драйверов (в частности Desktop Drivers) может негативно сказаться на работе других приложений Microsoft. Для информации (и замечаний) обращайтесь в форум WINEXT.
Также вам необходимы следующие файлы ODBC:
Минимум:
ODBC.DLL 03.10.1994, Версия 2.00.1510
ODBCINST.DLL 03.10.1994, Версия 2.00.1510
ODBCINST.HLP 11.08.1993
ODBCADM.EXE 11.08.1993, Версия 1.02.3129
Рекомендуется:
ODBC.DLL 12.07.1994, Версия 2.10.2401
ODBCINST.DLL 12.07.1994, Версия 2.10.2401
ODBCINST.HLP 12.07.1994
ODBCADM.EXE 12.07.1994, Версия 2.10.2309
Нижеследующие шаги приведут вас к искомой цели:
1. Используя администратора ODBC, установите источник данных (datasource) для вашей базы данных. Не забудьте задать путь к вашему mdb-файлу. Для нашего примера создайте источник с именем MYDSN.
2. Загрузите утилиту BDE Configuration.
3. Выберите пункт "New Driver".
4. Назначьте драйверу имя (в нашем случае ODBC_MYDSN).
5. В выпадающем списке драйверов выберите "Microsoft Access Driver (*.mdb)
6. В выпадающем списке имен выберите MYDSN
7. Перейдите на страницу "Alias" (псевдонимы).
8. Выберите "New Alias" (новый псевдоним).
9. Введите MYDSN в поле имени.
10. Для Alias Type (тип псевдонима) выберите ODBC_MYDSN.
11. На форме Delphi разместите компоненты DataSource, Table, и DBGrid.
12. Установите DBGrid1.DataSource на DataSource1.
13. Установите DataSource1.DataSet на Table1.
14. Установите Table1.DatabaseName на MYDSN.
15. В свойстве TableName компонента Table1 щелкните на стрелочку "вниз" и вы увидите диалог "Login". Нажмите OK и после короткой паузы вы увидите список всех имен ваших таблиц. Выберите одно.
16. Установите свойство Active Table1 в True и данные вашей таблицы появятся в табличной сетке.
С появлением и продвижением микрософтом OLE DB и реализацией в Дельфи ADO (начиная с версии 5.0) работа с MS Access через ODBC перестала быть актуальной. За исключением особых случаев рекомендуется пользоваться именно ADO линейкой компонентов для связи с MS Access
Очень часто при работе с запросами приходится менять SQL этого запроса. Например, при изменении порядка сортировки или при необходимости изменения фильтра, прописанного в where. Сделать это стандартными средствами можно, но довольно муторно, т.к. весь запрос хранится в одном месте (для TQuery и её потомков это свойство Sql). При желании изменить, например, количество или порядок следования полей в order by, нужно программно найти этот order by, написать свой, вставить его вместо старого и т.д. Для меня, честно говоря, загадка, зачем борланд пошла по такому ущербному пути: стандарт ANSI SQL-92, с которым (и только с которым!) работает Bde, подразумевает достаточно жёсткий синтаксис запроса, вполне допускающий обработку на уровне отдельных секций. Сегодня я хотел бы поделиться одним из вариантов реализации потомка TQuery, в котором задачи такого класса будут решаться на лету одной строчкой кода.
Смысл очень простой. Для того, чтобы уйти от ручной обработки текста sql-запроса, надо просто разбить его на стандартные секции. И менять их по отдельности. Ведь любой select-запрос имеет достаточно строгий синтаксис, состоя из определённого количества заранее известных секций (clauses), задаваемых в строго определённой последовательности. Рассмотрим этот синтаксис поподробнее на примере СУБД Interbase:
Как видим, обязательными являются две секции: SELECT и FROM.
Ещё восемь секций опциональны. Наша задача сводится к тому, чтобы значение каждой секции устанавливать отдельно, при необходимости переоткрывая запрос. Можно было бы плясать от стандартного свойства Sql, выделять нужную секцию, менять и вставлять обратно. Но зачем это, если можно сам Sql формировать на основе заданных секций? Конечно, этот подход имеет тот минус, что накрывается прямая установка Sql одной строкой, что может быть неудобно при хранении запроса в реестре, базе и т.д., но и это, при желании, можно побороть.
В общем-то, ничего заумного, реализация до смешного проста, но при использовании в проектах позволяет сэкономить массу времени и значительно увеличить читабельность кода.
Чтобы не писать отдельное свойство на каждую секцию, задавать их будем в виде массива строк. Для работы с этим массивом нам понадобятся индексы, которые тоже лучше определить заранее:
Определим тип нашего индексированного свойства и определим сам класс:
Свойство fClauses будет содержать все секции запроса, на основе которых и будет формироваться сам запрос. Занимается этим процедура UpdateSql. Ну а методы GetClause/SetClause стандартны, и служат для установки/чтения значений отдельных секций. Поглядим на сам код:
Всё достаточно прозрачно, отмечу лишь, что метод UpdateSql добавляет в текст Sql-запроса только те секции, для которых установлено начение, и переоткрывает квери, если она была открыта на момент изменения секции. Здесь есть мелкие недоработки, например, не проверяется выход индекса за пределы допустимых значений, я просто не хотел мусорить исходный код вещами, которые очевидны и принципиально не важны. Можно было бы привести код регистрации компонента в палире дельфи, но это также тривиально. Приведу лучше исходник тестового проекта, в котором используется этот квери. В этом проекте на форме находятся компоненты DbGrid1, подключенные к источнику данных DataSource1, динамически создаётся экземпляр TDynQuery, открывающий таблицу "biolife" из DbDemos, входящую в стандартную поставку Delphi. После этого изменяется по кликанью на заголовке (Title) грида меняется сортировка таблицы:
Можно сказать, что современная корпорация буквально "пропитана" данными. Они повсюду и, более того, очень часто одни и те же данные могут находиться в нескольких местах. Корпорация должна иметь возможность идентифицировать источник, происхождение, семантику и пути доступа к данным. Метаданные или, как их обычно называют, "данные о данных", являются ключом для получения этой информации. Но, как это ни удивительно, у большинства корпораций нет отчетливой стратегии относительно метаданных. Различные подразделения организации используют разные наборы инструментов для поддержки своих данных.
Каждому такому набору соответствуют определенные метаданные. Поэтому картина, типичная для многих корпораций, - это так называемые "острова метаданных", т.е. некоторые объемы информации, которые невозможно связать друг с другом. Для решения этой проблемы некоторые организации начинают крупные проекты по интеграции метаданных, тратя на это значительные средства и время. Но, к сожалению, в большинстве проектов отсутствует структурный подход, поэтому временные и финансовые затраты не окупаются.
В предлагаемой статье обсуждаются подходы к управлению метаданными, в том числе то, какие метаданные необходимо собирать, как их можно моделировать, как создать требуемое архитектурное решение и как обеспечить простоту поддержки метаданных в долгосрочной перспективе. Большинство этих подходов уже существуют в той или иной форме в различных организациях. В данной статье сделана попытка собрать и обобщить имеющийся опыт.
Классификация метаданных
На самом высоком уровне метаданные могут быть разделены на две категории:
Элементы общих метаданных должны иметь совместные (непротиворечивые) определения и семантику в масштабах всей корпорации. Например, определение понятия "клиент" должно быть единым для всей компании.
Метаданные могут быть классифицированы и по другим параметрам:
Метаданные бизнеса включают определения объектов, относящихся к корпоративным пользователям, логическим картам данных и словарям Хранилищ данных. Технические метаданные включают данные о физических объектах: названия таблиц и столбцов, ограничения и правила физического преобразования между различными зонами. В метаданных процессов отражается статистическая информация о различных процессах: статистика загруженности, информация о календарном планировании и обработка исключений.
Создание решения для управления метаданными
Для создания успешного решения по управлению корпоративными метаданными автор рекомендует следовать определенной последовательности шагов:
1. собрать все требования, предъявляемые к метаданным;
2. выбрать соответствующую модель метаданных;
3. определить общие подходы к архитектуре;
4. внедрить выбранное решение и осуществлять его поддержку.
Сбор требований, предъявляемых к метаданным
Определение требований, предъявляемых к метаданным, может оказаться непростой задачей. Ключевые стороны, которым могут быть нужны метаданные, разнообразны и пространственно разобщены. Это могут быть как конечные пользователи или аналитики, так и приложения или наборы инструментов. Процесс сбора стандартных требований не должен слишком расплываться. Автор предлагает следующий подход, учитывающий специфическую природу метаданных:
* определение ключевых сторон для каждого элемента метаданных;
* отнесение каждого элемента метаданных к определенной категории: метаданным бизнеса, техническим или метаданным процессов;
* отнесение каждого элемента метаданных к категории общих или уникальных на основе их использования в тех или иных процессах.
Следующий шаг - идентификация источника элемента метаданных. Обычно они называются "официальными метаданными" или "метаданными записи"1. Метаданные записи указывают на официальную версию определенного элемента для какого-либо события, в котором может быть несколько источников одних и тех же данных. Для того чтобы назвать определенный элемент метаданных официальным, важно понимать различные процессы, которые могут привести к созданию этого элемента. Эта информация помогает определить официальный источник метаданных. Например, компания розничной торговли создает корпоративное Хранилище данных, при этом элементы, содержащие информацию о клиентах, появляются в нескольких местах, таких как Хранилище данных о потребителях, система управления отношениями с клиентами (Customer Relationship Management, сокр. CRM) и система сбыта. При этом важно проводить анализ надежности и полноты каждого источника и оценивать, какие именно определения могут использоваться в качестве официальной версии. В данном случае уже может существовать Хранилище данных о потребителях, определяющее соответствующее измерение, поэтому можно будет считать словарь данных этого Хранилища официальными метаданными записей. После того как этот процесс будет закончен для всех элементов метаданных, можно будет сказать, что организация требований к метаданным завершена.
Выбор метамодели
Следующий шаг после формализации требований к метаданным - создание модели. Моделирование метаданных важно, поскольку оно может стать элементом, который используется во всей корпорации. Существует несколько способов выбора модели метаданных:
* создание специальной модели данных для работы с метаданными;
* использование имеющихся стандартных моделей;
* оснащение доступного репозитория метаданных инструментами, позволяющими использовать его как источник интеграции.
Для создания специальной модели метаданных важно иметь корректные определения элементов, их атрибутов и связей с другими элементами. Такая модель может быть объектно-ориентированной или моделью типа объект-отношение. Что касается стандартных моделей, то тут существует два варианта: модель открытой информации (Open Information Model, сокр. OIM) и общая метамодель Хранилища данных (Common Warehouse Meta-Model, сокр. CWM). CWM описывает обмен метаданными между Хранилищами данных, средствами Business Intelligence и управления знаниями и портальными технологиями. Согласно компании Meta Data Coalition, OIM - это набор спецификаций метаданных для облегчения их совместного и многократного использования в области разработки приложений и Хранилищ данных. OIM описывается с помощью универсального языка моделирования (Unified Modeling Language, сокр. UML) и организуется по предметным областям, которые могут быть легко использованы и при необходимости расширены. Эта модель данных основана на отраслевых стандартах, таких как UML, XML и SQL.
Выбор подходящей метамодели является непростой задачей. Хотя специальные модели бывают гораздо более гибкими, создание надежной модели на корпоративном уровне и ее долгосрочная поддержка могут оказаться довольно обременительными. Для решения такой задачи нужен хорошо продуманный план. С другой стороны, стандартные модели довольно широкие: они охватывают большинство требований, предъявляемых на корпоративном уровне. Но настройка таких моделей под специфические нужды корпорации может оказаться проблематичной. Для тех корпораций, где существуют наборы инструментов и связанные с ними метаданные, хорошим решением будет использование метамоделей от любого поставщика. При этом, безусловно, понадобятся существенные интеграционные усилия. С другой стороны, если корпорация только начинает работать с метаданными и у нее нет несовместимых наборов инструментов, то хорошим решением может быть создание собственной специальной метамодели.
После завершения моделирования метаданных важно определить репозиторий для хранения данных. Это может быть реляционное или объектно-ориентированное Хранилище.
[pagebreak]
Определение архитектуры высокого уровня
Для внедрения решений по работе с метаданными существует целый ряд архитектурных возможностей. Одно из решений - централизованный репозиторий, где хранятся все метаданные.
Основные элементы метаданных, которые будут храниться в таком центральном репозитории, - это метаданные приложений, систем управления базами данных, бизнеса и метаданные, связанные с различными процессами. Создание и модификация элементов метаданных должны осуществляться с помощью общего интерфейса. Для такого решения можно разработать специальную метамодель или использовать одну из стандартных. Данная архитектура имеет несколько преимуществ:
* сравнительно простая поддержка метаданных;
* упрощенные процедуры взаимодействия между компонентами;
* простые процедуры подготовки отчетности.
Некоторые корпорации пытаются создавать очень небольшие решения для работы с метаданными. Это означает, что каждое подразделение организации конструирует свое собственное решение.
Для облегчения обмена метаданными в качестве основы для их передачи используется XML. Каждое приложение, система управления базами данных или инструмент вступает в контакт с репозиторием с помощью XML. Парсер репозитория преобразует формат XML в формат метамодели и обновляет содержимое репозитория.
Наконец, третье архитектурное решение известно под названием распределенной архитектуры. Это тот случай, когда корпорация уже потратила значительное количество ресурсов на создание локального решения для работы с метаданными, а интеграция в масштабах всей корпорации оказывается слишком дорогостоящей. В результате локальное решение продолжает существовать, а в тех случаях, когда это оправдано и выгодно, происходит совместное пользование метаданными из нескольких источников.
Внедрение и поддержка решения для работы с метаданными
После завершения разработки архитектуры и выбора метамоделей можно приступать к внедрению решения. При этом надо иметь в виду следующее:
1. природу репозитория метаданных (реляционная база данных, система файлов, объектно-ориентированная база данных или репозиторий XML);
2. вопросы безопасности репозитория метаданных (кто управляет репозиторием; кто имеет право читать информацию репозитория или обновлять ее);
3. механизмы создания, чтения и добавления компонентов метаданных;
4. инфраструктуру отчетности для метаданных.
После разработки плана и обеспечения соответствующих инструментальных средств можно приступать к внедрению решения для работы с метаданными.
Но собственно внедрение еще не обеспечивает решения всех проблем. Важно обеспечить достаточно продолжительное функционирование созданной системы и ее соответствующее обслуживание. Одно из основных требований при этом - правильное распределение ролей и ответственности в корпорации.
После распределения ролей и ответственности необходимо создать процесс, определяющий жизненный цикл метаданных. Этот цикл задает следующие параметры: кто создает метаданные, кто использует их компоненты и кто отвечает за поддержку этих компонентов. Один из главных критериев долгосрочного успеха решения для работы с метаданными - это его расширяемость. Архитектура должна позволять легко добавлять новые требования к метаданным. Для этого необходим специальный процесс, обеспечивающий добавление новой информации о метаданных. При этом необходимо получить ответы на следующие важные вопросы:
* нужно ли хранить новые метаданные в общем репозитории (если таковой имеется);
* каковы методы доступа к элементам этих метаданных (только чтение или чтение и запись);
* являются ли эти метаданные уникальными или будут использоваться несколькими приложениями.
На основе ответов на эти вопросы принимаются соответствующие решения о хранении компонентов новых метаданных.
Пример решения для работы с метаданными
В качестве примера автор приводит розничную компанию, имеющую несколько Хранилищ данных для обеспечения различных видов бизнес-отчетности. Компания имеет Хранилище для составления отчетов по каналам поставок, Хранилище для CRM, Хранилище для данных о продажах и отдельное Хранилище для финансовой информации. Компания хочет создать единое корпоративное Хранилище данных с помощью консолидации информации в масштабах всей организации. Это хранилище будет центральным репозиторием для всех корпоративных данных, а отдельные подразделения будут создавать себе витрины данных на его основе. В процессе реализации этого проекта пришло понимание того, что также необходимо выработать стратегию консолидации метаданных.
Для этого можно использовать подход, описанный выше, который включает четыре основных действия. Первое действие - определение требований к метаданным. Этот процесс включает идентификацию заинтересованных сторон и классификацию метаданных. Поскольку это проект консолидации Хранилища данных, то типы метаданных будут достаточно простыми. Основные элементы - это некоторые корпоративные измерения, которые должны быть определены, и корпоративные факты. Оба этих элемента связаны с одними и теми же метаданными бизнеса. Следующий набор метаданных - это список таблиц и граф, использующих данные измерения и факты, т.е. это технические метаданные. Наконец, для документирования процессов ETL (extraction, transformation, loading - извлечение, преобразование и загрузка) и создания витрин данных необходима информация о тех шагах, из которых они состоят, т.е. это метаданные о процессах.
Для этих метаданных заинтересованными сторонами являются те, кто занимаются моделированием данных, а также разработчики ETL, витрин данных и отчетов. Помимо этого, такие метаданные нужны для работы с инструментами ETL и отчетности. Для консолидации метаданных требуются все элементы метаданных, их классификация, а также информация о том, кто и какие именно данные использует.
Следующий шаг - моделирование решения для работы с метаданными. В организации было принято решение создать свою метамодель, которая бы учитывала требования к модели данных, процессу ETL, витринам данных и инструментам отчетности.
После создания метамодели необходимо определить общую архитектуру. Было решено создать единый репозиторий для метаданных и определить процесс, который обеспечит его наполнение из всех систем. Например, после определения измерений и фактов метаданные экспортируются из инструментов моделирования данных и сохраняются в репозитории. Информация о процессах ETL создается вручную и также сохраняется в репозитории. Репозиторий инструментов отчетности наполняется с помощью заранее определенной технологии. Для выполнения требований отчетности, предъявляемых к метаданным, была создана система отчетности на основе интернета, которая создает запросы к репозиторию для получения информации.
После создания такого решения консолидация метаданных может считаться практически законченной. Следующая проблема - обеспечение долговременной работы данного решения. Например, как должен обрабатываться новый элемент или измерение, созданные в модели данных? Как вносится информация о новом процессе ETL или новом отчете? Все это определяется процессом поддержки метаданных. Для моделей данных периодически используется процесс синхронизации репозиториев инструментов и метаданных. Для ETL и отчетности существуют аналогичные процессы.
Заключение
Важность метаданных для корпораций уже общепризнанна. При работе с метаданными очень важно предварительно выработать соответствующую стратегию. Также важно понимать, что метаданные не являются универсальным средством для управления данными. Это мощное средство, которое может существенно улучшить качество анализа данных в корпорации, тем самым способствуя росту эффективности ее работы. При этом важно не распыляться в поисках абсолютно совершенного решения, а создавать решение, наиболее оптимальное для конкретного бизнеса.
Все протоколы обмена маршрутной информацией стека TCP/IP относятся к классу адаптивных протоколов, которые в свою очередь делятся на две группы, каждая из которых связана с одним из следующих типов алгоритмов:
* дистанционно-векторный алгоритм (Distance Vector Algorithms, DVA),
* алгоритм состояния связей (Link State Algorithms, LSA).
В алгоритмах дистанционно-векторного типа каждый маршрутизатор периодически и широковещательно рассылает по сети вектор расстояний от себя до всех известных ему сетей. Под расстоянием обычно понимается число промежуточных маршрутизаторов через которые пакет должен пройти прежде, чем попадет в соответствующую сеть. Может использоваться и другая метрика, учитывающая не только число перевалочных пунктов, но и время прохождения пакетов по связи между соседними маршрутизаторами.
Получив вектор от соседнего маршрутизатора, каждый маршрутизатор добавляет к нему информацию об известных ему других сетях, о которых он узнал непосредственно (если они подключены к его портам) или из аналогичных объявлений других маршрутизаторов, а затем снова рассылает новое значение вектора по сети. В конце-концов, каждый маршрутизатор узнает информацию об имеющихся в интерсети сетях и о расстоянии до них через соседние маршрутизаторы.
Дистанционно-векторные алгоритмы хорошо работают только в небольших сетях. В больших сетях они засоряют линии связи интенсивным широковещательным трафиком, к тому же изменения конфигурации могут отрабатываться по этому алгоритму не всегда корректно, так как маршрутизаторы не имеют точного представления о топологии связей в сети, а располагают только обобщенной информацией - вектором дистанций, к тому же полученной через посредников. Работа маршрутизатора в соответствии с дистанционно-векторным протоколом напоминает работу моста, так как точной топологической картины сети такой маршрутизатор не имеет.
Наиболее распространенным протоколом, основанным на дистанционно-векторном алгоритме, является протокол RIP.
Алгоритмы состояния связей обеспечивают каждый маршрутизатор информацией, достаточной для построения точного графа связей сети. Все маршрутизаторы работают на основании одинаковых графов, что делает процесс маршрутизации более устойчивым к изменениям конфигурации. Широковещательная рассылка используется здесь только при изменениях состояния связей, что происходит в надежных сетях не так часто.
Для того, чтобы понять, в каком состоянии находятся линии связи, подключенные к его портам, маршрутизатор периодически обменивается короткими пакетами со своими ближайшими соседями. Этот трафик также широковещательный, но он циркулирует только между соседями и поэтому не так засоряет сеть.
Протоколом, основанным на алгоритме состояния связей, в стеке TCP/IP является протокол OSPF.
Дистанционно-векторный протокол RIP
Протокол RIP (Routing Information Protocol) представляет собой один из старейших протоколов обмена маршрутной информацией, однако он до сих пор чрезвычайно распространен в вычислительных сетях. Помимо версии RIP для сетей TCP/IP, существует также версия RIP для сетей IPX/SPX компании Novell.
В этом протоколе все сети имеют номера (способ образования номера зависит от используемого в сети протокола сетевого уровня), а все маршрутизаторы - идентификаторы. Протокол RIP широко использует понятие "вектор расстояний". Вектор расстояний представляет собой набор пар чисел, являющихся номерами сетей и расстояниями до них в хопах.
Вектора расстояний итерационно распространяются маршрутизаторами по сети, и через несколько шагов каждый маршрутизатор имеет данные о достижимых для него сетях и о расстояниях до них. Если связь с какой-либо сетью обрывается, то маршрутизатор отмечает этот факт тем, что присваивает элементу вектора, соответствующему расстоянию до этой сети, максимально возможное значение, которое имеет специальный смысл - "связи нет". Таким значением в протоколе RIP является число 16.
При необходимости отправить пакет в сеть D маршрутизатор просматривает свою базу данных маршрутов и выбирает порт, имеющий наименьшее расстояния до сети назначения (в данном случае порт, связывающий его с маршрутизатором 3).
Для адаптации к изменению состояния связей и оборудования с каждой записью таблицы маршрутизации связан таймер. Если за время тайм-аута не придет новое сообщение, подтверждающее этот маршрут, то он удаляется из маршрутной таблицы.
При использовании протокола RIP работает эвристический алгоритм динамического программирования Беллмана-Форда, и решение, найденное с его помощью является не оптимальным, а близким к оптимальному. Преимуществом протокола RIP является его вычислительная простота, а недостатками - увеличение трафика при периодической рассылке широковещательных пакетов и неоптимальность найденного маршрута.
При обрыве связи с сетью 1 маршрутизатор М1 отмечает, что расстояние до этой сети приняло значение 16. Однако получив через некоторое время от маршрутизатора М2 маршрутное сообщение о том, что от него до сети 1 расстояние составляет 2 хопа, маршрутизатор М1 наращивает это расстояние на 1 и отмечает, что сеть 1 достижима через маршрутизатор 2. В результате пакет, предназначенный для сети 1, будет циркулировать между маршрутизаторами М1 и М2 до тех пор, пока не истечет время хранения записи о сети 1 в маршрутизаторе 2, и он не передаст эту информацию маршрутизатору М1.
Для исключения подобных ситуаций маршрутная информация об известной маршрутизатору сети не передается тому маршрутизатору, от которого она пришла.
Существуют и другие, более сложные случаи нестабильного поведения сетей, использующих протокол RIP, при изменениях в состоянии связей или маршрутизаторов сети.
Комбинирование различных протоколов обмена. Протоколы EGP и BGP сети Internet
Большинство протоколов маршрутизации, применяемых в современных сетях с коммутацией пакетов, ведут свое происхождение от сети Internet и ее предшественницы - сети ARPANET. Для того, чтобы понять их назначение и особенности, полезно сначала познакомится со структурой сети Internet, которая наложила отпечаток на терминологию и типы протоколов.
Internet изначально строилась как сеть, объединяющая большое количество существующих систем. С самого начала в ее структуре выделяли магистральную сеть (core backbone network), а сети, присоединенные к магистрали, рассматривались как автономные системы (autonomous systems). Магистральная сеть и каждая из автономных систем имели свое собственное административное управление и собственные протоколы маршрутизации. Далее маршрутизаторы будут называться шлюзами для следования традиционной терминологии Internet.
Шлюзы, которые используются для образования подсетей внутри автономной системы, называются внутренними шлюзами (interior gateways), а шлюзы, с помощью которых автономные системы присоединяются к магистрали сети, называются внешними шлюзами (exterior gateways). Непосредственно друг с другом автономные системы не соединяются. Соответственно, протоколы маршрутизации, используемые внутри автономных систем, называются протоколами внутренних шлюзов (interior gateway protocol, IGP), а протоколы, определяющие обмен маршрутной информацией между внешними шлюзами и шлюзами магистральной сети - протоколами внешних шлюзов (exterior gateway protocol, EGP). Внутри магистральной сети также может использоваться любой собственный внутренний протокол IGP.
Смысл разделения всей сети Internet на автономные системы в ее многоуровневом представлении, что необходимо для любой крупной системы, способной к расширению в больших масштабах. Внутренние шлюзы могут использовать для внутренней маршрутизации достаточно подробные графы связей между собой, чтобы выбрать наиболее рациональный маршрут. Однако, если информация такой степени детализации будет храниться во всех маршрутизаторах сети, то топологические базы данных так разрастутся, что потребуют наличия памяти гигантских размеров, а время принятия решений о маршрутизации непременно возрастет.
Поэтому детальная топологическая информация остается внутри автономной системы, а автономную систему как единое целое для остальной части Internet представляют внешние шлюзы, которые сообщают о внутреннем составе автономной системы минимально необходимые сведения - количество IP-сетей, их адреса и внутреннее расстояние до этих сетей от данного внешнего шлюза.
При инициализации внешний шлюз узнает уникальный идентификатор обслуживаемой им автономной системы, а также таблицу достижимости (reachability table), которая позволяет ему взаимодействовать с другими внешними шлюзами через магистральную сеть.
Затем внешний шлюз начинает взаимодействовать по протоколу EGP с другими внешними шлюзами и обмениваться с ними маршрутной информацией, состав которой описан выше. В результате, при отправке пакета из одной автономной системы в другую, внешний шлюз данной системы на основании маршрутной информации, полученной от всех внешних шлюзов, с которыми он общается по протоколу EGP, выбирает наиболее подходящий внешний шлюз и отправляет ему пакет.
Каждая функция работает на основе обмена сообщениями запрос-ответ.
Так как каждая автономная система работает под контролем своего административного штата, то перед началом обмена маршрутной информацией внешние шлюзы должны согласиться на такой обмен. Сначала один из шлюзов посылает запрос на установление соседских отношений (acquisition request) другому шлюзу. Если тот согласен на это, то он отвечает сообщением подтверждение установления соседских отношений (acquisition confirm), а если нет - то сообщением отказ от установления соседских отношений (acquisition refuse), которое содержит также причину отказа.
После установления соседских отношений шлюзы начинают периодически проверять состояние достижимости друг друга. Это делается либо с помощью специальных сообщений (привет (hello) и Я-услышал-тебя (I-heard-you)), либо встраиванием подтверждающей информации непосредственно в заголовок обычного маршрутного сообщения.
Обмен маршрутной информацией начинается с посылки одним из шлюзов другому сообщения запрос данных (poll request) о номерах сетей, обслуживаемых другим шлюзом и расстояниях до них от него. Ответом на это сообщение служит сообщение обновленная маршрутная информация (routing ). Если же запрос оказался некорректным, то в ответ на него отсылается сообщение об ошибке.
Все сообщения протокола EGP передаются в поле данных IP-пакетов. Сообщения EGP имеют заголовок фиксированного формата.
Поля Тип и Код совместно определяют тип сообщения, а поле Статус - информацию, зависящую от типа сообщения. Поле Номер автономной системы - это номер, назначенный той автономной системе, к которой присоединен данный внешний шлюз. Поле Номер последовательности служит для синхронизации процесса запросов и ответов.
[pagebreak]
Поле IP-адрес исходной сети в сообщениях запроса и обновления маршрутной информации обозначает сеть, соединяющую два внешних шлюза.
Сообщение об обновленной маршрутной информации содержит список адресов сетей, которые достижимы в данной автономной системе. Этот список упорядочен по внутренним шлюзам, которые подключены к исходной сети и через которые достижимы данные сети, а для каждого шлюза он упорядочен по расстоянию до каждой достижимой сети от исходной сети, а не от данного внутреннего шлюза. Для примера внешний шлюз R2 в своем сообщении указывает, что сеть 4 достижима с помощью шлюза R3 и расстояние ее равно 2, а сеть 2 достижима через шлюз R2 и ее расстояние равно 1 (а не 0, как если бы шлюз измерял ее расстояние от себя, как в протоколе RIP).
Протокол EGP имеет достаточно много ограничений, связанных с тем, что он рассматривает магистральную сеть как одну неделимую магистраль.
Развитием протокола EGP является протокол BGP (Border Gateway Protocol), имеющий много общего с EGP и используемый наряду с ним в магистрали сети Internet.
Протокол состояния связей OSPF
Протокол OSPF (Open Shortest Path Firs) является достаточно современной реализацией алгоритма состояния связей (он принят в 1991 году) и обладает многими особенностями, ориентированными на применение в больших гетерогенных сетях.
Протокол OSPF вычисляет маршруты в IP-сетях, сохраняя при этом другие протоколы обмена маршрутной информацией.
Непосредственно связанные (то есть достижимые без использования промежуточных маршрутизаторов) маршрутизаторы называются "соседями". Каждый маршрутизатор хранит информацию о том, в каком состоянии по его мнению находится сосед. Маршрутизатор полагается на соседние маршрутизаторы и передает им пакеты данных только в том случае, если он уверен, что они полностью работоспособны. Для выяснения состояния связей маршрутизаторы-соседи достаточно часто обмениваются короткими сообщениями HELLO.
Для распространения по сети данных о состоянии связей маршрутизаторы обмениваются сообщениями другого типа. Эти сообщения называются router links advertisement - объявление о связях маршрутизатора (точнее, о состоянии связей). OSPF-маршрутизаторы обмениваются не только своими, но и чужими объявлениями о связях, получая в конце-концов информацию о состоянии всех связей сети. Эта информация и образует граф связей сети, который, естественно, один и тот же для всех маршрутизаторов сети.
Кроме информации о соседях, маршрутизатор в своем объявлении перечисляет IP-подсети, с которыми он связан непосредственно, поэтому после получения информации о графе связей сети, вычисление маршрута до каждой сети производится непосредственно по этому графу по алгоритму Дэйкстры. Более точно, маршрутизатор вычисляет путь не до конкретной сети, а до маршрутизатора, к которому эта сеть подключена. Каждый маршрутизатор имеет уникальный идентификатор, который передается в объявлении о состояниях связей. Такой подход дает возможность не тратить IP-адреса на связи типа "точка-точка" между маршрутизаторами, к которым не подключены рабочие станции.
Маршрутизатор вычисляет оптимальный маршрут до каждой адресуемой сети, но запоминает только первый промежуточный маршрутизатор из каждого маршрута. Таким образом, результатом вычислений оптимальных маршрутов является список строк, в которых указывается номер сети и идентификатор маршрутизатора, которому нужно переслать пакет для этой сети. Указанный список маршрутов и является маршрутной таблицей, но вычислен он на основании полной информации о графе связей сети, а не частичной информации, как в протоколе RIP.
Описанный подход приводит к результату, который не может быть достигнут при использовании протокола RIP или других дистанционно-векторных алгоритмов. RIP предполагает, что все подсети определенной IP-сети имеют один и тот же размер, то есть, что все они могут потенциально иметь одинаковое число IP-узлов, адреса которых не перекрываются. Более того, классическая реализация RIP требует, чтобы выделенные линии "точка-точка" имели IP-адрес, что приводит к дополнительным затратам IP-адресов.
В OSPF такие требования отсутствуют: сети могут иметь различное число хостов и могут перекрываться. Под перекрытием понимается наличие нескольких маршрутов к одной и той же сети. В этом случае адрес сети в пришедшем пакете может совпасть с адресом сети, присвоенным нескольким портам.
Если адрес принадлежит нескольким подсетям в базе данных маршрутов, то продвигающий пакет маршрутизатор использует наиболее специфический маршрут, то есть адрес подсети, имеющей более длинную маску.
Например, если рабочая группа ответвляется от главной сети, то она имеет адрес главной сети наряду с более специфическим адресом, определяемым маской подсети. При выборе маршрута к хосту в подсети этой рабочей группы маршрутизатор найдет два пути, один для главной сети и один для рабочей группы. Так как последний более специфичен, то он и будет выбран. Этот механизм является обобщением понятия "маршрут по умолчанию", используемого во многих сетях.
Использование подсетей с различным количеством хостов является вполне естественным. Например, если в здании или кампусе на каждом этаже имеются локальные сети, и на некоторых этажах компьютеров больше, чем на других, то администратор может выбрать размеры подсетей, отражающие ожидаемые требования каждого этажа, а не соответствующие размеру наибольшей подсети.
В протоколе OSPF подсети делятся на три категории:
* "хост-сеть", представляющая собой подсеть из одного адреса,
* "тупиковая сеть", которая представляет собой подсеть, подключенную только к одному маршрутизатору,
* "транзитная сеть", которая представляет собой подсеть, подключенную к более чем одному маршрутизатору.
Транзитная сеть является для протокола OSPF особым случаем. В транзитной сети несколько маршрутизаторов являются взаимно и одновременно достижимыми. В широковещательных локальных сетях, таких как Ethernet или Token Ring, маршрутизатор может послать одно сообщение, которое получат все его соседи. Это уменьшает нагрузку на маршрутизатор, когда он посылает сообщения для определения существования связи или обновленные объявления о соседях.
Однако, если каждый маршрутизатор будет перечислять всех своих соседей в своих объявлениях о соседях, то объявления займут много места в памяти маршрутизатора. При определении пути по адресам транзитной подсети может обнаружиться много избыточных маршрутов к различным маршрутизаторам. На вычисление, проверку и отбраковку этих маршрутов уйдет много времени.
Когда маршрутизатор начинает работать в первый раз (то есть инсталлируется), он пытается синхронизировать свою базу данных со всеми маршрутизаторами транзитной локальной сети, которые по определению имеют идентичные базы данных. Для упрощения и оптимизации этого процесса в протоколе OSPF используется понятие "выделенного" маршрутизатора, который выполняет две функции.
Во-первых, выделенный маршрутизатор и его резервный "напарник" являются единственными маршрутизаторами, с которыми новый маршрутизатор будет синхронизировать свою базу. Синхронизировав базу с выделенным маршрутизатором, новый маршрутизатор будет синхронизирован со всеми маршрутизаторами данной локальной сети.
Во-вторых, выделенный маршрутизатор делает объявление о сетевых связях, перечисляя своих соседей по подсети. Другие маршрутизаторы просто объявляют о своей связи с выделенным маршрутизатором. Это делает объявления о связях (которых много) более краткими, размером с объявление о связях отдельной сети.
Для начала работы маршрутизатора OSPF нужен минимум информации - IP-конфигурация (IP-адреса и маски подсетей), некоторая информация по умолчанию (default) и команда на включение. Для многих сетей информация по умолчанию весьма похожа. В то же время протокол OSPF предусматривает высокую степень программируемости.
Интерфейс OSPF (порт маршрутизатора, поддерживающего протокол OSPF) является обобщением подсети IP. Подобно подсети IP, интерфейс OSPF имеет IP-адрес и маску подсети. Если один порт OSPF поддерживает более, чем одну подсеть, протокол OSPF рассматривает эти подсети так, как если бы они были на разных физических интерфейсах, и вычисляет маршруты соответственно.
Интерфейсы, к которым подключены локальные сети, называются широковещательными (broadcast) интерфейсами, так как они могут использовать широковещательные возможности локальных сетей для обмена сигнальной информацией между маршрутизаторами. Интерфейсы, к которым подключены глобальные сети, не поддерживающие широковещание, но обеспечивающие доступ ко многим узлам через одну точку входа, например сети Х.25 или frame relay, называются нешироковещательными интерфейсами с множественным доступом или NBMA (non-broadcast multi-access).
Они рассматриваются аналогично широковещательным интерфейсам за исключением того, что широковещательная рассылка эмулируется путем посылки сообщения каждому соседу. Так как обнаружение соседей не является автоматическим, как в широковещательных сетях, NBMA-соседи должны задаваться при конфигурировании вручную. Как на широковещательных, так и на NBMA-интерфейсах могут быть заданы приоритеты маршрутизаторов для того, чтобы они могли выбрать выделенный маршрутизатор.
Интерфейсы "точка-точка", подобные PPP, несколько отличаются от традиционной IP-модели. Хотя они и могут иметь IP-адреса и подмаски, но необходимости в этом нет.
В простых сетях достаточно определить, что пункт назначения достижим и найти маршрут, который будет удовлетворительным. В сложных сетях обычно имеется несколько возможных маршрутов. Иногда хотелось бы иметь возможности по установлению дополнительных критериев для выбора пути: например, наименьшая задержка, максимальная пропускная способность или наименьшая стоимость (в сетях с оплатой за пакет). По этим причинам протокол OSPF позволяет сетевому администратору назначать каждому интерфейсу определенное число, называемое метрикой, чтобы оказать нужное влияние на выбор маршрута.
Число, используемое в качестве метрики пути, может быть назначено произвольным образом по желанию администратора. Но по умолчанию в качестве метрики используется время передачи бита в 10-ти наносекундных единицах (10 Мб/с Ethernet'у назначается значение 10, а линии 56 Кб/с - число 1785). Вычисляемая протоколом OSPF метрика пути представляет собой сумму метрик всех проходимых в пути связей; это очень грубая оценка задержки пути. Если маршрутизатор обнаруживает более, чем один путь к удаленной подсети, то он использует путь с наименьшей стоимостью пути.
В протоколе OSPF используется несколько временных параметров, и среди них наиболее важными являются интервал сообщения HELLO и интервал отказа маршрутизатора (router dead interval).
HELLO - это сообщение, которым обмениваются соседние, то есть непосредственно связанные маршрутизаторы подсети, с целью установить состояние линии связи и состояние маршрутизатора-соседа. В сообщении HELLO маршрутизатор передает свои рабочие параметры и говорит о том, кого он рассматривает в качестве своих ближайших соседей. Маршрутизаторы с разными рабочими параметрами игнорируют сообщения HELLO друг друга, поэтому неверно сконфигурированные маршрутизаторы не будут влиять на работу сети.
Каждый маршрутизатор шлет сообщение HELLO каждому своему соседу по крайней мере один раз на протяжении интервала HELLO. Если интервал отказа маршрутизатора истекает без получения сообщения HELLO от соседа, то считается, что сосед неработоспособен, и распространяется новое объявление о сетевых связях, чтобы в сети произошел пересчет маршрутов.
Пример маршрутизации по алгоритму OSPF
Представим себе один день из жизни транзитной локальной сети. Пусть у нас имеется сеть Ethernet, в которой есть три маршрутизатора - Джон, Фред и Роб (имена членов рабочей группы Internet, разработавшей протокол OSPF). Эти маршрутизаторы связаны с сетями в других городах с помощью выделенных линий.
Пусть произошло восстановление сетевого питания после сбоя. Маршрутизаторы и компьютеры перезагружаются и начинают работать по сети Ethernet. После того, как маршрутизаторы обнаруживают, что порты Ethernet работают нормально, они начинают генерировать сообщения HELLO, которые говорят о их присутствии в сети и их конфигурации. Однако маршрутизация пакетов начинает осуществляться не сразу - сначала маршрутизаторы должны синхронизировать свои маршрутные базы.
На протяжении интервала отказа маршрутизаторы продолжают посылать сообщения HELLO. Когда какой-либо маршрутизатор посылает такое сообщение, другие его получают и отмечают, что в локальной сети есть другой маршрутизатор. Когда они посылают следующее HELLO, они перечисляют там и своего нового соседа.
Когда период отказа маршрутизатора истекает, то маршрутизатор с наивысшим приоритетом и наибольшим идентификатором объявляет себя выделенным (а следующий за ним по приоритету маршрутизатор объявляет себя резервным выделенным маршрутизатором) и начинает синхронизировать свою базу данных с другими маршрутизаторами.
[pagebreak]
С этого момента времени база данных маршрутных объявлений каждого маршрутизатора может содержать информацию, полученную от маршрутизаторов других локальных сетей или из выделенных линий. Роб, например, вероятно получил информацию от Мило и Робина об их сетях, и он может передавать туда пакеты данных. Они содержат информацию о собственных связях маршрутизатора и объявления о связях сети.
Базы данных теперь синхронизированы с выделенным маршрутизатором, которым является Джон. Джон суммирует свою базу данных с каждой базой данных своих соседей - базами Фреда, Роба и Джеффа - индивидуально. В каждой синхронизирующейся паре объявления, найденные только в какой-либо одной базе, копируются в другую. Выделенный маршрутизатор, Джон, распространяет новые объявления среди других маршрутизаторов своей локальной сети.
Например, объявления Мило и Робина передаются Джону Робом, а Джон в свою очередь передает их Фреду и Джеффри. Обмен информацией между базами продолжается некоторое время, и пока он не завершится, маршрутизаторы не будут считать себя работоспособными. После этого они себя таковыми считают, потому что имеют всю доступную информацию о сети.
Посмотрим теперь, как Робин вычисляет маршрут через сеть. Две из связей, присоединенных к его портам, представляют линии T-1, а одна - линию 56 Кб/c. Робин сначала обнаруживает двух соседей - Роба с метрикой 65 и Мило с метрикой 1785. Из объявления о связях Роба Робин обнаружил наилучший путь к Мило со стоимостью 130, поэтому он отверг непосредственный путь к Мило, поскольку он связан с большей задержкой, так как проходит через линии с меньшей пропускной способностью. Робин также обнаруживает транзитную локальную сеть с выделенным маршрутизатором Джоном. Из объявлений о связях Джона Робин узнает о пути к Фреду и, наконец, узнает о пути к маршрутизаторам Келли и Джеффу и к их тупиковым сетям.
После того, как маршрутизаторы полностью входят в рабочий режим, интенсивность обмена сообщениями резко падает. Обычно они посылают сообщение HELLO по своим подсетям каждые 10 секунд и делают объявления о состоянии связей каждые 30 минут (если обнаруживаются изменения в состоянии связей, то объявление передается, естественно, немедленно). Обновленные объявления о связях служат гарантией того, что маршрутизатор работает в сети. Старые объявления удаляются из базы через определенное время.
Представим, однако, что какая-либо выделенная линия сети отказала. Присоединенные к ней маршрутизаторы распространяют свои объявления, в которых они уже не упоминают друг друга. Эта информация распространяется по сети, включая маршрутизаторы транзитной локальной сети. Каждый маршрутизатор в сети пересчитывает свои маршруты, находя, может быть, новые пути для восстановления утраченного взаимодействия.
Сравнение протоколов RIP и OSPF по затратам на широковещательный трафик
В сетях, где используется протокол RIP, накладные расходы на обмен маршрутной информацией строго фиксированы. Если в сети имеется определенное число маршрутизаторов, то трафик, создаваемый передаваемой маршрутной информацией, описываются формулой (1):
(1) F = (число объявляемых маршрутов/25) x 528 (байтов в сообщении) x
(число копий в единицу времени) x 8 (битов в байте)
В сети с протоколом OSPF загрузка при неизменном состоянии линий связи создается сообщениями HELLO и обновленными объявлениями о состоянии связей, что описывается формулой (2):
(2) F = { [ 20 + 24 + 20 + (4 x число соседей)] x
(число копий HELLO в единицу времени) }x 8 +
[(число объявлений x средний размер объявления) x
(число копий объявлений в единицу времени)] x 8,
где 20 - размер заголовка IP-пакета,
24 - заголовок пакета OSPF,
20 - размер заголовка сообщения HELLO,
4 - данные на каждого соседа.
Интенсивность посылки сообщений HELLO - каждые 10 секунд, объявлений о состоянии связей - каждые полчаса. По связям "точка-точка" или по широковещательным локальным сетям в единицу времени посылается только одна копия сообщения, по NBMA сетям типа frame relay каждому соседу посылается своя копия сообщения. В сети frame relay с 10 соседними маршрутизаторами и 100 маршрутами в сети (подразумевается, что каждый маршрут представляет собой отдельное OSPF-обобщение о сетевых связях и что RIP распространяет информацию о всех этих маршрутах) трафик маршрутной информации определяется соотношениями (3) и (4):
(3) RIP: (100 маршрутов / 25 маршрутов в объявлении) x 528 x
(10 копий / 30 сек) = 5 632 б/с
(4) OSPF: {[20 + 24 + 20 + (4 x 10) x (10 копий / 10 сек)] +
[100 маршрутов x (32 + 24 + 20) + (10 копий / 30 x 60 сек]} x 8 = 1 170 б/с
Как видно из полученных результатов, для нашего гипотетического примера трафик, создаваемый протоколом RIP, почти в пять раз интенсивней трафика, создаваемого протоколом OSPF.
Использование других протоколов маршрутизации
Случай использования в сети только протокола маршрутизации OSPF представляется маловероятным. Если сеть присоединена к Internet'у, то могут использоваться такие протоколы, как EGP (Exterior Gateway protocol), BGP (Border Gateway Protocol, протокол пограничного маршрутизатора), старый протокол маршрутизации RIP или собственные протоколы производителей.
Когда в сети начинает применяться протокол OSPF, то существующие протоколы маршрутизации могут продолжать использоваться до тех пор, пока не будут полностью заменены. В некоторых случаях необходимо будет объявлять о статических маршрутах, сконфигурированных вручную.
В OSPF существует понятие автономных систем маршрутизаторов (autonomous systems), которые представляют собой домены маршрутизации, находящиеся под общим административным управлением и использующие единый протокол маршрутизации. OSPF называет маршрутизатор, который соединяет автономную систему с другой автономной системой, использующей другой протокол маршрутизации, пограничным маршрутизатором автономной системы (autonomous system boundary router, ASBR).
В OSPF маршруты (именно маршруты, то есть номера сетей и расстояния до них во внешней метрике, а не топологическая информация) из одной автономной системы импортируются в другую автономную систему и распространяются с использованием специальных внешних объявлений о связях.
Внешние маршруты обрабатываются за два этапа. Маршрутизатор выбирает среди внешних маршрутов маршрут с наименьшей внешней метрикой. Если таковых оказывается больше, чем 2, то выбирается путь с меньшей стоимостью внутреннего пути до ASBR.
Область OSPF - это набор смежных интерфейсов (территориальных линий или каналов локальных сетей). Введение понятия "область" служит двум целям - управлению информацией и определению доменов маршрутизации.
Для понимания принципа управления информацией рассмотрим сеть, имеющую следующую структуру: центральная локальная сеть связана с помощью 50 маршрутизаторов с большим количеством соседей через сети X.25 или frame relay. Эти соседи представляют собой большое количество небольших удаленных подразделений, например, отделов продаж или филиалов банка.
Из-за большого размера сети каждый маршрутизатор должен хранить огромное количество маршрутной информации, которая должна передаваться по каждой из линий, и каждое из этих обстоятельств удорожает сеть. Так как топология сети проста, то большая часть этой информации и создаваемого ею трафика не имеют смысла.
Для каждого из удаленных филиалов нет необходимости иметь детальную маршрутную информацию о всех других удаленных офисах, в особенности, если они взаимодействуют в основном с центральными компьютерами, связанными с центральными маршрутизаторами. Аналогично, центральным маршрутизаторам нет необходимости иметь детальную информацию о топологии связей с удаленными офисами, соединенными с другими центральными маршрутизаторами.
В то же время центральные маршрутизаторы нуждаются в информации, необходимой для передачи пакетов следующему центральному маршрутизатору. Администратор мог бы без труда разделить эту сеть на более мелкие домены маршрутизации для того, чтобы ограничить объемы хранения и передачи по линиям связи не являющейся необходимой информации. Обобщение маршрутной информации является главной целью введения областей в OSPF.
В протоколе OSPF определяется также пограничный маршрутизатор области (ABR, area border router). ABR - это маршрутизатор с интерфейсами в двух или более областях, одна из которых является специальной областью, называемой магистральной (backbone area). Каждая область работает с отдельной базой маршрутной информации и независимо вычисляет маршруты по алгоритму OSPF.
Пограничные маршрутизаторы передают данные о топологии области в соседние области в обобщенной форме - в виде вычисленных маршрутов с их весами. Поэтому в сети, разбитой на области, уже не действует утверждение о том, что все маршрутизаторы оперируют с идентичными топологическими базами данных.
Маршрутизатор ABR берет информацию о маршрутах OSPF, вычисленную в одной области, и транслирует ее в другую область путем включения этой информации в обобщенное суммарное объявление (summary) для базы данных другой области. Суммарная информация описывает каждую подсеть области и дает для нее метрику. Суммарная информация может быть использована тремя способами: для объявления об отдельном маршруте, для обобщения нескольких маршрутов или же служить маршрутом по умолчанию.
Дальнейшее уменьшение требований к ресурсам маршрутизаторов происходит в том случае, когда область представляет собой тупиковую область (stub area). Этот атрибут администратор сети может применить к любой области, за исключением магистральной. ABR в тупиковой области не распространяет внешние объявления или суммарные объявления из других областей. Вместо этого он делает одно суммарное объявление, которое будет удовлетворять любой IP-адрес, имеющий номер сети, отличный от номеров сетей тупиковой области. Это объявление называется маршрутом по умолчанию.
Маршрутизаторы тупиковой области имеют информацию, необходимую только для вычисления маршрутов между собой плюс указания о том, что все остальные маршруты должны проходить через ABR. Такой подход позволяет уменьшить в нашей гипотетической сети количество маршрутной информации в удаленных офисах без уменьшения способности маршрутизаторов корректно передавать пакеты.