Поделиться через


Получение уведомлений об изменениях

Многие клиенты могут одновременно обновлять таблицу маршрутизации, и клиенты должны получать уведомления при изменении сведений о маршрутизации. Например, клиент, который не уведомлен об изменениях другого клиента в таблице маршрутизации, может объявлять устаревшие сведения о маршруте. Это можно предотвратить, если клиенты будут регистрироваться у диспетчера таблиц маршрутизации, чтобы получать уведомления об изменениях в таблице маршрутизации. Диспетчер таблиц маршрутизации отправляет уведомления об изменениях всем клиентам, которые регистрируют их для получения.

Уведомление об изменении применяется только к назначениям. Невозможно обратиться к диспетчеру таблиц маршрутизации, чтобы узнать об изменениях в конкретном маршруте.

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

В настоящее время существует три типа уведомлений об изменениях, на которые клиент может зарегистрироваться.

  • Уведомление о любых изменениях маршрутов для назначения. Этот запрос выполняется с помощью флага RTM_CHANGE_TYPE_ALL.

  • Уведомление, если лучший маршрут до пункта назначения изменится, или изменится любая из следующей информации о текущем лучшем маршруте:

    • Предпочтение
    • Дальнейшие прыжки
    • Флаги маршрута

    Этот запрос выполняется с помощью флага RTM_CHANGE_TYPE_BEST.

  • Уведомление обо всех изменениях типа RTM_CHANGE_TYPE_BEST, за исключением изменений в флагах без пересылки в лучшем маршруте. Например, диспетчер маршрутизатора следит за изменениями этого типа в одноадресном представлении и обновляет сведения в одноадресном маршрутизаторе. Этот запрос выполняется с помощью флага RTM_CHANGE_TYPE_FORWARDING.

Запросы на уведомления об изменениях также могут быть ограничены подмножеством назначений, регистрируя уведомления об изменениях только в "помеченных" назначениях. Клиент может пометить назначение для уведомления об изменениях, вызвав RtmMarkDestForChangeNotification.

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

  • Тип изменения, который произошел, — это тип, для которого клиент зарегистрировался для уведомления
  • Изменения произошли в обозначенном клиентом месте назначения или в любом из мест назначения, если клиент запросил изменения для всех мест.
  • Клиент запрашивал уведомление об изменениях для представления, в котором произошло это изменение

Если изменение соответствует всем приведенным выше критериям, изменение кэшируется и клиент уведомляется.

Уведомление не указывает фактические изменения, только то, что они произошли. Клиент должен получить изменения, вызвав функцию RtmGetChangedDests, используя дескриптор уведомлений, который был получен из предыдущего вызова функции RtmRegisterForChangeNotification.