Диаграмма состояний
Поведение IGMP формально описывается приведенной ниже диаграммой состояний. Хост может находиться в одном из трех возможных состояний применительно к любой группе хостов IP на любом из сетевых интерфейсов:
- Состояние Non-Member (хост не входит в группу)
- начальное состояние для всех групп на всех сетевых интерфейсах. Это состояние не требует ресурсов хоста.
- Состояние Delaying Member
- говорит о том, что хост принадлежит к группе на данном интерфейсе и запущен таймер генерации отчета о принадлежности к группе.
- Состояние Idle Member
- говорит о том, что хост входит в группу, но таймер генерации отчета о принадлежности к группе не запущен.
Существует пять типов событий, которые могут вызывать изменения состояний IGMP:
- Событие join group (подключение к группе)
- связано с решением хоста о подключении к группе на данном интерфейсе. Это событие может быть связано только с хостами, находящимися в состоянии Non-Member.
- Событие leave group (выход из группы)
- происходит в тех случаях, когда хост покидает группу на данном интерфейсе. Это событие может происходить только для хостов, находящихся в состоянии Delaying Member или Idle Member.
- Событие query received (получен запрос)
- связано с получением хостом корректного сообщения IGMP Host Membership Query. Корректное сообщение Query должно иметь размер не менее 8 октетов, корректную контрольную сумму IGMP и IP-адрес получателя 224.0.0.1. Одно сообщение Query применимо ко всем фактам принадлежности (membership) на интерфейсе, из которого получено сообщение Query. Это сообщение игнорируется хостами, находящимися в состоянии Non-Member или Delaying Member.
- Событие report received
- связано с получением хостом корректного сообщения IGMP Host Membership Report (сообщение должно иметь размер не менее 8 октетов, корректную контрольную сумму IGMP и одинаковый адрес IP в поле получателя и адреса группы IGMP). Сообщение Report применимо только к принадлежности к группе, указанной в данном сообщении и относящейся к интерфейсу, через который принято сообщение Report. Это сообщение игнорируется хостами, находящимися в состоянии Non-Member или Delaying Member.
- Событие timer expired
- происходит при завершении времени, заданного для таймера задержки этой группы на данном интерфейсе. Событие может происходить только в состоянии Delaying Member.
Все прочие события (например, некорректные сообщения IGMP или сообщения IGMP, не являющиеся Query или Report) игнорируются в любом состоянии.
В ответ на перечисленные выше события может выполняться три типа операций:
- Передача отчета (send report) для группы на данном интерфейсе.
- Запуск таймера (start timer) для группы на данном интерфейсе с использованием случайной задержки в диапазоне от 0 до D секунд.
- Остановка таймера (stop timer) для группы на данном интерфейсе.
На приведенной ниже диаграмме каждый переход обозначен меткой события, вызвавшего этот переход, и в скобках указаны действия, выполняемые в процессе перехода.
________________ | | | | | | | | --------->| Non-Member |<--------- | | | | | | | | | | | | | |________________| | | | | | leave group | join group | leave group | (stop timer) |(send report, | | | start timer) | ________|________ | ________|________ | |<--------- | | | | | | | |<-------------------| | | | query received | | | Delaying Member | (start timer) | Idle Member | | |------------------->| | | | report received | | | | (stop timer) | | |_________________|------------------->|_________________| timer expired (send report)
Группа all-hosts (адрес 224.0.0.1) рассматривается как специальный случай. Хост стартует в состоянии Idle Member по отношению к этой группе на всех интерфейсах, никогда не переходит в другие состояния и никогда не шлет сообщений о принадлежности к этой группе.
Параметры протокола
Максимальная задержка передачи отчета (D) составляет 10 секунд.