# Internet Group Management Protocol

The Internet Group Management Protocol (IGMP) is a communications protocol used by hosts and adjacent routers on IPv4 networks to establish multicast group memberships. IGMP is an integral part of IP multicast and allows the network to direct multicast transmissions only to hosts that have requested them.
IGMP can be used for one-to-many networking applications such as online streaming video and gaming, and allows more efficient use of resources when supporting these types of applications.
IGMP is used on IPv4 networks. Multicast management on IPv6 networks is handled by Multicast Listener Discovery (MLD) which is a part of ICMPv6 in contrast to IGMP's bare IP encapsulation.

## Architecture

A network designed to deliver a multicast service using IGMP might use this basic architecture:
IGMP operates between a host and a local multicast router. Switches featuring IGMP snooping also derive useful information by observing these IGMP transactions. Protocol Independent Multicast (PIM) is then used between the local and remote multicast routers to direct multicast traffic from hosts sending multicasts to hosts that have registered through IGMP to receive them.
IGMP operates on the network layer (layer 3), just the same as other network management protocols like ICMP.
The IGMP protocol is implemented on hosts and within routers. A host requests membership to a group through its local router while a router listens for these requests and periodically sends out subscription queries. A single router per subnet is elected to perform this querying function. Some multilayer switches include an IGMP querier capability to allow their IGMP snooping features to work in the absence of an IGMP-capable router in the layer 2 network.
IGMP is vulnerable to some attacks, and firewalls commonly allow the user to disable it if not needed.

## Versions

There are three versions of IGMP. IGMPv1 was defined in 1989. IGMPv2, defined in 1997, improves IGMPv1 by adding the ability for a host to signal a desire to leave a multicast group.
In 2002, IGMPv3 improved IGMPv2 by supporting source-specific multicast and introduces membership report aggregation. The support for source-specific multicast was improved in 2006.
The three versions of IGMP are backward compatible. A router supporting IGMPv3 can support clients running IGMPv1, IGMPv2, and IGMPv3. IGMPv1 uses a query-response model. Queries are sent to 224.0.0.1. Membership reports are sent to the group's multicast address. IGMPv2 accelerates the process of leaving a group and adjusts other timeouts. Leave-group messages are sent to 224.0.0.2. A group-specific query is introduced. Group-specific queries are sent to the group's multicast address. A means for routers to select an IGMP querier for the network is introduced. IGMPv3 introduces source-specific multicast capability. Membership reports are sent to 224.0.0.22.

## Messages

There are several types of IGMP messages:

### General membership queries

    Sent by multicast routers to determine which multicast addresses are of interest to systems attached to the network(s) they serve to refresh the group membership state for all systems on its network.

### Group-specific membership queries

    Used for determining the reception state for a particular multicast address.

### Group-and-source-specific queries

    Allow the router to determine if any systems desire reception of messages sent to a multicast group from a source address specified in a list of unicast addresses.

### Membership reports

    Sent by multicast receivers in response to a membership query or asynchronously when first registering for a multicast group.

### Leave group messages

    Sent by multicast receivers when specified multicast transmissions are no longer needed at the receiver.
IGMP messages are carried in bare IP packets with IP protocol number 2.$^{:§4}$ Similar to the Internet Control Message Protocol, there is no transport layer used with IGMP messaging.

### IGMPv2 messages

IGMPv2 packet structure$^{:§2}$ :
| Offset | Octet | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
| Octet | Bit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
| 0 | 0 | Type | Type | Type | Type | Type | Type | Type | Type | Maximum Response Time | Maximum Response Time | Maximum Response Time | Maximum Response Time | Maximum Response Time | Maximum Response Time | Maximum Response Time | Maximum Response Time | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum |
| 4 | 32 | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address |

#### Type: 8 bits:Indicates the message type as follows

    Message Type value Membership Query 0x11 IGMPv1 Membership Report 0x12 IGMPv2 Membership Report 0x16 IGMPv3 Membership Report 0x22 Leave Group 0x17

#### Group Address: 32 bits:This is the multicast address being queried when sending a Group-Specific or Group-and-Source-Specific Query. The field is zeroed when sending a General Query.

    The message is sent to the following IP multicast addresses:$^{:§9}$
    Message typeMulticast address General QueryAll hosts (224.0.0.1) Group-Specific QueryThe group being queried Membership Report (all IGMP versions)The group being reported Leave GroupAll routers (224.0.0.2)

### IGMPv3 membership query

IGMPv3 membership query$^{:§4.1}$ :
| Offset | Octet | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
| Octet | Bit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
| 0 | 0 | Type (0x11) | Type (0x11) | Type (0x11) | Type (0x11) | Type (0x11) | Type (0x11) | Type (0x11) | Type (0x11) | Maximum Response Code | Maximum Response Code | Maximum Response Code | Maximum Response Code | Maximum Response Code | Maximum Response Code | Maximum Response Code | Maximum Response Code | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum | Checksum |
| 4 | 32 | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address | Group Address |
| 8 | 64 | Reserved | Reserved | Reserved | Reserved | S | QRV | QRV | QRV | QQIC | QQIC | QQIC | QQIC | QQIC | QQIC | QQIC | QQIC | Number of Sources (N) | Number of Sources (N) | Number of Sources (N) | Number of Sources (N) | Number of Sources (N) | Number of Sources (N) | Number of Sources (N) | Number of Sources (N) | Number of Sources (N) | Number of Sources (N) | Number of Sources (N) | Number of Sources (N) | Number of Sources (N) | Number of Sources (N) | Number of Sources (N) | Number of Sources (N) |
| 12 | 96 | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] | Source Address[1] |
| 16 | 128 | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] | Source Address[2] |
| 8+4n | 64+32n | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] | Source Address[n] |

#### Source Address [i]: 32 bits:The Source Address [i] fields are a vector of n IP unicast addresses, where n is the value in the Number of Sources (N) field.
## Implementations

FreeBSD, Linux and Windows all support IGMP on the host side.