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


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

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

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

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

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

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

  • Уведомление о том, что меняется оптимальный маршрут к месту назначения, или какие-либо из следующих сведений для текущего наилучшего маршрута:

    • Предпочтение
    • Следующие прыжки
    • Флаги маршрута

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

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

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

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

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

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

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