我正试图嗅探本地网络上的所有IGMP消息(出于疯狂的原因不被讨论;-))。 我有一些与此相关的问题,因为我不是IGMP /路由专家。
甚至可能吗?我知道我可以从原始套接字读取IGMP,我知道你可以使用Wireshark来监控到达本地计算机的IGMP消息,但令我困惑的是:
我在另一台计算机上使用一个程序(通过交换机与运行Wireshark的计算机分开),它将加入一个多播地址 - 但是,我并不总是在Wireshark中看到成员报告/ JOIN。现在有谁知道是否保证每个 IGMP加入都在整个本地网络上展开?有时我看到Wireshark的加入,有时候我没有。
假设所有IGMP加入消息总是发送到网络上的每个站点,那么不应该监视哪些站点是哪个多播组的成员做这样的事情(posix socket c ++ code):
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*/
}
答案 0 :(得分:1)
您的问题可能就是这样......每个IGMP数据包必须具有IP TTL = 1,这意味着IGMP永远不会越过路由边界(例如vlan)。
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接收器位于same IP subnet as the sender。您还可以查看您的计算机是否通过tshark
或wireshark
接收IGMP ...