Мультикаст

В этой заметке мы поговорим о том, зачем вообще нужны сети? Вроде бы ответ очевиден: чтобы передавать данные. Вопрос лишь в том, какие данные, как и зачем передавать. Отсюда и существует огромное количество протоколов, которые работают помогают передавать различные типы данных. В данной заметке мы поговори о протоколе, являющимся одним из краеугольных камней различных мультимедийных приложений. Если быть точным, то это инфраструктурный протокол, который помогает многим другим программам и протоколам выполнять свою работу, чтобы мы получали нужный нам контент. Например, смотрели видео про котиков J

Итак, протокол IGMP (Internet Group Management Protocol) используется для регистрации узлов на маршрутизаторах, которые передают multicast трафик в сети. Что такое multicast – это когда один и тот же трафик получается одновременно большим количеством пользователей (например, трансляция котиков через IP TV). На самом деле multicast и связанные с ним протоколы часто овеяны мифами. В реальности же все гораздо проще и прозаичнее, и все мифы – это от редкости использования и настройки данных протоколов.

Протокола IGMP существует 3 версии. Версия 3, понятное дело, самая продвинутая и обладает усовершенствованиями, позволяющими реализовывать SSM – Source-Specific multicast. Это когда ты можешь выбрать не только группу, для которой принимать multicast пакеты, но и источник, который эти пакеты отправляет. Для справки скажем, что по умолчанию на маршрутизаторах cisco работает протокол IGMPv2, где такие фишки не доступны.

Чтобы настроить IGMP на маршрутизаторе Cisco необходимо всего 2 команды:

R1(config)# ip multicast-routing
R1(config)# interface e 0/0
R1(config-if)# ip pim sparse-dense-mode

IGMP включается автоматически на интерфейсе, на котором активируется протокол маршрутизации для multicast. Про этот протокол детальнее мы поговорим в следующей заметке. Важно отметить, что уже наш маршрутизатор готов принимать от пользователей запросы, на получение multicast трафика. Для активации версии 3 надо ввести еще 1 команду.

R1(config-if)# ip igmp version 3

R1(config-if)#do sh ip igmp int e0/0
Ethernet0/0 is up, line protocol is up
  Internet address is 10.1.12.1/24
  IGMP is enabled on interface
  Current IGMP host version is 3
  Current IGMP router version is 3
  IGMP query interval is 60 seconds
  IGMP configured query interval is 60 seconds
  IGMP querier timeout is 120 seconds
  IGMP configured querier timeout is 120 seconds
  IGMP max query response time is 10 seconds
  Last member query count is 2
  Last member query response interval is 1000 ms
  Inbound IGMP access group is not set
  IGMP activity: 1 joins, 0 leaves
  Multicast routing is enabled on interface
  Multicast TTL threshold is 0
  Multicast designated router (DR) is 10.1.12.1 (this system)
  IGMP querying router is 10.1.12.1 (this system)
  Multicast groups joined by this system (number of users):
 224.0.1.40(1)

Попробуем зарегистрировать на этом маршрутизаторе клиента (в качестве клиента выступит маршрутизатор из той же подсети, подключенный к этому интерфейсу):

R2(config)#int e 0/0
R2(config-if)#ip igmp ver 3  

Теперь укажем, какие multicast группы мы хотим слушать. Сначала от любого источника:

R2(config-if)#ip igmp join-group 239.0.10.10

Потом от конкретного:

R2(config-if)#ip igmp join-group 232.0.1.17 source 10.0.0.1

Смотрим на маршрутизаторе, который регистрирует:

R1(config-if)#do sh ip igmp gr det

Flags: L — Local, U — User, SG — Static Group, VG — Virtual Group,
       SS — Static Source, VS — Virtual Source,
       Ac — Group accounted towards access control limit

Interface: Ethernet0/0
Group:             232.0.1.17
Flags:              
Uptime:           00:03:21
Group mode:    INCLUDE
Last reporter:   10.1.12.2
Group source list: (C — Cisco Src Report, U — URD, R — Remote, S — Static,
                    V — Virtual, M — SSM Mapping, L — Local,
                    Ac — Channel accounted towards access control limit)
  Source Address   Uptime    v3 Exp   CSR Exp   Fwd  Flags
  10.0.0.1         00:03:21  00:02:31  stopped   Yes  R

Interface: Ethernet0/0
Group:             239.0.10.10
Flags:              
Uptime:           00:03:37
Group mode:    EXCLUDE (Expires: 00:02:31)
Last reporter:   10.1.12.2
Source list is empty

Осталось только получить multicast traffic от источника на наш маршрутизатор, о чем мы поговорим в следующей заметке.

 

Я долго думал над тем, как уложить описание настройки мультикаста в маршрутизируемой сети в одну заметку. Базовый конфиг, который позволит работать на самом деле очень простой — всего 2 команды на каждом маршрутизаторе или Л3 коммутаторе:

R1(config)# ip multicast-routing
R1(config)# int e 0/0
R1(config-if)# ip pim sparse-dense-mode

На этом можно было бы и остановиться, потому что все, мультикаст в вашей сети уже работает. Первая команда активирует поддержку мультикаст маршрутизации на вашем устройстве, а вторая команда добавляет конкретный инетерфейс к возможному мульткаст дереву. В основе работы такого мультикаста лежит протокол PIM (Protocol Independent Multicast), а другого в Cisco и нет. Это если не считать, конечно, статические мульткаст маршруты, но про них мы говорить не будем.
Вся концепция мульткаста построена на логике «шлем пакеты от источника», в противовес концепции юникаста «шлем пакеты к назначению». Для реализации этого правила используется проверка RPF (reverse path forwarding). Работает она следующим образом: отправляем дальше только те пакеты, которые пришли на интерефейс, которому соответствует маршрут к источнику (то есть интерфейс, который маршрутизатор использует для юникаст роутинга к источнику). Дальше пакеты рассылаются через все остальные интерфейсы. Пример сильно упрощенный, так как реально PIM отправет пакеты только через те интерфейсы, где есть слушатели (которых мы в прошлой заметке регистрировали по IGMP), либо через другие инетерфейсы, где есть другие PIM-говорящие маршрутизаторы, у которых есть слушатели.

Вот простой пример (схема):

R1 (e0/0) — (e0/0) R2 (e0/1) — (e0/0) R3 (e0/1) — (e0/0) R4 (e0/1) — (e0/0) R5

Настройка с нуля:

Router>en
Router#conf t
Router(config)#host R1
R1(config)#ip route 0.0.0.0 0.0.0.0 e0/0 10.0.12.2
R1(config)#int e 0/0
R1(config-if)#ip add 10.0.12.1 255.255.255.0
R1(config-if)#no sh
R1(config-if)#ip igmp join 238.0.12.1

Router>en
Router#conf t
Router(config)#host R2
R2(config)#int e 0/0
R2(config-if)#ip add 10.0.12.2 255.255.255.0
R2(config-if)#ip pim sparse-den
R2(config-if)#no sh
R2(config-if)#int e 0/1
R2(config-if)#ip add 10.0.23.2 255.255.255.0
R2(config-if)#ip pim sparse-den
R2(config-if)#no sh
R2(config-if)#exi
R2(config)#ip multicast-r
R2(config)#router ei 1
R2(config-router)#net 10.0.0.0
R2(config-router)#pass e0/0

Router>en
Router#conf t
Router(config)#host R3
R3(config)#ip multicast-ro
R3(config)#int e 0/0
R3(config-if)#ip add 10.0.23.3 255.255.255.0
R3(config-if)#ip pim sparse-den
R3(config-if)#no sh
R3(config-if)#int e 0/1
R3(config-if)#ip add 10.0.34.3 255.255.255.0
R3(config-if)#ip pim sparse-den
R3(config-if)#no sh
R3(config-if)#exi
R3(config-if)#router ei 1
R3(config-router)#net 10.0.0.0

Router>en
Router#conf t
Router(config)#host R4
R4(config)#ip multicast-ro
R4(config)#int e 0/0
R4(config-if)#ip add 10.0.34.4 255.255.255.0
R4(config-if)#ip pim sparse-den
R4(config-if)#no sh
R4(config-if)#ip add 10.0.45.4 255.255.255.0
R4(config-if)#ip pim sparse-den
R4(config-if)#no sh
R4(config-if)#router ei 1
R4(config-router)#net 10.0.0.0
R4(config-router)#pass e 0/1

Router>en
Router#conf t
Router(config)#host R5
R5(config)#ip route 0.0.0.0 0.0.0.0 e 0/0 10.0.45.4
R5(config)#int e 0/0
R5(config-if)#ip add 10.0.45.5 255.255.255.0
R5(config-if)#no sh

Вот и все. Друг, в твоей сети уже передается мульткаст трафик! Ты можешь орагнизовывать вещание клубнички в сети как сервис за доп плату;-) Делаем мульткаст пинг со стороны R5 к группе, в которой зарегистрирован R1 (238.0.12.1).

R5#ping 238.0.12.1 repeat 5
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 238.0.12.1, timeout is 2 seconds:

Reply to request 0 from 10.0.12.1, 54 ms
Reply to request 1 from 10.0.12.1, 1 ms
Reply to request 2 from 10.0.12.1, 1 ms
Reply to request 3 from 10.0.12.1, 1 ms
Reply to request 4 from 10.0.12.1, 3 ms

В это время на R1:

R1#debug ip icmp
ICMP packet debugging is on
R1#sh ip igmp groups
IGMP Connected Group Membership
Group Address    Interface                Uptime    Expires   Last Reporter   Group Accounted
238.0.12.1       Ethernet0/0              00:20:45  never     10.0.12.1
R1#
*Mar 24 15:44:13.523: ICMP: echo reply sent, src 10.0.12.1, dst 10.0.45.5, topology BASE, dscp 0 topoid 0
R1#
*Mar 24 15:44:24.493: ICMP: echo reply sent, src 10.0.12.1, dst 10.0.45.5, topology BASE, dscp 0 topoid 0
R1#
*Mar 24 15:44:35.510: ICMP: echo reply sent, src 10.0.12.1, dst 10.0.45.5, topology BASE, dscp 0 topoid 0
R1#
*Mar 24 15:44:46.531: ICMP: echo reply sent, src 10.0.12.1, dst 10.0.45.5, topology BASE, dscp 0 topoid 0
R1#
*Mar 24 15:44:57.543: ICMP: echo reply sent, src 10.0.12.1, dst 10.0.45.5, topology BASE, dscp 0 topoid 0

 

На самом деле сложность мультикаста сильно переоценена. Однако, в силу не сильно широкого распространения и отсутствия практики у большинства специалистов мултикастинг окружен мифом таинственности. В этой заметке мы поговорим про такую интересную вещь, как SSM (Source Specific Multicast). Это технология относительно новая. Мне даже стало интересно самому, и я погуглил RFC: RFC 4607 – 2006 год и RFC 3569 – 2003 год. То есть в виде открытого стандарта существует по факту менее 10 лет. Что это такое, как работает и зачем оно надо конкретно тебе?

Для ответа на этот вопрос, мы обратимся к «обычному» мультикастингу, который называется ISM (Internet Standard Multicast). В ISM клиент просто подключается к какой-то мультикаст группе, например, (*, 239.0.15.08). Символ «*» — это адрес источника мультикаст-трафика, то есть любой. IP-адрес 239.0.15.08 – это адрес группы, для которой источник шлет трафик. В прошлой заметке мы собрали рабочую схему без всяких дополнительных ухищрений, и все прекрасно работало. Так зачем нам еще что-то?

Ответ на этот вопрос заключается в том, что адрес источника в группе (*, 239.0.15.08) может быть совершенно любой. Как итог, источник у нас может быть не один. Их может быть два, три, десять – источникам все равно. Например, сервера с адресами 10.0.0.1, 192.168.16.05 и 172.17.18.19. Они отправляют трафик пользователю и остальное их не заботит. Но источники могут отправлять разный трафик для одной и той же группы (*, 239.0.15.08). Логично, что пользователь будет получать полную кашу на свое устройство. Итог: сервис не работает, клиент грустит.
Для предотвращения такой сумятицы и существует SSM. При таком варианте, пользователь в своем IGMP-запросе указывает мультикаст группу с конкретным адресом источника. Например, если пользователь хочет получать трафик от сервера с IP адресом 10.0.0.1, он отправит IGMP-запрос для группы (10.0.0.1, 239.0.15.08). В нашей первой заметке про мультикаст, мы показывали, как зарегистрироваться в такой группе, но покажем еще раз. Для этого, у пользователя и у маршрутизатора, к которому он подключается, должен быть активирована версия IGMPv3 (по умолчанию на маршрутизаторах Cisco включена IGMPv2). На примере схемы из прошлой заметки:

R1 (e0/0) — (e0/0) R2 (e0/1) — (e0/0) R3 (e0/1) — (e0/0) R4 (e0/1) — (e0/0) R5

В этот раз, пользователь R5 хочет получать трафик для группы 232.0.11.12 от источника 10.0.12.1:

R5(config)#int e 0/0
R5(config-if)#ip igmp ver 3
R5(config-if)#ip igmp join 232.0.11.12 source
R5(config-if)#ip igmp join 232.0.11.12 source 10.0.12.1

R4(config)#int e 0/1
R4(config-if)#ip igmp ver 3

Теперь R4 знает, что R5 хочет получать трафик именно от 10.0.12.1 и не от кого другого:
R4(config-if)#do sh ip igmp groups detail

Flags: L — Local, U — User, SG — Static Group, VG — Virtual Group,
SS — Static Source, VS — Virtual Source,
Ac — Group accounted towards access control limit

Interface:      Ethernet0/1
Group:          232.0.11.12
Flags:
Uptime:         00:04:28
Group mode:     INCLUDE
Last reporter:  10.0.45.5
Group source list: (C — Cisco Src Report, U — URD, R — Remote, S — Static,
V — Virtual, M — SSM Mapping, L — Local,
Ac — Channel accounted towards access control limit)
Source Address   Uptime    v3 Exp   CSR Exp   Fwd  Flags
10.0.12.1        00:04:28  00:02:40  stopped   Yes  R

Дальше нам остается настроить саму поддержку SSM. Наша группа не зря начинается на 232.0.0.0/8. В RFC именно этот диапазон выделен для SSM. Однако Cisco позволяет поменять его по своему усмотрению на любой другой. Мы настроим в стандартном. Для этого на маршрутизаторах R2-R4 вводим всего 1 команду:

R2(config)#ip pim ssm default
R3(config)#ip pim ssm default
R4(config)#ip pim ssm default

Обычно, полное multicast дерево строится только при наличии трафика. Оданко в случае SSM дерево построится автоматически:

R4(config)#do sh ip mro
!
(10.0.12.1, 232.0.11.12), 00:01:08/00:02:51, flags: sTI
Incoming interface: Ethernet0/0, RPF nbr 10.0.34.3
Outgoing interface list:
Ethernet0/1, Forward/Sparse-Dense, 00:01:08/00:02:51
!

R3(config)#do sh ip mro
!
(10.0.12.1, 232.0.11.12), 00:00:18/00:03:11, flags: sT
Incoming interface: Ethernet0/0, RPF nbr 10.0.23.2
Outgoing interface list:
Ethernet0/1, Forward/Sparse-Dense, 00:00:18/00:03:11
!

R4(config)#do sh ip mro
!
(10.0.12.1, 232.0.11.12), 00:01:08/00:02:51, flags: sTI
Incoming interface: Ethernet0/0, RPF nbr 10.0.34.3
Outgoing interface list:
Ethernet0/1, Forward/Sparse-Dense, 00:01:08/00:02:51
!

Все готово. Тестируем ping:

R1#ping 232.0.11.12
Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 232.0.11.12, timeout is 2 seconds:
Reply to request 0 from 10.0.45.5, 4 ms

Чтобы точно быть увереным, что мы только от этого источника принимаем трафик, поменяем адрес на R1:

R1(config)#int e 0/0
R1(config-if)#ip add 10.0.12.3 255.255.255.0
R1(config-if)#exi
R1(config)#exi
R1#ping 232.0.11.12 rep 5
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 232.0.11.12, timeout is 2 seconds:
…..

Снова меняем:

R1(config)#int e 0/0
R1(config-if)#ip add 10.0.12.1 255.255.255.0

Снова работает:

R1#ping 232.0.11.12
Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 232.0.11.12, timeout is 2 seconds:
Reply to request 0 from 10.0.45.5, 3 ms

Я не рассказал тебе про весь мультикаст, только про малую его часть. Но надеюсь это послужит трамплином в этот удивительный и интересный мир.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Hide me
Получать регулярно свежие материалы, лабораторные и вебинары
Email Имя
Show me