0

我正在尝试嗅探本地网络上的所有 IGMP 消息(出于不讨论的疯狂原因;-))。我有一些与此相关的问题,因为我并不是真正的 IGMP/路由专家。

甚至可能吗?我知道我可以从原始套接字读取 IGMP,并且我知道您可以使用 Wireshark 监视到达本地计算机的 IGMP 消息,但让我感到困惑的是:

我在另一台计算机上使用一个程序(通过开关与运行 Wireshark 的计算机分开),它将加入一个多播地址 - 但是 - 我并不总是在 Wireshark 中看到成员资格报告/加入。现在有谁知道是否可以保证每个IGMP 加入都分布在整个本地网络上?有时我在 Wireshark 中看到加入,有时我没有。

假设所有 IGMP 加入消息总是发送到网络上的每个站点,是否可以监视哪些站点是哪些多播组的成员,执行这样的操作(posix socket c++ 代码):

int rawSock = ::socket(AF_INET, SOCK_RAW, IPPROTO_IGMP);

uint8_t buf[10*1024];
while(true)
{
    ssize_t rval = ::recv(rawSock, buf, sizeof(buf), 0);
    iphdr *iph = (iphdr*)buf;
    printf("Received %d bytes - protocol %d\n", rval, iph->protocol);
    /*do whatever needed to the IGMP message*/
} 
4

1 回答 1

2

您的问题可能是这样的……每个 IGMP 数据包都必须有一个 IP TTL=1,这意味着 IGMP 永远不会跨越路由边界(例如 vlan)。

来自RFC 2236 - IGMP 版本 2

   Like ICMP, IGMP is a integral part of IP.  It is required to be
   implemented by all hosts wishing to receive IP multicasts.  IGMP
   messages are encapsulated in IP datagrams, with an IP protocol number
   of 2.  All IGMP messages described in this document are sent with IP
   TTL 1, and contain the IP Router Alert option [RFC 2113] in their IP
   header.

这意味着您不能在任何地方看到 IGMP;您应该检查以确保上面的 IGMP 接收器与发送器位于同一 IP 子网上。您还可以检查您的机器是否正在接收 IGMPtsharkwireshark...

于 2011-10-26T11:28:55.890 回答