Multicast

IGMP Explained: v2 vs v3, Joins, Leaves, and the Querier

IGMP v2 vs v3 - feature image with real IGMPv3 INCLUDE mode state from Cisco IOS XE
In: Multicast, Labs

IGMP is the only part of multicast a host ever speaks. Before PIM builds a single tree, before an RP hears a single register, a receiver has to raise its hand on the local segment and say "I want group 239.1.1.10". This article covers how that conversation works in IGMPv2 and IGMPv3, what the querier does, how joins and leaves age out, and the version-mismatch trap that silently breaks SSM. All output is real, captured from a CML lab where a Debian VM is the receiver. Part of the IP multicast guide.

What IGMP Does (and Does Not Do)

IGMP runs between hosts and their first-hop router, on one segment only. It answers exactly one question: which groups have interested receivers on this interface? It carries no routing information, never crosses a router, and knows nothing about sources or trees. The router translates IGMP state into PIM joins upstream (covered in PIM sparse mode); IGMP itself stops at the first hop.

The protocol has exactly two message flows: hosts send membership reports (joins, and in v3, source-filtered subscriptions), and one router per segment, the querier, sends periodic queries to check that members still exist. Leaves are the third piece, handled differently per version.

The Querier: One Router Asks, Everyone Answers

If a segment has multiple routers, only one sends queries: the querier, elected as the lowest IP address on the segment (in both v2 and v3). Everything about the querier's behavior is visible in one command. This is the lab's edge router, fresh after a host joined a group:

R1# show ip igmp interface Ethernet0/0
  Internet address is 192.168.99.1/24
  Current IGMP host version is 2
  Current IGMP router version is 2
  IGMP query interval is 60 seconds
  IGMP querier timeout is 120 seconds
  IGMP max query response time is 10 seconds
  Last member query count is 2
  IGMP activity: 1 joins, 0 leaves
  Multicast designated router (DR) is 192.168.99.1 (this system)
  IGMP querying router is 192.168.99.1 (this system)

Every 60 seconds the querier sends a general query to 224.0.0.1. Hosts answer with reports for each group they belong to, after a random delay up to the max response time (10 seconds) so a hundred receivers do not answer simultaneously. In v2, hosts also suppress their report if another host answers first for the same group; the router only needs one member to keep forwarding. Membership state expires after roughly (robustness x query interval) + max response time, here about 130 seconds, visible as the Expires timer:

R1# show ip igmp groups
Group Address    Interface       Uptime    Expires   Last Reporter
239.1.1.10       Ethernet0/0     00:00:21  00:02:39  169.254.147.59

Note the DR line as well. On multi-router segments the IGMP querier (lowest IP) and the PIM DR (highest priority/IP, responsible for sending PIM joins upstream) can be different routers. Exam writers love that distinction.

IGMPv2: Join, Stay, Leave

IGMPv2 is the simple lifecycle. A host joins by sending an unsolicited membership report to the group address itself. It stays by answering general queries. It leaves by sending a leave message to 224.0.0.2 (all routers), which triggers the querier to send a group-specific query: "anyone still here for 239.1.1.10?" It asks twice (the last member query count above), one second apart, and if nobody answers, the group is removed and the router prunes upstream. Worst-case leave latency is about two seconds, a big improvement over v1, which had no leave at all and simply aged out.

What v2 cannot do: say anything about sources. A v2 join means "any source sending to G". That is ASM (any-source multicast), and it is why ASM needs a rendezvous point to introduce sources and receivers.

IGMPv3: Source Filtering Changes the Model

IGMPv3 (RFC 3376) adds one capability that changes multicast architecture: reports carry a source filter. A host can join in INCLUDE mode ("only these sources") or EXCLUDE mode ("everything except these"; an empty exclude list is the v2-equivalent any-source join). Mechanically, v3 also changes where reports go: to 224.0.0.22 (all IGMPv3 routers) instead of the group address, and one report can carry multiple group records, so suppression is gone; every host reports.

Source filtering is the enabler for SSM: if the receiver names the source, the network can build the (S,G) tree directly with no RP. Here is the lab's edge router after the Debian VM sent a v3 INCLUDE join for group 232.1.1.10, source 10.0.30.10:

R1# show ip igmp groups 232.1.1.10 detail
Interface:      Ethernet0/0
Group:          232.1.1.10
Flags:          SSM
Group mode:     INCLUDE
Last reporter:  169.254.147.59
  Source Address   Uptime    v3 Exp   CSR Exp   Fwd  Flags
  10.0.30.10       00:00:08  00:02:51  stopped   Yes  R

Group mode INCLUDE with an explicit source list: that is the entire difference between v2 and v3 in one capture. The router now knows not just "someone wants G" but "someone wants G from exactly this S".

v2 vs v3 Side by Side

IGMPv2
Reports sent to the group address. Report suppression on. Explicit leave to 224.0.0.2. Any-source joins only. Enables ASM; needs an RP for source discovery.
IGMPv3
Reports to 224.0.0.22, multiple group records per report, no suppression. INCLUDE/EXCLUDE source filters. State changes replace leave messages. Enables SSM.
Both versions
Querier = lowest IP on segment. Periodic general queries to 224.0.0.1. Group state expires without answers. Segment-local only; never routed.

The Compatibility Trap That Breaks SSM

IGMPv3 is backward compatible, and the fallback has a sharp edge. When a v3 host sees a v2 query on the segment, it drops into v2 compatibility mode and stays there for the "older version querier present" interval, roughly two query cycles, even after the querier upgrades. In compat mode the host sends v2 reports, and a v2 report carries no source list.

This happened live while building this lab. R1's receiver interface started at v2 while the Debian VM issued a source-specific join for 232.1.1.10. Result, straight off the wire:

j@llmbits:~$ sudo tcpdump -i ens224 -c 3 -n igmp
10:41:03.46 IP 192.168.99.1 > 224.0.0.1: igmp query v3
10:41:05.06 IP 169.254.147.59 > 232.1.1.10: igmp v2 report 232.1.1.10
10:41:07.52 IP 169.254.147.59 > 239.5.5.5: igmp v2 report 239.5.5.5

The router is already querying at v3, but the host is still reporting at v2 from compat mode, and IOS XE ignores v2 reports for the SSM range (a sourceless join is meaningless there). The router held zero state for the group until the host was forced back to v3 (on Linux: force_igmp_version=3 sysctl, or wait out the compat timer), after which the INCLUDE join above appeared immediately. If SSM "just doesn't work" for some receivers, check IGMP versions on both ends before anything else, with show ip igmp interface on the router (both host and router version lines) and tcpdump on the host.

Configuration is one line per interface: ip igmp version 3 on everything that should support SSM receivers. IOS XE defaults to v2.

The Timers That Rule the Lifecycle

Every IGMP behavior above is timer-driven, and the defaults visible in the interface output interact in ways worth spelling out. The query interval (60 seconds on IOS XE, 125 in the RFC) sets the heartbeat. The robustness variable (2) is the "how many losses do we tolerate" multiplier baked into every derived timer. Group membership expires after (robustness x query interval) + max response time: 2 x 60 + 10 = 130 seconds of silence before the router stops forwarding. The querier itself is given up on after the querier timeout (2 x query interval = 120 seconds), at which point the next-lowest IP takes over querying.

Leave latency is governed separately: on a v2 leave, the querier sends last-member-query-count (2) group-specific queries at last-member-query-interval (1 second) spacing, so a group with no remaining members stops flowing in about 2 seconds. If your application needs faster cutoff (channel zapping in IPTV is the classic case), ip igmp last-member-query-interval and immediate-leave (ip igmp immediate-leave group-list, safe only when exactly one receiver lives per port) are the knobs. Tightening the general query interval buys faster failure detection at the cost of more control traffic and more report bursts from large segments; most networks should leave it alone.

Joining From the Router Itself: join-group vs static-group

Two interface commands make a router behave like a receiver, and confusing them causes real outages. ip igmp join-group 239.1.1.10 makes the router a full member: it answers queries and, critically, punts every packet for the group to its CPU. It is a test tool (the router responds to pings sent to the group, which makes end-to-end reachability testable without any host), and leaving it configured on a production box is a well-known way to melt a control plane.

ip igmp static-group 239.1.1.10 is the operational sibling: the router forwards the group out the interface unconditionally, in hardware, without becoming a member itself. Use it for segments where hosts cannot speak IGMP (some industrial gear, dumb display endpoints) or where you want traffic pre-pulled to an interface regardless of membership. In the lab you will notice 224.0.1.40 joined on every router's loopback in show ip igmp groups; that is Auto-RP's discovery group, joined automatically, and a reminder that routers themselves are IGMP participants too.

IGMP Snooping: The Switch in the Middle

One layer down, switches flood multicast frames by default because the destination MAC never appears in their learned tables. IGMP snooping fixes that: the switch listens to reports and queries and constrains each group's frames to ports with actual members plus router ports. It is on by default on Cisco switches and generally should stay on; a segment with no querier and snooping enabled is the classic "multicast works for two minutes then dies" failure, because snooped state ages out with no queries to refresh it. On router-less L2 domains, configure an IGMP snooping querier on the switch. The details of L2 forwarding behavior tie into the MAC overlap covered in multicast addressing.

Securing the Membership Plane

IGMP is unauthenticated by design, so the controls are limits and filters. ip igmp access-group <acl> on an interface restricts which groups hosts may join at all, the right tool for segments that should only ever receive the corporate video group and nothing else. ip igmp limit (global or per interface) caps total membership state, blunting both buggy applications that join in a loop and deliberate state-exhaustion attempts. On the switch side, IGMP snooping's report suppression and querier hardening matter more than router config for most attack surfaces; a host spraying bogus reports pollutes L2 forwarding before any router notices. None of this is exotic: the same three commands appear in every hardening baseline, and the pillar's security section puts them alongside the PIM-side controls they complement.

Key Takeaways

  • IGMP is host-to-router membership signaling on one segment; PIM does everything between routers.
  • The querier (lowest IP) polls 224.0.0.1 every 60 seconds by default; group state expires in about 130 seconds without answers. All of it is visible in show ip igmp interface.
  • v2 gives you any-source joins and fast leaves. v3 adds INCLUDE/EXCLUDE source filters, reports to 224.0.0.22, and no suppression.
  • SSM requires v3 end to end. Hosts fall back to v2 compat mode when they ever see a v2 query and stay there for minutes; IOS ignores v2 reports in 232/8, so the join silently vanishes.
  • show ip igmp groups detail showing Group mode INCLUDE with a source list is your proof that v3 signaling actually works.

Next: PIM sparse mode turns this membership state into trees. The full cluster lives in the complete multicast guide.

Written by
More from Ping Labz
Great! You’ve successfully signed up.
Welcome back! You've successfully signed in.
You've successfully subscribed to Ping Labz.
Your link has expired.
Success! Check your email for magic link to sign-in.
Success! Your billing info has been updated.
Your billing was not updated.