私は、LAN に接続されている電流測定デバイスからマルチキャスト更新を取得するアプリケーションを作成しています。デバイスは、数分ごとにマルチキャスト グループ 224.192.32.19:22600 にパケットを送信し、ホストの 1 つ (Raspberry Pi) からそれらを正常に読み取ることができます。
奇妙なことに、2 番目のリスナー ホストを追加しようとしたときに、そのインターフェイス上でそのグループからのマルチキャスト トラフィックが見つかりませんでした。
ネットワーク全体は、同じ 192.168.xx サブネットの同じ物理的な場所にあります。送信側と受信側の間には、DD-WRT を実行する 2 台の TP-Link WDR3600 ルーターと、"ダム" TP-Link 8 ポート ギガビット スイッチ (ポート エクスパンダとして使用) があります。すべてはイーサネット経由で配線されています。
詳細:
- 「NOK」ホストには、Windows 7 ラップトップ、同じラップトップ上のブリッジされた Linux VM、および別の Linux ラップトップが含まれます。
- 「OK」ホストがあるダムスイッチに「NOK」ホストを直接接続しても効果はありません。
- セカンダリルータ(ソースから1イーサネット「ホップ」近い)に直接接続しても効果はありません。
稼働中のホストを含め、どのホストでもそのグループのIGMPトラフィックを見つけることができません。224.0.0.22
IGMP のネットワーク トラフィックをスヌーピングすると、アプリケーションの起動時に 2 つの参加要求が送信されていることがわかります。
グループのメンバーシップはカーネルによって登録され、
~ $ netstat -ng
IPv6/IPv4 Group Memberships
Interface RefCnt Group
--------------- ------ ---------------------
lo 1 224.0.0.1
eth0 1 224.192.32.19
eth0 1 224.0.0.251
eth0 1 224.0.0.1
リスナー アプリケーションからソケットを初期化する Python コードは次のとおりです。
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((self.mcast_group, self.mcast_port))
mreq = struct.pack("4sl", socket.inet_aton(self.mcast_group), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
ここで何が欠けているのでしょうか? 動作中のホストでリスナー アプリケーションを実行するだけでマルチキャスト トラフィックを受信できましたが、追加のリスナーではそうならないのはなぜでしょうか?
答え1
これはルーターの問題であることが判明し、セカンダリ ルーターを再起動すると、すべてのホストが期待どおりにマルチキャスト パケットを受信し始めました。
これは DD-WRT のバグか、マルチキャスト トラフィックの配信を危険にさらす何らかの状態の破損のいずれかであると思われます。