Протокол IGMP (Internet Group Management Protocol) отвечает за регулирование групповых передач в сети.
То есть с его помощью можно сказать маршрутизатору: мне нужны пакеты с такими-то адресами, остальные можешь слать лесом. Тем самым сетевая нагрузка на устройство может сильно уменьшиться, если в сетке этих мультикастов гуляет целая куча.
Если регулироваться их прохождение не будет, то устройство получит все пакеты
читать дальшеПротокол прост и незамысловат, если не вдаваться в тонкости. Я пока смотрел только вторую версию протокола IGMPv2. Остальные не сильно сложнее.
IP-заголовок пакета отличается от UDP, во-первых, типом (вместо 0x11 у UDP здесь 0x02), во-вторых дополнительным полем Router Alert (4 байта в конце 0x94 0x04 0x00 0x00), которое заставляет маршрутизатор посмотреть содержимое пакета (иначе он просто пошлёт дальше, проигнорировав).
Устройство должно уметь принимать всего один тип пакетов:
— Membership Query Message. Запрос списка нужных рассылок. Внутри него интересно лишь одно поле: адрес. Если в поле адреса нули (0.0.0.0), то устройство, получившее запрос, шлёт список адресов рассылок, которые ему надо получать. Если там какой-то адрес, то отвечаем только конкретно по нему: нужна нам эта рассылка или нет.
Отправлять надо два типа пакетов:
— Membership Report Message — нам нужна эта рассылка, шлите мне её;
— Membership Leave Message — нам эта рассылка более не нужна, фильтруйте.
Отличаются они только типом 0x16 у Report и 0x17 у Leave. Кроме типа и, собственно, адреса мультикаст-рассылки, там ничего важного и нет.
А, ещё один важный момент: Membership Report Message шлётся по адресу рассылки (который указан в пакете), а Membership Leave Message шлётся по адресу 224.0.0.2 (всем маршрутизаторам что ли).
Пакеты могут отправляться в любое время, если есть такая надобность, и Report отправляется, если пришёл запрос Query.
Сам формат пакетов можно посмотреть тут: IP Multicast.
Или так:
Мне оно надо, так как протокол sACN (E1.31) использует мультикаст рассылки и требует поддержки этого протокола.