2015-10-14 3 views
3

Этот вопрос касается отправки и получения многоадресных рассылок внутри одного и того же хоста, одновременно отправляя их другим хостам.Loopback в multicast

Даже после нескольких часов работы в Интернете я не смог разобраться, как многоадресные датаграммы маршрутизируются внутри одного и того же хоста ..!

Вот идет подробное описание проблемы:

Linux ящик «А» кабель-подключен к коммутатору/маршрутизатору (назовём переключатель/маршрутизатор в качестве «R»).

В Linux коробки А, У меня есть процесс (A0), который посылает UDP пакеты многоадресной адрес «224.0.0.0», порт 5000.

Кроме того, в том же самом окне А, у меня есть два процесса (A1 и A2), как подключение к 224.0.0.0, порт 5000, так и использование UDP-пакетов.

Теперь, как ядро ​​в блоке A управляет маршрутизацией?

Итак, A0 отправляет дейтаграмму, которая потребляется A1 и A2. Имеет ли такая дейтаграмма круглый путь A -> R -> A?

.. или это маршрут ядра в «А» достаточно умный, чтобы избежать этого ненужного кругового путешествия? (то есть датаграмма отправляется посредством A0 и сразу же потребляется A1 и A2, не оставляя A).

Конечно, можно гарантировать, что дейтаграммы многоадресного никогда не покидают A, путем создания и применения петлевого устройства для многоадресной рассылки:

sudo ifconfig lo multicast 
sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev lo 

Но теперь, если я хочу, чтобы потреблять UDP датаграммы одновременно в другом окне Linux , скажем, «Б», туда они не приходят.

Итак, в идеале, (1) датаграмма, потребляемая в A, никогда не должна оставлять A (то есть без туда и обратно A -> R -> A), тогда как (2) датаграмма, потребленная в B, должна идти как A - > R -> B. Я хотел бы достичь этих двух вещей одновременно.

Любой способ достичь этого, например, командой «route»?

гнезда процессы A1 и A2 имеют следующие флаги установлены:

SO_REUSEADDR 
SO_REUSEPORT 

В то время как я проверил, что процесс A0 (тот, который посылает многоадресную дейтаграмму) имеет следующий флаг:

IP_MULTICAST_LOOP 
+0

«Многоадресный поток» является противоречием в терминах, а единица передачи UDP является дейтаграммой. – EJP

ответ

2

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

Вам нужно IP_MULTICAST_LOOP, это выглядит хорошо.

Правильно ли вы присоединились к группе многоадресной передачи во всех процессах? IP_ADD_MEMBERSHIP? Без этого вы получаете все виды фиктивного поведения.

Вы можете посмотреть таблицу локальных маршрутов, чтобы узнать, что Linux делает локально для пакетов.Это, как правило, далеко не тривиальна:

sudo ip route show table local

Вы также можете посмотреть на текущей многоадресной членством группы:

netstat -g

ли выход и отсчеты реф имеет смысл в вашем случае?