Я столкнулся со странной проблемой при работе с мультикастом во FreeBSD 12.x. Проблема состоит в том, что система не отправляет запросы IGMP Leave, т.е. не отписывается от мультикаста по окончании его использования. В результате единожды запрошенный мультикаст льётся в сетевой интерфейс вечно, даже если он уже сто лет как не нужен. Это приводит к быстрому забиванию сетевой полосы и необходимости перезагрузки сервера. Либо я чего-то фатально не понял
Итак, следственный эксперимент выглядит так. Имеем под рукой две машинки: на одной 12.1, на другой - 11.3. На обеих установлен ffprobe 4.2.x. Проводим эксперимент на мультикасте 234.5.2.157:1234. Смысл эксперимента состоит в том, что мы запрашиваем мультикаст через ffprobe, при этом с помощью tcpdump пишем дамп всех IGMP-запросов, а сам ffprobe запускаем с помощью truss, чтобы отследить его вызовы.
Что в итоге вышло?
1) Смотрим системные вызовы setsockopt в логах truss.
11.3:
Код: Выделить всё
setsockopt(3,SOL_SOCKET,SO_NOSIGPIPE,0x7fffffffd92c,4) = 0 (0x0)
setsockopt(3,SOL_SOCKET,SO_REUSEADDR,0x80ecba028,4) = 0 (0x0)
setsockopt(3,IPPROTO_IP,IP_ADD_MEMBERSHIP,0x7fffffffe360,8) = 0 (0x0)
setsockopt(3,SOL_SOCKET,SO_RCVBUF,0x7fffffffe360,4) = 0 (0x0)
setsockopt(3,IPPROTO_IP,IP_DROP_MEMBERSHIP,0x7fffffffe440,8) = 0 (0x0)
Код: Выделить всё
setsockopt(3,SOL_SOCKET,SO_NOSIGPIPE,0x7fffffffd3ac,4) = 0 (0x0)
setsockopt(3,SOL_SOCKET,SO_REUSEADDR,0x8055869e8,4) = 0 (0x0)
setsockopt(3,IPPROTO_IP,IP_ADD_MEMBERSHIP,0x7fffffffdde0,8) = 0 (0x0)
setsockopt(3,SOL_SOCKET,SO_RCVBUF,0x7fffffffdde0,4) = 0 (0x0)
setsockopt(3,IPPROTO_IP,IP_DROP_MEMBERSHIP,0x7fffffffe290,8) = 0 (0x0)
2) Теперь смотрим IGMP-запросы по этому мультикасту в дампах tcpdump.
11.3:
Код: Выделить всё
14:42:39.191842 IP 192.168.171.66 > 234.5.2.157: igmp v2 report 234.5.2.157
14:42:43.428794 IP 192.168.171.66 > all-routers.mcast.net: igmp leave 234.5.2.157
Код: Выделить всё
14:42:25.372999 IP 192.168.71.100 > 234.5.2.157: igmp v2 report 234.5.2.157
14:42:47.548742 IP 192.168.71.100 > 234.5.2.157: igmp v2 report 234.5.2.157
Что я делаю не так? Где что можно проверить?