# Querier

Рассмотрим чуть более сложный случай:

![IGMP Querier](http://img-fotki.yandex.ru/get/9813/83739833.38/0_da358_a61224c0_XL.png)

В клиентский сегмент подключено два (или больше) маршрутизатора, которые могут вещать трафик. Если ничего не сделать, мультикастовый трафик будет дублироваться — оба маршрутизатора ведь будут получать Report от клиентов. Во избежание этого существует механизм выбора **Querier** — опрашивателя. Тот кто победит, будет посылать Query, мониторить Report и реагировать на Leave, ну и, соответственно, он будет отправлять и трафик в сегмент. Проигравший же будет только слушать Report и держать руку на пульсе.

Выборы происходят довольно просто и интуитивно понятно.\
Рассмотрим ситуацию с момента включения маршрутизаторов R1 и R2.\
**1)** Активировали IGMP на интерфейсах.\
**2)** Сначала по умолчанию каждый из них считает себя Querier.\
**3)** Каждый отправляет IGMP General Query в сеть. Главная цель — узнать, есть ли клиенты, а параллельно — заявить другим маршрутизаторам в сегменте, если они есть, о своём желании участвовать в выборах.\
**4)** General Query получают все устройства в сегменте, в том числе и другие IGMP-маршрутизаторы.\
**5)** Получив такое сообщение от соседа, каждый маршрутизатор оценивает, кто достойнее.\
**6)** Побеждает маршрутизатор с **меньшим IP** (указан в поле Source IP пакета IGMP Query). Он становится Querier, все другие — Non-Querier.\
**7)** Non-Querier запускает таймер, который обнуляется каждый раз, как приходит Query с меньшим IP-адресом. Если до истечения таймера (больше 100 секунд: 105-107) маршрутизатор не получит Query с меньшим адресом, он объявляет себя Querier и берёт на себя все соответствующие функции.\
**8)** Если Querier получает Query с меньшим адресом, он складывает с себя эти обязанности. Querier'ом становится другой маршрутизатор, у которого IP меньше.

*Тот редкий случай, когда меряются, у кого меньше.*

Выборы Querier очень важная процедура в мультикасте, но некоторые коварные производители, не придерживающиеся RFC, могут вставить крепкую палку в колёса. Я сейчас говорю о IGMP Query с адресом источника 0.0.0.0, которые могут генерироваться коммутатором. Такие сообщения не должны участвовать в выборе Querier, но надо быть готовыми ко всему. [Вот пример](http://nag.ru/articles/article/25136/takie-raznyie-problemyi.html) весьма сложной долгоиграющей проблемы.
