从组播如何 :
IP_ADD_MEMBERSHIP。
回想一下,你需要告诉内核你感兴趣的组播组。如果一个组中没有任何进程感兴趣,丢弃到达该主机的数据包将被丢弃。
如果你不这样做,你将不会看到tcpdump数据包。
这取决于您的多播基础设施:例如,您可以有多个多播路由器,并在您的交换机上设置各种规则(使订阅静态或dynamic,甚至禁止某些端口/节点)。
但是,如果你想订阅一个多播组…只需订阅。 在一些基础设施上发送IGMP JOIN数据包,这显然启用了IGMP侦听。 您可以使用各种工具生成IGMP数据包。
向更高层次迈进,使用iperf来订阅任何多播组。 如果您的networking基础结构不太复杂,并且“允许”订阅任何多播组,则使用以下命令:
iperf -s -u -B 239.100.100.100其中,239.100.100.100是您的多播组地址。
tcpdump同时得到一个详细的报告。
请注意,我相信iperf只支持IGMP v1和v2。 如你所说,如果你想制作一个IGMP v3 JOIN数据包,写一个程序应该不会太难。 但是那里会有更多的工具可能会做同样的事情。
多播HOWTO的链接页面没有提及tcpdump的任何内容。
Tcpdump使用libpcap捕获networking数据包,而在以太网上,libpcap同时支持:
混杂模式,在这种模式下,networking适配器无论目的地址如何,都会向主机发送所看到的每个数据包,networking堆栈会将每个通过filter的数据包传送到捕获机制,
非混杂模式,在这种模式下,networking适配器向主机发送单播数据包,广播数据包和它configuration为传递的多播数据包,networking堆栈将所有通过捕获filter的数据包传送到捕获机制。
Tcpdump默认为请求混杂模式; 在这种模式下,甚至可以看到单播数据包不会发送到您的主机(只要您不在交换networking上或处于交换networking中,而是插入到可获取所有stream量的“镜像”端口)。
如果你通过tcpdump的-p标志,它会请求非混杂模式,在这种情况下,你只会看到你的机器“应该”得到的数据包; 在这种情况下,如果没有进程注册到特定多播组中的兴趣,您将不会看到发送到该组播组地址的数据包,但在这种情况下,这不是一个错误,这是一个function,因为您的机器不“不要对这些数据包做任何事情。
所以,如果你想看到所有的数据包(单播数据包到所有主机,多播数据包到所有多播地址和广播数据包),运行tcpdump(或Wireshark或其他)在混杂模式,如果你在交换networking上运行在“镜像端口”或“SPAN端口”或交换机供应商所称的端口(如果它支持“镜像端口”)。
有关以太网数据包捕获的Wireshark Wiki页面,请参阅混杂模式和交换networking上的许多详细信息; 该页面上的信息适用于所有的数据包嗅探器,包括tcpdump,而不仅仅是Wireshark。