繁体   English   中英

组播侦听和接口IP地址更改

[英]Multicast listening and interface IP address change

我绑定到多播组和端口以侦听多播流。 由于添加组成员身份(通过IP_ADD_MEMBERSHIP)需要指定特定的网络接口,因此当该接口IP地址更改时会发生什么?

我是否要重新开始使用新的套接字并添加成员身份? 这与Linux / C环境有关。 我确实看到有一些数据包在不更改IP的情况下传入,但是我感觉我必须重新启动。

谢谢,gl

Linux内核似乎正在根据接口标识符而不是接口IP地址来跟踪接口。 经过几次实验,看来您的应用程序不需要任何特殊处理

实验1:主机接收

这是我与Ubuntu一起进行的一项实验,目的是测试主机是否将继续通过接口IP更改接收消息。

$ uname -a
$ Linux joel-VirtualBox 3.16.0-34-generic #47-Ubuntu SMP Fri Apr 10 18:02:58 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

我有一个简单的Python测试脚本,用于在网络接口eth2上运行多播接收器,该接口由静态IP 192.168.33.11标识:

import socket
import struct

sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP )
sock.bind( ('',50400) )

sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton('239.254.2.4') + socket.inet_aton('192.168.33.11') )

while True:
    print sock.recv( 2048 )

sock.close( sock )

运行python脚本后,我可以通过运行以下命令验证成员身份:

$ netstat -gn
lo              1      224.0.0.1
eth0            1      224.0.0.251
eth0            1      224.0.0.1
eth1            1      224.0.0.1
eth2            1      224.0.0.251
eth2            1      239.254.2.4
eth2            1      224.0.0.1

从另一台PC,我运行了一个多播发送器,发送到239.254.2.4:50400并验证了数据已打印。 然后,我将静态IP更改为192.168.33.12,并验证了netstat仍报告了成员身份,并且我的python脚本可以继续接收数据。

实验2:IGMP成员资格报告

我进行了另一个实验,以查看IGMP成员资格报告发生了什么:

捕获IGMP报告

如您所见,当IP地址发生更改时,不会为239.254.2.4生成新的IGMP报告。 但是,当脚本被杀死时,将发送IGMP离开消息。

尽管执行IGMP侦听或多播路由的任何交换机或路由器都将定期发出IGMP查询,但这可能被认为是“漏洞”。 我们的主机将通过发送其当前成员身份(包括239.254.2.4的成员身份)来响应此查询。

我认为您不必重新加入该小组。 本地主机和路由器都只有一个成员数,在两种情况下,如果非零,它将在内部传递多播。 但是我可能是错的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM