Теоретические основы и архитектура
Multicast доставляет один поток многим получателям, а сеть размножает пакеты только там, где путь расходится. Для оператора это IPTV, биржевые ленты и обновления ПО, для клиентов VRF - видеоконференции и корпоративные рассылки. В этом уроке повторяем основы глазами оператора: как хосты сообщают о членстве через IGMP и MLD, как PIM-SM строит общее дерево с RP и переключается на дерево источника, чем отличаются SSM и Bidir, как работает проверка RPF и зачем нужны Anycast RP и MSDP. Затем выясняем главный вопрос модуля: почему LSP протоколов LDP и RSVP-TE, которые вы уже знаете как однонаправленные пути, не умеют размножать пакет, и какие четыре способа есть у оператора - ingress replication, GRE-туннели поверх IP multicast, P2MP/MP2MP LSP и BIER. Урок готовит почву для Rosen mVPN и NG-MVPN: все термины (RPF, (S,G), RP, SPT) пригодятся дальше.
Хосты и маршрутизатор: IGMP и MLD
Оператору важно понимать multicast не только в клиентской VRF, но и в собственной сети (IPTV-головная станция, биржевые ленты, видеоконференции). Хост сообщает ближайшему маршрутизатору о членстве в группе через IGMP (IPv4) или MLD (IPv6). IGMPv2 (RFC 2236) использует отчёты на адрес группы и сообщение Leave на 224.0.0.2; общий запрос отправляется на 224.0.0.1, по умолчанию раз в 125 секунд, а querier на сегменте выбирается по наименьшему IP. IGMPv3 (RFC 3376) добавляет списки источников INCLUDE/EXCLUDE, отчёты уходят на 224.0.0.22, и именно он нужен для SSM. MLDv1/v2 (RFC 2710, RFC 3810) выполняют те же функции поверх ICMPv6. IGMP/MLD работают только между хостом и ближайшим маршрутизатором: по сети оператора состояние переносит PIM.
PIM-SM: общее дерево, Register и SPT
PIM-SM (RFC 7761) строит деревья по явному запросу получателей. Соседство устанавливают Hello (по умолчанию каждые 30 секунд, hold time 105 секунд); на сегменте выбирается DR: наибольший DR Priority, затем наибольший IP-адрес. DR получателя при IGMP-отчёте создаёт состояние (*,G) и отправляет Join к RP по маршруту RPF к адресу RP; Join/Prune обновляются периодически (раз в 60 секунд, hold time 210 секунд). Источник сначала неизвестен получателям: DR источника инкапсулирует первые пакеты в PIM Register и направляет их юникастом на RP. RP отправляет (S,G) Join в сторону источника, получает нативный поток, а затем шлёт Register-Stop. После этого последний прыжок обычно переключается на кратчайшее дерево SPT: отправляет (S,G) Join к источнику и (S,G,rpt) Prune к RP. Порог переключения настраивается и на многих платформах по умолчанию равен нулю, то есть переход происходит сразу после первого пакета.
SSM и Bidir
PIM-SSM (RFC 4607) отказывается от RP и общего дерева. Канал задаётся парой (S,G), хост запрашивает его IGMPv3 INCLUDE, последний прыжок отправляет (S,G) Join прямо к источнику. Диапазон SSM по умолчанию 232.0.0.0/8 (IPv4) и FF3x::/32 (IPv6); для IGMPv2-хостов используют SSM mapping. Для IPTV этот режим прост и устойчив: нет Register, нет RP как точки отказа. Bidir PIM (RFC 5015) подходит для many-to-many: состояние только (*,G), на каждом линке для каждого RP выбирается Designated Forwarder, трафик идёт от источника вверх к RP и вниз по общему дереву, без Register и без (S,G) состояния в ядре.
RPF-проверка
Multicast пересылается по принципу reverse path forwarding: пакет принимается, только если пришёл на интерфейс, которым маршрутизатор достигает источника (для (*,G) - адрес RP) по юникастной таблице (MRIB). Пакеты на другом интерфейсе отбрасываются: так подавляются петли. Следствия: асимметричный юникаст, ECMP или неверный маршрут на источник напрямую ломают multicast, даже когда ping проходит. Join отправляется на RPF-соседа, поэтому дерево следует за IGP, а не за конфигурацией PIM.
RP: static, Auto-RP, BSR, Anycast RP и MSDP
RP можно задать статически, динамически через BSR (RFC 5059) или фирменный Auto-RP (Cisco, 224.0.1.39/40). Для отказоустойчивости применяют Anycast RP: несколько маршрутизаторов получают один адрес RP на loopback, а источники регистрируются у ближайшего по IGP. Состояние об источниках между такими RP синхронизируется или через MSDP (RFC 3618, TCP 639, сообщения Source-Active), или через PIM (RFC 4610), где Register пересылается остальным RP набора. Адрес RP должен достигаться по IGP из всех маршрутизаторов домена; рассогласование статического RP на части маршрутизаторов даёт (*,G) без общего корня.