RFC 9777

Multicast Listener Discovery Version 2 (MLDv2) for IPv6

๐Ÿ“… published March 2025, from ietf

1. Introduction โœจ

okay so bestie, this is the title block and the vibes are immaculate ๐Ÿ’… this is RFC 9777, "Multicast Listener Discovery Version 2 (MLDv2) for IPv6" ๐ŸŽ€. The editor is B. Haberman, Ed. from JHU APL, and it's dated March 2025. It's a Standards Track doc with STD: 101, which means it's a full-on internet standard, not just a suggestion ๐Ÿซถ. It obsoletes RFC 3810 and updates RFC 2710 ๐ŸŒˆ. Obsoletes means the old one is replaced, updates means it tweaks the old one, and it's giving "new and improved era" ๐Ÿ’–

Okay so MLD is how IPv6 routers figure out who's listening for multicast packets on their directly attached links ๐Ÿฆ‹. A multicast listener is just a node that wants to receive multicast packets, and the router basically asks around to find out which multicast addresses its neighbors care about ๐Ÿงš. Here's the fun twist: a router can be a listener too! In that case it runs both the "multicast router part" and the "Multicast Address Listener part", so it gets the info it needs for routing and also keeps itself and its neighboring routers up to date on its own listening state ๐Ÿ‘‘

This doc specifies version 2 of MLD. The old version lives in [RFC2710], and the doc calls it "MLDv1" ๐Ÿ“. MLDv2 is basically a translation of IGMPv3 [RFC9776] for IPv6 semantics. Literally the IPv4 friend, but make it IPv6 ๐Ÿ’…

So what's new? MLDv2 adds source filtering โœจ. That means a node can say "I only want packets from these specific sources" (that's what Source-Specific Multicast, or SSM [RFC3569], is all about ๐Ÿ”ฅ), or "I want everything except these specific sources", sent to a particular multicast address ๐Ÿ™ˆ. And yes, it's still interoperable with MLDv1, which is so considerate of it ๐Ÿซถ

The doc also uses the term "SSM-aware" for systems that support SSM as defined in [RFC4607] ๐ŸŒธ. And to make it official: this document obsoletes [RFC3810], and Appendix B.2 has the full list of what changed from that one ๐Ÿ’œ

1.1. Conventions Used in This Document

Okay this part is the rulebook for the capital letters ๐Ÿ“œ. The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" mean what [RFC2119] and [RFC8174] say they mean, but only when they're in all caps ๐ŸŽ€. If you see them lowercase, they're just regular words, no cap attached ๐Ÿ’€

2. Protocol Overview ๐Ÿฆ‹

Okay so this section is the quick tour before the deep dive, bestie ๐Ÿงš. MLD is asymmetric, which means it has separate behaviors for Multicast Address Listeners (hosts or routers that listen to multicast) and for multicast routers ๐Ÿ’…. The whole point is so each multicast router can learn, for every directly attached link, which multicast addresses and which sources have interested listeners on that link ๐Ÿ‘‘. That info then goes to whatever multicast routing protocol the router is using, so packets actually reach every link where somebody wants them ๐ŸŒˆ

Multicast routers don't have to track each neighbor's interests individually ๐Ÿ™ˆ. They only need to know that at least one node on an attached link is listening to a particular address from a particular source. (There's extra discussion in Appendix A.2, item 1, if you want the lore ๐Ÿ“–)

A multicast router runs the router part of MLDv2, which is described in detail in Section 7, on each of its directly attached links ๐Ÿ”ฅ. If it has more than one interface on the same link, it only needs to run the protocol on one of them, which is very efficient energy โœจ. Now, if there are several multicast routers on the same subnet, they need a querier election (see Section 7.6.2) to pick one router to be in Querier state ๐Ÿ’–. That one is called the "Querier" ๐Ÿ‘ธ. Everyone else still listens to what Multicast Address Listeners send and keeps the same listening state, so they can take over if the Querier goes down ๐Ÿซถ. Only the Querier actually sends the periodic or triggered Query Messages on the subnet, as described in Section 7.1 ๐ŸŽ€

Finally, a Multicast Address Listener runs the listener part of MLDv2, described in detail in Section 6 ๐ŸŒธ. It does this on all interfaces where multicast reception is supported, even if more than one of those interfaces are on the same link ๐Ÿฆ‹

Part 1 of 15 done, bestie! ๐Ÿ’… Send "part 2" when you're ready for the next chunk, and yes I'll keep the section numbers and every MUST/SHOULD exactly as they are ๐Ÿซถ

2.1. Building Multicast Address Listening State on Multicast Address Listeners ๐ŸŽ€

okay so, upper-layer protocols and apps running on a Multicast Address Listener node ๐Ÿ’– use specific service interface calls (described in Section 3) to ask the IP layer to turn reception of packets sent to specific multicast addresses on or off โœจ. The node keeps Multicast Address Listening state for each socket where those service interface calls have been invoked (Section 4.1). But that's not all ๐Ÿ‘€. A node must also maintain or compute Multicast Address Listening state for each of its interfaces (Section 4.2) ๐Ÿงš.

Conceptually, that interface state is a set of records, and each record holds an IPv6 multicast address, a filter-mode, and a source-list ๐Ÿ“. The filter-mode can be INCLUDE or EXCLUDE. In INCLUDE mode, reception of packets sent to the multicast address is enabled only from the source addresses in the source-list ๐Ÿฆ‹. In EXCLUDE mode, it's the opposite vibe: reception is enabled from all source addresses except the ones in the source-list ๐Ÿ’….

At most, one record per multicast address exists for a given interface ๐ŸŒธ. This per-interface state is derived from the per-socket state, but it can look different when different sockets have different filter-modes and/or source-lists for the same multicast address and interface ๐Ÿ™ˆ. After the IP layer accepts a multicast packet from an interface, delivery to the application connected to a particular socket depends on that socket's Multicast Address Listening state ๐Ÿซถ (and possibly on other conditions too, like which transport-layer port the socket is bound to). Also, MLDv2 messages are not subject to source filtering, and hosts and routers must always process them ๐Ÿ”ฅ.

2.2. Exchanging Messages between the Querier and the Listening Nodes ๐Ÿ’œ

There are three types of MLDv2 Query Messages: General Queries, Multicast Address Specific Queries, and Multicast Address and Source Specific Queries ๐ŸŒˆ. The Querier periodically sends General Queries to learn Multicast Address Listener info from an attached link ๐Ÿ”. These queries are used to build and refresh the Multicast Address Listening state inside all multicast routers on the link โœจ.

Nodes answer these queries by reporting their per-interface Multicast Address Listening state through Current-State Report messages. Those go to a specific multicast address that all MLDv2 routers on the link listen to ๐Ÿ“ฃ. On the other hand, if a node's listening state changes, it reports that change right away through a State-Change Report message ๐Ÿ’จ. A State-Change Report contains Filter-Mode-Change Records, Source-List-Change Records, or both ๐Ÿ’…. You can find a detailed description of the report messages in Section 5.2.13 ๐ŸŽ€.

Router and listener state changes are mainly triggered by a timer expiring or by receiving an MLD message. (A listener state change can also be triggered by a service interface call ๐Ÿงš.) So, to boost protocol robustness despite possibly unreliable message exchanges, messages get retransmitted several times ๐Ÿ”. Timers are also set to account for possible message losses and to wait for those retransmissions โณ.

Periodic General Queries and Current-State Reports don't follow this rule. The reason is that they'd overload the link ๐Ÿ˜ญ. It's assumed that these messages generally don't cause state changes, since their main job is to refresh existing state ๐ŸŒธ. So even if one of them gets lost, the state will be refreshed during the next reporting period ๐Ÿซถ.

Unlike Current-State Reports, State-Change Reports are retransmitted several times, so that one or more multicast routers don't miss them ๐Ÿ’–. The number of retransmissions depends on the so-called Robustness Variable ๐Ÿ”ง. This variable lets you tune the protocol for the packet loss you expect on a link ๐Ÿ“. If a link is expected to be lossy (for example, a wireless connection), the Robustness Variable's value may be increased โ˜๏ธ. MLD is robust to [Robustness Variable]-1 packet losses ๐Ÿ›ก๏ธ. This document recommends a default value of 2 for the Robustness Variable (see Section 9.1) โœจ.

If more changes hit the same per-interface state entry before all the retransmissions of the State-Change Report for the first change are done, each extra change immediately triggers a new State-Change Report ๐Ÿš€. Section 6.1 shows how the content of that new report is computed ๐Ÿ“. Retransmissions of the new State-Change Report get scheduled too, so that each state change is transmitted at least [Robustness Variable] times ๐Ÿ”๐Ÿ’….

If a node on a link tells the Querier, through a State-Change Report, that it no longer wants to listen to a particular multicast address (or source), the Querier must query for other listeners before deleting that multicast address (or source) from its Multicast Address Listening state and stopping the traffic ๐Ÿ™…โ€โ™€๏ธ. So the Querier sends a Multicast Address Specific Query to check whether any nodes are still listening to a specified multicast address ๐Ÿ‘€. Likewise, it sends a Multicast Address and Source Specific Query to check whether, for a specified multicast address, any nodes are still listening to a specific set of sources ๐Ÿ•ต๏ธโ€โ™€๏ธ. Section 5.1.13 describes each query in more detail ๐Ÿ“–.

Both Multicast Address Specific Queries and Multicast Address and Source Specific Queries are only sent in response to State-Change Reports, never in response to Current-State Reports ๐Ÿ™Œ. This split is needed so the router doesn't treat every Multicast Listener Report as a possible state change ๐Ÿ’€. The side effect is that the fast leave mechanism of MLDv2 (described in more detail in Section 2.3) might not work if a State-Change Report gets lost and the router only receives the following Current-State Report ๐Ÿ˜ฌ. Still, this avoids extra processing at the router, and it cuts down on MLD traffic on the link ๐Ÿƒ. You can read more about why the two report types need to be told apart in Appendix A.1 ๐Ÿ“š.

Nodes respond to the queries above with Current-State Reports that contain their per-interface Multicast Address Listening state only for the multicast addresses (or sources) being queried ๐ŸŽฏ.

As mentioned earlier, to keep the protocol robust, all queries except the periodic General Queries are retransmitted several times within a given time interval โฑ๏ธ. The number of retransmissions depends on the Robustness Variable ๐Ÿ”ข. If new queries are being scheduled while there are pending queries to be retransmitted for the same multicast address, the new queries and the pending ones have to be merged ๐Ÿงฉ. Host reports received for a multicast address with pending queries may also change what those queries contain ๐Ÿ”„. The process of building and maintaining the state of pending queries is presented in Section 7.6.3 ๐Ÿ—‚๏ธ.

The S flag (Suppress Router-Side Processing) also boosts protocol robustness ๐Ÿ’ช. As described above, when the Querier sends a Multicast Address Specific or a Multicast Address and Source Specific Query, several retransmissions of that query get scheduled โฐ. In the original (first) query, the S flag is clear โŒ. When the Querier sends this query, it lowers the timers for the concerned multicast address (or source) to a given value. Any non-querier multicast router that receives the query lowers its timers the same way ๐Ÿ“‰. Still, while waiting for the next scheduled queries, the Querier may receive a report that updates the timers ๐Ÿ“ฌ. The scheduled queries still have to go out, so a non-querier router keeps its state synchronized with the current Querier (that router might have missed the first query) ๐Ÿ”—. But the timers should not be lowered again, since a valid answer was already received ๐Ÿ™…โ€โ™€๏ธ. That's why the Querier sets the S flag in subsequent queries โœ…๐Ÿ’–

2.3. Building Multicast Address Listening State on Multicast Routers โœจ

Okay so routers that speak MLDv2 (whether they're the Querier or not) ๐Ÿ’… keep state per multicast address per attached link. That state is made of a filter-mode, a filter timer, and a source-list, and every source on that list gets its own timer โณ. The filter-mode is basically how the router squashes everybody's listening wishes into one minimal summary so every node's wishes still get respected. It can flip when certain report types show up or when certain timer conditions happen ๐Ÿ”ฅ.

A router is in INCLUDE mode for a specific multicast address on an interface when all the listeners on that link who are interested in the address are in INCLUDE mode. Its state is written as INCLUDE (A), where A is the "Include List," which is the set of sources one or more listeners asked to receive ๐ŸŽ€. Everything on the Include List gets forwarded, and anything not on it gets blocked ๐Ÿšซ.

A source can join the Include List when an INCLUDE-mode listener sends a Current-State or State-Change Report that includes it. Each source has a Source Timer that gets refreshed whenever an INCLUDE-mode listener reports interest in that exact source. If that timer runs out, the source is gone ๐Ÿ‘‹.

Besides this "soft leave" vibe, MLDv2 also has a "fast leave" scheme, which is also built on source timers ๐Ÿƒโ€โ™€๏ธ. When an INCLUDE-mode node says it wants to stop listening to a specific source, all the multicast routers on the link drop their timers for that source down to a given value. The Querier then sends a Multicast Address and Source Specific Query to check whether anyone else on the link still wants that source. If a report that includes the source arrives before the timer expires, every router on the link refreshes the source timer. If not, the source is deleted from the Include List. How the Include List gets handled based on received reports is covered in Sections 7.4.1 and 7.4.2 ๐Ÿ“–.

A router is in EXCLUDE mode for a specific multicast address on an interface if there's at least one listener in EXCLUDE mode for that address on the link ๐ŸŒธ. When the first report from that listener arrives, the router starts the Filter Timer for that address. The timer resets each time an EXCLUDE-mode listener confirms its listening state through a Current-State Report. It also gets updated when a listener that used to be in INCLUDE mode announces its filter-mode change through a State-Change Report. If the Filter Timer expires, that means no EXCLUDE-mode listeners are left on the link, so the router switches back to INCLUDE mode for that address ๐Ÿ”.

When the router is in EXCLUDE mode, its state is written as EXCLUDE (X,Y), where X is the "Requested List" and Y is the "Exclude List." Everything except the sources on the Exclude List gets forwarded. The Requested List doesn't affect forwarding at all, but the router still has to maintain it, for two reasons ๐Ÿง :

  1. To track the sources INCLUDE-mode listeners are listening to. This is what makes sure the router can transition smoothly back to INCLUDE mode once there's no EXCLUDE-mode listener left. That transition should not interrupt the flow of traffic to INCLUDE-mode listeners for that address. So at transition time, the Requested List should contain the set of sources that INCLUDE-mode nodes have explicitly requested ๐Ÿ’–.

When the router switches to INCLUDE mode, the sources in the Requested List move over to the Include List, and the Exclude List gets deleted. Before that switch, the Requested List can contain an inexact guess of the sources INCLUDE-mode listeners are listening to, which might be too large or too small. That's because the Requested List is also used for fast blocking, which is coming up next. If fast blocking is needed, some sources might get deleted from the Requested List (see Sections 7.4.1 and 7.4.2) to reduce router state. But in each of those cases, the Filter Timer also gets updated. That gives INCLUDE-mode listeners enough time, before any possible switch, to reconfirm their interest in the removed sources and rebuild the Requested List accordingly ๐Ÿซถ. The protocol makes sure that when a switch to INCLUDE mode happens, the Requested List is accurate. Details about the router's transition to INCLUDE mode are in Appendix A.3.

  1. To allow fast blocking of previously unblocked sources. If the router gets a report containing such a request, the concerned sources get added to the Requested List. Their timers get set to a given small value, and the Querier sends a Multicast Address and Source Specific Query to check whether nodes on the link are still interested in those sources. If no node announces interest in those specific sources, their timers expire. Then the sources move from the Requested List to the Exclude List. From that point on, the router blocks them ๐Ÿšซ๐Ÿ’….

The handling of the EXCLUDE-mode router state, based on received reports, is detailed in Sections 7.4.1 and 7.4.2.

Both the MLDv2 router and listener behaviors in this document were defined to ensure backward interoperability with MLDv1 hosts and routers. Interoperability issues are detailed in Section 8 ๐Ÿฆ‹.


3. The Service Interface for Requesting IP Multicast Reception ๐ŸŽ€

Within an IP system, there is (at least conceptually) a service interface that upper-layer protocols or application programs use to ask the IP layer to enable or disable reception of packets sent to specific IP multicast addresses ๐Ÿ“ฌ. To take full advantage of MLDv2's capabilities, a node's IP service interface must support the following operation:

   IPv6MulticastListen ( socket, interface, IPv6 multicast-address,
                         filter-mode, source-list )

where:

  • "socket" is an implementation-specific parameter used to tell apart the different requesting entities (like programs and processes) within the node. The socket parameter of BSD Unix system calls is a specific example ๐Ÿงš.
  • "interface" is a local identifier of the network interface where reception of the specified multicast address is to be enabled or disabled. Interfaces can be physical (for example, an Ethernet interface) or virtual (for example, the endpoint of a Frame Relay virtual circuit or an IP-in-IP "tunnel"). An implementation may allow a special "unspecified" value to be passed as the interface parameter, in which case the request applies to the "primary" or "default" interface of the node (perhaps established by system configuration). If reception of the same multicast address is wanted on more than one interface, IPv6MulticastListen is invoked separately for each desired interface ๐Ÿ”Œ.
  • "IPv6 multicast address" is the multicast address the request is about. If reception of more than one multicast address on a given interface is wanted, IPv6MulticastListen is invoked separately for each desired address ๐ŸŒˆ.
  • "filter-mode" may be either INCLUDE or EXCLUDE. In INCLUDE mode, reception of packets sent to the specified multicast address is requested only from the source addresses listed in the source-list parameter. In EXCLUDE mode, reception of packets sent to the given multicast address is requested from all source addresses except those listed in the source-list parameter ๐Ÿ”.
  • "source-list" is an unordered list of zero or more unicast addresses from which multicast reception is wanted or not wanted, depending on the filter-mode. An implementation MAY impose a limit on the size of source-lists. When an operation causes the source-list size limit to be exceeded, the service interface SHOULD return an error ๐Ÿšจ.

For a given combination of socket, interface, and IPv6 multicast address, only a single filter-mode and source-list can be in effect at any one time. Still, either the filter-mode or the source-list (or both) can be changed by later IPv6MulticastListen requests that specify the same socket, interface, and IPv6 multicast address. Each later request completely replaces any earlier request for that given socket, interface, and multicast address ๐Ÿ”„.

The MLDv1 protocol didn't support source filters and had a simpler service interface. It had Start Listening and Stop Listening operations to enable and disable listening to a given multicast address (from all sources) on a given interface. Here are the equivalent operations in this service interface ๐Ÿ‘€.

The Start Listening operation is equivalent to:

   IPv6MulticastListen ( socket, interface, IPv6 multicast address,
                         EXCLUDE, {} )

and the Stop Listening operation is equivalent to:

   IPv6MulticastListen ( socket, interface, IPv6 multicast address,
                         INCLUDE, {} )

where {} is an empty source-list.

An example of an API that provides the capabilities outlined in this service interface is given in [RFC3678] ๐Ÿ’œ.


4. Multicast Address Listening State Maintained by Nodes ๐Ÿงš

4.1. Per-Socket State ๐Ÿ’…

For each socket where IPv6MulticastListen has been invoked, the node records the desired Multicast Address Listening state for that socket. Conceptually, that state is a set of records of this form:

   (interface, IPv6 multicast address, filter-mode, source-list)

The per-socket state changes in response to each invocation of IPv6MulticastListen on the socket, like so:

  • If the requested filter-mode is INCLUDE and the requested source-list is empty, then the entry that matches the requested interface and multicast address is deleted, if it's present. If no such entry is present, the request has no effect ๐Ÿ—‘๏ธ.
  • If the requested filter-mode is EXCLUDE or the requested source-list is non-empty, then the entry that matches the requested interface and multicast address, if it's present, is changed to contain the requested filter-mode and source-list. If no such entry is present, a new entry is created using the parameters from the request โœจ.

4.2. Per-Interface State โœจ

Okay bestie, so on top of the per-socket Multicast Address Listening state, a node must also maintain or compute Multicast Address Listening state for each of its interfaces ๐ŸŽ€. Conceptually that state is a bunch of records shaped like this:

(IPv6 multicast address, filter-mode, source-list)

There is at most one record per multicast address for a given interface ๐Ÿฆ‹. This per-interface state comes from the per-socket state, but it can be different when different sockets have different filter-modes and/or source-lists for the same multicast address and interface. Let's do an example ๐Ÿ’…. One app calls this on socket s1:

IPv6MulticastListen ( s1, i, m, INCLUDE, {a, b, c} )

That asks for packets sent to multicast address m on interface i, but only if they come from sources a, b, or c. Another app calls this on socket s2:

IPv6MulticastListen ( s2, i, m, INCLUDE, {b, c, d} )

That's the same interface and the same multicast address, but only from sources b, c, or d. To make both sockets happy, interface i has to receive packets sent to m from any one of a, b, c, or d ๐Ÿ˜ญ. So the listening state of interface i for multicast address m is filter-mode INCLUDE with source-list {a, b, c, d}.

After the IP layer accepts a multicast packet from an interface, delivery to the app or process listening on a particular socket depends on that socket's Multicast Address Listening state. Other conditions can matter too, like which transport-layer port the socket is bound to ๐ŸŒธ. So in the example above, if a packet arrives on interface i, destined to multicast address m, with source address a, it may be delivered on socket s1 but not on socket s2. Also, MLDv2 messages are not subject to source filtering and must always be processed by hosts and routers ๐Ÿ‘‘.

Requiring packets to be filtered based on a socket's multicast reception state is a feature of this service interface. The previous service interface did no filtering based on Multicast Address Listening state. A Start Listening operation on a socket just made the node start listening to a multicast address on the given interface, and packets sent to that address could be delivered to all sockets, whether they had started listening or not ๐Ÿ™ˆ.

The general rules for deriving the per-interface state from the per-socket state are below. For each distinct (interface, IPv6 multicast address) pair that appears in any per-socket state, a per-interface record is created for that multicast address on that interface. Then you look at all the socket records with that same (interface, IPv6 multicast address) pair:

  • If any such record has a filter-mode of EXCLUDE, then the filter-mode of the interface record is EXCLUDE. The source-list of the interface record is the intersection of the source-lists of all socket records in EXCLUDE mode, minus any source addresses that appear in any socket record in INCLUDE mode. For example, if the socket records for multicast address m on interface i are:
    • from socket s1: ( i, m, EXCLUDE, {a, b, c, d} )
    • from socket s2: ( i, m, EXCLUDE, {b, c, d, e} )
    • from socket s3: ( i, m, INCLUDE, {d, e, f} )

then the corresponding interface record on interface i is:

  • ( m, EXCLUDE, {b, c} )

If a fourth socket is added, such as:

  • From socket s4: ( i, m, EXCLUDE, {} )

then the interface record becomes:

  • ( m, EXCLUDE, {} )
  • If all such records have a filter-mode of INCLUDE, then the filter-mode of the interface record is INCLUDE. The source-list of the interface record is the union of the source-lists of all the socket records. For example, if the socket records for multicast address m on interface i are:
    • from socket s1: ( i, m, INCLUDE, {a, b, c} )
    • from socket s2: ( i, m, INCLUDE, {b, c, d} )
    • from socket s3: ( i, m, INCLUDE, {e, f} )

then the corresponding interface record on interface i is:

  • ( m, INCLUDE, {a, b, c, d, e, f} )

An implementation MUST NOT use an EXCLUDE interface record for a multicast address if all sockets for this multicast address are in INCLUDE state. If system resource limits are reached when a per-interface state source-list is calculated, an error MUST be returned to the application which requested the operation ๐Ÿšจ.

The above rules for deriving the per-interface state are (re)evaluated whenever an IPv6MulticastListen invocation modifies the per-socket state by adding, deleting, or modifying a per-socket state record. A change in the per-socket state doesn't always mean a change in the per-interface state, so don't panic if nothing changes ๐Ÿซถ.


5. Message Formats ๐ŸŽ€

Okay so MLDv2 is a sub-protocol of ICMPv6. That means MLDv2 message types are a subset of ICMPv6 messages, and MLDv2 messages are identified in IPv6 packets by a preceding Next Header value of 58 ๐Ÿ“. All MLDv2 messages described in this document MUST be sent with a link-local IPv6 Source Address, an IPv6 Hop Limit of 1, and an IPv6 Router Alert option [RFC2711] in a Hop-by-Hop Options header. (The Router Alert option is necessary to make routers examine MLDv2 messages sent to IPv6 multicast addresses that the routers themselves have no interest in ๐Ÿ‘€.) MLDv2 Reports can be sent with the source address set to the unspecified address [RFC4291], if a valid link-local IPv6 source address hasn't been acquired yet for the sending interface. (See Section 5.2.14 for details.)

There are two MLD message types that matter to the MLDv2 protocol described in this document ๐Ÿ’œ:

  • Multicast Listener Query (Type = decimal 130)
  • Version 2 Multicast Listener Report (Type = decimal 143). See Section 11 for IANA considerations.

To make sure it works with nodes that implement MLDv1 (see Section 8), an implementation of MLDv2 must also support these two message types too ๐Ÿงš:

  • Multicast Listener Report (Type = decimal 131) [RFC2710]
  • Multicast Listener Done (Type = decimal 132) [RFC2710]

Unrecognized message types MUST be silently ignored. Other message types may be used by newer versions or extensions of MLD, by multicast routing protocols, or for other uses โœจ.

In this document, unless it says otherwise, the capitalized words "Query" and "Report" refer to MLD Multicast Listener Queries and MLD Version 2 Multicast Listener Reports, respectively.

5.1. Multicast Listener Query Message ๐ŸŒˆ

Okay so Multicast Listener Queries are sent by multicast routers in Querier state to ask neighboring interfaces about their Multicast Address Listening state ๐Ÿ”ฅ. Queries look like this:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Type = 130   |      Code     |           Checksum            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    Maximum Response Code      |           Reserved            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
*                                                               *
|                                                               |
*                       Multicast Address                       *
|                                                               |
*                                                               *
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Flags |S| QRV |     QQIC      |     Number of Sources (N)     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
*                                                               *
|                                                               |
*                       Source Address [1]                      *
|                                                               |
*                                                               *
|                                                               |
+-                                                             -+
|                                                               |
*                                                               *
|                                                               |
*                       Source Address [2]                      *
|                                                               |
*                                                               *
|                                                               |
+-                              .                              -+
.                               .                               .
.                               .                               .
+-                                                             -+
|                                                               |
*                                                               *
|                                                               |
*                       Source Address [N]                      *
|                                                               |
*                                                               *
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

5.1.1. Code

The Code field is initialized to zero by the sender and ignored by receivers ๐Ÿ™Œ.

5.1.2. Checksum

The Checksum field is the standard ICMPv6 checksum. It covers the entire MLDv2 message, plus a "pseudo-header" of IPv6 header fields [RFC4443] [RFC8200]. When computing the checksum, the Checksum field is set to zero. When a packet is received, the checksum MUST be verified before processing it ๐Ÿ”.

5.1.3. Maximum Response Code

The Maximum Response Code field specifies the maximum time allowed before sending a responding Report. The actual time allowed, called the "Maximum Response Delay", is measured in milliseconds and is derived from the Maximum Response Code like this โฐ:

  • If Maximum Response Code < 32768, Maximum Response Delay = Maximum Response Code.
  • If Maximum Response Code >=32768, Maximum Response Code represents a floating-point value as follows:
 0 1 2 3 4 5 6 7 8 9 A B C D E F
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|1| exp |          mant         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Maximum Response Delay = (mant | 0x1000) << (exp+3)

Small values of Maximum Response Delay let MLDv2 routers tune the leave latency. That's the time between the moment the last node on a link stops listening to a specific multicast address and the moment the routing protocol is told there are no more listeners for that address ๐Ÿƒ. Larger values, especially in the exponential range, let you tune how bursty MLD traffic is on a link ๐Ÿ’ฅ.

5.1.4. Reserved

The Reserved field is set to zero on transmission and ignored on reception ๐Ÿฆ‹.

5.1.5. Multicast Address ๐ŸŒธ

okay so for a General Query, the Multicast Address field gets set to zero ๐Ÿซถ. For a Multicast Address Specific Query or a Multicast Address and Source Specific Query, it gets set to the multicast address being queried (see Section 5.1.10, below) ๐Ÿฆ‹.

5.1.6. Flags ๐ŸŽ€

bestie, the individual bits in the Flags field are allocated in Section 2.2 of [RFC9778] ๐Ÿ“–. Future specs will define what each allocated bit means โœจ.

5.1.7. S Flag (Suppress Router-Side Processing) ๐Ÿ™ˆ

when the S flag is set to one, it tells any multicast routers that receive it to suppress the normal timer updates they'd usually do after getting a Query ๐Ÿคซ. BUT it does NOT suppress querier election ๐Ÿ‘‘, and it doesn't stop the normal "host-side" processing a router might have to do because it's a multicast listener itself ๐Ÿ’…. so it's not a full shutdown, just the timers ๐Ÿ˜ญ.

5.1.8. QRV (Querier's Robustness Variable) ๐Ÿ’œ

if the QRV field is non-zero, it holds the [Robustness Variable] value the Querier is using ๐Ÿงš. if the Querier's [Robustness Variable] is bigger than 7 (the max the QRV field can hold), the QRV field gets set to zero ๐Ÿ’€.

routers take the QRV from the most recent Query and make it their own [Robustness Variable] ๐Ÿซถ. EXCEPT if that QRV was zero, then they use the default [Robustness Variable] from Section 9.1 or whatever was statically configured ๐ŸŒˆ.

5.1.9. QQIC (Querier's Query Interval Code) ๐Ÿ“

the QQIC field tells everyone the [Query Interval] the Querier is using โœจ. the actual interval, called the "Querier's Query Interval (QQI)", is in seconds and you get it from the QQIC like this ๐Ÿงฎ:

  • if QQIC < 128, then QQI = QQIC
  • if QQIC >= 128, the QQIC is a floating-point value laid out like this:
 0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|1| exp | mant  |
+-+-+-+-+-+-+-+-+

and then:

QQI = (mant | 0x10) << (exp + 3)

multicast routers that aren't the current Querier adopt the QQI from the latest Query as their own [Query Interval] ๐Ÿ‘‘. UNLESS that QQI was zero, in which case they fall back to the default [Query Interval] from Section 9.2 ๐ŸŒธ.

5.1.10. Number of Sources (N) ๐Ÿฆ‹

the Number of Sources (N) field says how many source addresses are in the Query ๐Ÿ’…. it's zero in a General Query or a Multicast Address Specific Query, and non-zero in a Multicast Address and Source Specific Query โœจ. the number is capped by the MTU of the link the Query goes over ๐Ÿ“.

here's the example, it's giving math class but make it cute ๐ŸŽ€. on an Ethernet link with an MTU of 1500 octets, the IPv6 header (40 octets) plus the Hop-by-Hop Extension Header (8 octets) that carries the Router Alert option eat up 48 octets ๐Ÿฐ. the MLD fields up to the Number of Sources (N) field take 28 octets ๐Ÿ’–. that leaves 1424 octets for source addresses, so the max is 89 sources (1424/16) ๐Ÿ”ฅ. we love a clean ceiling ๐Ÿ˜ญ.

5.1.11. Source Address [i] ๐Ÿงš

the Source Address [i] fields are a vector of n unicast addresses, where n is whatever's in the Number of Sources (N) field ๐Ÿ’œ.

5.1.12. Additional Data ๐ŸŒˆ

okay this one's important ๐Ÿ‘€. if the Payload Length field in the IPv6 header of a received Query says there are extra octets beyond the fields we just covered, MLDv2 implementations MUST include those octets when they compute the MLD Checksum to verify it ๐Ÿ”. but they MUST otherwise ignore those extra octets ๐Ÿ™ˆ. when sending a Query, an MLDv2 implementation MUST NOT include any octets past the fields described above ๐Ÿšซ. no extras, bestie ๐Ÿ’….

5.1.13. Query Variants ๐Ÿ“

there are three variants of the Query Message, and they're all kinda iconic โœจ:

  • a "General Query" is sent by the Querier to find out which multicast addresses have listeners on an attached link ๐Ÿ‘‘. in a General Query, both the Multicast Address field and the Number of Sources (N) field are zero ๐Ÿซถ.
  • a "Multicast Address Specific Query" is sent by the Querier to check whether one particular multicast address has any listeners on an attached link ๐Ÿฆ‹. the Multicast Address field holds that address of interest, and the Number of Sources (N) field is set to zero ๐Ÿ’–.
  • a "Multicast Address and Source Specific Query" is sent by the Querier to find out if any of the sources from the listed sources for one particular multicast address have listeners on an attached link ๐Ÿ”ฅ. the Multicast Address field holds the multicast address of interest, and the Source Address [i] field(s) hold the source address(es) of interest ๐Ÿ’œ.

5.1.14. Source Addresses for Queries ๐Ÿ›ก๏ธ

the source-address rules are strict, bestie ๐Ÿ˜ค. all MLDv2 Queries MUST be sent with a valid IPv6 link-local source address ๐Ÿ”—. if a node (router or host) gets a Query Message whose IPv6 Source Address is the unspecified address (::), or any other address that isn't a valid IPv6 link-local address, it MUST silently discard the message ๐Ÿค. it SHOULD log a warning too ๐Ÿ“.

5.1.15. Destination Addresses for Queries ๐ŸŒธ

in MLDv2, General Queries go to the link-scope all-nodes multicast address (ff02::1) ๐ŸŒ. Multicast Address Specific and Multicast Address and Source Specific Queries are sent with an IP destination address equal to the multicast address of interest ๐ŸŽฏ. HOWEVER, a node MUST accept and process any Query whose IP Destination Address field contains any address (unicast or multicast) assigned to the interface the Query arrives on ๐Ÿซถ. this might be useful, e.g., for debugging purposes ๐Ÿงš.


5.2. Version 2 Multicast Listener Report Message ๐Ÿฆ‹

okay now we're onto Reports โœจ. Version 2 Multicast Listener Reports are sent by IP nodes to tell their neighboring routers about the current Multicast Address Listening state of their interfaces ๐Ÿ“ฃ. they also send changes in that state ๐Ÿ”„. the format looks like this ๐Ÿ‘€:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Type = 143   |    Reserved   |           Checksum            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             Flags             |Nr of Mcast Address Records (M)|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
.                                                               .
.                  Multicast Address Record [1]                 .
.                                                               .
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
.                                                               .
.                  Multicast Address Record [2]                 .
.                                                               .
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                               .                               |
.                               .                               .
|                               .                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
.                                                               .
.                  Multicast Address Record [M]                 .
.                                                               .
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

each Multicast Address Record has its own internal format too ๐Ÿงฉ:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Record Type  |  Aux Data Len |     Number of Sources (N)     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
*                                                               *
|                                                               |
*                       Multicast Address                       *
|                                                               |
*                                                               *
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
*                                                               *
|                                                               |
*                       Source Address [1]                      *
|                                                               |
*                                                               *
|                                                               |
+-                                                             -+
|                                                               |
*                                                               *
|                                                               |
*                       Source Address [2]                      *
|                                                               |
*                                                               *
|                                                               |
+-                                                             -+
.                               .                               .
.                               .                               .
.                               .                               .
+-                                                             -+
|                                                               |
*                                                               *
|                                                               |
*                       Source Address [N]                      *
|                                                               |
*                                                               *
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
.                                                               .
.                         Auxiliary Data                        .
.                                                               .
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

5.2.1. Reserved ๐Ÿซง

the Reserved field is set to zero when sent and ignored when received ๐Ÿค.

5.2.2. Checksum ๐Ÿ”

the Checksum field is the standard ICMPv6 checksum ๐Ÿงฎ. it covers the entire MLDv2 message, plus a "pseudo-header" of IPv6 header fields [RFC4443] [RFC8200] ๐ŸŒ. to compute it, the Checksum field is set to zero first 0๏ธโƒฃ. when a packet is received, the checksum MUST be verified before the packet gets processed ๐Ÿ›ก๏ธ. no skipping this step, periodt ๐Ÿ’….

5.2.3. Flags ๐ŸŽ€

the individual bits in the Flags field are allocated as described in Section 2.3 of [RFC9778] ๐Ÿ“–. future specs will define what each allocated bit means โœจ.

5.2.4. Nr of Mcast Address Records (M) ๐ŸŽ€

okay so the Nr of the Mcast Address Records (M) field tells you how many Multicast Address Records are included in this Report. it's literally the headcount ๐Ÿ’…

5.2.5. Multicast Address Record ๐Ÿฆ‹

Each Multicast Address Record is a little block of fields with info on the sender listening to one multicast address on the interface the Report is sent from. ngl it's giving tidy envelope energy ๐Ÿ’Œ

5.2.6. Record Type ๐ŸŒธ

The Record Type field says what kind of Multicast Address Record you're looking at. See Section 5.2.13 for the full breakdown of all the possible Record Types ๐Ÿซถ

5.2.7. Aux Data Len โœจ

The Aux Data Len field holds the length of the Auxiliary Data field in this Multicast Address Record, in units of 32-bit words. It may contain zero, which means there's no auxiliary data at all ๐Ÿ™ˆ

5.2.8. Number of Sources (N) ๐Ÿ’œ

The Number of Sources (N) field tells you how many source addresses are present in this Multicast Address Record ๐Ÿ“

5.2.9. Multicast Address ๐Ÿงš

The Multicast Address field contains the multicast address this Multicast Address Record is about ๐Ÿฆ‹

5.2.10. Source Address [i] ๐ŸŒˆ

The Source Address [i] fields are a vector of n unicast addresses, where n is the value in this record's Number of Sources (N) field. it's a whole list, bestie ๐Ÿ“‹

5.2.11. Auxiliary Data ๐Ÿ”ฅ

The Auxiliary Data field, if present, contains extra info that pertains to this Multicast Address Record. the protocol in this document, MLDv2, does not define any auxiliary data. so, implementations of MLDv2 MUST NOT include any auxiliary data (i.e., MUST set the Aux Data Len field to zero) in any transmitted Multicast Address Record, and MUST ignore any such data present in any received Multicast Address Record. the semantics and the internal encoding of the Auxiliary Data field are to be defined by any future version or extension of MLD that uses this field. future MLD, you get to decide this ๐Ÿ‘‘

5.2.12. Additional Data ๐Ÿ’–

If the Payload Length field in the IPv6 header of a received Report indicates that there are additional octets of data present beyond the last Multicast Address Record, MLDv2 implementations MUST include those octets in the computation to verify the received MLD Checksum, but MUST otherwise ignore those additional octets. when sending a Report, an MLDv2 implementation MUST NOT include additional octets beyond the last Multicast Address Record. no extra octets in the group chat, periodt ๐Ÿค

5.2.13. Multicast Address Record Types ๐Ÿ’…

there are a bunch of different types of Multicast Address Records that can be included in a Report message, so let's go through them ๐Ÿซถ

  • A "Current-State Record" is sent by a node in response to a Query received on an interface. it reports the current listening state of that interface, with respect to a single multicast address. the Record Type of a Current-State Record may be one of the following two values:
    1. MODE_IS_INCLUDE - indicates that the interface has a filter-mode of INCLUDE for the specified multicast address. the Source Address [i] fields in this Multicast Address Record contain the interface's source-list for the specified multicast address. a MODE_IS_INCLUDE Record is never sent with an empty source-list.
    2. MODE_IS_EXCLUDE - indicates that the interface has a filter-mode of EXCLUDE for the specified multicast address. the Source Address [i] fields in this Multicast Address Record contain the interface's source-list for the specified multicast address, if it is non-empty. an SSM-aware host SHOULD NOT send a MODE_IS_EXCLUDE record type for multicast addresses that fall within the SSM address range, as they will be ignored by SSM-aware routers [RFC4604]. the routers are side-eyeing it ๐Ÿ‘€
  • A "Filter-Mode-Change Record" is sent by a node whenever a local invocation of IPv6MulticastListen causes a change of the filter-mode (i.e., a change from INCLUDE to EXCLUDE, or from EXCLUDE to INCLUDE) of the interface-level state entry for a particular multicast address, whether the source-list changes at the same time or not. the Record is included in a Report sent from the interface on which the change occurred. the Record Type of a Filter-Mode-Change Record may be one of the following two values:
    1. CHANGE_TO_INCLUDE_MODE - indicates that the interface has changed to INCLUDE filter-mode for the specified multicast address. the Source Address [i] fields in this Multicast Address Record contain the interface's new source-list for the specified multicast address, if it is non-empty.
    2. CHANGE_TO_EXCLUDE_MODE - indicates that the interface has changed to EXCLUDE filter-mode for the specified multicast address. the Source Address [i] fields in this Multicast Address Record contain the interface's new source-list for the specified multicast address, if it is non-empty. an SSM-aware host SHOULD NOT send a CHANGE_TO_EXCLUDE_MODE record type for multicast addresses that fall within the SSM address range.
  • A "Source-List-Change Record" is sent by a node whenever a local invocation of IPv6MulticastListen causes a change of source-list that is not coincident with a change of filter-mode, of the interface-level state entry for a particular multicast address. the Record is included in a Report sent from the interface on which the change occurred. the Record Type of a Source-List-Change Record may be one of the following two values:
    1. ALLOW_NEW_SOURCES - indicates that the Source Address [i] fields in this Multicast Address Record contain a list of the additional sources that the node wishes to listen to, for packets sent to the specified multicast address. if the change was to an INCLUDE source-list, these are the addresses that were added to the list; if the change was to an EXCLUDE source-list, these are the addresses that were deleted from the list.
    2. BLOCK_OLD_SOURCES - indicates that the Source Address [i] fields in this Multicast Address Record contain a list of the sources that the node no longer wishes to listen to, for packets sent to the specified multicast address. if the change was to an INCLUDE source-list, these are the addresses that were deleted from the list; if the change was to an EXCLUDE source-list, these are the addresses that were added to the list.

if a change of source-list results in both allowing new sources and blocking old sources, then two Multicast Address Records are sent for the same multicast address: one of type ALLOW_NEW_SOURCES and one of type BLOCK_OLD_SOURCES ๐Ÿ”„

we use the term "State-Change Record" to refer to either a Filter Mode Change Record or a Source-List-Change Record ๐Ÿซง

Multicast Address Records with an unrecognized Record Type value MUST be silently ignored, with the rest of the report being processed. no drama, just keep going ๐Ÿคทโ€โ™€๏ธ

in the rest of this document, we use the following notation to describe the contents of a Multicast Address Record that pertains to a particular multicast address:

IS_IN ( x ) - Type MODE_IS_INCLUDE, source addresses x
IS_EX ( x ) - Type MODE_IS_EXCLUDE, source addresses x
TO_IN ( x ) - Type CHANGE_TO_INCLUDE_MODE, source addresses x
TO_EX ( x ) - Type CHANGE_TO_EXCLUDE_MODE, source addresses x
ALLOW ( x ) - Type ALLOW_NEW_SOURCES, source addresses x
BLOCK ( x ) - Type BLOCK_OLD_SOURCES, source addresses x

where x is either:

  • a capital letter (e.g., "A") to represent the set of source addresses, or
  • a set expression (e.g., "A+B"), where "A+B" means the union of sets A and B, "A*B" means the intersection of sets A and B, and "A-B" means the removal of all elements of set B from set A.
A+B   union of sets A and B
A*B   intersection of sets A and B
A-B   all elements of set B removed from set A

5.2.14. Source Addresses for Reports ๐Ÿ”ฎ

An MLDv2 Report MUST be sent with a valid IPv6 link-local source address, or the unspecified address (::), if the sending interface has not acquired a valid link-local address yet. sending reports with the unspecified address is allowed to support the use of IP multicast in the Neighbor Discovery Protocol [RFC4861]. for stateless autoconfiguration, as defined in [RFC4862], a node is required to join several IPv6 multicast groups, in order to perform Duplicate Address Detection (DAD). prior to DAD, the only address the reporting node has for the sending interface is a tentative one, which cannot be used for communication. thus, the unspecified address must be used. it's a chicken-and-egg situation and the unspecified address is the way out ๐Ÿฃ

on the other hand, routers MUST silently discard a message that is not sent with a valid link-local address, without taking any action on the contents of the packet. thus, a Report is discarded if the router cannot identify the source address of the packet as belonging to a link connected to the interface on which the packet was received. a Report sent with the unspecified address is also discarded by the router. this enhances security, as unidentified reporting nodes cannot influence the state of the MLDv2 router(s) ๐Ÿ›ก๏ธ nevertheless, the reporting node has modified its listening state for multicast addresses that are contained in the Multicast Address Records of the Report message. from now on, it will treat packets sent to those multicast addresses according to this new listening state. once a valid link-local address is available, a node SHOULD generate new MLDv2 Report messages for all multicast addresses joined on the interface. glow-up unlocked โœจ

5.2.15. Destination Addresses for Reports ๐Ÿงญ

Version 2 Multicast Listener Reports are sent with an IP destination address of ff02::16, which all MLDv2-capable multicast routers listen to (see Section 11 for IANA considerations related to this special destination address). a node that operates in version 1 compatibility mode (see details in Section 8) sends version 1 Reports to the multicast address specified in the Multicast Address field of the Report. in addition, a node MUST accept and process any version 1 Report whose IP Destination Address field contains any of the IPv6 addresses (unicast or multicast) assigned to the interface on which the Report arrives. this might be useful, e.g., for debugging purposes ๐Ÿ”

5.2.16. Multicast Listener Report Size ๐ŸŒŠ

if the set of Multicast Address Records required in a Report does not fit within the size limit of a single Report message (as determined by the MTU of the link on which it will be sent), the Multicast Address Records are sent in as many Report messages as needed to report the entire set. split it up, bestie, no one's getting squished ๐Ÿ“ฆ

if a single Multicast Address Record contains so many source addresses that it does not fit within the size limit of a single Report message, then:

  • if its Type is not IS_EX or TO_EX, it is split into multiple Multicast Address Records; each such record contains a different subset of the source addresses and is sent in a separate Report.
  • if its Type is IS_EX or TO_EX, a single Multicast Address Record is sent, with as many source addresses as can fit; the remaining source addresses are not reported. although the choice of which sources to report is arbitrary, it is preferable to report the same set of sources in each subsequent report, rather than reporting different sources each time. consistency is everything, iykyk ๐Ÿฅน

6. Protocol Description for Multicast Address Listeners โœจ

okay so MLD is an asymmetric protocol ๐Ÿซถ, which means it has separate behaviors for Multicast Address Listeners (hosts or routers that listen to multicast packets ๐ŸŽง) and for multicast routers. This section covers the part of MLDv2 that applies to all Multicast Address Listeners. (ngl, a multicast router that's also a listener does both parts! It receives and responds to its own MLD messages AND its neighbors' ๐Ÿ‘‘.) The multicast router part is in Section 7.

A node runs the protocol from this section over every interface where multicast reception is supported ๐Ÿ’–, even if more than one of those interfaces is connected to the same link.

For interoperability with multicast routers running MLDv1 ๐Ÿงš, nodes keep a Host Compatibility Mode variable for each interface that supports multicast reception. This section describes how Multicast Address Listener nodes behave on interfaces where Host Compatibility Mode = MLDv2. The algorithm for figuring out Host Compatibility Mode, and the behavior when it's set to MLDv1, are in Section 8 ๐ŸŒธ.

The link-scope all-nodes multicast address, ff02::1, gets special treatment โญ. On all nodes (all hosts and routers, including multicast routers), listening to packets sent to the all-nodes multicast address from any source is permanently enabled on every interface that supports multicast listening. No MLD messages are ever sent about ff02::1 or any multicast address of scope 0 (reserved) or 1 (node-local). Multicast listeners MUST send MLD messages for all multicast addresses except the link-scope all-nodes multicast address and any multicast addresses of scope less than 2.

There are three types of events that trigger MLDv2 protocol actions on an interface ๐Ÿฆ‹:

  • a change of the per-interface listening state, caused by a local invocation of IPv6MulticastListen;
  • the firing of a specific timer; and
  • the reception of a Query.

(Received MLD messages of types other than Query are silently ignored, except when that's required for interoperating with nodes that implement MLDv1 ๐Ÿ™ˆ.)

The following subsections describe what to do for each case. Timer and counter names appear in square brackets. Default values for those timers and counters are specified in Section 9 ๐ŸŽ€.


6.1. Action on Change of Per-Interface State

An invocation of IPv6MulticastListen may change the Multicast Address Listening state of an interface, following the rules in Section 4.2 ๐Ÿ’…. Each such change affects the per-interface entry for a single multicast address.

A change of per-interface state makes the node immediately transmit a State-Change Report from that interface ๐Ÿš€. The type and contents of the Multicast Address Record(s) in that Report are decided by comparing the filter-mode and source-list for the affected multicast address before and after the change, using Table 1 ๐Ÿ‘€. If there was no per-interface state for that multicast address before the change (aka the change created a new per-interface record), or there's no state after the change (aka the change deleted a per-interface record), then the "non-existent" state is treated as having an INCLUDE filter-mode and an empty source-list.

   +=============+=============+==========================+
   | Old State   | New State   | State-Change Record Sent |
   +=============+=============+==========================+
   | INCLUDE (A) | INCLUDE (B) | ALLOW (B-A), BLOCK (A-B) |
   +-------------+-------------+--------------------------+
   | EXCLUDE (A) | EXCLUDE (B) | ALLOW (A-B), BLOCK (B-A) |
   +-------------+-------------+--------------------------+
   | INCLUDE (A) | EXCLUDE (B) | TO_EX (B)                |
   +-------------+-------------+--------------------------+
   | EXCLUDE (A) | INCLUDE (B) | TO_IN (B)                |
   +-------------+-------------+--------------------------+

       Table 1: State-Change Record Transmission Logic

If the computed source-list for either an ALLOW or a BLOCK State-Change Record is empty, that record gets left out of the Report ๐Ÿซง.

To cover the chance that the State-Change Report gets missed by one or more multicast routers ๐Ÿฅบ, [Robustness Variable] - 1 retransmissions are scheduled through a Retransmission Timer, at intervals picked at random from the range (0, [Unsolicited Report Interval]).

If more changes hit the same per-interface state entry before all the retransmissions of the State-Change Report for the first change are done, each extra change immediately triggers a brand new State-Change Report ๐Ÿ’ฅ.

The contents of the new Report get worked out like this:

  • Just like for the first Report, the per-interface state for the affected multicast address is compared before and after the latest change.
  • The records showing the difference are built using the table above. But these records don't get sent in a separate message. Instead, they're merged with the contents of the pending report to make the new State-Change Report ๐Ÿงฉ. The rules for working out this merged report are described below.

Sending the merged State-Change Report ends the retransmissions of the earlier State-Change Reports for the same multicast address, and it becomes the first of [Robustness Variable] transmissions of the new State-Change Reports ๐Ÿ”. These transmissions are needed so that each state change gets sent at least [Robustness Variable] times ๐Ÿ’œ.

Each time a source shows up in the difference report calculated above, the node has to keep retransmission state for that source until [Robustness Variable] State-Change Reports have been sent ๐Ÿ“ฃ. This makes sure a series of back-to-back state changes doesn't break the protocol's robustness ๐Ÿ’ช. Sources in retransmission state can be kept in a per-multicast-address Retransmission List, with a Source Retransmission Counter attached to each source in the list. When a source gets added to the list, its counter is set to [Robustness Variable]. Every time a State-Change Report is sent, the counter goes down by one. When the counter hits zero, the source is removed from the Retransmission List for that multicast address ๐Ÿ—‘๏ธ.

If the per-interface listening change that triggers the new report is a filter-mode change, then the next [Robustness Variable] State-Change Reports will include a Filter-Mode-Change Record ๐ŸŒˆ. This applies even if any number of source-list changes happen during that period. The node has to keep retransmission state for the multicast address until those [Robustness Variable] State-Change Reports have been sent. This can be done with a per-multicast-address Filter Mode Retransmission Counter. When the filter-mode changes, the counter is set to [Robustness Variable]. Every time a State-Change Report is sent, the counter goes down by one. When the counter reaches zero (aka [Robustness Variable] State-Change Reports with Filter-Mode-Change Records have gone out since the last filter-mode change), and source-list changes have caused extra reports to be scheduled, then the next State-Change Report will include Source-List-Change Records ๐Ÿง.

Every time a per-interface listening state change sets off an immediate State-Change Report, its contents get decided like this ๐Ÿง . If the report should contain a Filter-Mode-Change Record (aka the Filter Mode Retransmission Counter for that multicast address is higher than zero), then, if the interface's current filter-mode is INCLUDE, a TO_IN record goes in the report, and otherwise a TO_EX record goes in. If instead the report should contain Source-List-Change Records (aka the Filter Mode Retransmission Counter for that multicast address is zero), an ALLOW record and a BLOCK record go in. The contents of these records are built according to Table 2 ๐Ÿ“‹.

   +========+=======================================================+
   | Record | Sources Included                                      |
   +========+=======================================================+
   | TO_IN  | All in the current per-interface state that must be   |
   |        | forwarded.                                            |
   +--------+-------------------------------------------------------+
   | TO_EX  | All in the current per-interface state that must be   |
   |        | blocked.                                              |
   +--------+-------------------------------------------------------+
   | ALLOW  | All with retransmission state (i.e., all sources from |
   |        | the Retransmission List) that must be forwarded.      |
   +--------+-------------------------------------------------------+
   | BLOCK  | All with retransmission state that must be blocked.   |
   +--------+-------------------------------------------------------+

          Table 2: Per-Interface State-Change Report Contents

If the computed source-list for either an ALLOW or a BLOCK record is empty, that record gets left out of the State-Change Report ๐Ÿ™ƒ.

      |  Note: When the first State-Change Report is sent, the non-
      |  existent pending report to merge with can be treated as a
      |  Source-Change Report with empty ALLOW and BLOCK records (no
      |  sources have retransmission state).

Building a scheduled State-Change Report, which gets triggered by the firing of a Retransmission Timer instead of a per-interface listening state change, is described in Section 6.3 โฐ.

6.2. Action on Reception of a Query โœจ

okay bestie, so when an MLD message with a Query shows up, the node runs some checks first ๐Ÿ’… It checks if the source address is a valid link-local address, if the Hop Limit is set to 1, and if the Router Alert option is present in the Hop-by-Hop Options header of the IPv6 packet. If any of those checks fail, the packet gets dropped ๐Ÿ’€

If the MLD message passes, the node starts processing the Query. But it does not respond right away ๐Ÿ™ˆ It waits a random amount of time, bounded by the Maximum Response Delay value, which is derived from the Maximum Response Code in the received Query Message. A node can get a variety of Queries on different interfaces, and they can be different kinds (General Queries, Multicast Address Specific Queries, and Multicast Address and Source Specific Queries). Each one might need its own delayed response ๐Ÿฆ‹

Before scheduling a response to a Query, the node must first consider previously scheduled pending responses and, in many cases, schedule a combined response instead ๐Ÿซถ So for each of its interfaces where it runs the listener part of the MLDv2 protocol, the node must be able to maintain the following state:

  • an Interface Timer for scheduling responses to General Queries;
  • a Multicast Address Timer for scheduling responses to Multicast Address (and Source) Specific Queries, for each multicast address the node has to report on; and
  • a per-multicast-address list of sources to be reported in response to a Multicast Address and Source Specific Query.

When a valid General Query arrives on an interface, the node checks whether it has any per-interface listening state record to report on, or not. Same deal when a valid Multicast Address (and Source) Specific Query arrives on an interface: the node checks whether it has a per-interface listening state record that matches the queried multicast address (and source), or not. If it does, a delay for the response is randomly picked in the range (0, [Maximum Response Delay]), where Maximum Response Delay is derived from the Maximum Response Code inserted in the received Query Message. Then these rules decide if a Report needs to be scheduled and what type it should be. (The rules are considered in order, and only the first matching rule is applied. ๐ŸŽ€)

  1. If there is a pending response to a previous General Query scheduled sooner than the selected delay, no additional response needs to be scheduled. ๐Ÿ˜Œ
  2. If the received Query is a General Query, the Interface Timer is used to schedule a response to the General Query after the selected delay. Any previously pending response to a General Query is canceled. ๐Ÿงน
  3. If the received Query is a Multicast Address Specific Query or a Multicast Address and Source Specific Query, and there is no pending response to a previous Query for this multicast address, then the Multicast Address Timer is used to schedule a report. If the received Query is a Multicast Address and Source Specific Query, the list of queried sources is recorded for use when generating a response. ๐Ÿ“
  4. If there is already a pending response to a previous Query scheduled for this multicast address, and either the new Query is a Multicast Address Specific Query or the recorded source-list associated with the multicast address is empty, then the multicast address source-list is cleared and a single response is scheduled using the Multicast Address Timer. The new response is scheduled to be sent at the earliest of the remaining time for the pending report and the selected delay. โฐ
  5. If the received Query is a Multicast Address and Source Specific Query, and there is a pending response for this multicast address with a non-empty source-list, then the multicast address source-list is augmented to contain the list of sources in the new Query, and a single response is scheduled using the Multicast Address Timer. The new response is scheduled to be sent at the earliest of the remaining time for the pending report and the selected delay. ๐ŸŒˆ

6.3. Action on Timer Expiration โณ

There are several timers that, when they expire, trigger protocol actions on an MLDv2 Multicast Address Listener node. Every single one of these actions is tied to a pending report the node scheduled ๐Ÿ’œ

  1. If the expired timer is the Interface Timer (so there is a pending response to a General Query), then one Current-State Record is sent for each multicast address the specified interface has listening state for, as described in Section 4.2. The Current-State Record carries the multicast address, its associated filter-mode (MODE_IS_INCLUDE or MODE_IS_EXCLUDE), and its source-list. Multiple Current-State Records get packed into individual Report messages, to the extent possible. ๐Ÿ“ฆ

This naive algorithm can cause bursts of packets when a node listens to a large number of multicast addresses ๐Ÿ˜ญ So instead of using a single Interface Timer, implementations are recommended to spread the transmission of those Report messages over the interval (0, [Maximum Response Delay]) โœจ Note that any such implementation MUST avoid the "ack-implosion" problem, i.e., MUST NOT send a Report immediately upon reception of a General Query. Big no-no, no cap ๐Ÿ™…โ€โ™€๏ธ

  1. If the expired timer is a Multicast Address Timer and the list of recorded sources for that multicast address is empty (so there is a pending response to a Multicast Address Specific Query), then, if and only if, the interface has listening state for that multicast address, a single Current-State Record is sent for that address. The Current-State Record carries the multicast address, its associated filter-mode (MODE_IS_INCLUDE or MODE_IS_EXCLUDE), and its source-list, if any. ๐ŸŽฏ
  2. If the expired timer is a Multicast Address Timer and the list of recorded sources for that multicast address is non-empty (so there is a pending response to a Multicast Address and Source Specific Query), then, if and only if, the interface has listening state for that multicast address, the contents of the corresponding Current-State Record are determined from the per-interface state and the pending response record, as specified in Table 3. ๐Ÿงฎ
       +=====================+=========================+===============+
       | Per-Interface       | Set of Sources in the   | Current-State |
       | State               | Pending Response Record | Record        |
       +=====================+=========================+===============+
       | INCLUDE (A)         | B                       | IS_IN (A*B)   |
       +---------------------+-------------------------+---------------+
       | EXCLUDE (A)         | B                       | IS_IN (B-A)   |
       +---------------------+-------------------------+---------------+

             Table 3: Determining Contents of Current-State Record

If the resulting Current-State Record has an empty set of source addresses, then no response is sent. After the required Report messages have been generated, the source-lists associated with any reported multicast addresses get cleared ๐Ÿงผ

  1. If the expired timer is a Retransmission Timer for a multicast address (so there is a pending State-Change Report for that multicast address), the contents of the report are determined as follows. If the report should contain a Filter-Mode-Change Record (meaning the Filter Mode Retransmission Counter for that multicast address has a value higher than zero), then, if the current filter-mode of the interface is INCLUDE, a TO_IN record is included in the report. Otherwise, a TO_EX record is included. In both cases, the Filter Mode Retransmission Counter for that multicast address is decremented by one unit after the transmission of the report. ๐Ÿ”

If instead the report should contain Source-List-Change Records (meaning the Filter Mode Retransmission Counter for that multicast address is zero), an ALLOW and a BLOCK record are included. The contents of these records are built according to Table 4. ๐Ÿ“‹

       +========+=====================================================+
       | Record | Sources Included                                    |
       +========+=====================================================+
       | TO_IN  | All in the current per-interface state that must be |
       |        | forwarded.                                          |
       +--------+-----------------------------------------------------+
       | TO_EX  | All in the current per-interface state that must be |
       |        | blocked.                                            |
       +--------+-----------------------------------------------------+
       | ALLOW  | All with retransmission state (i.e., all sources    |
       |        | from the Retransmission List) that must be          |
       |        | forwarded.  For each included source, its Source    |
       |        | Retransmission Counter is decreased with one unit   |
       |        | after the transmission of the report.  If the       |
       |        | counter reaches zero, the source is deleted from    |
       |        | the Retransmission List for that multicast address. |
       +--------+-----------------------------------------------------+
       | BLOCK  | All with retransmission state (i.e., all sources    |
       |        | from the Retransmission List) that must be blocked. |
       |        | For each included source, its Source Retransmission |
       |        | Counter is decreased with one unit after the        |
       |        | transmission of the report.  If the counter reaches |
       |        | zero, the source is deleted from the Retransmission |
       |        | List for that multicast address.                    |
       +--------+-----------------------------------------------------+

         Table 4: Determining Contents of Source-List-Change Records

If the computed source-list for either an ALLOW or a BLOCK record is empty, that record is omitted from the State-Change Report. Bye-bye, empty records ๐Ÿ‘‹๐ŸŒธ

7. Description of the Protocol for Multicast Routers ๐Ÿฆ‹

okay bestie, this part is the router side of MLD โœจ The whole goal is that each multicast router figures out, for each of its directly attached links, which multicast addresses have listeners on that link ๐Ÿ‘€ MLD version 2 goes even further and lets a router learn which sources have listeners among the neighboring nodes, for packets sent to any particular multicast address ๐Ÿ’… All that info gets handed to whichever multicast routing protocol the router uses, so multicast packets actually reach every link with interested listeners ๐ŸŽ€ periodt.

This section covers the part of MLDv2 that multicast routers do. Routers can also be Multicast Address Listeners ๐Ÿซถ, so they run the listener part too, which is in Section 6.

A multicast router runs this protocol on each of its directly attached links ๐ŸŒธ If a router has more than one interface to the same link, it only needs to run the protocol on one of them (no double work, lol).

For each interface where the router runs MLD, the router must configure that interface to listen to all link-layer multicast addresses that can be generated by IPv6 multicasts. Like, an Ethernet-attached router has to set its Ethernet address reception filter to accept all Ethernet multicast addresses that start with the hexadecimal value 3333 [RFC2464] ๐Ÿงš And if an Ethernet interface can't filter that range, it has to be set to accept ALL Ethernet multicast addresses so it meets MLD's requirements ๐Ÿ˜ญ

On each interface where this protocol is running, the router MUST enable reception of the link-scope "all MLDv2-capable routers" multicast address from all sources, and MUST perform the Multicast Address Listener part of MLDv2 for that address on that interface ๐Ÿ”ฅ

Multicast routers only need to know that at least one node on an attached link listens to packets for a particular multicast address from a particular source ๐Ÿ™ˆ They don't have to individually keep track of what every neighboring node is interested in. (Nevertheless, see Appendix A.2, item 1 for discussion.)

MLDv2 is backward compatible with the MLDv1 protocol ๐Ÿ“ For the full tea on compatibility issues, see Section 8.

7.1. Conditions for MLD Queries ๐Ÿ’–

The way a router behaves with MLDv2 depends on whether there are several multicast routers on the same subnet or not ๐Ÿ‘€ If there are, a querier election mechanism (described in Section 7.6.2) picks a single multicast router to be in Querier state. All the multicast routers on the subnet listen to messages sent by Multicast Address Listeners and keep the same multicast listening information, so they can quickly and correctly take over the querier job if the present Querier fails ๐Ÿฆ‹ Still, only the Querier sends periodic or triggered Query Messages on the subnet.

The Querier periodically sends General Queries to request Multicast Address Listener info from an attached link โœจ These queries are how routers build and refresh the Multicast Address Listening state on attached links.

Nodes answer these queries by reporting their Multicast Address Listening state (plus the set of sources they listen to) using Current State Multicast Address Records in MLD Version 2 Multicast Listener Reports ๐Ÿ’…

As a listener, a node can express interest in listening to traffic from particular sources, or not listening to it ๐ŸŒˆ When the node's desired listening state changes, it reports that using Filter-Mode-Change Records or Source-List-Change Records. These records show an explicit state change for a multicast address at a node, in either the Multicast Address Record's source-list or its filter-mode. When Multicast Address Listening ends at a node, or traffic from a particular source isn't wanted anymore, the Querier must query for other listeners of the multicast address or of the source before deleting the multicast address (or source) from its Multicast Address Listening state and pruning its traffic ๐Ÿ˜ญ

To let every node on a link respond to changes in multicast address listening, the Querier sends specific queries ๐ŸŽ€ A Multicast Address Specific Query is sent to check that no nodes listen to the specified multicast address, or to "rebuild" the listening state for that address. These get sent when the Querier receives a State-Change Record saying a node stopped listening to a multicast address. They're also sent to enable a fast transition of a router from EXCLUDE to INCLUDE mode, in case a received State-Change Record motivates that move ๐Ÿงš

A Multicast Address and Source Specific Query is used to check that there are no nodes on a link listening to traffic from a specific set of sources ๐Ÿ‘€ These queries list sources for a particular multicast address that were requested to no longer be forwarded. The Querier sends them to find out if any node is still listening to packets sent to the specified multicast address from the specified source addresses. Multicast Address and Source Specific Queries are only sent in response to State-Change Records and never in response to Current-State Records. Section 5.1.13 describes each query in more detail ๐Ÿซถ

7.2. MLD State Maintained by Multicast Routers ๐Ÿงš

Multicast routers that implement MLDv2 keep state per multicast address, per attached link ๐Ÿ’œ That state is made up of a filter-mode, a list of sources, and various timers. For each attached link where MLD runs, the router records the listening state for that link. Conceptually, that state is a set of records of this form:

         (IPv6 multicast address, Filter Timer,
          Router Filter Mode, (source records) )

Each source record looks like this:

         (IPv6 source address, source timer)

If all sources for a multicast address are listened to, the router keeps an empty source record list with the Router Filter Mode set to EXCLUDE. That means the nodes on this link want all sources for this multicast address to be forwarded ๐ŸŒธ It's the MLDv2 version of an MLDv1 listening state, so it's giving familiar vibes ๐Ÿ’–

7.2.1. Definition of Router Filter Mode ๐Ÿฆ‹

To keep internal state small, MLDv2 routers keep a filter-mode per multicast address, per attached link ๐Ÿง  This filter-mode summarizes the total listening state of a multicast address down to a minimum set that still respects every node's listening state. It can change when certain types of Multicast Address Records come in, or when certain timer conditions happen. In the sections that follow, "Router Filter Mode" means the filter-mode of a particular multicast address within a router. Section 7.4 describes how the Router Filter Mode changes for each Multicast Address Record received.

A router is in INCLUDE mode for a specific multicast address on a given interface if all the listeners on the link interested in that address are in INCLUDE mode. The router state is written as INCLUDE (A), where A is called the "Include List". The Include List is the set of sources that one or more listeners on the link have asked to receive ๐ŸŒˆ Every source in the Include List gets forwarded by the router, and any other source that isn't in the Include List gets blocked ๐Ÿšซ

A router is in EXCLUDE mode for a specific multicast address on a given interface if at least one listener in EXCLUDE mode is interested in that address on the link โœจ Conceptually, when a Multicast Address Record comes in, the Router Filter Mode for that address gets updated to cover all the requested sources using the least amount of state. As a rule, once a Multicast Address Record with a filter-mode of EXCLUDE is received, the Router Filter Mode for that multicast address is set to EXCLUDE. Nevertheless, if all the nodes with a Multicast Address Record having filter-mode set to EXCLUDE stop reporting, it's desirable for the Router Filter Mode for that address to transition back to INCLUDE mode ๐Ÿ’€ That transition happens when the Filter Timer expires; see Section 7.5 for more details.

When the router is in EXCLUDE mode, its state is written as EXCLUDE (X,Y), where X is called the "Requested List" and Y is called the "Exclude List" ๐Ÿ’… All sources, except those from the Exclude List, get forwarded by the router. The Requested List has no effect on forwarding, but it still has to be maintained for several reasons, as explained in Section 7.2.3 ๐Ÿซถ

The exact handling of both the INCLUDE and EXCLUDE mode router state, according to the received reports, is laid out in detail in Sections 7.4.1 and 7.4.2 ๐Ÿ‘‘

7.2.2. Definition of Filter Timers ๐ŸŒธ

The Filter Timer is only used when the router is in EXCLUDE mode for a specific multicast address. It represents the time for the Router Filter Mode of that multicast address to expire and switch to INCLUDE mode โฐ A Filter Timer is a decrementing timer with a lower bound of zero, and there is one Filter Timer per Multicast Address Record. Filter timers get updated based on which types of Multicast Address Records are received.

If a Filter Timer expires while the Router Filter Mode for that multicast address is EXCLUDE, it means there are no more listeners in EXCLUDE mode on the attached link ๐Ÿ™ˆ At that point, the router transitions to INCLUDE filter-mode. Section 7.5 describes the actions taken when a Filter Timer expires while in EXCLUDE mode.

Table 5 sums up the role of the Filter Timer ๐ŸŽ€ Section 7.4 explains how to set the Filter Timer for each type of Multicast Address Record received.

   +=========+========+================================================+
   | Router  | Filter | Actions/Comments                               |
   | Filter  | Timer  |                                                |
   | Mode    | Value  |                                                |
   +=========+========+================================================+
   | INCLUDE | Not    | All listeners in INCLUDE mode.                 |
   |         | Used   |                                                |
   +---------+--------+------------------------------------------------+
   | EXCLUDE | Timer  | At least one listener in EXCLUDE mode.         |
   |         | > 0    |                                                |
   +---------+--------+------------------------------------------------+
   | EXCLUDE | Timer  | No more listeners in EXCLUDE mode for          |
   |         | == 0   | the multicast address.  If the Requested       |
   |         |        | List is empty, delete Multicast Address        |
   |         |        | Record.  If not, switch to INCLUDE             |
   |         |        | filter-mode; the sources in the                |
   |         |        | Requested List are moved to the Include        |
   |         |        | List, and the Exclude List is deleted.         |
   +---------+--------+------------------------------------------------+

                      Table 5: Filter Timer Management

7.2.3. Definition of Source Timers โฑ๏ธ

Okay so a Source Timer is a decrementing timer ๐Ÿ’– with a lower bound of zero, and there's one per source record โœจ. These timers get updated based on the type and filter-mode of the Multicast Address Record that comes in. Section 7.4 walks through how they get set for each type of record ๐ŸŽ€.

Time for the abbreviations ๐Ÿงš. All of these variables are explained in detail in Section 9, but here's the quick version. MALI is the Multicast Address Listening Interval, which is how long multicast address listening state lasts before it times out โฐ. LLQT is the Last Listener Query Time, the total time the router should wait for a report after the Querier sends the first query. During that window, the Querier should send [Last Member Query Count]-1 retransmissions of the query ๐Ÿ”. LLQT also represents the leave latency, meaning the gap between a listener state change being sent and the info getting passed to the routing protocol ๐Ÿซ .

In INCLUDE mode, a source can get added to the current Include List if a listener in INCLUDE mode sends a Current-State or a State-Change Report that includes that source. Each source on the Include List has its own Source Timer, which gets refreshed whenever a listener in INCLUDE mode sends a report confirming interest in that specific source ๐Ÿ’…. If a source's timer expires, the source is deleted from the Include List. If there are no source records left, the Multicast Address Record gets deleted from the router ๐Ÿ’€.

Besides this "soft leave" mechanism, MLDv2 also has a "fast leave" scheme, which is also based on source timers ๐Ÿƒโ€โ™€๏ธ. When a node in INCLUDE mode wants to stop listening to a specific source, all the multicast routers on the link lower their timer for that source to a small interval of LLQT milliseconds. Then the Querier sends a Multicast Address and Source Specific Query to check whether anyone else on the link is still listening to that source ๐Ÿ‘€. If a matching report comes in before the timer expires, all the multicast routers on the link update their source timer. If not, the source gets deleted from the Include List. How the Include List gets handled based on received reports is detailed in Sections 7.4.1 and 7.4.2 ๐Ÿ”.

Source timers are treated differently when the Router Filter Mode for a multicast address is EXCLUDE ๐Ÿ™…โ€โ™€๏ธ. For sources on the Requested List, the timers have running values, and these sources are forwarded by the router. For sources on the Exclude List, the timers are set to zero, and these sources are blocked. If the timer of a source on the Requested List expires, the source is moved to the Exclude List. Then the router tells the routing protocol that there's no longer a listener on the link interested in traffic from that source ๐Ÿšซ.

The router has to keep the Requested List for two reasons, and both are very iconic ๐Ÿ‘‘:

  1. To keep track of sources that listeners in INCLUDE mode are listening to. This is necessary so the router can make a seamless transition to INCLUDE mode once there are no listeners in EXCLUDE mode left. That transition shouldn't interrupt the flow of traffic to the INCLUDE-mode listeners who are still interested in that multicast address. So at the moment of the transition, the Requested List should represent the set of sources that nodes in INCLUDE mode have explicitly requested.

When the router switches to INCLUDE mode, the sources on the Requested List move to the Include List, and the Exclude List gets deleted. Before the switch, the Requested List can contain an inexact guess at the sources that INCLUDE-mode listeners are listening to, and that guess might be too large or too small. These inexactitudes happen because the Requested List is also used for fast blocking purposes, as described below. If a fast blocking is required, some sources may be deleted from the Requested List (as shown in Sections 7.4.1 and 7.4.2) to reduce router state. Even so, in each such case the Filter Timer is updated as well. That means listeners in INCLUDE mode get enough time, before any eventual switch, to reconfirm their interest in the eliminated source(s) and rebuild the Requested List accordingly ๐Ÿ™Œ. The protocol makes sure that when a switch to INCLUDE mode happens, the Requested List will be accurate. Details about the transition of the router to INCLUDE mode are presented in Appendix A.3.

  1. To allow a fast blocking of previously unblocked sources โšก. If the router receives a report with such a request, the concerned sources are added to the Requested List. Their timers are set to a small interval of LLQT milliseconds, and the Querier sends a Multicast Address and Source Specific Query to check whether there are still nodes on the link interested in those sources. If no node confirms its interest in a specific source, that source's timer expires. Then the source is moved from the Requested List to the Exclude List, and from then on, the router blocks it ๐Ÿ›‘.

The handling of the EXCLUDE mode router state, according to the received reports, is detailed in Sections 7.4.1 and 7.4.2 ๐Ÿ“š.

When the Router Filter Mode for a multicast address is EXCLUDE, source records are only deleted when the Filter Timer expires, or when newly received Multicast Address Records change the source record list of the router ๐Ÿซถ.


7.3. MLDv2 Source-Specific Forwarding Rules โœจ

When a multicast router receives a datagram from a source destined to a particular multicast address, it has to decide whether to forward that datagram onto an attached link ๐Ÿค”. The multicast routing protocol in use is in charge of this decision, and it should use the MLDv2 information to make sure that all sources and multicast addresses with listeners on a link get forwarded to that link. MLDv2 information doesn't override multicast routing information. For example, if the MLDv2 filter-mode for a multicast address is EXCLUDE, a router may still forward packets from excluded sources to a transit link ๐Ÿš‡.

To sum up, Table 6 below shows the forwarding suggestions MLDv2 gives the routing protocol for traffic from a source destined to a multicast address ๐Ÿ“‹. It also shows the actions taken when a Source Timer expires, based on the Router Filter Mode of the multicast address ๐ŸŽ€.

   +=========+=========+=========================================+
   | Router  | Source  | Action                                  |
   | Filter  | Timer   |                                         |
   | Mode    | Value   |                                         |
   +=========+=========+=========================================+
   | INCLUDE | TIMER > | Suggest to forward traffic from source. |
   |         | 0       |                                         |
   +---------+---------+-----------------------------------------+
   | INCLUDE | TIMER   | Suggest to stop forwarding traffic from |
   |         | == 0    | source and remove the source record.    |
   |         |         | If there are no more source records,    |
   |         |         | delete the Multicast Address Record.    |
   +---------+---------+-----------------------------------------+
   | INCLUDE | No      | Suggest to not forward traffic from     |
   |         | Source  | source.                                 |
   |         | Element |                                         |
   +---------+---------+-----------------------------------------+
   | EXCLUDE | TIMER > | Suggest to forward traffic from source. |
   |         | 0       |                                         |
   +---------+---------+-----------------------------------------+
   | EXCLUDE | TIMER   | Suggest to not forward traffic from     |
   |         | == 0    | source.  Move the source from the       |
   |         |         | Requested List to the Exclude List (DO  |
   |         |         | NOT remove the source record).          |
   +---------+---------+-----------------------------------------+
   | EXCLUDE | No      | Suggest to forward traffic from all     |
   |         | Source  | sources.                                |
   |         | Element |                                         |
   +---------+---------+-----------------------------------------+

               Table 6: MLD Forwarding Recommendations

7.4. Action on Reception of Reports ๐Ÿ“จ

Whenever an MLD message containing a Report comes in, the router checks whether the source address of the message is a valid link-local address, whether the Hop Limit is set to 1, and whether the Router Alert option is present in the Hop-by-Hop Options header of the IPv6 packet ๐Ÿ•ต๏ธโ€โ™€๏ธ. If any of these checks fail, the packet gets dropped ๐Ÿ—‘๏ธ. If the MLD message checks out as valid, the router starts processing the Report โœ….

SSM-aware routers SHOULD ignore records that contain multicast addresses in the SSM address range if the record type is MODE_IS_EXCLUDE or CHANGE_TO_EXCLUDE_MODE ๐Ÿ™ˆ. SSM-aware routers SHOULD ignore MLDv1 Report and DONE messages that contain multicast addresses in the SSM address range. They SHOULD NOT use such Reports to set up IP forwarding state, and they MAY log an error if they receive such a message ๐Ÿ“. Honestly, that's a whole vibe ๐Ÿ’œ.

7.4.1. Reception of Current-State Records โœจ

okay so bestie, when a router gets Current-State Records ๐Ÿ’… it updates BOTH its Filter Timer AND its source timers. ๐Ÿซถ Sometimes getting one of these Multicast Address Records is enough to flip the Router Filter Mode for that multicast address, and that's giving plot twist energy ๐Ÿ˜ญ. Table 7 is the cheat sheet for what happens to the router's state and timers when these records show up.

Quick notation check ๐ŸŽ€ If the router is in INCLUDE filter-mode for a multicast address, we write INCLUDE (A), where A is the Include List. If it's in EXCLUDE filter-mode, we write EXCLUDE (X,Y), where X is the Requested List and Y is the Exclude List.

In the "Actions" column, (A)=J means set source timers for the source records in set A to value J. Delete (A) means delete those source records. Filter Timer = J means set the Filter Timer for the multicast address to value J. Simple, iconic, no cap ๐Ÿ’–

   +=========+==========+=========+======================+
   | Router  | Report   | New     | Actions              |
   | State   | Received | Router  |                      |
   |         |          | State   |                      |
   +=========+==========+=========+======================+
   | INCLUDE | IS_IN    | INCLUDE | (B)=MALI             |
   | (A)     | (B)      | (A+B)   |                      |
   +---------+----------+---------+----------------------+
   | INCLUDE | IS_EX    | EXCLUDE | (B-A)=0              |
   | (A)     | (B)      | (A*B,   |                      |
   |         |          | B-A)    | Delete (A-B)         |
   |         |          |         |                      |
   |         |          |         | Filter Timer=MALI    |
   +---------+----------+---------+----------------------+
   | EXCLUDE | IS_IN    | EXCLUDE | (A)=MALI             |
   | (X,Y)   | (A)      | (X+A,   |                      |
   |         |          | Y-A)    |                      |
   +---------+----------+---------+----------------------+
   | EXCLUDE | IS_EX    | EXCLUDE | (A-X-Y)=MALI         |
   | (X,Y)   | (A)      | (A-Y,   |                      |
   |         |          | Y*A)    | Delete (X-A)         |
   |         |          |         |                      |
   |         |          |         | Delete (Y-A)         |
   |         |          |         |                      |
   |         |          |         | Filter Timer=MALI    |
   +---------+----------+---------+----------------------+

     Table 7: Actions for Received Current-State Records

7.4.2. Reception of Filter-Mode-Change and Source-List-Change Records ๐Ÿฆ‹

Whenever something changes in the global state of a multicast address, the node sends either a Source-List-Change Record or a Filter Mode Change Record for it. ๐ŸŒธ Just like with Current-State Records, routers MUST act on these and maybe update their own state so it matches the new listening state of the link. ๐Ÿ‘‘

Now the Querier has to query sources or multicast addresses that are asked to stop being forwarded. ๐Ÿงš When a router queries (or receives a query for) a specific set of sources, it lowers their source timers to a small interval of Last Listener Query Time milliseconds. If Multicast Address Records come back in response and show interest in those queried sources, the matching timers get updated. ๐Ÿ’œ

Multicast Address Specific queries can ALSO help a router switch fast from EXCLUDE to INCLUDE mode when a Multicast Address Record makes that a good idea. โœจ The Filter Timer for that address drops to a small interval of Last Listener Query Time milliseconds. If any Multicast Address Records expressing EXCLUDE mode interest arrive during that window, the Filter Timer gets updated and the suggestion to the routing protocol to forward the address stands without any interruption ๐Ÿ”ฅ. If not, the router switches to INCLUDE filter-mode for that address. ๐Ÿ“

During the query period (that's Last Listener Query Time milliseconds, babe), the MLD component keeps suggesting to the routing protocol that it forward traffic from the queried multicast addresses or sources. ๐ŸŽ€ Only AFTER Last Listener Query Time milliseconds have passed, with no record showing interest in the queried multicast address or sources, MAY the router prune the multicast address or sources from the link. Ngl that's a very specific little permission ๐Ÿ™ˆ

Table 8 shows the changes in multicast address state and the action(s) taken when Filter-Mode-Change or Source-List-Change Records come in. It also shows which queries the Querier sends when a particular report arrives. ๐Ÿ’…

Here's how the queries are written down ๐Ÿ“ Q(MA) is a Multicast Address Specific Query to the MA multicast address. Q(MA,A) is a Multicast Address and Source Specific Query to the MA multicast address with source-list A. If source-list A ends up null because of the action (like A*B), then no query gets sent for that operation. Bye bye query ๐Ÿ‘‹

To keep the protocol robust ๐Ÿซถ, the queries listed in the Actions column of Table 8 need to be sent [Last Listener Query Count] times, once every [Last Listener Query Interval] period. Slay for consistency ๐Ÿ’–

If a router is scheduling new queries while there are already pending retransmissions for the same multicast address, the new and pending queries MUST be merged ๐ŸŒˆ. Also, host reports received for a multicast address with pending queries can change what's in those queries ๐Ÿ™ˆ. Section 7.6.3 explains how pending queries get built and maintained. Lowkey a whole saga ๐Ÿ˜ญ

   +=========+==========+====================+========================+
   | Router  | Report   | New Router State   | Actions                |
   | State   | Received |                    |                        |
   +=========+==========+====================+========================+
   | INCLUDE | ALLOW    | INCLUDE(A+B)       | (B)=MALI               |
   | (A)     | (B)      |                    |                        |
   +---------+----------+--------------------+------------------------+
   | INCLUDE | BLOCK    | INCLUDE(A)         | Send Q(MA,A*B)         |
   | (A)     | (B)      |                    |                        |
   +---------+----------+--------------------+------------------------+
   | INCLUDE | TO_EX    | EXCLUDE(A*B,B-A)   | (B-A)=0, Delete (A-B), |
   | (A)     | (B)      |                    | Send Q(MA,A*B), Filter |
   |         |          |                    | Timer=MALI             |
   +---------+----------+--------------------+------------------------+
   | INCLUDE | TO_IN    | INCLUDE(A+B)       | (B)=MALI, Send         |
   | (A)     | (B)      |                    | Q(MA,A-B)              |
   +---------+----------+--------------------+------------------------+
   | EXCLUDE | ALLOW    | EXCLUDE(X+A,Y-A)   | (A)=MALI               |
   | (X,Y)   | (A)      |                    |                        |
   +---------+----------+--------------------+------------------------+
   | EXCLUDE | BLOCK    | EXCLUDE(X+(A-Y),Y) | (A-X-Y)=Filter Timer,  |
   | (X,Y)   | (A)      |                    | Send Q(MA,A-Y)         |
   +---------+----------+--------------------+------------------------+
   | EXCLUDE | TO_EX    | EXCLUDE(A-Y,Y*A)   | (A-X-Y)=Filter Timer,  |
   | (X,Y)   | (A)      |                    | Delete (X-A), Delete   |
   |         |          |                    | (Y-A), Send Q(MA,A-Y), |
   |         |          |                    | Filter Timer=MALI      |
   +---------+----------+--------------------+------------------------+
   | EXCLUDE | TO_IN    | EXCLUDE(X+A,Y-A)   | (A)=MALI, Send         |
   | (X,Y)   | (A)      |                    | Q(MA,X-A), Send Q(MA)  |
   +---------+----------+--------------------+------------------------+

               Table 8: Multicast Router State Transitions

7.5. Switching Router Filter Modes ๐ŸŽ€

The Filter Timer is the mechanism for moving the Router Filter Mode from EXCLUDE to INCLUDE. ๐Ÿฆ‹

When a Filter Timer expires while the Router Filter Mode is EXCLUDE, the router assumes there are no nodes with a filter-mode of EXCLUDE on the attached link. ๐Ÿ’€ So the router transitions to INCLUDE filter-mode for the multicast address. Main character energy ๐Ÿ‘‘

A router uses the sources from the Requested List as its state for the switch to filter-mode INCLUDE. Sources from the Requested List move into the Include List, while sources from the Exclude List get deleted. ๐Ÿงš For example, if a router's state for a multicast address is EXCLUDE(X,Y) and the Filter Timer expires for it, the router switches to filter-mode INCLUDE with state INCLUDE(X). ๐Ÿ’– And if the Requested List (X) is empty at the moment of the switch, the Multicast Address Record is deleted from the router. ๐Ÿ˜ญ

7.6. Action on Reception of Queries ๐ŸŒธ

When a router gets an MLD message containing a Query, it checks three things: whether the source address of the message is a valid link-local address, whether the Hop Limit is set to 1, and whether the Router Alert option is present in the Hop-by-Hop Options header of the IPv6 packet. ๐Ÿซถ If ANY of these checks fail, the packet MUST be dropped. ๐Ÿ”ฅ

If the validity of the MLD message is verified, the router starts processing the Query. โœจ

7.6.1. Timer Updates ๐Ÿ’…

MLDv2 uses the S flag to keep robustness, as explained in Section 2.1. When a router sends or receives a query with a clear S flag, it MUST update its timers so they reflect the correct timeout values for the multicast address or sources being queried. ๐Ÿ™ˆ The table below describes the timer actions when sending or receiving a Multicast Address Specific or Multicast Address and Source Specific Query with the S flag not set. ๐Ÿ“

   +=========+=====================================================+
   | Query   | Action                                              |
   +=========+=====================================================+
   | Q(MA,A) | Source Timers for sources in A are lowered to LLQT. |
   +---------+-----------------------------------------------------+
   | Q(MA)   | The Filter Timer is lowered to LLQT.                |
   +---------+-----------------------------------------------------+

         Table 9: Timer Actions for Query Message Transmission

When a router sends or receives a query with the S flag set, it will NOT update its timers. ๐ŸŽ€

7.6.2. Querier Election โœจ

Okay so MLDv2 picks exactly one router per subnet to be in Querier state ๐Ÿ‘‘, and all the other routers on that subnet should be in Non-Querier state. It uses the same querier election mechanism as MLDv1, which is the IPv6 address. When a router first starts up on a subnet, it assumes it's the Querier by default ๐Ÿ’…. So it sends a bunch of General Queries, spaced a little apart (see Sections 9.6 and 9.7 for the deets).

Now, if a router hears a query from someone with a lower IPv6 address than its own, it sets the Other-Querier-Present Timer to [Other Querier Present Interval]. If it was the Querier before, it switches to Non-Querier state and stops sending queries on the link ๐Ÿซถ. Once that Other-Querier-Present Timer runs out, it should re-enter the Querier state and start sending General Queries again.

Here's the twist ๐Ÿ™ˆ: all MLDv2 queries MUST be sent with the fe80::/64 link-local source address prefix. So for the querier election, an IPv6 address A counts as lower than an IPv6 address B if the interface ID in the last 64 bits of A, read in big-endian bit order, is lower than the interface ID in the last 64 bits of B. Iconic math, honestly ๐Ÿค“.

7.6.3. Building and Sending Specific Queries โœจ

7.6.3.1. Building and Sending Multicast Address Specific Queries

When a table action "Send Q(MA)" shows up, the Filter Timer must be lowered to LLQT ๐Ÿฆ‹. The Querier must then immediately send a Multicast Address Specific Query, and also schedule [Last Listener Query Count - 1] query retransmissions, each sent every [Last Listener Query Interval], over [Last Listener Query Time].

When it's transmitting a Multicast Address Specific Query, if the Filter Timer is larger than LLQT, the "Suppress Router-Side Processing" bit gets set in the Query Message ๐Ÿ’œ.

7.6.3.2. Building and Sending Multicast Address and Source Specific Queries

When the Querier hits a table action "Send Q(MA,X)" in Table 8 (Section 7.4.2), it has to do the following for each source in X that sends to multicast address MA, as long as that source's Source Timer is larger than LLQT:

  • lower Source Timer to LLQT;
  • add the sources to the Retransmission List; and
  • set the Source Retransmission Counter for each source to [Last Listener Query Count].

Then the Querier must immediately send a Multicast Address and Source Specific Query, and schedule [Last Listener Query Count -1] query retransmissions, each sent every [Last Listener Query Interval], over [Last Listener Query Time]. Here's how the contents of those queries get worked out ๐Ÿง.

When building a Multicast Address and Source Specific Query for a multicast address MA, two separate Query Messages go out for that address. The first one has the "Suppress Router-Side Processing" bit set, and it carries all the sources with retransmission state (so, the sources from the Retransmission List for that multicast address) whose timers are greater than LLQT. The second one has the "Suppress Router-Side Processing" bit clear, and it carries all the sources with retransmission state whose timers are lower or equal to LLQT. If either of the two calculated messages ends up with no sources in it, then sending that message gets suppressed ๐Ÿ’€.

      |  Note: If a Multicast Address Specific Query is scheduled to be
      |  transmitted at the same time as a Multicast Address and Source
      |  Specific Query for the same multicast address, then
      |  transmission of the Multicast Address and Source Specific
      |  message with the "Suppress Router-Side Processing" bit set may
      |  be suppressed.

8. Interoperation with MLDv1 ๐Ÿฆ‹

MLD version 2 hosts and routers can interoperate with hosts and routers that haven't been upgraded to MLDv2 yet ๐ŸŒธ. This compatibility works because hosts and routers take the right actions depending on which versions of MLD are running across the network.

8.1. Query Version Distinctions

Here's how you tell which MLD version a Multicast Listener Query Message is:

  • MLDv1 Query: length = 24 octets
  • MLDv2 Query: length >= 28 octets

Any Query Message that doesn't match either of those (like a Query of length 26 octets, for example) MUST be silently ignored ๐Ÿ™ˆ.

8.2. Multicast Address Listener Behavior

8.2.1. In the Presence of MLDv1 Routers

To play nicely with MLDv1 routers, MLDv2 hosts MUST operate in version 1 compatibility mode ๐Ÿซถ. They also MUST keep state per local interface about the compatibility mode of each attached link. A host's compatibility mode comes from the Host Compatibility Mode variable, which can be in one of two states: MLDv1 or MLDv2.

The Host Compatibility Mode of an interface gets set to MLDv1 whenever an MLDv1 Multicast Address Listener General Query arrives on that interface. At that same moment, the Older-Version-Querier-Present Timer for the interface is set to [Older Version Querier Present Interval] seconds. That timer resets every time a new MLDv1 General Query comes in on that interface. If the Older-Version-Querier-Present Timer expires, the host switches back to Host Compatibility Mode of MLDv2 โœจ.

When Host Compatibility Mode is MLDv2, the host acts using the MLDv2 protocol on that interface. When Host Compatibility Mode is MLDv1, the host acts in MLDv1 compatibility mode, using only the MLDv1 protocol, on that interface.

An MLDv1 Querier sends General Queries with the Maximum Response Code set to the desired Maximum Response Delay. In other words, the full range of this field is linear, and the exponential algorithm described in Section 5.1.3. is not used.

Whenever a host changes its compatibility mode, it cancels all of its pending responses and retransmission timers.

An SSM-aware host that receives an MLDv1 General Query, or an MLDv1 Group Specific Query, for a multicast address in the SSM address range SHOULD log an error ๐Ÿšจ. It's RECOMMENDED that implementations offer a configuration option to turn off the use of Host Compatibility Mode, so networks can run only in SSM mode. That configuration option SHOULD be disabled by default.

8.2.2. In the Presence of MLDv1 Multicast Address Listeners

An MLDv2 host might end up on a link with MLDv1 hosts. A host MAY let its MLD Version 2 Multicast Listener Report get suppressed by an MLDv1 Multicast Listener Report (Type = decimal 131) ๐ŸŒˆ.

8.3. Multicast Router Behavior

8.3.1. In the Presence of MLDv1 Routers

MLDv2 routers can be placed on a network with at least one MLDv1 router. Here are the requirements that apply:

  • If an MLDv1 router is present on the link, the Querier MUST use the lowest version of MLD present on the network. This must be administratively assured. Routers that want to stay compatible with MLDv1 MUST have a configuration option to act in MLDv1 mode; if an MLDv1 router is present on the link, the system administrator must explicitly configure all MLDv2 routers to act in MLDv1 mode. When in MLDv1 mode, the Querier MUST send periodic General Queries truncated at the Multicast Address field (i.e., 24 bytes long), and SHOULD also warn about receiving an MLDv2 Query (such warnings MUST be rate-limited). The Querier MUST also fill in the Maximum Response Delay in the Maximum Response Code field, i.e., the exponential algorithm described in Section 5.1.3 is not used ๐Ÿ’–.
  • If a router isn't explicitly configured to use MLDv1 and receives an MLDv1 General Query, it SHOULD log a warning. These warnings MUST be rate-limited ๐Ÿ™ƒ.
  • It's RECOMMENDED that implementations provide a configuration option to disable use of compatibility mode, so networks can operate only in SSM mode. That configuration option SHOULD be disabled by default.

8.3.2. In the Presence of MLDv1 Multicast Address Listeners

MLDv2 routers can be placed on a network where there are hosts that haven't been upgraded to MLDv2 yet. To be compatible with MLDv1 hosts, MLDv2 routers MUST operate in version 1 compatibility mode ๐ŸŽ€. They keep a compatibility mode per Multicast Address Record. The compatibility mode of a multicast address is determined from the Multicast Address Compatibility Mode variable, which can be in one of two states: MLDv1 or MLDv2.

The Multicast Address Compatibility Mode of a Multicast Address Record is set to MLDv1 whenever an MLDv1 Multicast Listener Report (Type = decimal 131) is received for that multicast address. At the same time, the Older-Version-Host-Present Timer for the multicast address is set to [Older Version Host Present Interval] seconds. That timer resets whenever a new MLDv1 Report comes in for that multicast address. If the Older-Version-Host-Present Timer expires, the router switches back to the Multicast Address Compatibility Mode of MLDv2 for that multicast address ๐Ÿ”ฅ.

Heads up ๐Ÿ‘€: when a router switches back to MLDv2 Multicast Address Compatibility Mode for a multicast address, it takes some time to get its source-specific state info back. Source-specific information gets learned during the next General Query, but sources that should be blocked won't actually be blocked until [Multicast Address Listening Interval] after that.

When Multicast Address Compatibility Mode is MLDv2, a router acts using the MLDv2 protocol for that multicast address. When Multicast Address Compatibility Mode is MLDv1, the router internally translates the following MLDv1 messages for that multicast address into their MLDv2 equivalents (Table 10) ๐Ÿงš.

                   +===============+==================+
                   | MLDv1 Message | MLDv2 Equivalent |
                   +===============+==================+
                   | Report        | IS_EX( {} )      |
                   +---------------+------------------+
                   | Done          | TO_IN( {} )      |
                   +---------------+------------------+

                    Table 10: MLD Message Translation

MLDv2 BLOCK messages get ignored, and so do the source-lists in TO_EX() messages. Basically, any TO_EX() message is treated as TO_EX( {} ) ๐Ÿซ . On the other hand, the Querier keeps sending MLDv2 queries no matter what its Multicast Address Compatibility Mode is.

9. List of Timers, Counters, and Their Default Values ๐Ÿงš

Most of these timers are configurable. If you use non-default settings, they MUST be consistent among all nodes on a single link ๐ŸŒŸ. Also, parentheses are used to group expressions so the algebra stays clear.

9.1. Robustness Variable

The Robustness Variable lets you tune for the packet loss you expect on a link ๐ŸŽฏ. If a link is expected to be lossy, you can increase the value of the Robustness Variable. MLD is robust to [Robustness Variable] - 1 packet losses. The value of the Robustness Variable MUST NOT be zero and SHOULD NOT be one. Default value: 2 ๐Ÿ’œ.

9.2. Query Interval

The Query Interval variable is the interval between General Queries sent by the Querier. Default value: 125 seconds โฐ.

By tweaking the Query Interval, an administrator can control how many MLD messages show up on the link. Bigger values make MLD Queries get sent less often ๐Ÿ“.

9.3. Query Response Interval ๐ŸŽ€

okay so the Query Response Interval is the Maximum Response Delay that gets used to work out the Maximum Response Code going into the periodic General Queries ๐Ÿ’… Default value: 10000 (10 seconds) โœจ

by tweaking the Query Response Interval, an admin can tune how bursty MLD messages are on the link ๐Ÿฆ‹ bigger values make the traffic less bursty, since host responses get spread out over a longer interval ๐ŸŒธ the number of seconds represented by [Query Response Interval] must be less than the [Query Interval] ๐Ÿ’œ

9.4. Multicast Address Listening Interval ๐Ÿงš

the Multicast Address Listening Interval (MALI) is how long a multicast router has to wait before it decides there are no more listeners for a multicast address or a particular source on a link ๐Ÿ˜ญ this value MUST be ([Robustness Variable] times [Query Interval]) plus 2 times [Query Response Interval] โœจ

9.5. Other Querier Present Interval ๐Ÿ‘‘

the Other Querier Present Interval is how long a multicast router waits before it decides there's no longer another multicast router that should be the Querier ๐Ÿ’… this value MUST be ([Robustness Variable] times ([Query Interval]) plus (0.5 times [Query Response Interval]). ๐Ÿซถ

9.6. Startup Query Interval ๐Ÿ“

the Startup Query Interval is the gap between the General Queries a Querier sends when it first starts up ๐ŸŒˆ default value: 1/4 the [Query Interval] ๐ŸŒธ

9.7. Startup Query Count ๐Ÿง

the Startup Query Count is how many Queries get sent out on startup, spaced apart by the Startup Query Interval ๐Ÿ’– default value: [Robustness Variable] โœจ

9.8. Last Listener Query Interval ๐Ÿ’œ

the Last Listener Query Interval (LLQI) is the Maximum Response Delay used to calculate the Maximum Response Code that goes into Multicast Address Specific Queries sent in response to MLDv1 Multicast Listener Done (Type = decimal 132) messages ๐Ÿฆ‹ it's also the Maximum Response Delay used to calculate the Maximum Response Code that goes into Multicast Address and Source Specific Query Messages ๐Ÿ”ฅ default value: 1000 (1 second) ๐Ÿ’…

note that for values of LLQI greater than 32.768 seconds, only a limited set of values can be represented, corresponding to sequential values of Maximum Response Code ๐Ÿ™ˆ when converting a configured time to a Maximum Response Code value, it is recommended to use the exact value if possible, or the next lower value if the requested value isn't exactly representable ๐Ÿซถ

this value can be tuned to change the leave latency of the link ๐ŸŒธ a reduced value means the router detects the departure of the last listener for a multicast address or source faster โญ

9.9. Last Listener Query Count ๐ŸŒˆ

the Last Listener Query Count is the number of Multicast Address Specific Queries sent before the router assumes there are no local listeners ๐Ÿ’– it's also the number of Multicast Address and Source Specific Queries sent before the router assumes there are no listeners for a particular source ๐ŸŽ€ default value: [Robustness Variable] โœจ

9.10. Last Listener Query Time ๐Ÿงš

the Last Listener Query Time is the time value you get from [Last Listener Query Interval] times [Last Listener Query Count] ๐Ÿ’… it's not a tunable value, but you can tune it by changing its components ๐Ÿ’œ

9.11. Unsolicited Report Interval ๐Ÿฆ‹

the Unsolicited Report Interval is the time between repeats of a node's initial report of interest in a multicast address ๐ŸŒธ default value: 1 second โœจ

9.12. Older Version Querier Present Interval ๐Ÿ‘‘

the Older Version Querier Present Interval is the timeout for moving a host back to MLDv2 Host Compatibility Mode ๐Ÿ”ฅ when an MLDv1 query comes in, MLDv2 hosts set their Older-Version-Querier-Present Timer to [Older Version Querier Present Interval] ๐Ÿ’–

this value MUST be ([Robustness Variable] times [Query Interval] in the last Query received) plus ([Query Response Interval]). ๐Ÿซถ

9.13. Older Version Host Present Interval ๐Ÿ“

the Older Version Host Present Interval is the timeout for moving a router back to MLDv2 Multicast Address Compatibility Mode for one specific multicast address ๐ŸŒˆ when an MLDv1 report comes in for that multicast address, routers set their Older-Version-Host-Present Timer to [Older Version Host Present Interval] ๐Ÿฆ‹

this value MUST be ([Robustness Variable] times [Query Interval]) plus ([Query Response Interval]). ๐Ÿ’œ

9.14. Configuring Timers ๐ŸŽ€

this section is basically advice for network admins on how to tune these settings for their network ๐Ÿ’… ambitious router implementations might tune these settings dynamically based on how the network's characteristics change over time ๐Ÿงš

9.14.1. Robustness Variable ๐Ÿ›ก๏ธ

the Robustness Variable tunes MLD to the losses you expect on a link ๐Ÿ’– MLDv2 is robust to [Robustness Variable] - 1 packet losses, so e.g., if the Robustness Variable is set to the default value of 2, MLDv2 is robust to a single packet loss but may operate imperfectly if more losses happen ๐Ÿ˜ญ on lossy links, the Robustness Variable should be increased to cover the expected level of packet loss ๐Ÿซถ however, increasing it also increases the leave latency of the link (the time between when the last listener stops listening to a source or multicast address and when the traffic stops flowing) ๐Ÿ’€

9.14.2. Query Interval โญ

the overall level of periodic MLD traffic is inversely proportional to the Query Interval ๐ŸŒธ a longer Query Interval gives you a lower overall level of MLD traffic ๐Ÿ“ the value of the Query Interval MUST be equal to or greater than the Maximum Response Delay used to calculate the Maximum Response Code inserted in General Query Messages ๐Ÿ‘‘

9.14.3. Maximum Response Delay ๐Ÿ”ฅ

the burstiness of MLD traffic is inversely proportional to the Maximum Response Delay ๐Ÿฆ‹ a longer Maximum Response Delay spreads Report messages over a longer interval ๐ŸŒˆ however, a longer Maximum Response Delay in Multicast Address Specific and Multicast Address and Source Specific Queries extends the leave latency (the time between when the last listener stops listening to a source or multicast address and when the traffic stops flowing.) ๐Ÿ˜ญ the expected rate of Report messages can be calculated by dividing the expected number of Reporters by the Maximum Response Delay ๐Ÿ’… the Maximum Response Delay may be calculated dynamically (as shown in Table 11) per Query, using the expected number of Reporters for that Query ๐Ÿงš

+=======================+==========================================+
| Query Type            | Expected Number of Reporters             |
+=======================+==========================================+
| General Query         | All nodes on the link.                   |
+-----------------------+------------------------------------------+
| Multicast Address     | All nodes on the link that had expressed |
| Specific Query        | interest in the multicast address.       |
+-----------------------+------------------------------------------+
| Multicast Address and | All nodes on the link that had expressed |
| Source Specific Query | interest in the source and multicast     |
|                       | address.                                 |
+-----------------------+------------------------------------------+

            Table 11: Maximum Response Delay Calculation

a router is not required to calculate these populations or tune the Maximum Response Delay dynamically ๐Ÿ’œ these are simply guidelines ๐ŸŽ€


10. Security Considerations ๐Ÿ”๐Ÿ’€

okay bestie, this part is SERIOUS ๐Ÿ˜ญ MLD has zero cryptographic protection ๐Ÿ’€ so its messages aren't authenticated, the message contents aren't confidential, and any message can be replayed ๐Ÿ™ˆ being able to replay messages doesn't change how the protocol itself behaves ๐Ÿซถ

replaying messages can leave multicast forwarding state active way past what group members on a link actually need ๐Ÿšจ too much retained multicast state can lead to resource exhaustion in some devices ๐Ÿ”ฅ

the lack of confidentiality means any device with access to the link can figure out which multicast groups are being requested ๐Ÿ‘€ that's a privacy issue, since some multicast content can be sensitive ๐Ÿ’œ

the lack of authentication lets people create forged messages ๐Ÿ˜ค note that before processing an MLD message, nodes check whether the message's source address is a valid link-local address (or the unspecified address), whether the Hop Limit is set to 1, and whether the Router Alert option is present in the Hop-by-Hop Options header of the IPv6 packet ๐Ÿ›ก๏ธ if any of these checks fail, the packet gets dropped ๐Ÿ’… this defends MLDv2 nodes from acting on forged MLD messages that come from off-link ๐Ÿฆ‹ so, we only talk about the effects of on-link forgery in the following section ๐ŸŒธ

10.1. Query Message ๐Ÿงš

a forged Query Message from a machine with a lower IPv6 address than the current Querier will hand Querier duties to the forger ๐Ÿ˜ˆ if the forger then stops sending Query Messages, other routers' Other Querier Present Timer will time out and one of them will resume the role of Querier ๐ŸŒˆ during this time, if the forger ignores Multicast Listener Done messages, traffic might flow to multicast addresses with no listeners for up to [Multicast Address Listener Interval] ๐Ÿ˜ญ

a forged Version 1 Query Message will put MLDv2 listeners on that link into MLDv1 Host Compatibility Mode ๐Ÿ™ˆ this scenario can be avoided by giving MLDv2 hosts a configuration option to ignore Version 1 messages completely ๐Ÿซถ

a DoS attack on a node could be staged through forged Multicast Address and Source Specific Queries ๐Ÿ’€ the attacker can find out about a specific node's listening state with a General Query ๐Ÿ‘€ after that, they could send a large number of Multicast Address and Source Specific Queries, each with a large source-list and/or a long Maximum Response Delay ๐Ÿ”ฅ the node will have to store and maintain the sources specified in all of those queries for as long as it takes to send the delayed response ๐Ÿ˜ฑ this would eat up both memory and CPU cycles as it adds the sources from each successive query's source-list to the recorded ones ๐Ÿ’…

to protect against this kind of DoS attack, a node stack implementation could restrict the number of Multicast Address and Source Specific Queries per multicast address within this interval and/or record only a limited number of sources ๐Ÿ›ก๏ธโœจ

10.2. Current-State Report Messages ๐ŸŒธ

a forged Report message may make multicast routers think there are listeners for a multicast address on a link when there aren't ๐Ÿ™ƒ still, listening to a multicast address on a host is generally an unprivileged operation, so a local user can trivially get the same result without forging any messages ๐Ÿคทโ€โ™€๏ธ if a large number of forged Report messages get generated, a multicast router may use up significant resources maintaining multicast forwarding state ๐Ÿ’€

a forged Version 1 Report Message may put a router into MLDv1 Multicast Address Compatibility Mode for a particular multicast address, which means the router will ignore MLDv2 source-specific state messages ๐Ÿ˜ฌ this can make traffic flow from unwanted sources for up to [Multicast Address Listener Interval] ๐Ÿšจ this can be solved by giving routers a configuration switch to ignore Version 1 messages completely ๐Ÿซถ but that breaks automatic compatibility with Version 1 hosts, so it should only be used in situations where source filtering is critical ๐ŸŽ€

10.3. State-Change Report Messages

okay bestie ๐Ÿ˜ญ so a forged State-Change Report message makes the Querier send out Multicast Address Specific or Multicast Address and Source Specific Queries for the multicast address in question ๐Ÿ”. yes it's extra work for every router and every listener on that address ๐Ÿ’€, but it literally cannot cause loss of the traffic you actually want โœจ


11. IANA Considerations ๐ŸŽ€

IANA has assigned the IPv6 link-local multicast address ff02::16, called "all MLDv2-capable routers", as described in Section 5.2.15. Version 2 Multicast Listener Reports will be sent to this special address ๐Ÿ’Œ

In addition, IANA has assigned the ICMPv6 message Type value of 143 for Version 2 Multicast Listener Report messages, as specified in Section 4 ๐Ÿงš


12. References ๐Ÿ“š

Here are the refs, the ones this spec leans on the most ๐Ÿซถ

12.1. Normative References

[RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
           Requirement Levels", BCP 14, RFC 2119,
           DOI 10.17487/RFC2119, March 1997,
           <https://www.rfc-editor.org/info/rfc2119>.

[RFC2464]  Crawford, M., "Transmission of IPv6 Packets over Ethernet
           Networks", RFC 2464, DOI 10.17487/RFC2464, December 1998,
           <https://www.rfc-editor.org/info/rfc2464>.

[RFC2710]  Deering, S., Fenner, W., and B. Haberman, "Multicast
           Listener Discovery (MLD) for IPv6", RFC 2710,
           DOI 10.17487/RFC2710, October 1999,
           <https://www.rfc-editor.org/info/rfc2710>.

[RFC2711]  Partridge, C. and A. Jackson, "IPv6 Router Alert Option",
           RFC 2711, DOI 10.17487/RFC2711, October 1999,
           <https://www.rfc-editor.org/info/rfc2711>.

[RFC4291]  Hinden, R. and S. Deering, "IP Version 6 Addressing
           Architecture", RFC 4291, DOI 10.17487/RFC4291, February
           2006, <https://www.rfc-editor.org/info/rfc4291>.

[RFC4443]  Conta, A., Deering, S., and M. Gupta, Ed., "Internet
           Control Message Protocol (ICMPv6) for the Internet
           Protocol Version 6 (IPv6) Specification", STD 89,
           RFC 4443, DOI 10.17487/RFC4443, March 2006,
           <https://www.rfc-editor.org/info/rfc4443>.

[RFC4604]  Holbrook, H., Cain, B., and B. Haberman, "Using Internet
           Group Management Protocol Version 3 (IGMPv3) and Multicast
           Listener Discovery Protocol Version 2 (MLDv2) for Source-
           Specific Multicast", RFC 4604, DOI 10.17487/RFC4604,
           August 2006, <https://www.rfc-editor.org/info/rfc4604>.

[RFC4607]  Holbrook, H. and B. Cain, "Source-Specific Multicast for
           IP", RFC 4607, DOI 10.17487/RFC4607, August 2006,
           <https://www.rfc-editor.org/info/rfc4607>.

[RFC8174]  Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
           2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
           May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[RFC8200]  Deering, S. and R. Hinden, "Internet Protocol, Version 6
           (IPv6) Specification", STD 86, RFC 8200,
           DOI 10.17487/RFC8200, July 2017,
           <https://www.rfc-editor.org/info/rfc8200>.

[RFC9778]  Haberman, B., Ed., "IANA Considerations for Internet Group
           Management Protocols", BCP 57, RFC 9778,
           DOI 10.17487/RFC9778, March 2025,
           <https://www.rfc-editor.org/info/rfc9778>.

12.2. Informative References

[RFC3569]  Bhattacharyya, S., Ed., "An Overview of Source-Specific
           Multicast (SSM)", RFC 3569, DOI 10.17487/RFC3569, July
           2003, <https://www.rfc-editor.org/info/rfc3569>.

[RFC3678]  Thaler, D., Fenner, B., and B. Quinn, "Socket Interface
           Extensions for Multicast Source Filters", RFC 3678,
           DOI 10.17487/RFC3678, January 2004,
           <https://www.rfc-editor.org/info/rfc3678>.

[RFC3810]  Vida, R., Ed. and L. Costa, Ed., "Multicast Listener
           Discovery Version 2 (MLDv2) for IPv6", RFC 3810,
           DOI 10.17487/RFC3810, June 2004,
           <https://www.rfc-editor.org/info/rfc3810>.

[RFC4861]  Narten, T., Nordmark, E., Simpson, W., and H. Soliman,
           "Neighbor Discovery for IP version 6 (IPv6)", RFC 4861,
           DOI 10.17487/RFC4861, September 2007,
           <https://www.rfc-editor.org/info/rfc4861>.

[RFC4862]  Thomson, S., Narten, T., and T. Jinmei, "IPv6 Stateless
           Address Autoconfiguration", RFC 4862,
           DOI 10.17487/RFC4862, September 2007,
           <https://www.rfc-editor.org/info/rfc4862>.

[RFC9776]  Haberman, B., Ed., "Internet Group Management Protocol,
           Version 3", STD 100, RFC 9776, DOI 10.17487/RFC9776, March
           2025, <https://www.rfc-editor.org/info/rfc9776>.

Appendix A. Design Rationale ๐Ÿง โœจ

A.1. The Need for State-Change Report Messages

MLDv2 has two flavours of Multicast Listener Reports: Current State and State Change ๐Ÿ“ This section explains why both of them are needed, bestie.

Routers need to tell apart the Reports that were sent in response to Queries from the ones sent because the per-interface state changed ๐Ÿ•ต๏ธโ€โ™€๏ธ Reports sent in answer to Multicast Address Listener Queries are mostly there to refresh the existing state at the router, so they typically don't cause any transitions in state ๐Ÿ”„ Reports sent because the per-interface state changed are different, since the router has to do something about them (see Section 7.4) ๐Ÿ’…

If the router couldn't tell the two apart, it would have to treat every Multicast Listener Report as a possible state change ๐Ÿ˜ต That could mean more processing at the router and more MLD traffic on the link, which is just not it ๐Ÿ™…โ€โ™€๏ธ

A.2. Host Suppression

In MLDv1, a host wouldn't send a pending Multicast Listener Report if another listener on the link had already sent a similar one ๐Ÿคซ In MLDv2, that suppression got removed. Here's why, iykyk ๐Ÿ‘€

  1. Routers may want to track per-host Multicast Listener status on an interface ๐Ÿ” That would let them do fast leaves (for example, for layered multicast congestion control schemes) and also keep an eye on listener status for security or accounting purposes ๐Ÿ“Š The present specification does not require routers to implement per-host tracking ๐Ÿ™Œ Still, MLDv2 not having host suppression means someone can build proprietary or future standard router behaviour that does per-host tracking, and it'll still be fully interoperable with MLDv2 listeners and routers that implement the exact behaviour described in this specification ๐Ÿฆ‹
  2. Multicast Listener Report suppression doesn't work well on bridged LANs ๐ŸŒ‰ Lots of bridges and Layer 2 / Layer 3 switches that do MLD snooping don't forward MLD messages across LAN segments, so the suppression never gets a chance to happen ๐Ÿ™ˆ
  3. Without Report suppression, hosts have fewer messages to process ๐Ÿ’– That means a simpler state machine implementation, which is so clean ๐Ÿงผ
  4. In MLDv2, one Multicast Listener Report can bundle multiple Multicast Address Records, so fewer packets get sent ๐Ÿ“ฆ The previous version of MLD needed each multicast address reported in its own separate message, which was extra chaos ๐Ÿ˜ฉ

A.3. Switching Router Filter Modes from EXCLUDE to INCLUDE

If there are nodes in both EXCLUDE and INCLUDE modes on a link for a single multicast address, the router must be in EXCLUDE mode as well (see Section 7.2.1) ๐Ÿ”’ In EXCLUDE mode, a router forwards traffic from all sources except the ones in the Exclude List ๐Ÿšซ If every node in EXCLUDE mode stops existing or stops listening, it would be super nice for the router to switch back to INCLUDE mode seamlessly, without interrupting the traffic flowing to the existing listeners โœจ

One way to pull that off is for routers to keep track of every source that the INCLUDE-mode nodes are listening to, even while the router itself is in EXCLUDE mode ๐Ÿง  If the Filter Timer for a multicast address expires, that means there are no nodes in EXCLUDE mode on the link anymore, because otherwise a Multicast Listener Report from that node would have refreshed the filter timer ๐Ÿ•ฐ๏ธ At that point the router can switch to INCLUDE mode seamlessly: sources from the Requested List move to the Include List, and sources from the Exclude List get deleted ๐Ÿซง


Appendix B. Summary of Changes ๐Ÿ“

B.1. MLDv1

Here's the summary of what changed from MLDv1, which is specified in [RFC2710] ๐Ÿ’œ

  • MLDv2 introduces source filtering ๐ŸŽง
  • The IP service interface of MLDv2 nodes is modified accordingly. It enables the specification of a filter-mode and a source-list ๐Ÿ› ๏ธ
  • An MLDv2 node keeps per-socket and per-interface Multicast Address Listening states that include a filter-mode and a source-list for each multicast address. This enables packet filtering based on a socket's multicast reception state ๐Ÿ”Ž
  • MLDv2 state kept on routers includes a filter-mode and a list of sources and source timers for each multicast address that has listeners on the link. MLDv1 routers kept only the list of multicast addresses ๐Ÿ“‹
  • Queries include additional fields (Section 5.1) ๐Ÿ†•
  • The S flag is included in queries in order to fix robustness issues ๐Ÿฉน
  • The Querier's Robustness Variable and Query Interval Code are included in Queries in order to synchronize all MLDv2 routers connected to the same link ๐Ÿ”—
  • A new Query type (Multicast Address and Source Specific Query) is introduced ๐Ÿ†•
  • The Maximum Response Delay is not directly included in the Query anymore. Instead, an exponential algorithm is used to calculate its value, based on the Maximum Response Code included in the Query. The maximum value is increased from 65535 milliseconds to about 140 minutes ๐Ÿ“ˆ
  • Reports include Multicast Address Records. Information on the listening state for several different multicast addresses can be included in the same Report message ๐Ÿ“ฆ
  • Reports are sent to the "all MLDv2-capable multicast routers" address, instead of the multicast address the host listens to, as in MLDv1. This facilitates the operation of Layer 2 snooping switches ๐Ÿงš
  • There is no "host suppression", as in MLDv1. All nodes send Report messages ๐Ÿ“ฃ
  • Unsolicited Reports, announcing changes in receiver listening state, are sent [Robustness Variable] times. [RFC2710] is less explicit ๐Ÿ”
  • There are no Done messages ๐Ÿ‘‹
  • Interoperability with MLDv1 systems is achieved by MLDv2 state operations ๐Ÿค
  • In order to ensure interoperability, hosts maintain a Host Compatibility Mode variable and an Older-Version-Querier-Present Timer per interface. Routers maintain a Multicast Address Compatibility Mode variable and an Older-Version-Host-Present Timer per multicast address ๐Ÿซถ

B.2. Changes since RFC 3810

Here's what changed since [RFC3810] ๐ŸŒธ

  • Added definition of Resv to address Erratum 4773 ๐Ÿ“
  • Added clarifying text on which multicast addresses require the sending of MLD messages to address Erratum 5977 โœ๏ธ
  • Added text to clarify the Group Membership Interval Timer changes per Erratum 6725 โฑ๏ธ
  • Changed "Reserved field" to "Flags field" in messages to facilitate use of an IANA-managed registry for future bit allocations ๐Ÿ—‚๏ธ

Acknowledgments ๐Ÿ™โœจ

Okay bestie, the people who helped make this spec happen deserve a shoutout! ๐Ÿ“ฃ We would like to thank Hitoshi Asaeda, Randy Bush, Francis Dupont, Ted Hardie, Russ Housley, Konstantin Kabassanov, Erik Nordmark, Shinsuke Suzuki, Margaret Wasserman, Bert Wijnen, and Remi Zara for their valuable comments and suggestions on this specification. ๐Ÿ’–

Stig Venaas, Hitoshi Asaeda, and Mike McBride gave valuable feedback on this specification too, so thank you to them for their input! ๐Ÿซถ

Contributors ๐ŸŽ€

Roland Vida, Luis Henrique Maciel Kosmalski Costa, Serge Fdida, Steve Deering, Bill Fenner, and Isidor Kouvelas are the authors of RFC 3810. That's the one that makes up the majority of the content in this specification, so they're literally the OGs ๐Ÿ‘‘

Anuj Budhiraja, Toerless Eckert, Olufemi Komolafe, and Tim Winters contributed valuable content to this specification. Iconic work from all of them! ๐ŸŒธ

Author's Address ๐Ÿ“ฌ

Brian Haberman (editor) Johns Hopkins University Applied Physics Lab Email: brian@innovationslab.net ๐Ÿฆ‹

๐Ÿ“ฆ where this page comes from