【问题标题】:Sniffing IGMP messages on the local network嗅探本地网络上的 IGMP 消息
【发布时间】:2011-12-15 12:21:50
【问题描述】:

我正在尝试嗅探本地网络上的所有 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*/
} 

【问题讨论】:

    标签: sockets routing ip multicast igmp


    【解决方案1】:

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

    来自RFC 2236 - IGMP Version 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 接收器位于 same IP subnet as the sender 上。您还可以检查您的机器是否正在接收带有tsharkwireshark 的IGMP...

    【讨论】:

    • 我很确定两台机器都在同一个子网上(它们都有 192.168.1.* 地址)。但据我了解,IGMP 消息应该到达同一子网上的所有机器吗?想知道为什么发布的 C++ 代码从未检测到从机器以外的机器发送的 IGMP 消息吗?
    • @Vanvid,我不懂 C++;但是,我知道您必须将您的界面置于混杂模式才能查看您自己以外的流量,这意味着您需要以 root 身份运行代码。你在做这两件事吗?
    • 是的,它处于混杂模式,我以 root 身份运行。感谢您的时间:-)
    • 嗨,迈克,我遇到了类似的问题。我将 SocketOption“AddMembership”设置为发送 IGMP 加入数据包,尽管我如何设置 MulticastTimeToLive 值,但 IGMP 加入数据包始终具有 TTL=1。我已经阅读了您提到的 RFC 2236,但它没有说明 TTL 必须为 1,所以我想知道 IGMP 加入数据包是否必须具有 TTL=1 或者有没有办法增加它?
    • @LexL,关于 IGMP TTL 必须为 1,请查看 RFC 2236 的第 1 页:"本文档中描述的所有 IGMP 消息均使用 IP TTL 1"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 2016-05-28
    • 2019-11-12
    • 2013-03-18
    • 2011-07-10
    • 1970-01-01
    相关资源
    最近更新 更多