rfc9776xml2.original.xml | rfc9776.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="US-ASCII"?> | <?xml version='1.0' encoding='UTF-8'?> | |||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | ||||
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?> | ||||
<?rfc toc="yes"?> | ||||
<?rfc sortrefs="yes"?> | ||||
<?rfc symrefs="yes"?> | ||||
<?rfc compact="yes"?> | ||||
<?rfc comments="yes"?> | ||||
<?rfc inline="yes"?> | ||||
<rfc category="std" docName="draft-ietf-pim-3376bis-12" ipr="pre5378trust200902" | ||||
updates="2236" obsoletes="3376"> | ||||
<front> | ||||
<title abbrev="IGMPv3 Revision">Internet Group Management Protocol, Version 3 | ||||
</title> | ||||
<author fullname="Brian Haberman" initials="B." surname="Haberman" role="edit | <!DOCTYPE rfc [ | |||
or"> | <!ENTITY nbsp " "> | |||
<!ENTITY zwsp "​"> | ||||
<!ENTITY nbhy "‑"> | ||||
<!ENTITY wj "⁠"> | ||||
]> | ||||
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="std" docName="draft-ie | ||||
tf-pim-3376bis-12" number="9776" ipr="pre5378trust200902" updates="2236" obsolet | ||||
es="3376" submissionType="IETF" consensus="true" xml:lang="en" tocInclude="true" | ||||
sortRefs="true" symRefs="true" version="3"> | ||||
<front> | ||||
<!--[rfced] May we update the short title that spans the top of the | ||||
PDF file from "IGMPv3 Revision" to "IGMPv3" to match the document | ||||
title? | ||||
Original: | ||||
IGMPv3 Revision | ||||
Perhaps: | ||||
IGMPv3 | ||||
--> | ||||
<!-- [rfced] IGMP is being published as an Internet Standard. We have marked th | ||||
is as STD 100 (new STD), as we do not see any existing STDs related to IGMP. Pl | ||||
ease review and let us know if changes are needed. See https://www.rfc-editor.or | ||||
g/search/rfc_search_detail.php?sortkey=Number&sorting=DESC&page=All&pubstatus%5B | ||||
%5D=Standards%20Track&std_trk=Internet%20Standard | ||||
--> | ||||
<!-- [rfced] Note that, because draft-ietf-pim-3228bis will be published alongsi | ||||
de this document, we have replaced the reference to 3228 with 9778. Please revi | ||||
ew and let us know if any corrections are needed. | ||||
--> | ||||
<!-- [rfced] While we understand the original document was published with much | ||||
of the text we are questioning below, the questions are aimed at making the text | ||||
as correct as possible. Please let us know if these updates are incorrect or | ||||
undesirable. | ||||
--> | ||||
<title abbrev="IGMPv3 Revision">Internet Group Management Protocol, Version | ||||
3</title> | ||||
<seriesInfo name="RFC" value="9776"/> | ||||
<seriesInfo name="STD" value="100"/> | ||||
<author fullname="Brian Haberman" initials="B." surname="Haberman" role="edi | ||||
tor"> | ||||
<organization abbrev="JHU APL">Johns Hopkins University Applied Physics La b</organization> | <organization abbrev="JHU APL">Johns Hopkins University Applied Physics La b</organization> | |||
<address> | <address> | |||
<email>brian@innovationslab.net</email> | <email>brian@innovationslab.net</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<abstract> | <date year="2025" month="March"/> | |||
<t>IGMP is the protocol used by IPv4 systems to | ||||
<area>RTG</area> | ||||
<workgroup>pim</workgroup> | ||||
<!-- [rfced] Please insert any keywords (beyond those that appear in | ||||
the title) for use on https://www.rfc-editor.org/search. | ||||
--> | ||||
<abstract> | ||||
<t>The Internet Group Management | ||||
Protocol (IGMP) is the protocol used by IPv4 systems to | ||||
report their IP multicast group memberships to neighboring multicast | report their IP multicast group memberships to neighboring multicast | |||
routers. Version 3 of IGMP adds support for source filtering, that | routers. Version 3 of IGMP (IGMPv3) adds support for source filtering, that | |||
is, the ability for a system to report interest in receiving packets | is, the ability for a system to report interest in receiving packets | |||
only from specific source addresses, or from all but specific | only from specific source addresses, or from all but specific | |||
source addresses, sent to a particular multicast address. That | source addresses, sent to a particular multicast address. That | |||
information may be used by multicast routing protocols to avoid | information may be used by multicast routing protocols to avoid | |||
delivering multicast packets from specific sources to networks where | delivering multicast packets from specific sources to networks where | |||
there are no interested receivers.</t> | there are no interested receivers.</t> | |||
<t>This document specifies IGMPv3. It is a revised | ||||
<t>This document specifies Version 3 of the Internet Group Management | version of RFC 3376 that includes | |||
Protocol, IGMPv3. It is a revised version of the specification to include | clarifications and fixes for errata, and it is backward compatible | |||
clarifications and fixes for errata in RFC 3376 and is backwards compatible | ||||
with RFC 3376.</t> | with RFC 3376.</t> | |||
<t>This document updates RFC 2236 and obsoletes RFC 3376.</t> | ||||
<t>This document updates RFC 2236 and obsoletes RFC 3376.</t> | </abstract> | |||
</abstract> | </front> | |||
</front> | <middle> | |||
<section anchor="intro" numbered="true" toc="default"> | ||||
<middle> | <name>Introduction</name> | |||
<section anchor="intro" title="Introduction"> | <t>The Internet Group Management Protocol (IGMP) is used by IPv4 systems | |||
<t>The Internet Group Management Protocol (IGMP) is used by IPv4 systems | ||||
(hosts and routers) to report their IP multicast group memberships to | (hosts and routers) to report their IP multicast group memberships to | |||
any neighboring multicast routers. Note that an IP multicast router | any neighboring multicast routers. Note that an IP multicast router | |||
may itself be a member of one or more multicast groups, in which case | may itself be a member of one or more multicast groups, in which case | |||
it performs both the multicast router part of the protocol (to | it performs both the multicast router part of the protocol (to | |||
collect the membership information needed by its multicast routing | collect the membership information needed by its multicast routing | |||
protocol) and the group member part of the protocol (to inform | protocol) and the group member part of the protocol (to inform | |||
itself and other, neighboring multicast routers of its memberships).</t> | itself and other, neighboring multicast routers of its memberships).</t> | |||
<t>IGMP is also used for other IP multicast management functions, using | ||||
<t>IGMP is also used for other IP multicast management functions, using | ||||
message types other than those used for group membership reporting. | message types other than those used for group membership reporting. | |||
This document specifies only the group membership reporting functions | This document specifies only the group membership reporting functions | |||
and messages.</t> | and messages.</t> | |||
<t>This document specifies Version 3 of IGMP. Version 1, specified in | ||||
<t>This document specifies Version 3 of IGMP. Version 1, specified in | <xref target="RFC1112" format="default"/>, was the first widely deployed vers | |||
<xref target="RFC1112" />, was the first widely-deployed version and the firs | ion and the first | |||
t | ||||
version to become an Internet Standard. Version 2, specified in | version to become an Internet Standard. Version 2, specified in | |||
<xref target="RFC2236" />, added support for low leave latency, that is, a | <xref target="RFC2236" format="default"/>, added support for low leave latenc y, that is, a | |||
reduction in the time it takes for a multicast router to learn that | reduction in the time it takes for a multicast router to learn that | |||
there are no longer any members of a particular group present on an | there are no longer any members of a particular group present on an | |||
attached network. Version 3 adds support for source filtering, | attached network. Version 3 adds support for source filtering, | |||
that is, the ability for a system to report interest in receiving | that is, the ability for a system to report interest in receiving | |||
packets only from specific source addresses, as required to support | packets only from specific source addresses, as required to support | |||
Source-Specific Multicast <xref target="RFC3569" />, or from all but specific source | Source-Specific Multicast (SSM) <xref target="RFC3569" format="default"/>, or from all but specific source | |||
addresses, sent to a particular multicast address. Version 3 is | addresses, sent to a particular multicast address. Version 3 is | |||
designed to be interoperable with Versions 1 and 2.</t> | designed to be interoperable with Versions 1 and 2.</t> | |||
<t>This document uses SSM-aware to refer to systems | <t>This document uses "SSM-aware" to refer to systems | |||
that support Source-Specific Multicast (SSM) as defined in <xref targe | that support SSM as defined in <xref target="RFC4607" format="default"/>.< | |||
t="RFC4607" />.</t> | /t> | |||
<t>This document updates <xref target="RFC2236"/> as a proper implementation of Version 3 of IGMP | <t>This document updates <xref target="RFC2236" format="default"/> as a pr oper implementation of Version 3 of IGMP | |||
needs to implement Version 2 Report and Leave message handling.</t> | needs to implement Version 2 Report and Leave message handling.</t> | |||
<t>This document obsoletes <xref target="RFC3376" format="default"/> as it | ||||
<t>This document obsoletes <xref target="RFC3376"/> as it provides clarificat | provides clarifications and fixes | |||
ions and fixes | for errata in <xref target="RFC3376"/>. Detailed updates for those changes ar | |||
for errata in RFC 3376. Detailed updates for those changes are described in < | e described in <xref target="errata-details" format="default"/>.</t> | |||
xref target="errata-details"/>.</t> | <section numbered="true" toc="default"> | |||
<name>Conventions Used in This Document</name> | ||||
<section title="Conventions Used in This Document"> | <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp | |||
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | 14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bc | |||
"OPTIONAL" in this document are to be interpreted as described in | p14>", "<bcp14>NOT RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", and | |||
BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, | "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as described | |||
they appear in all | in | |||
BCP 14 <xref target="RFC2119" format="default"/> <xref target="RFC8174" forma | ||||
t="default"/> when, and only when, they appear in all | ||||
capitals, as shown here.</t> | capitals, as shown here.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="The Service Interface for Requesting IP Multicast Reception"> | <name>The Service Interface for Requesting IP Multicast Reception</name> | |||
<t>Within an IP system, there is (at least conceptually) a service | <t>Within an IP system, there is (at least conceptually) a service | |||
interface used by upper-layer protocols or application programs to | interface used by upper-layer protocols or application programs to | |||
ask the IP layer to enable and disable reception of packets sent to | ask the IP layer to enable and disable reception of packets sent to | |||
specific IP multicast addresses. In order to take full advantage of | specific IP multicast addresses. In order to take full advantage of | |||
the capabilities of IGMPv3, a system's IP service interface must | the capabilities of IGMPv3, a system's IP service interface must | |||
support the following operation:</t> | support the following operation:</t> | |||
<figure> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ | ||||
IPMulticastListen ( socket, interface, multicast-address, | IPMulticastListen ( socket, interface, multicast-address, | |||
filter-mode, source-list ) | filter-mode, source-list )]]></artwork> | |||
]]></artwork> | ||||
</figure> | ||||
<t>where: | ||||
<list style="symbols"> | ||||
<t>"socket" is an implementation-specific parameter used to | <t>where:</t> | |||
<ul spacing="normal"> | ||||
<li> | ||||
<t>"socket" is an implementation-specific parameter used to | ||||
distinguish among different requesting entities (e.g., programs or | distinguish among different requesting entities (e.g., programs or | |||
processes) within the system; the socket parameter of BSD Unix | processes) within the system; the socket parameter of BSD Unix | |||
system calls is a specific example.</t> | system calls is a specific example.</t> | |||
</li> | ||||
<t>"interface" is a local identifier of the network interface on which | <li> | |||
<t>"interface" is a local identifier of the network interface on which | ||||
reception of the specified multicast address is to be enabled or | reception of the specified multicast address is to be enabled or | |||
disabled. Interfaces may be physical (e.g., an Ethernet interface) | disabled. Interfaces may be physical (e.g., an Ethernet interface) | |||
or virtual (e.g., the endpoint of a Frame Relay virtual circuit or | or virtual (e.g., the endpoint of a Frame Relay virtual circuit or | |||
the endpoint of an IP-in-IP "tunnel"). An implementation may allow | the endpoint of an IP-in-IP "tunnel"). An implementation may allow | |||
a special "unspecified" value to be passed as the interface | a special "unspecified" value to be passed as the interface | |||
parameter, in which case the request would apply to the "primary" | parameter, in which case the request would apply to the "primary" | |||
or "default" interface of the system (perhaps established by system | or "default" interface of the system (perhaps established by system | |||
configuration). If reception of the same multicast address is | configuration). If reception of the same multicast address is | |||
desired on more than one interface, IPMulticastListen is invoked | desired on more than one interface, IPMulticastListen is invoked | |||
separately for each desired interface.</t> | separately for each desired interface.</t> | |||
</li> | ||||
<t>"multicast-address" is the IP multicast address, or group, to which | <li> | |||
<t>"multicast-address" is the IP multicast address, or group, to which | ||||
the request pertains. If reception of more than one multicast | the request pertains. If reception of more than one multicast | |||
address on a given interface is desired, IPMulticastListen is | address on a given interface is desired, IPMulticastListen is | |||
invoked separately for each desired multicast address.</t> | invoked separately for each desired multicast address.</t> | |||
</li> | ||||
<t>"filter-mode" may be either INCLUDE or EXCLUDE. In INCLUDE mode, | <li> | |||
<t>"filter-mode" may be either INCLUDE or EXCLUDE. In INCLUDE mode, | ||||
reception of packets sent to the specified multicast address is | reception of packets sent to the specified multicast address is | |||
requested only from those IP source addresses listed in the | requested only from those IP source addresses listed in the | |||
source-list parameter. In EXCLUDE mode, reception of packets sent | source-list parameter. In EXCLUDE mode, reception of packets sent | |||
to the given multicast address is requested from all IP source | to the given multicast address is requested from all IP source | |||
addresses except those listed in the source-list parameter.</t> | addresses except those listed in the source-list parameter.</t> | |||
</li> | ||||
<t>"source-list" is an unordered list of zero or more IP unicast | <li> | |||
<t>"source-list" is an unordered list of zero or more IP unicast | ||||
addresses from which multicast reception is desired or not desired, | addresses from which multicast reception is desired or not desired, | |||
depending on the filter mode. An implementation MAY impose a limit | depending on the filter mode. An implementation <bcp14>MAY</bcp14> impose | |||
on the size of source lists, but that limit MUST NOT be less than | a limit | |||
on the size of source lists, but that limit <bcp14>MUST NOT</bcp14> be less | ||||
than | ||||
64 addresses per list. When an operation causes the source list | 64 addresses per list. When an operation causes the source list | |||
size limit to be exceeded, the service interface MUST return an | size limit to be exceeded, the service interface <bcp14>MUST</bcp14> return an | |||
error.</t> | error.</t> | |||
</list></t> | </li> | |||
</ul> | ||||
<t>For a given combination of socket, interface, and multicast address, | <t>For a given combination of socket, interface, and multicast address, | |||
only a single filter mode and source list can be in effect at any one | only a single filter mode and source list can be in effect at any one | |||
time. However, either the filter mode or the source list, or both, | time. However, either the filter mode or the source list, or both, | |||
may be changed by subsequent IPMulticastListen requests that specify | may be changed by subsequent IPMulticastListen requests that specify | |||
the same socket, interface, and multicast address. Each subsequent | the same socket, interface, and multicast address. Each subsequent | |||
request completely replaces any earlier request for the given socket, | request completely replaces any earlier request for the given socket, | |||
interface and multicast address.</t> | interface, and multicast address.</t> | |||
<t>Previous versions of IGMP did not support source filters and had a | <t>Previous versions of IGMP did not support source filters and had a | |||
simpler service interface consisting of Join and Leave operations to | simpler service interface consisting of Join and Leave operations to | |||
enable and disable reception of a given multicast address (from all | enable and disable reception of a given multicast address (from all | |||
sources) on a given interface. The equivalent operations in the new | sources) on a given interface. The equivalent operations in the new | |||
service interface follow:</t> | service interface follow:</t> | |||
<t>The Join operation is equivalent to:</t> | ||||
<t>The Join operation is equivalent to:</t> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<figure> | ||||
<artwork><![CDATA[ | ||||
IPMulticastListen ( socket, interface, multicast-address, | ||||
EXCLUDE, {} ) | ||||
]]></artwork> | ||||
</figure> | ||||
<t>and the Leave operation is equivalent to:</t> | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
IPMulticastListen ( socket, interface, multicast-address, | IPMulticastListen ( socket, interface, multicast-address, | |||
INCLUDE, {} ) | EXCLUDE, {} )]]></artwork> | |||
]]></artwork> | ||||
</figure> | ||||
<t>where {} is an empty source list.</t> | ||||
<t>An example of an API providing the capabilities outlined in this | <t>and the Leave operation is equivalent to:</t> | |||
service interface is in <xref target="RFC3678" />.</t> | ||||
</section> | ||||
<section title="Multicast Reception State Maintained by Systems"> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<section title="Socket State"> | IPMulticastListen ( socket, interface, multicast-address, | |||
INCLUDE, {} )]]></artwork> | ||||
<t>For each socket on which IPMulticastListen has been invoked, the | <t>where {} is an empty source list.</t> | |||
<t>An example of an API providing the capabilities outlined in this | ||||
service interface is in <xref target="RFC3678" format="default"/>.</t> | ||||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>Multicast Reception State Maintained by Systems</name> | ||||
<section numbered="true" toc="default"> | ||||
<name>Socket State</name> | ||||
<t>For each socket on which IPMulticastListen has been invoked, the | ||||
system records the desired multicast reception state for that socket. | system records the desired multicast reception state for that socket. | |||
That state conceptually consists of a set of records of the form:</t> | That state conceptually consists of a set of records of the form:</t> | |||
<figure> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ | (interface, multicast-address, filter-mode, source-list)]]></artwork> | |||
(interface, multicast-address, filter-mode, source-list) | ||||
]]></artwork> | ||||
</figure> | ||||
<t>The socket state evolves in response to each invocation of | <t>The socket state evolves in response to each invocation of | |||
IPMulticastListen on the socket, as follows: | IPMulticastListen on the socket, as follows: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal"> | ||||
<t>If the requested filter mode is INCLUDE and the requested source | <li> | |||
<t>If the requested filter mode is INCLUDE and the requested source | ||||
list is empty, then the entry corresponding to the requested | list is empty, then the entry corresponding to the requested | |||
interface and multicast address is deleted if present. If no such | interface and multicast address is deleted if present. If no such | |||
entry is present, the request is ignored.</t> | entry is present, the request is ignored.</t> | |||
</li> | ||||
<t>If the requested filter mode is EXCLUDE or the requested source | <li> | |||
<t>If the requested filter mode is EXCLUDE or the requested source | ||||
list is non-empty, then the entry corresponding to the requested | list is non-empty, then the entry corresponding to the requested | |||
interface and multicast address, if present, is changed to contain | interface and multicast address, if present, is changed to contain | |||
the requested filter mode and source list. If no such entry is | the requested filter mode and source list. If no such entry is | |||
present, a new entry is created, using the parameters specified in | present, a new entry is created, using the parameters specified in | |||
the request.</t> | the request.</t> | |||
</list></t> | </li> | |||
</section> | </ul> | |||
</section> | ||||
<section title="Interface State" anchor="if_state"> | <section anchor="if_state" numbered="true" toc="default"> | |||
<name>Interface State</name> | ||||
<t>In addition to the per-socket multicast reception state, a system | <t>In addition to the per-socket multicast reception state, a system | |||
must also maintain or compute multicast reception state for each of | must also maintain or compute multicast reception state for each of | |||
its interfaces. That state conceptually consists of a set of | its interfaces. That state conceptually consists of a set of | |||
records of the form:</t> | records of the form:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
(multicast-address, filter-mode, source-list)]]></artwork> | ||||
<figure> | <t>At most, one record per multicast-address exists for a given | |||
<artwork><![CDATA[ | ||||
(multicast-address, filter-mode, source-list) | ||||
]]></artwork> | ||||
</figure> | ||||
<t>At most one record per multicast-address exists for a given | ||||
interface. This per-interface state is derived from the per-socket | interface. This per-interface state is derived from the per-socket | |||
state, but may differ from the per-socket state when different | state, but it may differ from the per-socket state when different | |||
sockets have differing filter modes and/or source lists for the | sockets have differing filter modes and/or source lists for the | |||
same multicast address and interface. For example, suppose one | same multicast address and interface. For example, suppose one | |||
application or process invokes the following operation on socket | application or process invokes the following operation on socket | |||
s1:</t> | s1:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
IPMulticastListen ( s1, i, m, INCLUDE, {a, b, c} )]]></artwork> | ||||
<figure> | <t>requesting reception on interface i of packets sent to multicast | |||
<artwork><![CDATA[ | ||||
IPMulticastListen ( s1, i, m, INCLUDE, {a, b, c} ) | ||||
]]></artwork> | ||||
</figure> | ||||
<t>requesting reception on interface i of packets sent to multicast | ||||
address m, only if they come from source a, b, or c. Suppose | address m, only if they come from source a, b, or c. Suppose | |||
another application or process invokes the following operation on | another application or process invokes the following operation on | |||
socket s2:</t> | socket s2:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
IPMulticastListen ( s2, i, m, INCLUDE, {b, c, d} )]]></artwork> | ||||
<figure> | <t>requesting reception on the same interface i of packets sent to the | |||
<artwork><![CDATA[ | ||||
IPMulticastListen ( s2, i, m, INCLUDE, {b, c, d} ) | ||||
]]></artwork> | ||||
</figure> | ||||
<t>requesting reception on the same interface i of packets sent to the | ||||
same multicast address m, only if they come from sources b, c, or | same multicast address m, only if they come from sources b, c, or | |||
d. In order to satisfy the reception requirements of both sockets, | d. In order to satisfy the reception requirements of both sockets, | |||
it is necessary for interface i to receive packets sent to m from | it is necessary for interface i to receive packets sent to m from | |||
any one of the sources a, b, c, or d. Thus, in this example, the | any one of the sources a, b, c, or d. Thus, in this example, the | |||
reception state of interface i for multicast address m has filter | reception state of interface i for multicast address m has filter | |||
mode INCLUDE and source list {a, b, c, d}.</t> | mode INCLUDE and source list {a, b, c, d}.</t> | |||
<t>After a multicast packet has been accepted from an interface by the | ||||
<t>After a multicast packet has been accepted from an interface by the | ||||
IP layer, its subsequent delivery to the application or process | IP layer, its subsequent delivery to the application or process | |||
listening on a particular socket depends on the multicast reception | listening on a particular socket depends on the multicast reception | |||
state of that socket [and possibly also on other conditions, such | state of that socket (and possibly also on other conditions, such | |||
as what transport-layer port the socket is bound to]. So, in the | as what transport-layer port the socket is bound to). So, in the | |||
above example, if a packet arrives on interface i, destined to | above example, if a packet arrives on interface i, destined to | |||
multicast address m, with source address a, it will be delivered on | multicast address m, with source address a, it will be delivered on | |||
socket s1 but not on socket s2. Note that IGMP Queries and Reports | socket s1 but not on socket s2. Note that IGMP Queries and Reports | |||
are not subject to source filtering and must always be processed by | are not subject to source filtering and must always be processed by | |||
hosts and routers.</t> | hosts and routers.</t> | |||
<t>Filtering of packets based upon a socket's multicast reception | <t>Filtering of packets based upon a socket's multicast reception | |||
state is a new feature of this service interface. The previous | state is a new feature of this service interface. The previous | |||
service interface <xref target="RFC1112" /> described no filtering based up on | service interface <xref target="RFC1112" format="default"/> described no fi ltering based upon | |||
multicast join state; rather, a join on a socket simply caused the | multicast join state; rather, a join on a socket simply caused the | |||
host to join a group on the given interface, and packets destined | host to join a group on the given interface, and packets destined | |||
for that group could be delivered to all sockets whether they had | for that group could be delivered to all sockets whether they had | |||
joined or not.</t> | joined or not.</t> | |||
<t>The general rules for deriving the per-interface state from the | ||||
<t>The general rules for deriving the per-interface state from the | ||||
per-socket state are as follows: For each distinct (interface, | per-socket state are as follows: For each distinct (interface, | |||
multicast-address) pair that appears in any socket state, a per- | multicast-address) pair that appears in any socket state, a per-interface r | |||
interface record is created for that multicast address on that | ecord is created for that multicast address on that | |||
interface. Considering all socket records containing the same | interface. Considering all socket records containing the same | |||
(interface, multicast-address) pair, | (interface, multicast-address) pair, | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal"> | ||||
<t>if any such record has a filter mode of EXCLUDE, then the filter | <li> | |||
mode of the interface record is EXCLUDE, and the source list of the | <t>if any such record has a filter mode of EXCLUDE, then the | |||
interface record is the intersection of the source lists of all | filter mode of the interface record is EXCLUDE, and the source | |||
socket records in EXCLUDE mode, minus those source addresses that | list of the interface record is the intersection of the source | |||
appear in any socket record in INCLUDE mode. For example, if the | lists of all socket records in EXCLUDE mode, minus those source | |||
socket records for multicast address m on interface i are: | addresses that appear in any socket record in INCLUDE mode. For | |||
example, if the socket records for multicast address m on | ||||
<list style="hanging"> | interface i are:</t> | |||
<t>from socket s1: ( i, m, EXCLUDE, {a, b, c, d} )</t> | <ul spacing="normal"> | |||
<t>from socket s2: ( i, m, EXCLUDE, {b, c, d, e} )</t> | <li>from socket s1: ( i, m, EXCLUDE, {a, b, c, d} )</li> | |||
<t>from socket s3: ( i, m, INCLUDE, {d, e, f} )</t> | <li>from socket s2: ( i, m, EXCLUDE, {b, c, d, e} )</li> | |||
</list> | <li>from socket s3: ( i, m, INCLUDE, {d, e, f} )</li> | |||
</ul> | ||||
then the corresponding interface record on interface i is: | <t>then the corresponding interface record on interface i is:</t> | |||
<ul spacing="normal"> | ||||
<list style="hanging"> | <li>( m, EXCLUDE, {b, c} )</li> | |||
<t>( m, EXCLUDE, {b, c} )</t> | </ul> | |||
</list> | <t>If a fourth socket is added, such as:</t> | |||
<ul spacing="normal"> | ||||
If a fourth socket is added, such as: | <li>from socket s4: ( i, m, EXCLUDE, {} )</li> | |||
</ul> | ||||
<list style="hanging"> | <t>then the interface record becomes:</t> | |||
<t>from socket s4: ( i, m, EXCLUDE, {} )</t> | <ul spacing="normal"> | |||
</list> | <li>( m, EXCLUDE, {} )</li> | |||
</ul> | ||||
then the interface record becomes: | </li> | |||
<li> | ||||
<list style="hanging"> | <t>if all such records have a filter mode of INCLUDE, then the | |||
<t>( m, EXCLUDE, {} )</t> | filter mode of the interface record is INCLUDE, and the source | |||
</list></t> | list of the interface record is the union of the source lists of | |||
all the socket records. For example, if the socket records for | ||||
<t>if all such records have a filter mode of INCLUDE, then the | multicast address m on interface i are:</t> | |||
filter mode of the interface record is INCLUDE, and the source list | <ul spacing="normal"> | |||
of the interface record is the union of the source lists of all the | <li>from socket s1: ( i, m, INCLUDE, {a, b, c} )</li> | |||
socket records. For example, if the socket records for multicast | <li>from socket s2: ( i, m, INCLUDE, {b, c, d} )</li> | |||
address m on interface i are: | <li>from socket s3: ( i, m, INCLUDE, {e, f} )</li> | |||
</ul> | ||||
<list style="hanging"> | <t> then the corresponding interface record on interface i is: | |||
<t>from socket s1: ( i, m, INCLUDE, {a, b, c} )</t> | </t> | |||
<t>from socket s2: ( i, m, INCLUDE, {b, c, d} )</t> | <ul spacing="normal"> | |||
<t>from socket s3: ( i, m, INCLUDE, {e, f} )</t> | <li>( m, INCLUDE, {a, b, c, d, e, f} )</li> | |||
</list> | </ul> | |||
<t>An implementation <bcp14>MUST NOT</bcp14> use an EXCLUDE | ||||
then the corresponding interface record on interface i is: | interface record to represent a group when all sockets for this | |||
group are in INCLUDE state. If system resource limits are reached | ||||
<list style="hanging"> | when an interface state source list is calculated, an error | |||
<t>( m, INCLUDE, {a, b, c, d, e, f} )</t> | <bcp14>MUST</bcp14> be returned to the application that requested | |||
</list> | the operation.</t> | |||
</li> | ||||
An implementation MUST NOT use an EXCLUDE interface record to | </ul> | |||
represent a group when all sockets for this group are in INCLUDE | <t>The above rules for deriving the interface state are (re-)evaluated | |||
state. If system resource limits are reached when an interface | ||||
state source list is calculated, an error MUST be returned to the | ||||
application which requested the operation.</t> | ||||
</list></t> | ||||
<t>The above rules for deriving the interface state are (re-)evaluated | ||||
whenever an IPMulticastListen invocation modifies the socket state by | whenever an IPMulticastListen invocation modifies the socket state by | |||
adding, deleting, or modifying a per-socket state record. Note that | adding, deleting, or modifying a per-socket state record. Note that | |||
a change of socket state does not necessarily result in a change of | a change of socket state does not necessarily result in a change of | |||
interface state.</t> | interface state.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<name>Message Formats</name> | ||||
<t>IGMP messages are encapsulated in IPv4 datagrams, with an IP protocol | ||||
number of 2. | ||||
<section title="Message Formats"> | <!--[rfced] Is "IP Precedence of Internetwork Control" referring to | |||
"IP Time-to-Live of 1"? If so, could "which is an" be added for | ||||
easier readability as shown below? | ||||
<t>IGMP messages are encapsulated in IPv4 datagrams, with an IP protocol | Original: | |||
number of 2. Every IGMP message described in this document is sent | Every IGMP message described in this document is sent with | |||
an IP Time-to-Live of 1, IP Precedence of Internetwork | ||||
Control (e.g., Type of Service 0xc0), and carries an | ||||
IP Router Alert option [RFC2113] in its IP header. | ||||
Perhaps: | ||||
Every IGMP message described in this document is sent with an | ||||
IP Time-to-Live of 1, which is an IP Precedence of Internetwork | ||||
Control (e.g., Type of Service 0xc0), and carries an IP Router | ||||
Alert option [RFC2113] in its IP header. | ||||
--> | ||||
Every IGMP message described in this document is sent | ||||
with an IP Time-to-Live of 1, IP Precedence of Internetwork Control | with an IP Time-to-Live of 1, IP Precedence of Internetwork Control | |||
(e.g., Type of Service 0xc0), and carries an IP Router Alert option | (e.g., Type of Service 0xc0), and carries an IP Router Alert option | |||
<xref target="RFC2113" /> in its IP header. IGMP message types are | <xref target="RFC2113" format="default"/> in its IP header. IGMP message typ | |||
registered per <xref target="I-D.ietf-pim-3228bis"/>.</t> | es are | |||
registered per <xref target="RFC9778" format="default"/>.</t> | ||||
<t>There are two IGMP message types of concern to the IGMPv3 protocol | ||||
described in this document:</t> | ||||
<t>There are two IGMP message types of concern to the IGMPv3 protocol | <table anchor="v3-msgs" align="center"> | |||
described in this document:</t> | <name>New Messages Introduced by IGMPv3</name> | |||
<thead> | ||||
<tr> | ||||
<th align="left">Type Number (hex)</th> | ||||
<th align="left">Message Name</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td align="left">0x11</td> | ||||
<td align="left">Membership Query</td> | ||||
</tr> | ||||
<!-- [rfced] We see the following discrepancies with the IGMP Type Numbers regis | ||||
try <https://www.iana.org/assignments/igmp-type-numbers>. Please review and let | ||||
us know if we may update the names to match what appears in the IANA registry. | ||||
In addition, please consider whether uses of "version X" should be updated for | ||||
consistency as well. | ||||
<texttable anchor="v3-msgs" title="New messages introduced by IGMP3"> | From the IANA registry: | |||
<ttcol align="center">Type Number (hex)</ttcol> | 0x22 IGMPv3 Membership Report | |||
<ttcol align="center">Message Name</ttcol> | Type 0x22 - IGMPv3 Membership Report | |||
<c>0x11</c><c>Membership Query</c> | ||||
<c>0x22</c><c>Version 3 Membership Report</c> | ||||
</texttable> | ||||
<t>An implementation of IGMPv3 MUST also support the following three | Table 1: | |||
message types, for interoperation with previous versions of IGMP (see | 0x22 Version 3 Membership Report | |||
<xref target="interop" />):</t> | ||||
<texttable anchor="legacy-msgs" title="Legacy IGMP messages"> | From the IANA registry: | |||
<ttcol align="center">Type Number (hex)</ttcol> | 0x12 IGMPv1 Membership Report | |||
<ttcol align="center">Message Name</ttcol> | 0x16 IGMPv2 Membership Report | |||
<ttcol align="center">Reference</ttcol> | 0x17 IGMPv2 Leave Group | |||
<c>0x12</c><c>Version 1 Membership Report</c><c><xref target="RFC1112" | ||||
/></c> | ||||
<c>0x16</c><c>Version 2 Membership Report</c><c><xref target="RFC2236" | ||||
/></c> | ||||
<c>0x17</c><c>Version 2 Leave Group</c><c><xref target="RFC2236" /></c | ||||
> | ||||
</texttable> | ||||
<t>Unrecognized message types MUST be silently ignored. Other message | Table 2: | |||
0x12 Version 1 Membership Report | ||||
0x16 Version 2 Membership Report | ||||
0x17 Version 2 Leave Group | ||||
--> | ||||
<tr> | ||||
<td align="left">0x22</td> | ||||
<td align="left">Version 3 Membership Report</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>An implementation of IGMPv3 <bcp14>MUST</bcp14> also support the follow | ||||
ing three | ||||
message types, for interoperation with previous versions of IGMP (see | ||||
<xref target="interop" format="default"/>):</t> | ||||
<table anchor="legacy-msgs" align="center"> | ||||
<name>Legacy IGMP Messages</name> | ||||
<thead> | ||||
<tr> | ||||
<th align="left">Type Number (hex)</th> | ||||
<th align="left">Message Name</th> | ||||
<th align="left">Reference</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td align="left">0x12</td> | ||||
<td align="left">Version 1 Membership Report</td> | ||||
<td align="left"> | ||||
<xref target="RFC1112" format="default"/></td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">0x16</td> | ||||
<td align="left">Version 2 Membership Report</td> | ||||
<td align="left"> | ||||
<xref target="RFC2236" format="default"/></td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">0x17</td> | ||||
<td align="left">Version 2 Leave Group</td> | ||||
<td align="left"> | ||||
<xref target="RFC2236" format="default"/></td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>Unrecognized message types <bcp14>MUST</bcp14> be silently ignored. Ot | ||||
her message | ||||
types may be used by newer versions or extensions of IGMP, by | types may be used by newer versions or extensions of IGMP, by | |||
multicast routing protocols, or for other uses.</t> | multicast routing protocols, or for other uses.</t> | |||
<t>In this document, unless otherwise qualified, the capitalized words | ||||
<t>In this document, unless otherwise qualified, the capitalized words | ||||
"Query" and "Report" refer to IGMP Membership Queries and IGMP | "Query" and "Report" refer to IGMP Membership Queries and IGMP | |||
Version 3 Membership Reports, respectively.</t> | Version 3 Membership Reports, respectively.</t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Membership Query Message"> | <name>Membership Query Message</name> | |||
<t>Membership Queries are sent by IP multicast routers to query the | ||||
<t>Membership Queries are sent by IP multicast routers to query the | ||||
multicast reception state of neighboring interfaces. Queries have | multicast reception state of neighboring interfaces. Queries have | |||
the following format:</t> | the following format:</t> | |||
<figure anchor="v3-qry"> | ||||
<figure anchor="v3-qry" title="IGMPv3 Query Message"> | <name>IGMPv3 Query Message</name> | |||
<artwork><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
0 1 2 3 | 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 | 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 = 0x11 | Max Resp Code | Checksum | | | Type = 0x11 | Max Resp Code | Checksum | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Group Address | | | Group Address | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Flags |S| QRV | QQIC | Number of Sources (N) | | | Flags |S| QRV | QQIC | Number of Sources (N) | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Source Address [1] | | | Source Address [1] | | |||
+- -+ | +- -+ | |||
| Source Address [2] | | | Source Address [2] | | |||
+- . -+ | +- . -+ | |||
. . . | . . . | |||
. . . | . . . | |||
+- -+ | +- -+ | |||
| Source Address [N] | | | Source Address [N] | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwor | |||
]]></artwork> | k> | |||
</figure> | </figure> | |||
<section anchor="max_resp_code" numbered="true" toc="default"> | ||||
<section title="Max Resp Code" anchor="max_resp_code"> | <name>Max Resp Code</name> | |||
<t>The Max Resp Code field specifies the maximum time allowed before | ||||
<t>The Max Resp Code field specifies the maximum time allowed before | sending a responding report. The actual time allowed, called the | |||
sending a responding report. The actual time allowed, called the Max | "Max Resp Time", is represented in units of 1/10 second and is derived | |||
Resp Time, is represented in units of 1/10 second and is derived from | from the Max Resp Code as follows:</t> | |||
the Max Resp Code as follows:</t> | <ul spacing="normal"> | |||
<li>If Max Resp Code < 128, Max Resp Time = Max Resp Code</li> | ||||
<t>If Max Resp Code < 128, Max Resp Time = Max Resp Code</t> | <li><t>If Max Resp Code >= 128, Max Resp Code represents a | |||
floating-point value as follows:</t> | ||||
<t>If Max Resp Code >= 128, Max Resp Code represents a floating-point | ||||
value as follows:</t> | ||||
<figure anchor="max-resp" title="Max Resp Code Representation"> | <figure anchor="max-resp"> | |||
<artwork><![CDATA[ | <name>Max Resp Code Representation</name> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
|1| exp | mant | | |1| exp | mant | | |||
+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
Max Resp Time = (mant | 0x10) << (exp + 3) | Max Resp Time = (mant | 0x10) << (exp + 3)]]></artwork> | |||
]]></artwork> | </figure> | |||
</figure> | </li> | |||
</ul> | ||||
<t>Small values of Max Resp Time allow IGMPv3 routers to tune the "leave | <t>Small values of Max Resp Time allow IGMPv3 routers to tune the "lea | |||
ve | ||||
latency" (the time between the moment the last host leaves a group | latency" (the time between the moment the last host leaves a group | |||
and the moment the routing protocol is notified that there are no | and the moment the routing protocol is notified that there are no | |||
more members). Larger values, especially in the exponential range, | more members). Larger values, especially in the exponential range, | |||
allow tuning of the burstiness of IGMP traffic on a network.</t> | allow tuning of the burstiness of IGMP traffic on a network.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Checksum"> | <name>Checksum</name> | |||
<t>The Checksum field is the 16-bit one's complement of the one's comp | ||||
<t>The Checksum is the 16-bit one's complement of the one's complement | lement | |||
sum of the whole IGMP message (the entire IP payload). For computing | sum of the whole IGMP message (the entire IP payload). For computing | |||
the checksum, the Checksum field is set to zero. When receiving | the checksum, the Checksum field is set to zero. When receiving | |||
packets, the checksum MUST be verified before processing a packet | packets, the checksum <bcp14>MUST</bcp14> be verified before processing a pac | |||
<xref target="RFC1071" />.</t> | ket | |||
</section> | <xref target="RFC1071" format="default"/>.</t> | |||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>Group Address</name> | ||||
<section title="Group Address"> | <!--[rfced] Is "Section 4.1.9" the correct section reference in the | |||
sentence below, or is "Section 4.1.11", which explains the Query | ||||
message variants, perhaps intended? Please review. | ||||
<t>The Group Address field is set to zero when sending a General Query, | Original: | |||
The Group Address field is set to zero when sending a General Query, | ||||
and set to the IP multicast address being queried when sending a | and set to the IP multicast address being queried when sending a | |||
Group-Specific Query or Group-and-Source-Specific Query (see | Group-Specific Query or Group-and-Source-Specific Query (see | |||
<xref target="src_addr_field" />, below).</t> | Section 4.1.9, below). | |||
</section> | --> | |||
<section title="Flags"> | ||||
<t>The Flags field is a bitstring managed by an IANA registry defined in | ||||
<xref target="I-D.ietf-pim-3228bis"/>.</t> | ||||
</section> | ||||
<section title="S Flag (Suppress Router-Side Processing)"> | <t>The Group Address field is set to zero when sending a General Query | |||
and set to the IP multicast address being queried when sending a | ||||
Group-Specific Query or Group-and-Source-Specific Query (see | ||||
<xref target="src_addr_field" format="default"/>, below).</t> | ||||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>Flags</name> | ||||
<t>The Flags field is a bitstring managed by the "IGMP Type Numbers" r | ||||
egistry defined in | ||||
<xref target="RFC9778" format="default"/>.</t> | ||||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<t>When set to one, the S Flag indicates to any receiving multicast | <name>S Flag (Suppress Router-Side Processing)</name> | |||
<t>When set to one, the S flag indicates to any receiving multicast | ||||
routers that they are to suppress the normal timer updates they | routers that they are to suppress the normal timer updates they | |||
perform upon hearing a Query. It does not, however, suppress the | perform upon hearing a Query. It does not, however, suppress the | |||
querier election or the normal "host-side" processing of a Query that | querier election or the normal "host-side" processing of a Query that | |||
a router may be required to perform as a consequence of itself being | a router may be required to perform as a consequence of itself being | |||
a group member.</t> | a group member.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="QRV (Querier's Robustness Variable)"> | <name>QRV (Querier's Robustness Variable)</name> | |||
<t>If non-zero, the QRV field contains the [Robustness Variable] value | ||||
<t>If non-zero, the QRV field contains the [Robustness Variable] value | ||||
used by the querier, i.e., the sender of the Query. If the querier's | used by the querier, i.e., the sender of the Query. If the querier's | |||
[Robustness Variable] exceeds 7, the maximum value of the QRV field, | [Robustness Variable] exceeds 7, the maximum value of the QRV field, | |||
the QRV is set to zero. Routers adopt the QRV value from the most | the QRV is set to zero. Routers adopt the QRV value from the most | |||
recently received Query as their own [Robustness Variable] value, | recently received Query as their own [Robustness Variable] value, | |||
unless that most recently received QRV was zero, in which case the | unless that most recently received QRV was zero, in which case the | |||
receivers use the default [Robustness Variable] value specified in | receivers use the default [Robustness Variable] value specified in | |||
<xref target="robust" /> or a statically configured value.</t> | <xref target="robust" format="default"/> or a statically configured value.</t | |||
</section> | > | |||
</section> | ||||
<section title="QQIC (Querier's Query Interval Code)"> | <section numbered="true" toc="default"> | |||
<name>QQIC (Querier's Query Interval Code)</name> | ||||
<t>The Querier's Query Interval Code field specifies the [Query | <t>The QQIC field specifies the [Query | |||
Interval] used by the querier. The actual interval, called the | Interval] used by the querier. The actual interval, called the | |||
Querier's Query Interval (QQI), is represented in units of seconds | "Querier's Query Interval (QQI)", is represented in units of seconds | |||
and is derived from the Querier's Query Interval Code as follows:</t> | and is derived from the QQIC as follows:</t> | |||
<ul spacing="normal"> | ||||
<t>If QQIC < 128, QQI = QQIC</t> | <li>If QQIC < 128, QQI = QQIC</li> | |||
<li><t>If QQIC >= 128, QQIC represents a floating-point value as | ||||
<t>If QQIC >= 128, QQIC represents a floating-point value as follows:</t> | follows:</t> | |||
<figure anchor="QQIC"> | ||||
<figure anchor="QQIC" title="QQIC Representation"> | <name>QQIC Representation</name> | |||
<artwork><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
|1| exp | mant | | |1| exp | mant | | |||
+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+ | |||
QQI = (mant | 0x10) << (exp + 3) | QQI = (mant | 0x10) << (exp + 3)]]></artwork> | |||
]]></artwork> | </figure> | |||
</figure> | </li> | |||
</ul> | ||||
<t>Multicast routers that are not the current querier adopt the QQI | <t>Multicast routers that are not the current querier adopt the QQI | |||
value from the most recently received Query as their own [Query | value from the most recently received Query as their own [Query | |||
Interval] value, unless that most recently received QQI was zero, in | Interval] value, unless that most recently received QQI was zero, in | |||
which case the receiving routers use the default [Query Interval] | which case the receiving routers use the default [Query Interval] | |||
value specified in <xref target="qry_int" />.</t> | value specified in <xref target="qry_int" format="default"/>.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Number of Sources (N)"> | <name>Number of Sources (N)</name> | |||
<t>The Number of Sources (N) field specifies how many source addresses | ||||
<t>The Number of Sources (N) field specifies how many source addresses | ||||
are present in the Query. This number is zero in a General Query or | are present in the Query. This number is zero in a General Query or | |||
a Group-Specific Query, and non-zero in a Group-and-Source-Specific | a Group-Specific Query and non-zero in a Group-and-Source-Specific | |||
Query. This number is limited by the MTU of the network over which | Query. This number is limited by the MTU of the network over which | |||
the Query is transmitted. For example, on an Ethernet with an MTU of | the Query is transmitted. For example, on an Ethernet with an MTU of | |||
1500 octets, the IP header including the Router Alert option consumes | 1500 octets, the IP header including the Router Alert option consumes | |||
24 octets, and the IGMP fields up to including the Number of Sources | 24 octets, and the IGMP fields up to and including the Number of Sources | |||
(N) field consume 12 octets, leaving 1464 octets for source | (N) field consume 12 octets, leaving 1464 octets for source | |||
addresses, which limits the number of source addresses to 366 | addresses, which limits the number of source addresses to 366 (1464/4).</t> | |||
(1464/4).</t> | </section> | |||
</section> | <section anchor="src_addr_field" numbered="true" toc="default"> | |||
<name>Source Address [i]</name> | ||||
<section title="Source Address [i]" anchor="src_addr_field"> | <t>The Source Address [i] fields are a vector of n IP unicast addresse | |||
s, | ||||
<t>The Source Address [i] fields are a vector of n IP unicast addresses, | ||||
where n is the value in the Number of Sources (N) field.</t> | where n is the value in the Number of Sources (N) field.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Additional Data"> | <name>Additional Data</name> | |||
<t>If the Packet Length field in the IP header of a received Query | ||||
<t>If the Packet Length field in the IP header of a received Query | ||||
indicates that there are additional octets of data present, beyond | indicates that there are additional octets of data present, beyond | |||
the fields described here, IGMPv3 implementations MUST include those | the fields described here, IGMPv3 implementations <bcp14>MUST</bcp14> include | |||
octets in the computation to verify the received IGMP Checksum, but | those | |||
MUST otherwise ignore those additional octets. When sending a Query, | octets in the computation to verify the received IGMP Checksum but | |||
an IGMPv3 implementation MUST NOT include additional octets beyond | <bcp14>MUST</bcp14> otherwise ignore those additional octets. When sending a | |||
Query, | ||||
an IGMPv3 implementation <bcp14>MUST NOT</bcp14> include additional octets be | ||||
yond | ||||
the fields described here.</t> | the fields described here.</t> | |||
</section> | </section> | |||
<section anchor="qry_vars" numbered="true" toc="default"> | ||||
<section title="Query Variants" anchor="qry_vars"> | <name>Query Variants</name> | |||
<t>There are three variants of the Query message: | ||||
<t>There are three variants of the Query message: | ||||
<list style="numbers"> | ||||
<t>A General Query is sent by a multicast router to learn the | </t> | |||
<ol spacing="normal" type="1"><li> | ||||
<t>A General Query is sent by a multicast router to learn the | ||||
complete multicast reception state of the neighboring interfaces | complete multicast reception state of the neighboring interfaces | |||
(that is, the interfaces attached to the network on which the | (that is, the interfaces attached to the network on which the | |||
Query is transmitted). In a General Query, both the Group Address | Query is transmitted). In a General Query, both the Group Address | |||
field and the Number of Sources (N) field are zero.</t> | field and the Number of Sources (N) field are zero.</t> | |||
</li> | ||||
<t>A Group-Specific Query is sent by a multicast router to learn | <li> | |||
<t>A Group-Specific Query is sent by a multicast router to learn | ||||
the reception state, with respect to a single multicast address, | the reception state, with respect to a single multicast address, | |||
of the neighboring interfaces. In a Group-Specific Query, the | of the neighboring interfaces. In a Group-Specific Query, the | |||
Group Address field contains the multicast address of interest, | Group Address field contains the multicast address of interest, | |||
and the Number of Sources (N) field contains zero.</t> | and the Number of Sources (N) field contains zero.</t> | |||
</li> | ||||
<t>A Group-and-Source-Specific Query is sent by a multicast router | <li> | |||
<t>A Group-and-Source-Specific Query is sent by a multicast router | ||||
to learn if any neighboring interface desires reception of packets | to learn if any neighboring interface desires reception of packets | |||
sent to a specified multicast address, from any of a specified | sent to a specified multicast address, from any of a specified | |||
list of sources. In a Group-and-Source-Specific Query, the Group | list of sources. In a Group-and-Source-Specific Query, the Group | |||
Address field contains the multicast address of interest, and the | Address field contains the multicast address of interest, and the | |||
Source Address [i] fields contain the source address(es) of | Source Address [i] fields contain the source address(es) of | |||
interest.</t> | interest.</t> | |||
</list></t> | </li> | |||
</section> | </ol> | |||
</section> | ||||
<section title="IP Destination Addresses for Queries"> | <section numbered="true" toc="default"> | |||
<name>IP Destination Addresses for Queries</name> | ||||
<t>In IGMPv3, General Queries are sent with an IP destination address of | <t>In IGMPv3, General Queries are sent with an IP destination address | |||
of | ||||
224.0.0.1, the all-systems multicast address. Group-Specific and | 224.0.0.1, the all-systems multicast address. Group-Specific and | |||
Group-and-Source-Specific Queries are sent with an IP destination | Group-and-Source-Specific Queries are sent with an IP destination | |||
address equal to the multicast address of interest. However, a | address equal to the multicast address of interest. However, a | |||
system MUST accept and process any Query whose IP Destination | system <bcp14>MUST</bcp14> accept and process any Query whose IP Destination | |||
Address field contains any of the addresses (unicast or multicast) | Address field contains any of the addresses (unicast or multicast) | |||
assigned to the interface on which the Query arrives.</t> | assigned to the interface on which the Query arrives.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Version 3 Membership Report Message"> | <name>Version 3 Membership Report Message</name> | |||
<t>Version 3 Membership Reports are sent by IP systems to report (to | ||||
<t>Version 3 Membership Reports are sent by IP systems to report (to | ||||
neighboring routers) the current multicast reception state, or | neighboring routers) the current multicast reception state, or | |||
changes in the multicast reception state, of their interfaces. | changes in the multicast reception state, of their interfaces. | |||
Reports have the following format:</t> | Reports have the following format:</t> | |||
<figure anchor="v3-rpt"> | ||||
<figure anchor="v3-rpt" title="IGMPv3 Report Message"> | <name>IGMPv3 Report Message</name> | |||
<artwork><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
0 1 2 3 | 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 | 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 = 0x22 | Reserved | Checksum | | | Type = 0x22 | Reserved | Checksum | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Flags | Number of Group Records (M) | | | Flags | Number of Group Records (M) | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | |||
. . | . . | |||
. Group Record [1] . | . Group Record [1] . | |||
skipping to change at line 630 ¶ | skipping to change at line 699 ¶ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| . | | | . | | |||
. . . | . . . | |||
| . | | | . | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | |||
. . | . . | |||
. Group Record [M] . | . Group Record [M] . | |||
. . | . . | |||
| | | | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwor | |||
]]></artwork> | k> | |||
</figure> | </figure> | |||
<t>where each Group Record has the following internal format:</t> | ||||
<t>where each Group Record has the following internal format:</t> | <figure anchor="v3-grp"> | |||
<name>IGMPv3 Report Group Record</name> | ||||
<figure anchor="v3-grp" title="IGMPv3 Report Group Record"> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Record Type | Aux Data Len | Number of Sources (N) | | | Record Type | Aux Data Len | Number of Sources (N) | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Multicast Address | | | Multicast Address | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Source Address [1] | | | Source Address [1] | | |||
+- -+ | +- -+ | |||
| Source Address [2] | | | Source Address [2] | | |||
+- -+ | +- -+ | |||
. . . | . . . | |||
. . . | . . . | |||
. . . | . . . | |||
+- -+ | +- -+ | |||
| Source Address [N] | | | Source Address [N] | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | |||
. . | . . | |||
. Auxiliary Data . | . Auxiliary Data . | |||
. . | . . | |||
| | | | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwor | |||
]]></artwork> | k> | |||
</figure> | </figure> | |||
<section numbered="true" toc="default"> | ||||
<section title="Reserved"> | <name>Reserved</name> | |||
<t>The Reserved field is set to zero on transmission and ignored on | ||||
<t>The Reserved field is set to zero on transmission, and ignored on | ||||
reception.</t> | reception.</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<section title="Checksum"> | <name>Checksum</name> | |||
<t>The Checksum field is the 16-bit one's complement of the one's comp | ||||
<t>The Checksum is the 16-bit one's complement of the one's complement | lement | |||
sum of the whole IGMP message (the entire IP payload). For computing | sum of the whole IGMP message (the entire IP payload). For computing | |||
the checksum, the Checksum field is set to zero. When receiving | the checksum, the Checksum field is set to zero. When receiving | |||
packets, the checksum MUST be verified before processing a message.</t | packets, the checksum <bcp14>MUST</bcp14> be verified before processin | |||
> | g a message.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Flags"> | <name>Flags</name> | |||
<t>The Flags field is a bitstring managed by an IANA registry defined in | <t>The Flags field is a bitstring managed by the "IGMP Type Numbers" r | |||
<xref target="I-D.ietf-pim-3228bis"/>.</t> | egistry defined in | |||
</section> | <xref target="RFC9778" format="default"/>.</t> | |||
</section> | ||||
<section title="Number of Group Records (M)"> | <section numbered="true" toc="default"> | |||
<name>Number of Group Records (M)</name> | ||||
<t>The Number of Group Records (M) field specifies how many Group | <t>The Number of Group Records (M) field specifies how many Group | |||
Records are present in this Report.</t> | Records are present in this Report.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Group Record"> | <name>Group Record</name> | |||
<t>Each Group Record is a block of fields containing information | ||||
<t>Each Group Record is a block of fields containing information | ||||
pertaining to the sender's membership in a single multicast group on | pertaining to the sender's membership in a single multicast group on | |||
the interface from which the Report is sent.</t> | the interface from which the Report is sent.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Record Type"> | <name>Record Type</name> | |||
<t>See <xref target="grp_rec_types" format="default"/>, below.</t> | ||||
<t>See <xref target="grp_rec_types" />, below.</t> | </section> | |||
</section> | <section numbered="true" toc="default"> | |||
<name>Aux Data Len</name> | ||||
<section title="Aux Data Len"> | <t>The Aux Data Len field contains the length of the Auxiliary Data | |||
<t>The Aux Data Len field contains the length of the Auxiliary Data | ||||
field in this Group Record, in units of 32-bit words. It may contain | field in this Group Record, in units of 32-bit words. It may contain | |||
zero, to indicate the absence of any auxiliary data.</t> | zero, to indicate the absence of any auxiliary data.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Number of Sources (N)"> | <name>Number of Sources (N)</name> | |||
<t>The Number of Sources (N) field specifies how many source addresses | ||||
<t>The Number of Sources (N) field specifies how many source addresses | ||||
are present in this Group Record.</t> | are present in this Group Record.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Multicast Address"> | <name>Multicast Address</name> | |||
<t>The Multicast Address field contains the IP multicast address to | ||||
<t>The Multicast Address field contains the IP multicast address to | ||||
which this Group Record pertains.</t> | which this Group Record pertains.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Source Address [i]"> | <name>Source Address [i]</name> | |||
<t>The Source Address [i] fields are a vector of n IP unicast addresse | ||||
<t>The Source Address [i] fields are a vector of n IP unicast addresses, | s, | |||
where n is the value in this record's Number of Sources (N) field.</t> | where n is the value in this record's Number of Sources (N) field.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Auxiliary Data"> | <name>Auxiliary Data</name> | |||
<t>The Auxiliary Data field, if present, contains additional informati | ||||
<t>The Auxiliary Data field, if present, contains additional information | on | |||
pertaining to this Group Record. The protocol specified in this | pertaining to this Group Record. The protocol specified in this | |||
document, IGMPv3, does not define any auxiliary data. Therefore, | document, IGMPv3, does not define any auxiliary data. Therefore, | |||
implementations of IGMPv3 MUST NOT include any auxiliary data (i.e., | implementations of IGMPv3 <bcp14>MUST NOT</bcp14> include any auxiliary data | |||
MUST set the Aux Data Len field to zero) in any transmitted Group | (i.e., | |||
Record, and MUST ignore any auxiliary data present in any received | <bcp14>MUST</bcp14> set the Aux Data Len field to zero) in any transmitted Gr | |||
oup | ||||
Record and <bcp14>MUST</bcp14> ignore any auxiliary data present in any recei | ||||
ved | ||||
Group Record. The semantics and internal encoding of the Auxiliary | Group Record. The semantics and internal encoding of the Auxiliary | |||
Data field are to be defined by any future version or extension of | Data field are to be defined by any future version or extension of | |||
IGMP that uses this field.</t> | IGMP that uses this field.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Additional Data"> | <name>Additional Data</name> | |||
<t>If the Packet Length field in the IP header of a received Report | ||||
<t>If the Packet Length field in the IP header of a received Report | ||||
indicates that there are additional octets of data present, beyond | indicates that there are additional octets of data present, beyond | |||
the last Group Record, IGMPv3 implementations MUST include those | the last Group Record, IGMPv3 implementations <bcp14>MUST</bcp14> include tho | |||
octets in the computation to verify the received IGMP Checksum, but | se | |||
MUST otherwise ignore those additional octets. When sending a | octets in the computation to verify the received IGMP Checksum but | |||
Report, an IGMPv3 implementation MUST NOT include additional octets | <bcp14>MUST</bcp14> otherwise ignore those additional octets. When sending a | |||
Report, an IGMPv3 implementation <bcp14>MUST NOT</bcp14> include additional o | ||||
ctets | ||||
beyond the last Group Record.</t> | beyond the last Group Record.</t> | |||
</section> | </section> | |||
<section anchor="grp_rec_types" numbered="true" toc="default"> | ||||
<section title="Group Record Types" anchor="grp_rec_types"> | <name>Group Record Types</name> | |||
<t>There are a number of different types of Group Records that may be | ||||
<t>There are a number of different types of Group Records that may be | ||||
included in a Report message: | included in a Report message: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal"> | ||||
<t>A Current-State Record is sent by a system in response to a Query | <li> | |||
received on an interface. It reports the current reception state | <t>A Current-State Record is sent by a system in response to a | |||
of that interface, with respect to a single multicast address. The | Query received on an interface. It reports the current | |||
Record Type of a Current-State Record may be one of the following | reception state of that interface, with respect to a single | |||
two values: | multicast address. The Record Type of a Current-State Record | |||
<list style="format %d - " counter="my_cnt"> | may be one of the following two values:</t> | |||
<t>MODE_IS_INCLUDE - indicates that the interface has a | <ol group="my_cnt" spacing="normal" type="1"> | |||
filter mode of INCLUDE for the specified multicast | <li> | |||
address. The Source Address [i] fields in this Group | <t>MODE_IS_INCLUDE - indicates that the interface has a | |||
Record contain the interface's source list for the | filter mode of INCLUDE for the specified multicast address. | |||
specified multicast address, if it is non-empty.</t> | The Source Address [i] fields in this Group Record contain | |||
<t>MODE_IS_EXCLUDE - indicates that the interface has a | the interface's source list for the specified multicast | |||
filter mode of EXCLUDE for the specified multicast | address, if it is non-empty.</t> | |||
address. The Source Address [i] fields in this Group | </li> | |||
Record contain the interface's source list for the | <li> | |||
specified multicast address, if it is non-empty. An | <t>MODE_IS_EXCLUDE - indicates that the interface has a | |||
SSM-aware host SHOULD NOT send a MODE_IS_EXCLUDE record type | filter mode of EXCLUDE for the specified multicast | |||
for multicast addresses that fall within the SSM address range as | address. The Source Address [i] fields in this Group Record | |||
they will be ignored by SSM-aware routers <xref target="RFC4604"/>.</t | contain the interface's source list for the specified | |||
> | multicast address, if it is non-empty. An SSM-aware host | |||
</list></t> | <bcp14>SHOULD NOT</bcp14> send a MODE_IS_EXCLUDE record type | |||
for multicast addresses that fall within the SSM address | ||||
<t>A Filter-Mode-Change Record is sent by a system whenever a local | range as they will be ignored by SSM-aware routers <xref | |||
invocation of IPMulticastListen causes a change of the filter mode | target="RFC4604" format="default"/>.</t> | |||
(i.e., a change from INCLUDE to EXCLUDE, or from EXCLUDE to | </li> | |||
INCLUDE), of the interface-level state entry for a particular | </ol> | |||
multicast address. The Record is included in a Report sent from | </li> | |||
the interface on which the change occurred. The Record Type of a | <li> | |||
Filter-Mode-Change Record may be one of the following two values: | <t>A Filter-Mode-Change Record is sent by a system whenever a | |||
<list style="format %d - " counter="my_cnt"> | local invocation of IPMulticastListen causes a change of the | |||
<t>CHANGE_TO_INCLUDE_MODE - indicates that the interface | filter mode (i.e., a change from INCLUDE to EXCLUDE, or from | |||
has changed to INCLUDE filter mode for the specified | EXCLUDE to INCLUDE) of the interface-level state entry for a | |||
multicast address. The Source Address [i] fields | particular multicast address. The Record is included in a | |||
in this Group Record contain the interface's new | Report sent from the interface on which the change occurred. | |||
source list for the specified multicast address, | The Record Type of a Filter-Mode-Change Record may be one of the | |||
if it is non-empty.</t> | following two values: | |||
<t>CHANGE_TO_EXCLUDE_MODE - indicates that the interface | </t> | |||
has changed to EXCLUDE filter mode for the specified | <ol group="my_cnt" spacing="normal" type="1"><li> | |||
multicast address. The Source Address [i] fields | <t>CHANGE_TO_INCLUDE_MODE - indicates that the interface has | |||
in this Group Record contain the interface's new | changed to INCLUDE filter mode for the specified multicast | |||
source list for the specified multicast address, | address. The Source Address [i] fields in this Group Record | |||
if it is non-empty. An SSM-aware host SHOULD NOT send a | contain the interface's new source list for the specified | |||
CHANGE_TO_EXCLUDE_MODE record type for multicast addresses | multicast address, if it is non-empty.</t> | |||
that fall within the SSM address range.</t> | </li> | |||
</list></t> | <li> | |||
<t>CHANGE_TO_EXCLUDE_MODE - indicates that the interface has | ||||
<t>A Source-List-Change Record is sent by a system whenever a local | changed to EXCLUDE filter mode for the specified multicast | |||
invocation of IPMulticastListen causes a change of source list that | address. The Source Address [i] fields in this Group Record | |||
is not coincident with a change of filter mode, of the | contain the interface's new source list for the specified | |||
interface-level state entry for a particular multicast address. | multicast address, if it is non-empty. An SSM-aware host | |||
The Record is included in a Report sent from the interface on which | <bcp14>SHOULD NOT</bcp14> send a CHANGE_TO_EXCLUDE_MODE | |||
the change occurred. The Record Type of a Source-List-Change | record type for multicast addresses that fall within the SSM | |||
Record may be one of the following two values: | address range.</t> | |||
<list style="format %d - " counter="my_cnt"> | </li> | |||
<t>ALLOW_NEW_SOURCES - indicates that the Source Address | </ol> | |||
[i] fields in this Group Record contain a list of the | </li> | |||
additional sources that the system wishes to | <li> | |||
hear from, for packets sent to the specified | <t>A Source-List-Change Record is sent by a system whenever a | |||
multicast address. If the change was to an INCLUDE | local invocation of IPMulticastListen causes a change of the sourc | |||
source list, these are the addresses that were added | e | |||
to the list; if the change was to an EXCLUDE source | list that is not coincident with a change of the filter mode, of t | |||
list, these are the addresses that were deleted from | he | |||
the list.</t> | interface-level state entry for a particular multicast address. | |||
<t>BLOCK_OLD_SOURCES - indicates that the Source Address | The Record is included in a Report sent from the interface on | |||
[i] fields in this Group Record contain a list of the | which the change occurred. The Record Type of a | |||
sources that the system no longer wishes to | Source-List-Change Record may be one of the following two | |||
hear from, for packets sent to the specified | values: | |||
multicast address. If the change was to an INCLUDE | </t> | |||
source list, these are the addresses that were | <ol group="my_cnt" spacing="normal" type="1"> | |||
deleted from the list; if the change was to an | <li> | |||
EXCLUDE source list, these are the addresses that | <t>ALLOW_NEW_SOURCES - indicates that the Source Address [i] | |||
were added to the list.</t> | fields in this Group Record contain a list of the additional | |||
</list></t> | sources that the system wishes to hear from, for packets | |||
</list></t> | sent to the specified multicast address. If the change was | |||
to an INCLUDE source list, these are the addresses that were | ||||
<t>If a change of source list results in both allowing new sources and | added to the list; if the change was to an EXCLUDE source | |||
blocking old sources, then two Group Records are sent for the same | list, these are the addresses that were deleted from the | |||
multicast address, one of type ALLOW_NEW_SOURCES and one of type | list.</t> | |||
BLOCK_OLD_SOURCES.</t> | </li> | |||
<li> | ||||
<t>We use the term State-Change Record to refer to either a Filter- | <t>BLOCK_OLD_SOURCES - indicates that the Source Address [i] | |||
fields in this Group Record contain a list of the sources | ||||
that the system no longer wishes to hear from, 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.</t> | ||||
</li> | ||||
</ol> | ||||
</li> | ||||
</ul> | ||||
<t>If a change of source list results in both allowing new sources | ||||
and blocking old sources, then two Group Records are sent for the | ||||
same multicast address, one of type ALLOW_NEW_SOURCES and one of | ||||
type BLOCK_OLD_SOURCES.</t> | ||||
<t>We use the term "State-Change Record" to refer to either a Filter- | ||||
Mode-Change Record or a Source-List-Change Record.</t> | Mode-Change Record or a Source-List-Change Record.</t> | |||
<t>Unrecognized Record Type values <bcp14>MUST</bcp14> be silently ign | ||||
<t>Unrecognized Record Type values MUST be silently ignored.</t> | ored.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="IP Source Addresses for Reports"> | <name>IP Source Addresses for Reports</name> | |||
<t>An IGMP report is sent with a valid unicast IPv4 source address for | ||||
<t>An IGMP report is sent with a valid unicast IPv4 source address for the | the | |||
destination subnet. The 0.0.0.0 source address may be used by a | destination subnet. The 0.0.0.0 source address may be used by a | |||
system that has not yet acquired an IP address. Note that the | system that has not yet acquired an IP address. Note that the | |||
0.0.0.0 source address may simultaneously be used by multiple systems | 0.0.0.0 source address may simultaneously be used by multiple systems | |||
on a LAN. Routers MUST accept a report with a source address of | on a LAN. Routers <bcp14>MUST</bcp14> accept a report with a source address of | |||
0.0.0.0.</t> | 0.0.0.0.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="IP Destination Addresses for Reports"> | <name>IP Destination Addresses for Reports</name> | |||
<t>Version 3 Reports are sent with an IP destination address of | ||||
<t>Version 3 Reports are sent with an IP destination address of | ||||
224.0.0.22, to which all IGMPv3-capable multicast routers listen. A | 224.0.0.22, to which all IGMPv3-capable multicast routers listen. A | |||
system that is operating in version 1 or version 2 compatibility | system that is operating in version 1 or version 2 compatibility | |||
modes sends version 1 or version 2 Reports to the multicast group | modes sends version 1 or version 2 Reports to the multicast group | |||
specified in the Group Address field of the Report. In addition, a | specified in the Group Address field of the Report. In addition, a | |||
system MUST accept and process any version 1 or version 2 Report | system <bcp14>MUST</bcp14> accept and process any version 1 or version 2 Repo rt | |||
whose IP Destination Address field contains any of the addresses | whose IP Destination Address field contains any of the addresses | |||
(unicast or multicast) assigned to the interface on which the Report | (unicast or multicast) assigned to the interface on which the Report | |||
arrives.</t> | arrives.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Notation for Group Records"> | <name>Notation for Group Records</name> | |||
<t>In the rest of this document, we use the following notation to | ||||
<t>In the rest of this document, we use the following notation to | ||||
describe the contents of a Group Record pertaining to a particular | describe the contents of a Group Record pertaining to a particular | |||
multicast address:</t> | multicast address:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
IS_IN ( x ) - Type MODE_IS_INCLUDE, source addresses x | IS_IN ( x ) - Type MODE_IS_INCLUDE, source addresses x | |||
IS_EX ( x ) - Type MODE_IS_EXCLUDE, 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_IN ( x ) - Type CHANGE_TO_INCLUDE_MODE, source addresses x | |||
TO_EX ( x ) - Type CHANGE_TO_EXCLUDE_MODE, source addresses x | TO_EX ( x ) - Type CHANGE_TO_EXCLUDE_MODE, source addresses x | |||
ALLOW ( x ) - Type ALLOW_NEW_SOURCES, source addresses x | ALLOW ( x ) - Type ALLOW_NEW_SOURCES, source addresses x | |||
BLOCK ( x ) - Type BLOCK_OLD_SOURCES, source addresses x | BLOCK ( x ) - Type BLOCK_OLD_SOURCES, source addresses x]]></artwork> | |||
]]></artwork> | ||||
</figure> | ||||
<t>where x is either: | ||||
<list style="symbols"> | ||||
<t>a capital letter (e.g., "A") to represent the set of source | ||||
addresses, or</t> | ||||
<t>a set expression (e.g., "A+B"), where "A+B" means the union of sets | <t>where x is either:</t> | |||
<ul spacing="normal"> | ||||
<li> | ||||
<t>a capital letter (e.g., "A") to represent the set of source | ||||
addresses or</t> | ||||
</li> | ||||
<li> | ||||
<t>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" | 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.</t> | means the removal of all elements of set B from set A.</t> | |||
</list></t> | </li> | |||
</section> | </ul> | |||
</section> | ||||
<section title="Membership Report Size"> | <section numbered="true" toc="default"> | |||
<name>Membership Report Size</name> | ||||
<t>If the set of Group Records required in a Report does not fit within | <t>If the set of Group Records required in a Report does not fit withi | |||
n | ||||
the size limit of a single Report message (as determined by the MTU | the size limit of a single Report message (as determined by the MTU | |||
of the network on which it will be sent), the Group Records are sent | of the network on which it will be sent), the Group Records are sent | |||
in as many Report messages as needed to report the entire set.</t> | in as many Report messages as needed to report the entire set.</t> | |||
<t>If a single Group Record contains so many source addresses that it | ||||
<t>If a single Group Record contains so many source addresses that it | does not fit within the size limit of a single Report message, and if its | |||
does not fit within the size limit of a single Report message, if its | ||||
Type is not MODE_IS_EXCLUDE or CHANGE_TO_EXCLUDE_MODE, it is split | Type is not MODE_IS_EXCLUDE or CHANGE_TO_EXCLUDE_MODE, it is split | |||
into multiple Group Records, each containing a different subset of | into multiple Group Records, each containing a different subset of | |||
the source addresses and each sent in a separate Report message. If | the source addresses and each sent in a separate Report message. If | |||
its Type is MODE_IS_EXCLUDE or CHANGE_TO_EXCLUDE_MODE, a single Group | its Type is MODE_IS_EXCLUDE or CHANGE_TO_EXCLUDE_MODE, a single Group | |||
Record is sent, containing as many source addresses as can fit, and</t | Record is sent, containing as many source addresses as can fit, and | |||
> | the remaining source addresses are not reported; though the choice of | |||
<t>the remaining source addresses are not reported; though the choice of | ||||
which sources to report is arbitrary, it is preferable to report the | which sources to report is arbitrary, it is preferable to report the | |||
same set of sources in each subsequent report, rather than reporting | same set of sources in each subsequent report, rather than reporting | |||
different sources each time.</t> | different sources each time.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="grp_mbrs" numbered="true" toc="default"> | ||||
<section title="Description of the Protocol for Group Members" anchor="grp_mb | <name>Description of the Protocol for Group Members</name> | |||
rs"> | <t>IGMP is an asymmetric protocol, specifying separate behaviors for | |||
<t>IGMP is an asymmetric protocol, specifying separate behaviors for | ||||
group members -- that is, hosts or routers that wish to receive | group members -- that is, hosts or routers that wish to receive | |||
multicast packets -- and multicast routers. This section describes | multicast packets -- and multicast routers. This section describes | |||
the part of IGMPv3 that applies to all group members. (Note that a | the part of IGMPv3 that applies to all group members. (Note that a | |||
multicast router that is also a group member performs both parts of | multicast router that is also a group member performs both parts of | |||
IGMPv3, receiving and responding to its own IGMP message | IGMPv3, receiving and responding to its own IGMP message | |||
transmissions as well as those of its neighbors. The multicast | transmissions as well as those of its neighbors. The multicast | |||
router part of IGMPv3 is described in <xref target="mcast_rtrs" />.)</ | router part of IGMPv3 is described in <xref target="mcast_rtrs" format | |||
t> | ="default"/>.)</t> | |||
<t>A system performs the protocol described in this section over all | ||||
<t>A system performs the protocol described in this section over all | ||||
interfaces on which multicast reception is supported, even if more | interfaces on which multicast reception is supported, even if more | |||
than one of those interfaces is connected to the same network.</t> | than one of those interfaces is connected to the same network.</t> | |||
<t>For interoperability with multicast routers running older versions of | ||||
<t>For interoperability with multicast routers running older versions of | ||||
IGMP, systems maintain a MulticastRouterVersion variable for each | IGMP, systems maintain a MulticastRouterVersion variable for each | |||
interface on which multicast reception is supported. This section | interface on which multicast reception is supported. This section | |||
describes the behavior of group member systems on interfaces for | describes the behavior of group member systems on interfaces for | |||
which MulticastRouterVersion = 3. The algorithm for determining | which MulticastRouterVersion = 3. The algorithm for determining | |||
MulticastRouterVersion, and the behavior for versions other than 3, | MulticastRouterVersion, and the behavior for versions other than 3, | |||
are described in <xref target="interop" />.</t> | are described in <xref target="interop" format="default"/>.</t> | |||
<t>The all-systems multicast address, 224.0.0.1, is handled as a special | ||||
<t>The all-systems multicast address, 224.0.0.1, is handled as a special | case. On all systems -- that is, all hosts and routers including | |||
case. On all systems -- that is all hosts and routers, including | ||||
multicast routers -- reception of packets destined to the all-systems | multicast routers -- reception of packets destined to the all-systems | |||
multicast address, from all sources, is permanently enabled on all | multicast address, from all sources, is permanently enabled on all | |||
interfaces on which multicast reception is supported. No IGMP | interfaces on which multicast reception is supported. No IGMP | |||
messages are ever sent regarding the all-systems multicast address.</t > | messages are ever sent regarding the all-systems multicast address.</t > | |||
<t>There are two types of events that trigger IGMPv3 protocol actions on | ||||
<t>There are two types of events that trigger IGMPv3 protocol actions on | ||||
an interface: | an interface: | |||
<list style="symbols"> | </t> | |||
<t>a change of the interface reception state, caused by a local | <ul spacing="normal"> | |||
<li> | ||||
<t>A change of the interface reception state, caused by a local | ||||
invocation of IPMulticastListen.</t> | invocation of IPMulticastListen.</t> | |||
</li> | ||||
<t>reception of a Query.</t> | <li> | |||
</list></t> | <t>The reception of a Query.</t> | |||
</li> | ||||
<t>(Received IGMP messages of types other than Query are silently | </ul> | |||
<t>(Received IGMP messages of types other than Query are silently | ||||
ignored, except as required for interoperation with earlier versions | ignored, except as required for interoperation with earlier versions | |||
of IGMP.)</t> | of IGMP.)</t> | |||
<t>The following subsections describe the actions to be taken for each | ||||
<t>The following subsections describe the actions to be taken for each | ||||
of these two cases. In those descriptions, timer and counter names | of these two cases. In those descriptions, timer and counter names | |||
appear in square brackets. The default values for those timers and | appear in square brackets. The default values for those timers and | |||
counters are specified in <xref target="timers" />.</t> | counters are specified in <xref target="timers" format="default"/>.</t | |||
> | ||||
<section title="Action on Change of Interface State"> | <section numbered="true" toc="default"> | |||
<name>Action on Change of Interface State</name> | ||||
<t>An invocation of IPMulticastListen may cause the multicast reception | <t>An invocation of IPMulticastListen may cause the multicast reception | |||
state of an interface to change, according to the rules in | state of an interface to change, according to the rules in | |||
<xref target="if_state" />. Each such change affects the per-interface entry for a single | <xref target="if_state" format="default"/>. Each such change affects the per -interface entry for a single | |||
multicast address.</t> | multicast address.</t> | |||
<t>A change of interface state causes the system to immediately transmit | ||||
<t>A change of interface state causes the system to immediately transmit | ||||
a State-Change Report from that interface. The type and contents of | a State-Change Report from that interface. The type and contents of | |||
the Group Record(s) in that Report are determined by comparing the | the Group Record(s) in that Report are determined by comparing the | |||
filter mode and source list for the affected multicast address before | filter mode and source list for the affected multicast address before | |||
and after the change, according to the table below. If no interface | and after the change, according to <xref target="state-change-record"/>. If no interface | |||
state existed for that multicast address before the change (i.e., the | state existed for that multicast address before the change (i.e., the | |||
change consisted of creating a new per-interface record), or if no | change consisted of creating a new per-interface record), or if no | |||
state exists after the change (i.e., the change consisted of deleting | state exists after the change (i.e., the change consisted of deleting | |||
a per-interface record), then the "non-existent" state is considered | a per-interface record), then the "non-existent" state is considered | |||
to have a filter mode of INCLUDE and an empty source list.</t> | to have a filter mode of INCLUDE and an empty source list.</t> | |||
<texttable> | <!--[rfced] We note that Tables 3-15 do not have titles (Tables 1 and 2 | |||
<ttcol align="center">Old State</ttcol> | do). Would you like to add titles? If so, please provide the | |||
<ttcol align="center">New State</ttcol> | desired text. | |||
<ttcol align="center">State-Change Record Sent</ttcol> | --> | |||
<c>INCLUDE (A)</c><c>INCLUDE (B)</c><c>ALLOW (B-A), BLOCK (A-B)</c> | ||||
<c>EXCLUDE (A)</c><c>EXCLUDE (B)</c><c>ALLOW (A-B), BLOCK (B-A)</c> | ||||
<c>INCLUDE (A)</c><c>EXCLUDE (B)</c><c>TO_EX (B)</c> | ||||
<c>EXCLUDE (A)</c><c>INCLUDE (B)</c><c>TO_IN (B)</c> | ||||
</texttable> | ||||
<t>If the computed source list for either an ALLOW or a BLOCK State- | <table anchor="state-change-record" align="center"> | |||
<thead> | ||||
<tr> | ||||
<th align="left">Old State</th> | ||||
<th align="left">New State</th> | ||||
<th align="left">State-Change Record Sent</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td align="left">INCLUDE (A)</td> | ||||
<td align="left">INCLUDE (B)</td> | ||||
<td align="left">ALLOW (B-A), BLOCK (A-B)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">EXCLUDE (A)</td> | ||||
<td align="left">EXCLUDE (B)</td> | ||||
<td align="left">ALLOW (A-B), BLOCK (B-A)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">INCLUDE (A)</td> | ||||
<td align="left">EXCLUDE (B)</td> | ||||
<td align="left">TO_EX (B)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">EXCLUDE (A)</td> | ||||
<td align="left">INCLUDE (B)</td> | ||||
<td align="left">TO_IN (B)</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>If the computed source list for either an ALLOW or a BLOCK State- | ||||
Change Record is empty, that record is omitted from the Report | Change Record is empty, that record is omitted from the Report | |||
message.</t> | message.</t> | |||
<t>To cover the possibility of the State-Change Report being missed by | ||||
<t>To cover the possibility of the State-Change Report being missed by | ||||
one or more multicast routers, it is retransmitted [Robustness | one or more multicast routers, it is retransmitted [Robustness | |||
Variable] - 1 more times, at intervals chosen at random from the | Variable] - 1 more times, at intervals chosen at random from the | |||
range (0, [Unsolicited Report Interval]).</t> | range (0, [Unsolicited Report Interval]).</t> | |||
<t>If more changes to the same interface state entry occur before all | ||||
<t>If more changes to the same interface state entry occur before all | ||||
the retransmissions of the State-Change Report for the first change | the retransmissions of the State-Change Report for the first change | |||
have been completed, each such additional change triggers the | have been completed, each such additional change triggers the | |||
immediate transmission of a new State-Change Report.</t> | immediate transmission of a new State-Change Report.</t> | |||
<t>The contents of the new transmitted report are calculated as follows. | ||||
<t>The contents of the new transmitted report are calculated as follows. | ||||
As was done with the first report, the interface state for the | As was done with the first report, the interface state for the | |||
affected group before and after the latest change is compared. The | affected group before and after the latest change is compared. The | |||
report records expressing the difference are built according to the | report records expressing the difference are built according to <xref target= | |||
table above. However these records are not transmitted in a message | "state-change-record"/>. However, these records are not transmitted in a messag | |||
but instead merged with the contents of the pending report, to create | e | |||
but instead are merged with the contents of the pending report to create | ||||
the new State-Change report. The rules for merging the difference | the new State-Change report. The rules for merging the difference | |||
report resulting from the state change and the pending report are | report resulting from the state change and the pending report are | |||
described below.</t> | described below.</t> | |||
<t>The transmission of the merged State-Change Report terminates | ||||
<t>The transmission of the merged State-Change Report terminates | ||||
retransmissions of the earlier State-Change Reports for the same | retransmissions of the earlier State-Change Reports for the same | |||
multicast address, and becomes the first of [Robustness Variable] | multicast address, and becomes the first of [Robustness Variable] | |||
transmissions of State-Change Reports.</t> | transmissions of State-Change Reports.</t> | |||
<t>Each time a source is included in the difference report calculated | ||||
<t>Each time a source is included in the difference report calculated | ||||
above, retransmission state for that source needs to be maintained | above, retransmission state for that source needs to be maintained | |||
until [Robustness Variable] State-Change reports have been sent by | until [Robustness Variable] State-Change reports have been sent by | |||
the host. This is done in order to ensure that a series of | the host. This is done in order to ensure that a series of | |||
successive state changes do not break the protocol robustness.</t> | successive state changes do not break the protocol robustness.</t> | |||
<t>If the interface reception-state change that triggers the new report | ||||
<t>If the interface reception-state change that triggers the new report | is a filter-mode change, then the next [Robustness Variable] State-Change | |||
is a filter-mode change, then the next [Robustness Variable] State- | Reports will include a Filter-Mode-Change Record. This | |||
Change Reports will include a Filter-Mode-Change record. This | ||||
applies even if any number of source-list changes occur in that | applies even if any number of source-list changes occur in that | |||
period. The host has to maintain retransmission state for the group | period. The host has to maintain retransmission state for the group | |||
until the [Robustness Variable] State-Change reports have been sent. | until the [Robustness Variable] State-Change reports have been sent. | |||
When [Robustness Variable] State-Change reports with Filter-Mode- | When [Robustness Variable] State-Change reports with Filter-Mode-Change | |||
Change records have been transmitted after the last filter-mode | Records have been transmitted after the last filter-mode | |||
change, and if source-list changes to the interface reception have | change, and if source-list changes to the interface reception have | |||
scheduled additional reports, then the next State-Change report will | scheduled additional reports, then the next State-Change report will | |||
include Source-List-Change records.</t> | include Source-List-Change Records.</t> | |||
<t>Each time a State-Change Report is transmitted, the contents are | ||||
determined as follows. | ||||
<t>Each time a State-Change Report is transmitted, the contents are | <!--[rfced] For consistency, should "Filter-Mode-Change record" | |||
determined as follows. If the report should contain a Filter-Mode- | be plural in the first sentence (option A), or should | |||
Change record, then if the current filter-mode of the interface is | "Source-List-Change records" be singular in the second | |||
INCLUDE, a TO_IN record is included in the report, otherwise a TO_EX | sentence (option B)? | |||
record is included. If instead the report should contain Source- | ||||
List-Change records, an ALLOW and a BLOCK record are included. The | ||||
contents of these records are built according to the table below.</t> | ||||
<texttable> | Original: | |||
<ttcol align="center">Record</ttcol> | If the report should contain a Filter-Mode-Change record, then if | |||
<ttcol align="center">Sources Included</ttcol> | the current filter-mode of the interface is INCLUDE, a TO_IN record | |||
<c>TO_IN</c><c>All in the current interface state that must be forward | is included in the report, otherwise a TO_EX record is included. If | |||
ed</c> | instead the report should contain Source-List-Change records, an | |||
<c>TO_EX</c><c>All in the current interface state that must be blocked | ALLOW and a BLOCK record are included. | |||
</c> | ||||
<c>ALLOW</c><c>All with retransmission state that must be forwarded</c | ||||
> | ||||
<c>BLOCK</c><c>All with retransmission state that must be blocked</c> | ||||
</texttable> | ||||
<t>If the computed source list for either an ALLOW or a BLOCK record is | Perhaps A: | |||
empty, that record is omitted from the State-Change report.</t> | If the report should contain Filter-Mode-Change Records, and 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. If | ||||
instead the report should contain Source-List-Change Records, an | ||||
ALLOW and a BLOCK record are included. | ||||
<t>Note: When the first State-Change report is sent, the non-existent | or | |||
pending report to merge with, can be treated as a source-change | ||||
report with empty ALLOW and BLOCK records (no sources have | ||||
retransmission state).</t> | ||||
</section> | ||||
<section title="Action on Reception of a Query"> | Perhaps B: | |||
If the report should contain a Filter-Mode-Change Record, and 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. If | ||||
instead the report should contain a Source-List-Change Record, an | ||||
ALLOW and a BLOCK record are included. | ||||
--> | ||||
<t>When a system receives a Query, it does not respond immediately. | If the report should contain a Filter-Mode-Change | |||
Record, and 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. If instead the report should contain Source-List-Change | ||||
Records, an ALLOW and a BLOCK record are included. The | ||||
contents of these records are built according to <xref target="sources | ||||
_included"/>.</t> | ||||
<table anchor="sources_included" align="center"> | ||||
<thead> | ||||
<tr> | ||||
<th align="left">Record</th> | ||||
<th align="left">Sources Included</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td align="left">TO_IN</td> | ||||
<td align="left">All in the current interface state that must be f | ||||
orwarded</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">TO_EX</td> | ||||
<td align="left">All in the current interface state that must be b | ||||
locked</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">ALLOW</td> | ||||
<td align="left">All with retransmission state that must be forwar | ||||
ded</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">BLOCK</td> | ||||
<td align="left">All with retransmission state that must be blocke | ||||
d</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>If the computed source list for either an ALLOW or a BLOCK record is | ||||
empty, that record is omitted from the State-Change report.</t> | ||||
<!-- [rfced] Please review whether any of the notes in this document | ||||
should be in the <aside> element. It is defined as "a container for | ||||
content that is semantically less important or tangential to the | ||||
content that surrounds it" (https://authors.ietf.org/en/rfcxml-vocabulary#aside) | ||||
. | ||||
--> | ||||
<t>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).</t> | ||||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>Action on Reception of a Query</name> | ||||
<t>When a system receives a Query, it does not respond immediately. | ||||
Instead, it delays its response by a random amount of time, bounded | Instead, it delays its response by a random amount of time, bounded | |||
by the Max Resp Time value derived from the Max Resp Code in the | by the Max Resp Time value derived from the Max Resp Code in the | |||
received Query message. A system may receive a variety of Queries on | received Query message. A system may receive a variety of Queries on | |||
different interfaces and of different kinds (e.g., General Queries, | different interfaces and of different kinds (e.g., General Queries, | |||
Group-Specific Queries, and Group-and-Source-Specific Queries), each | Group-Specific Queries, and Group-and-Source-Specific Queries), each | |||
of which may require its own delayed response.</t> | of which may require its own delayed response.</t> | |||
<t>Before scheduling a response to a Query, the system must first | ||||
<t>Before scheduling a response to a Query, the system must first | consider previously scheduled pending responses as, in many cases, | |||
consider previously scheduled pending responses and in many cases | it can schedule a combined response. Therefore, the system must be able to | |||
schedule a combined response. Therefore, the system must be able to | maintain the following state:</t> | |||
maintain the following state:<list style="symbols"> | <ul spacing="normal"> | |||
<li> | ||||
<t>A timer per interface for scheduling responses to General Queries.</t> | <t>A timer per interface for scheduling responses to General Queries | |||
.</t> | ||||
<t>A per-group and interface timer for scheduling responses to Group- | </li> | |||
<li> | ||||
<t>A per-group and interface timer for scheduling responses to Group | ||||
- | ||||
Specific and Group-and-Source-Specific Queries.</t> | Specific and Group-and-Source-Specific Queries.</t> | |||
</li> | ||||
<t>A per-group and interface list of sources to be reported in the | <li> | |||
<t>A per-group and interface list of sources to be reported in the | ||||
response to a Group-and-Source-Specific Query.</t> | response to a Group-and-Source-Specific Query.</t> | |||
</list></t> | </li> | |||
</ul> | ||||
<t>When a new Query with the Router-Alert option arrives on an | <t>When a new Query with the Router Alert option arrives on an | |||
interface, provided the system has state to report, a delay for a | interface, provided the system has state to report, a delay for a | |||
response is randomly selected in the range (0, [Max Resp Time]) where | response is randomly selected in the range (0, [Max Resp Time]) where | |||
Max Resp Time is derived from Max Resp Code in the received Query | Max Resp Time is derived from Max Resp Code in the received Query | |||
message. The following rules are then used to determine if a Report | message. The following rules are then used to determine if a Report | |||
needs to be scheduled and the type of Report to schedule. The rules | needs to be scheduled and the type of Report to schedule. The rules | |||
are considered in order and only the first matching rule is applied. | are considered in order and only the first matching rule is applied. | |||
<list style="numbers"> | </t> | |||
<t>If there is a pending response to a previous General Query | <ol spacing="normal" type="1"><li> | |||
<t>If there is a pending response to a previous General Query | ||||
scheduled sooner than the selected delay, no additional response | scheduled sooner than the selected delay, no additional response | |||
needs to be scheduled.</t> | needs to be scheduled.</t> | |||
</li> | ||||
<t>If the received Query is a General Query, the interface timer is | <li> | |||
<t>If the received Query is a General Query, the interface timer is | ||||
used to schedule a response to the General Query after the | used to schedule a response to the General Query after the | |||
selected delay. Any previously pending response to a General | selected delay. Any previously pending response to a General | |||
Query is canceled.</t> | Query is canceled.</t> | |||
</li> | ||||
<t>If the received Query is a Group-Specific Query or a Group-and- | <li> | |||
<t>If the received Query is a Group-Specific Query or a Group-and- | ||||
Source-Specific Query and there is no pending response to a | Source-Specific Query and there is no pending response to a | |||
previous Query for this group, then the group timer is used to | previous Query for this group, then the group timer is used to | |||
schedule a report. If the received Query is a Group-and-Source- | schedule a report. If the received Query is a Group-and-Source- | |||
Specific Query, the list of queried sources is recorded to be used | Specific Query, the list of queried sources is recorded to be used | |||
when generating a response.</t> | when generating a response.</t> | |||
</li> | ||||
<t>If there already is a pending response to a previous Query | <li> | |||
<t>If there already is a pending response to a previous Query | ||||
scheduled for this group, and either the new Query is a Group- | scheduled for this group, and either the new Query is a Group- | |||
Specific Query or the recorded source-list associated with the | Specific Query or the recorded source-list associated with the | |||
group is empty, then the group source-list is cleared and a single | group is empty, then the group source-list is cleared and a single | |||
response is scheduled using the group timer. The new response is | response is scheduled using the group timer. The new response is | |||
scheduled to be sent at the earliest of the remaining time for the | scheduled to be sent at the earliest of the remaining time for the | |||
pending report and the selected delay.</t> | pending report and the selected delay.</t> | |||
</li> | ||||
<t>If the received Query is a Group-and-Source-Specific Query and | <li> | |||
<t>If the received Query is a Group-and-Source-Specific Query and | ||||
there is a pending response for this group with a non-empty | there is a pending response for this group with a non-empty | |||
source-list, then the group source list is augmented to contain | source-list, then the group source list is augmented to contain | |||
the list of sources in the new Query and a single response is | the list of sources in the new Query and a single response is | |||
scheduled using the group timer. The new response is scheduled to | scheduled using the group timer. The new response is scheduled to | |||
be sent at the earliest of the remaining time for the pending | be sent at the earliest of the remaining time for the pending | |||
report and the selected delay.</t> | report and the selected delay.</t> | |||
</list></t> | </li> | |||
</ol> | ||||
<t>When the timer in a pending response record expires, the system | <t>When the timer in a pending response record expires, the system | |||
transmits, on the associated interface, one or more Report messages | transmits, on the associated interface, one or more Report messages | |||
carrying one or more Current-State Records (see <xref target="grp_rec_ | carrying one or more Current-State Records (see <xref target="grp_rec_ | |||
types" />), as | types" format="default"/>), as | |||
follows:<list style="numbers"> | follows:</t> | |||
<ol spacing="normal" type="1"><li> | ||||
<t>If the expired timer is the interface timer (i.e., it is a pending | <t>If the expired timer is the interface timer (i.e., it is a pendin | |||
g | ||||
response to a General Query), then one Current-State Record is | response to a General Query), then one Current-State Record is | |||
sent for each multicast address for which the specified interface | sent for each multicast address for which the specified interface | |||
has reception state, as described in <xref target="if_state" />. The | has reception state, as described in <xref target="if_state" format="d | |||
Current- | efault"/>. The Current-State Record carries the multicast address and its assoc | |||
State Record carries the multicast address and its associated | iated | |||
filter mode (MODE_IS_INCLUDE or MODE_IS_EXCLUDE) and source list. | filter mode (MODE_IS_INCLUDE or MODE_IS_EXCLUDE) and source list. | |||
Multiple Current-State Records are packed into individual Report | Multiple Current-State Records are packed into individual Report | |||
messages, to the extent possible. | messages, to the extent possible. | |||
<vspace blankLines="1" /> | </t> | |||
<t> | ||||
This naive algorithm may result in bursts of packets when a system | This naive algorithm may result in bursts of packets when a system | |||
is a member of a large number of groups. Instead of using a | is a member of a large number of groups. Instead of using a | |||
single interface timer, implementations are recommended to spread | single interface timer, implementations are recommended to spread | |||
transmission of such Report messages over the interval (0, [Max | transmission of such Report messages over the interval (0, [Max | |||
Resp Time]). Note that any such implementation MUST avoid the | Resp Time]). Note that any such implementation <bcp14>MUST</bcp14> avoid | |||
"ack-implosion" problem, i.e., MUST NOT send a Report immediately | the | |||
"ack-implosion" problem, i.e., <bcp14>MUST NOT</bcp14> send a Report immed | ||||
iately | ||||
on reception of a General Query.</t> | on reception of a General Query.</t> | |||
</li> | ||||
<t>If the expired timer is a group timer and the list of recorded | <li> | |||
sources for the that group is empty (i.e., it is a pending | <t>If the expired timer is a group timer and the list of recorded | |||
sources for that group is empty (i.e., it is a pending | ||||
response to a Group-Specific Query), then if and only if the | response to a Group-Specific Query), then if and only if the | |||
interface has reception state for that group address, a single | interface has reception state for that group address, a single | |||
Current-State Record is sent for that address. The Current-State | Current-State Record is sent for that address. The Current-State | |||
Record carries the multicast address and its associated filter | Record carries the multicast address and its associated filter | |||
mode (MODE_IS_INCLUDE or MODE_IS_EXCLUDE) and source list.</t> | mode (MODE_IS_INCLUDE or MODE_IS_EXCLUDE) and source list.</t> | |||
</li> | ||||
<t>If the expired timer is a group timer and the list of recorded | <li> | |||
If the expired timer is a group timer and the list of recorded | ||||
sources for that group is non-empty (i.e., it is a pending | sources for that group is non-empty (i.e., it is a pending | |||
response to a Group-and-Source-Specific Query), then if and only | response to a Group-and-Source-Specific Query), then if and only | |||
if the interface has reception state for that group address, the | if the interface has reception state for that group address, the | |||
contents of the responding Current-State Record is determined from | contents of the responding Current-State Record is determined from | |||
the interface state and the pending response record, as specified | the interface state and the pending response record, as specified | |||
in the following table:</t></list></t> | in <xref target="per-interface-state"/>. | |||
</li> | ||||
<texttable> | </ol> | |||
<ttcol align="center">Per-Interface State</ttcol> | <table anchor="per-interface-state" align="center"> | |||
<ttcol align="center">Set of Sources in the Pending Response Record</t | <thead> | |||
tcol> | <tr> | |||
<ttcol align="center">Current-State Record</ttcol> | <th align="left">Per-Interface State</th> | |||
<c>INCLUDE (A)</c><c>B</c><c>IS_IN (A*B)</c> | <th align="left">Set of Sources in the Pending Response Record</th | |||
<c>EXCLUDE (A)</c><c>B</c><c>IS_IN (B-A)</c> | > | |||
</texttable> | <th align="left">Current-State Record</th> | |||
</tr> | ||||
<t>If the resulting Current-State Record has an empty set of source | </thead> | |||
<tbody> | ||||
<tr> | ||||
<td align="left">INCLUDE (A)</td> | ||||
<td align="left">B</td> | ||||
<td align="left">IS_IN (A*B)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">EXCLUDE (A)</td> | ||||
<td align="left">B</td> | ||||
<td align="left">IS_IN (B-A)</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>If the resulting Current-State Record has an empty set of source | ||||
addresses, then no response is sent.</t> | addresses, then no response is sent.</t> | |||
<t>Finally, after any required Report messages have been generated, the | ||||
<t>Finally, after any required Report messages have been generated, the | ||||
source lists associated with any reported groups are cleared.</t> | source lists associated with any reported groups are cleared.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="mcast_rtrs" numbered="true" toc="default"> | ||||
<section title="Description of the Protocol for Multicast Routers" anchor="mc | <name>Description of the Protocol for Multicast Routers</name> | |||
ast_rtrs"> | <t>The purpose of IGMP is to enable each multicast router to learn, for | |||
<t>The purpose of IGMP is to enable each multicast router to learn, for | ||||
each of its directly attached networks, which multicast addresses are | each of its directly attached networks, which multicast addresses are | |||
of interest to the systems attached to those networks. IGMP version | of interest to the systems attached to those networks. IGMP version | |||
3 adds the capability for a multicast router to also learn which | 3 adds the capability for a multicast router to also learn which | |||
sources are of interest to neighboring systems, for packets sent to | sources are of interest to neighboring systems, for packets sent to | |||
any particular multicast address. The information gathered by IGMP | any particular multicast address. The information gathered by IGMP | |||
is provided to whichever multicast routing protocol is being used by | is provided to whichever multicast routing protocol is being used by | |||
the router, in order to ensure that multicast packets are delivered | the router, in order to ensure that multicast packets are delivered | |||
to all networks where there are interested receivers.</t> | to all networks where there are interested receivers.</t> | |||
<t>This section describes the part of IGMPv3 that is performed by | ||||
<t>This section describes the part of IGMPv3 that is performed by | ||||
multicast routers. Multicast routers may also themselves become | multicast routers. Multicast routers may also themselves become | |||
members of multicast groups, and therefore also perform the group | members of multicast groups, and therefore also perform the group | |||
member part of IGMPv3, described in <xref target="grp_mbrs" />.</t> | member part of IGMPv3, as described in <xref target="grp_mbrs" format= | |||
"default"/>.</t> | ||||
<t>A multicast router performs the protocol described in this section | <t>A multicast router performs the protocol described in this section | |||
over each of its directly-attached networks. If a multicast router | over each of its directly attached networks. If a multicast router | |||
has more than one interface to the same network, it only needs to | has more than one interface to the same network, it only needs to | |||
operate this protocol over one of those interfaces. On each | operate this protocol over one of those interfaces. On each | |||
interface over which this protocol is being run, the router MUST | interface over which this protocol is being run, the router <bcp14>MUST</bcp1 | |||
enable reception of multicast address 224.0.0.22, from all sources | 4> | |||
(and MUST perform the group member part of IGMPv3 for that address on | enable reception of multicast address 224.0.0.22 from all sources | |||
(and <bcp14>MUST</bcp14> perform the group member part of IGMPv3 for that add | ||||
ress on | ||||
that interface).</t> | that interface).</t> | |||
<t>Multicast routers need to know only that at least one system on an | ||||
<t>Multicast routers need to know only that at least one system on an | ||||
attached network is interested in packets to a particular multicast | attached network is interested in packets to a particular multicast | |||
address from a particular source; a multicast router is not required | address from a particular source; a multicast router is not required | |||
to keep track of the interests of each individual neighboring system. | to keep track of the interests of each individual neighboring system. | |||
(However, see <xref target="suppression" /> point 1 for discussion.)</ | (However, see <xref target="suppression" format="default"/>, item 1 fo | |||
t> | r discussion.)</t> | |||
<t>IGMPv3 is backward compatible with previous versions of the IGMP | ||||
<t>IGMPv3 is backward compatible with previous versions of the IGMP | ||||
protocol. In order to remain backward compatible with older IGMP | protocol. In order to remain backward compatible with older IGMP | |||
systems, IGMPv3 multicast routers MUST also implement versions 1 and | systems, IGMPv3 multicast routers <bcp14>MUST</bcp14> also implement versions | |||
2 of the protocol (see <xref target="interop" />).</t> | 1 and | |||
2 of the protocol (see <xref target="interop" format="default"/>).</t> | ||||
<section title="Conditions for IGMP Queries"> | <section numbered="true" toc="default"> | |||
<name>Conditions for IGMP Queries</name> | ||||
<t>Multicast routers send General Queries periodically to request group | <t>Multicast routers send General Queries periodically to request group | |||
membership information from an attached network. These queries are | membership information from an attached network. These queries are | |||
used to build and refresh the group membership state of systems on | used to build and refresh the group membership state of systems on | |||
attached networks. Systems respond to these queries by reporting | attached networks. Systems respond to these queries by reporting | |||
their group membership state (and their desired set of sources) with | their group membership state (and their desired set of sources) with | |||
Current-State Group Records in IGMPv3 Membership Reports.</t> | Current-State Group Records in IGMPv3 Membership Reports.</t> | |||
<t>As a member of a multicast group, a system may express interest in | ||||
<t>As a member of a multicast group, a system may express interest in | ||||
receiving or not receiving traffic from particular sources. As the | receiving or not receiving traffic from particular sources. As the | |||
desired reception state of a system changes, it reports these changes | desired reception state of a system changes, it reports these changes | |||
using Filter-Mode-Change Records or Source-List-Change Records. | using Filter-Mode-Change Records or Source-List-Change Records. | |||
These records indicate an explicit state change in a group at a | These records indicate an explicit state change in a group at a | |||
system in either the group record's source list or its filter-mode. | system in either the group record's source list or its filter-mode. | |||
When a group membership is terminated at a system or traffic from a | When a group membership is terminated at a system or traffic from a | |||
particular source is no longer desired, a multicast router must query | particular source is no longer desired, a multicast router must query | |||
for other members of the group or listeners of the source before | for other members of the group or listeners of the source before | |||
deleting the group (or source) and pruning its traffic.</t> | deleting the group (or source) and pruning its traffic.</t> | |||
<t>To enable all systems on a network to respond to changes in group | ||||
<t>To enable all systems on a network to respond to changes in group | membership, multicast routers send specific queries. A Group-Specific | |||
membership, multicast routers send specific queries. A Group- | Query is sent to verify there are no systems that desire | |||
Specific Query is sent to verify there are no systems that desire | ||||
reception of the specified group or to "rebuild" the desired | reception of the specified group or to "rebuild" the desired | |||
reception state for a particular group. Group-Specific Queries are | reception state for a particular group. Group-Specific Queries are | |||
sent when a router receives a State-Change record indicating a system | sent when a router receives a State-Change record indicating a system | |||
is leaving a group.</t> | is leaving a group.</t> | |||
<t>A Group-and-Source Specific Query is used to verify there are no | ||||
<t>A Group-and-Source Specific Query is used to verify there are no | systems on a network that desire receiving traffic from a set of | |||
systems on a network which desire to receive traffic from a set of | ||||
sources. Group-and-Source Specific Queries list sources for a | sources. Group-and-Source Specific Queries list sources for a | |||
particular group which have been requested to no longer be forwarded. | particular group that have been requested to no longer be forwarded. | |||
This query is sent by a multicast router to learn if any systems | This query is sent by a multicast router to learn if any systems | |||
desire reception of packets to the specified group address from the | desire reception of packets to the specified group address from the | |||
specified source addresses. Group-and-Source Specific Queries are | specified source addresses. Group-and-Source Specific Queries are | |||
only sent in response to State-Change Records and never in response | only sent in response to State-Change Records and never in response | |||
to Current-State Records. <xref target="qry_vars" /> describes each q uery in | to Current-State Records. <xref target="qry_vars" format="default"/> describes each query in | |||
more detail.</t> | more detail.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="IGMP State Maintained by Multicast Routers"> | <name>IGMP State Maintained by Multicast Routers</name> | |||
<t>Multicast routers implementing IGMPv3 keep state per group per | ||||
<t>Multicast routers implementing IGMPv3 keep state per group per | ||||
attached network. This group state consists of a filter-mode, a list | attached network. This group state consists of a filter-mode, a list | |||
of sources, and various timers. For each attached network running | of sources, and various timers. For each attached network running | |||
IGMP, a multicast router records the desired reception state for that | IGMP, a multicast router records the desired reception state for that | |||
network. That state conceptually consists of a set of records of the | network. That state conceptually consists of a set of records of the | |||
form: | form: | |||
<figure> | </t> | |||
<artwork><![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
(multicast address, group timer, filter-mode, (source records)) | (multicast address, group timer, filter-mode, (source records))]]></artwor | |||
]]></artwork> | k> | |||
</figure></t> | ||||
<t>Each source record is of the form: | <t>Each source record is of the form:</t> | |||
<figure> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ | (source address, source timer)]]></artwork> | |||
(source address, source timer) | ||||
]]></artwork> | ||||
</figure></t> | ||||
<t>If all sources within a given group are desired, an empty source | <t>If all sources within a given group are desired, an empty source | |||
record list is kept with filter-mode set to EXCLUDE. This means | record list is kept with filter-mode set to EXCLUDE. This means | |||
hosts on this network want all sources for this group to be | hosts on this network want all sources for this group to be | |||
forwarded. This is the IGMPv3 equivalent to a IGMPv1 or IGMPv2 group | forwarded. This is the IGMPv3 equivalent to an IGMPv1 or IGMPv2 group | |||
join.</t> | join.</t> | |||
<section anchor="sec-rfm" numbered="true" toc="default"> | ||||
<section anchor="sec-rfm" title="Definition of Router Filter-Mode"> | <name>Definition of Router Filter-Mode</name> | |||
<t>To reduce internal state, IGMPv3 routers keep a filter-mode per gro | ||||
<t>To reduce internal state, IGMPv3 routers keep a filter-mode per group | up | |||
per attached network. This filter-mode is used to condense the total | per attached network. This filter-mode is used to condense the total | |||
desired reception state of a group to a minimum set such that all | desired reception state of a group to a minimum set such that all | |||
systems' memberships are satisfied. This filter-mode may change in | systems' memberships are satisfied. This filter-mode may change in | |||
response to the reception of particular types of group records or | response to the reception of particular types of group records or | |||
when certain timer conditions occur. In the following sections, we | when certain timer conditions occur. In the following sections, we | |||
use the term "router filter-mode" to refer to the filter-mode of a | use the term "router filter-mode" to refer to the filter-mode of a | |||
particular group within a router. <xref target="rcv_rpts" /> describe s the changes | particular group within a router. <xref target="rcv_rpts" format="def ault"/> describes the changes | |||
of a router filter-mode per group record received.</t> | of a router filter-mode per group record received.</t> | |||
<t>Conceptually, when a group record is received, the router filter-mo | ||||
<t>Conceptually, when a group record is received, the router filter-mode | de | |||
for that group is updated to cover all the requested sources using | for that group is updated to cover all the requested sources using | |||
the least amount of state. As a rule, once a group record with a | the least amount of state. As a rule, once a group record with a | |||
filter-mode of EXCLUDE is received, the router filter-mode for that | filter-mode of EXCLUDE is received, the router filter-mode for that | |||
group will be EXCLUDE.</t> | group will be EXCLUDE.</t> | |||
<t>When a router filter-mode for a group is EXCLUDE, the source record | ||||
<t>When a router filter-mode for a group is EXCLUDE, the source record | list contains two types of sources. The first type is the set that | |||
list contains two types of sources. The first type is the set which | ||||
represents conflicts in the desired reception state; this set must be | represents conflicts in the desired reception state; this set must be | |||
forwarded by some router on the network. The second type is the set | forwarded by some router on the network. The second type is the set | |||
of sources which hosts have requested to not be forwarded. <xref target="rat ionale" /> | of sources that hosts have requested to not be forwarded. <xref target="rati onale" format="default"/> | |||
describes the reasons for keeping two different sets when in EXCLUDE | describes the reasons for keeping two different sets when in EXCLUDE | |||
mode.</t> | mode.</t> | |||
<t>When a router filter-mode for a group is INCLUDE, the source record | ||||
<t>When a router filter-mode for a group is INCLUDE, the source record | ||||
list is the list of sources desired for the group. This is the total | list is the list of sources desired for the group. This is the total | |||
desired set of sources for that group. Each source in the source | desired set of sources for that group. Each source in the source | |||
record list must be forwarded by some router on the network.</t> | record list must be forwarded by some router on the network.</t> | |||
<t>Because a reported group record with a filter-mode of EXCLUDE will | ||||
<t>Because a reported group record with a filter-mode of EXCLUDE will | ||||
cause a router to transition its filter-mode for that group to | cause a router to transition its filter-mode for that group to | |||
EXCLUDE, a mechanism for transitioning a router's filter-mode back to | EXCLUDE, a mechanism for transitioning a router's filter-mode back to | |||
INCLUDE must exist. If all systems with a group record in EXCLUDE | INCLUDE must exist. If all systems with a group record in EXCLUDE | |||
filter-mode cease reporting, it is desirable for the router filter- | filter-mode cease reporting, it is desirable for the router filter- | |||
mode for that group to transition back to INCLUDE mode. This | mode for that group to transition back to INCLUDE mode. This | |||
transition occurs when the group timer expires and is explained in | transition occurs when the group timer expires and is explained in | |||
detail in <xref target="fltr_modes" />.</t> | detail in <xref target="fltr_modes" format="default"/>.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Definition of Group Timers"> | <name>Definition of Group Timers</name> | |||
<t>The group timer is only used when a group is in EXCLUDE mode and it | ||||
<t>The group timer is only used when a group is in EXCLUDE mode and it | ||||
represents the time for the filter-mode of the group to expire and | represents the time for the filter-mode of the group to expire and | |||
switch to INCLUDE mode. We define a group timer as a decrementing | switch to INCLUDE mode. We define a group timer as a decrementing | |||
timer with a lower bound of zero kept per group per attached network. | timer with a lower bound of zero kept per group per attached network. | |||
Group timers are updated according to the types of group records | Group timers are updated according to the types of group records | |||
received.</t> | received.</t> | |||
<t>A group timer expiring when a router filter-mode for the group is | ||||
<t>A group timer expiring when a router filter-mode for the group is | ||||
EXCLUDE means there are no listeners on the attached network in | EXCLUDE means there are no listeners on the attached network in | |||
EXCLUDE mode. At this point, a router will transition to INCLUDE | EXCLUDE mode. At this point, a router will transition to INCLUDE | |||
filter-mode. <xref target="fltr_modes" /> describes the actions taken when a group | filter-mode. <xref target="fltr_modes" format="default"/> describes t he actions taken when a group | |||
timer expires while in EXCLUDE mode.</t> | timer expires while in EXCLUDE mode.</t> | |||
<t><xref target="group-timer"/> summarizes the role of the group timer | ||||
<t>The following table summarizes the role of the group timer. | . | |||
<xref target="rcv_rpts" /> describes the details of setting the group timer p | <xref target="rcv_rpts" format="default"/> describes the details of setting t | |||
er type of | he group timer per type of | |||
group record received.</t> | group record received.</t> | |||
<texttable> | <table anchor="group-timer" align="center"> | |||
<ttcol align="center">Group Filter-Mode</ttcol> | <thead> | |||
<ttcol align="center">Group Timer Value</ttcol> | <tr> | |||
<ttcol align="center">Actions/Comments</ttcol> | <th align="left">Group Filter-Mode</th> | |||
<c>INCLUDE</c><c>Timer >= 0</c><c>All members in INCLUDE mode.</c> | <th align="left">Group Timer Value</th> | |||
<c>EXCLUDE</c><c>Timer > 0</c><c>At least one member in EXCLUDE mode.</c> | <th align="left">Actions/Comments</th> | |||
<c>EXCLUDE</c><c>Timer == 0</c> | </tr> | |||
<c>No more listeners to group. If all source timers have expired then | </thead> | |||
<tbody> | ||||
<tr> | ||||
<td align="left">INCLUDE</td> | ||||
<td align="left">Timer >= 0</td> | ||||
<td align="left">All members in INCLUDE mode.</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">EXCLUDE</td> | ||||
<td align="left">Timer > 0</td> | ||||
<td align="left">At least one member in EXCLUDE mode.</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">EXCLUDE</td> | ||||
<td align="left">Timer == 0</td> | ||||
<td align="left">No more listeners to group. If all source time | ||||
rs have expired, then | ||||
delete Group Record. If there are still source record timers runni ng, | delete Group Record. If there are still source record timers runni ng, | |||
switch to INCLUDE filter-mode using those source records with runni ng | switch to INCLUDE filter-mode using those source records with runni ng | |||
timers as the INCLUDE source record state.</c> | timers as the INCLUDE source record state.</td> | |||
</texttable> | </tr> | |||
</section> | </tbody> | |||
</table> | ||||
<section title="Definition of Source Timers"> | </section> | |||
<section numbered="true" toc="default"> | ||||
<t>A source timer is kept per source record and is a decrementing timer | <name>Definition of Source Timers</name> | |||
<t>A source timer is kept per source record and is a decrementing time | ||||
r | ||||
with a lower bound of zero. Source timers are updated according to | with a lower bound of zero. Source timers are updated according to | |||
the type and filter-mode of the group record received. Source timers | the type and filter-mode of the group record received. Source timers | |||
are always updated (for a particular group) whenever the source is | are always updated (for a particular group) whenever the source is | |||
present in a received record for that group. <xref target="rcv_rpts" /> desc ribes | present in a received record for that group. <xref target="rcv_rpts" format= "default"/> describes | |||
the setting of source timers per type of group records received.</t> | the setting of source timers per type of group records received.</t> | |||
<t>A source record with a running timer with a router filter-mode for | ||||
<t>A source record with a running timer with a router filter-mode for | ||||
the group of INCLUDE means that there is currently one or more | the group of INCLUDE means that there is currently one or more | |||
systems (in INCLUDE filter-mode) which desire to receive that source. | systems (in INCLUDE filter-mode) that desire to receive that source. | |||
If a source timer expires with a router filter-mode for the group of | If a source timer expires with a router filter-mode for the group of | |||
INCLUDE, the router concludes that traffic from this particular | INCLUDE, the router concludes that traffic from this particular | |||
source is no longer desired on the attached network, and deletes the | source is no longer desired on the attached network and deletes the | |||
associated source record.</t> | associated source record.</t> | |||
<t>Source timers are treated differently when a router filter-mode for | ||||
<t>Source timers are treated differently when a router filter-mode for a | a | |||
group is EXCLUDE. If a source record has a running timer with a | group is EXCLUDE. If a source record has a running timer with a | |||
router filter-mode for the group of EXCLUDE, it means that at least | router filter-mode for the group of EXCLUDE, it means that at least | |||
one system desires the source. It should therefore be forwarded by a | one system desires the source. It should therefore be forwarded by a | |||
router on the network. <xref target="rationale" /> describes the reasons for keeping | router on the network. <xref target="rationale" format="default"/> describes the reasons for keeping | |||
state for sources that have been requested to be forwarded while in | state for sources that have been requested to be forwarded while in | |||
EXCLUDE state.</t> | EXCLUDE state.</t> | |||
<t>If a source timer expires with a router filter-mode for the group o | ||||
<t>If a source timer expires with a router filter-mode for the group of | f | |||
EXCLUDE, the router informs the routing protocol that there is no | EXCLUDE, the router informs the routing protocol that there is no | |||
longer a receiver on the network interested in traffic from this | longer a receiver on the network interested in traffic from this | |||
source.</t> | source.</t> | |||
<t>When a router filter-mode for a group is EXCLUDE, source records ar | ||||
<t>When a router filter-mode for a group is EXCLUDE, source records are | e | |||
only deleted when the group timer expires. <xref target="ss_fwd" /> describe | only deleted when the group timer expires. <xref target="ss_fwd" format="def | |||
s the | ault"/> describes the | |||
actions that should be taken dependent upon the value of a source | actions that should be taken dependent upon the value of a source | |||
timer.</t> | timer.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="ss_fwd" numbered="true" toc="default"> | ||||
<section title="IGMPv3 Source-Specific Forwarding Rules" anchor="ss_fwd"> | <name>IGMPv3 Source-Specific Forwarding Rules</name> | |||
<t>When a multicast router receives a datagram from a source destined to | ||||
<t>When a multicast router receives a datagram from a source destined to | ||||
a particular group, a decision has to be made whether to forward the | a particular group, a decision has to be made whether to forward the | |||
datagram onto an attached network or not. The multicast routing | datagram onto an attached network or not. The multicast routing | |||
protocol in use is in charge of this decision, and should use the | protocol in use is in charge of this decision and should use the | |||
IGMPv3 information to ensure that all sources/groups desired on a | IGMPv3 information to ensure that all sources/groups desired on a | |||
subnetwork are forwarded to that subnetwork. IGMPv3 information does | subnetwork are forwarded to that subnetwork. IGMPv3 information does | |||
not override multicast routing information; for example, if the | not override multicast routing information; for example, if the | |||
IGMPv3 filter-mode group for G is EXCLUDE, a router may still forward | IGMPv3 filter-mode group for G is EXCLUDE, a router may still forward | |||
packets for excluded sources to a transit subnet.</t> | packets for excluded sources to a transit subnet.</t> | |||
<t>To summarize, <xref target="forwarding_suggestions" /> describes the | ||||
<t>To summarize, the following table describes the forwarding | forwarding | |||
suggestions made by IGMP to the routing protocol for traffic | suggestions made by IGMP to the routing protocol for traffic | |||
originating from a source destined to a group. It also summarizes | originating from a source destined to a group. It also summarizes | |||
the actions taken upon the expiration of a source timer based on the | the actions taken upon the expiration of a source timer based on the | |||
router filter-mode of the group.</t> | router filter-mode of the group.</t> | |||
<texttable> | <table anchor="forwarding_suggestions" align="center"> | |||
<ttcol align="center">Group Filter-Mode</ttcol> | <thead> | |||
<ttcol align="center">Group Timer Value</ttcol> | <tr> | |||
<ttcol align="center">Action</ttcol> | <th align="left">Group Filter-Mode</th> | |||
<c>INCLUDE</c><c>TIMER > 0</c><c>Suggest to forward traffic from source</c | <th align="left">Group Timer Value</th> | |||
> | <th align="left">Action</th> | |||
</tr> | ||||
<c>INCLUDE</c><c>TIMER == 0</c><c>Suggest to stop forwarding traffic from | </thead> | |||
<tbody> | ||||
<tr> | ||||
<td align="left">INCLUDE</td> | ||||
<td align="left">TIMER > 0</td> | ||||
<td align="left">Suggest to forward traffic from source.</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">INCLUDE</td> | ||||
<td align="left">TIMER == 0</td> | ||||
<td align="left">Suggest to stop forwarding traffic from | ||||
source and remove source record. If there are no more source | source and remove source record. If there are no more source | |||
records for the group, delete group record.</c> | records for the group, delete group record.</td> | |||
</tr> | ||||
<c>INCLUDE</c><c>No Source Elements</c><c>Suggest to not forward source</c | <tr> | |||
> | <td align="left">INCLUDE</td> | |||
<td align="left">No Source Elements</td> | ||||
<c>EXCLUDE</c><c>TIMER > 0</c><c>Suggest to forward traffic from source</c | <td align="left">Suggest to not forward source.</td> | |||
> | </tr> | |||
<tr> | ||||
<c>EXCLUDE</c><c>TIMER == 0</c><c>Suggest to not forward traffic from sour | <td align="left">EXCLUDE</td> | |||
ce (DO NOT remove record)</c> | <td align="left">TIMER > 0</td> | |||
<td align="left">Suggest to forward traffic from source.</td> | ||||
<c>EXCLUDE</c><c>No Source Elements</c><c>Suggest to forward traffic from | </tr> | |||
source</c> | <tr> | |||
</texttable> | <td align="left">EXCLUDE</td> | |||
</section> | <td align="left">TIMER == 0</td> | |||
<td align="left">Suggest to not forward traffic from source (DO NO | ||||
<section title="Action on Reception of Reports" anchor="rcv_rpts"> | T remove record).</td> | |||
</tr> | ||||
<t>SSM-aware routers SHOULD ignore records that contain multicast addresses | <tr> | |||
<td align="left">EXCLUDE</td> | ||||
<td align="left">No Source Elements</td> | ||||
<td align="left">Suggest to forward traffic from source.</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
</section> | ||||
<section anchor="rcv_rpts" numbered="true" toc="default"> | ||||
<name>Action on Reception of Reports</name> | ||||
<t>SSM-aware routers <bcp14>SHOULD</bcp14> ignore records that contain m | ||||
ulticast addresses | ||||
in the SSM address range if the record type is MODE_IS_EXCLUDE or | in the SSM address range if the record type is MODE_IS_EXCLUDE or | |||
CHANGE_TO_EXCLUDE_MODE. SSM-aware routers SHOULD ignore IGMPv1/IGMPv2 | CHANGE_TO_EXCLUDE_MODE. SSM-aware routers <bcp14>SHOULD</bcp14> ignore IGMPv1 | |||
Report and IGMPv2 DONE messages that contain multicast addresses in the SSM a | /IGMPv2 | |||
ddress range, SHOULD NOT | Report and IGMPv2 DONE messages that contain multicast addresses in the SSM a | |||
use such Reports to establish IP forwarding state, and MAY log an error if it | ddress range, <bcp14>SHOULD NOT</bcp14> | |||
receives | use such Reports to establish IP forwarding state, and <bcp14>MAY</bcp14> log | |||
an error if it receives | ||||
such a message.</t> | such a message.</t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Reception of Current-State Records"> | <name>Reception of Current-State Records</name> | |||
<t>When receiving Current-State Records, a router updates both its gro | ||||
<t>When receiving Current-State Records, a router updates both its group | up | |||
and source timers. In some circumstances, the reception of a type of | and source timers. In some circumstances, the reception of a type of | |||
group record will cause the router filter-mode for that group to | group record will cause the router filter-mode for that group to | |||
change. The table below describes the actions, with respect to state | change. <xref target="router_state_8"/> describes the actions, with respect to state | |||
and timers that occur to a router's state upon reception of Current- | and timers that occur to a router's state upon reception of Current- | |||
State Records.</t> | State Records.</t> | |||
<t>The following notation is used to describe the updating of source | ||||
<t>The following notation is used to describe the updating of source | ||||
timers. The notation ( A, B ) will be used to represent the total | timers. The notation ( A, B ) will be used to represent the total | |||
number of sources for a particular group, where</t> | number of sources for a particular group, where</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
A = set of source records whose source timers > 0 (Sources that at | A = set of source records whose source timers > 0 (Sources that at | |||
least one host has requested to be forwarded) | least one host has requested to be forwarded) | |||
B = set of source records whose source timers = 0 (Sources that IGMP | B = set of source records whose source timers = 0 (Sources that IGMP | |||
will suggest to the routing protocol not to forward) | will suggest to the routing protocol not to forward)]]></artwork> | |||
]]></artwork> | ||||
</figure> | ||||
<t>Note that there will only be two sets when a router's filter-mode for | <t>Note that there will only be two sets when a router's filter-mode f or | |||
a group is EXCLUDE. When a router's filter-mode for a group is | a group is EXCLUDE. When a router's filter-mode for a group is | |||
INCLUDE, a single set is used to describe the set of sources | INCLUDE, a single set is used to describe the set of sources | |||
requested to be forwarded (e.g., simply (A)).</t> | requested to be forwarded (e.g., simply (A)).</t> | |||
<t>In Tables <xref target="router_state_8" format="counter"/> and <xre | ||||
<t>In the following tables, abbreviations are used for several variables | f target="router_state_9" format="counter"/>, abbreviations are used for several | |||
(all of which are described in detail in <xref target="timers" />). T | variables | |||
he variable | (all of which are described in detail in <xref target="timers" format= | |||
"default"/>). The variable | ||||
GMI is an abbreviation for the Group Membership Interval, which is | GMI is an abbreviation for the Group Membership Interval, which is | |||
the time in which group memberships will time out. The variable LMQT | the time in which group memberships will time out. The variable LMQT | |||
is an abbreviation for the Last Member Query Time, which is the total | is an abbreviation for the Last Member Query Time, which is the total | |||
time spent after Last Member Query Count retransmissions. LMQT | time spent after Last Member Query Count retransmissions. LMQT | |||
represents the "leave latency", or the difference between the | represents the "leave latency" or the difference between the | |||
transmission of a membership change and the change in the information | transmission of a membership change and the change in the information | |||
given to the routing protocol.</t> | given to the routing protocol.</t> | |||
<t>Within the "Actions" section of the router state tables, we use the | ||||
<t>Within the "Actions" section of the router state tables, we use the | ||||
notation 'A=J', which means that the set A of source records should | notation 'A=J', which means that the set A of source records should | |||
have their source timers set to value J. 'Delete A' means that the | have their source timers set to value J. 'Delete A' means that the | |||
set A of source records should be deleted. 'Group Timer=J' means | set A of source records should be deleted. 'Group Timer=J' means | |||
that the Group Timer for the group should be set to value J.</t> | that the Group Timer for the group should be set to value J.</t> | |||
<figure> | <table anchor="router_state_8" align="center"> | |||
<artwork><![CDATA[ | <thead> | |||
Router State Report Rec'd New Router State Actions | <tr> | |||
<th>Router State</th> | ||||
INCLUDE (A) IS_IN (B) INCLUDE (A+B) (B)=GMI | <th>Report Rec'd</th> | |||
<th>New Router State</th> | ||||
INCLUDE (A) IS_EX (B) EXCLUDE (A*B,B-A) (B-A)=0 | <th>Actions</th> | |||
Delete (A-B) | </tr> | |||
Group Timer=GMI | </thead> | |||
<tbody> | ||||
EXCLUDE (X,Y) IS_IN (A) EXCLUDE (X+A,Y-A) (A)=GMI | <tr> | |||
<td>INCLUDE (A)</td> | ||||
EXCLUDE (X,Y) IS_EX (A) EXCLUDE (A-Y,Y*A) (A-X-Y)=GMI | <td>IS_IN (B)</td> | |||
Delete (X-A) | <td>INCLUDE (A+B)</td> | |||
Delete (Y-A) | <td>(B)=GMI</td> | |||
Group Timer=GMI | </tr> | |||
]]></artwork> | <tr> | |||
</figure> | <td>INCLUDE (A)</td> | |||
</section> | <td>IS_EX (B)</td> | |||
<td>EXCLUDE (A*B,B-A)</td> | ||||
<section title="Reception of Filter-Mode-Change and Source-List-Change Record | <td>(B-A)=0<br/>Delete (A-B)<br/>Group Timer=GMI</td> | |||
s" anchor="slc_recs"> | </tr> | |||
<tr> | ||||
<td>EXCLUDE (X,Y)</td> | ||||
<td>IS_IN (A)</td> | ||||
<td>EXCLUDE (X+A,Y-A)</td> | ||||
<td>(A)=GMI</td> | ||||
</tr> | ||||
<tr> | ||||
<td>EXCLUDE (X,Y)</td> | ||||
<td>IS_EX (A)</td> | ||||
<td>EXCLUDE (A-Y,Y*A)</td> | ||||
<td>(A-X-Y)=GMI<br/>Delete (X-A)<br/>Delete (Y-A)<br/>Group Timer=GMI</ | ||||
td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>When a change in the global state of a group occurs in a system, the | </section> | |||
<section anchor="slc_recs" numbered="true" toc="default"> | ||||
<name>Reception of Filter-Mode-Change and Source-List-Change Records</ | ||||
name> | ||||
<t>When a change in the global state of a group occurs in a system, th | ||||
e | ||||
system sends either a Source-List-Change Record or a Filter-Mode- | system sends either a Source-List-Change Record or a Filter-Mode- | |||
Change Record for that group. As with Current-State Records, routers | Change Record for that group. As with Current-State Records, routers | |||
must act upon these records and possibly change their own state to | must act upon these records and possibly change their own state to | |||
reflect the new desired membership state of the network.</t> | reflect the new desired membership state of the network.</t> | |||
<t>Routers must query sources that are requested to be no longer | ||||
<t>Routers must query sources that are requested to be no longer | ||||
forwarded to a group. When a router queries or receives a query for | forwarded to a group. When a router queries or receives a query for | |||
a specific set of sources, it lowers its source timers for those | a specific set of sources, it lowers its source timers for those | |||
sources to a small interval of Last Member Query Time seconds. If | sources to a small interval of Last Member Query Time seconds. If | |||
group records are received in response to the queries which express | group records are received in response to the queries which express | |||
interest in receiving traffic from the queried sources, the | interest in receiving traffic from the queried sources, the | |||
corresponding timers are updated.</t> | corresponding timers are updated.</t> | |||
<t>Similarly, when a router queries a specific group, it lowers its | ||||
<t>Similarly, when a router queries a specific group, it lowers its | ||||
group timer for that group to a small interval of Last Member Query | group timer for that group to a small interval of Last Member Query | |||
Time seconds. If any group records expressing EXCLUDE mode interest | Time seconds. If any group records expressing EXCLUDE mode interest | |||
in the group are received within the interval, the group timer for | in the group are received within the interval, the group timer for | |||
the group is updated and the suggestion to the routing protocol to | the group is updated and the suggestion to the routing protocol to | |||
forward the group stands without any interruption.</t> | forward the group stands without any interruption.</t> | |||
<t>During a query period (i.e., Last Member Query Time seconds), the | ||||
<t>During a query period (i.e., Last Member Query Time seconds), the | ||||
IGMP component in the router continues to suggest to the routing | IGMP component in the router continues to suggest to the routing | |||
protocol that it forwards traffic from the groups or sources that it | protocol that it forwards traffic from the groups or sources that it | |||
is querying. It is not until after Last Member Query Time seconds | is querying. It is not until after Last Member Query Time seconds | |||
without receiving a record expressing interest in the queried group | without receiving a record expressing interest in the queried group | |||
or sources that the router may prune the group or sources from the | or sources that the router may prune the group or sources from the | |||
network.</t> | network.</t> | |||
<t> <xref target="router_state_9"/> describes the changes in group sta | ||||
<t>The following table describes the changes in group state and the | te and the | |||
action(s) taken when receiving either Filter-Mode-Change or Source- | action(s) taken when receiving either Filter-Mode-Change or Source-List-Chang | |||
List-Change Records. This table also describes the queries which are | e | |||
Records. This table also describes the queries that are | ||||
sent by the querier when a particular report is received.</t> | sent by the querier when a particular report is received.</t> | |||
<t>We use the following notation for describing the queries that are | ||||
<t>We use the following notation for describing the queries which are | ||||
sent. We use the notation 'Q(G)' to describe a Group-Specific Query | sent. We use the notation 'Q(G)' to describe a Group-Specific Query | |||
to G. We use the notation 'Q(G,A)' to describe a Group-and-Source | to G. We use the notation 'Q(G,A)' to describe a Group-and-Source | |||
Specific Query to G with source-list A. If source-list A is null as | Specific Query to G with source-list A. If source-list A is null as | |||
a result of the action (e.g., A*B) then no query is sent as a result | a result of the action (e.g., A*B), then no query is sent as a result | |||
of the operation.</t> | of the operation.</t> | |||
<t>In order to maintain protocol robustness, queries sent by actions i | ||||
<t>In order to maintain protocol robustness, queries sent by actions in | n | |||
the table below need to be transmitted [Last Member Query Count] | <xref target="router_state_9"/> need to be transmitted [Last Member Query Cou | |||
nt] | ||||
times, once every [Last Member Query Interval].</t> | times, once every [Last Member Query Interval].</t> | |||
<t>If while scheduling new queries there are already pending queries t | ||||
<t>If while scheduling new queries, there are already pending queries to | o | |||
be retransmitted for the same group, the new and pending queries have | be retransmitted for the same group, the new and pending queries have | |||
to be merged. In addition, received host reports for a group with | to be merged. In addition, received host reports for a group with | |||
pending queries may affect the contents of those queries. | pending queries may affect the contents of those queries. | |||
<xref target="ssqs" /> describes the process of building and maintaining the state of | <xref target="ssqs" format="default"/> describes the process of building and maintaining the state of | |||
pending queries.</t> | pending queries.</t> | |||
<figure> | <table anchor="router_state_9" align="center"> | |||
<artwork><![CDATA[ | <thead> | |||
Router State Report Rec'd New Router State Actions | <tr> | |||
<th>Router State</th> | ||||
INCLUDE (A) ALLOW (B) INCLUDE (A+B) (B)=GMI | <th>Report Rec'd</th> | |||
<th>New Router State</th> | ||||
INCLUDE (A) BLOCK (B) INCLUDE (A) Send Q(G,A*B) | <th>Actions</th> | |||
</tr> | ||||
INCLUDE (A) TO_EX (B) EXCLUDE (A*B,B-A) (B-A)=0 | </thead> | |||
Delete (A-B) | <tbody> | |||
Send Q(G,A*B) | <tr> | |||
Group Timer=GMI | <td>INCLUDE (A)</td> | |||
<td>ALLOW (B)</td> | ||||
INCLUDE (A) TO_IN (B) INCLUDE (A+B) (B)=GMI | <td>INCLUDE (A+B)</td> | |||
Send Q(G,A-B) | <td>(B)=GMI</td> | |||
</tr> | ||||
EXCLUDE (X,Y) ALLOW (A) EXCLUDE (X+A,Y-A) (A)=GMI | <tr> | |||
<td>INCLUDE (A)</td> | ||||
EXCLUDE (X,Y) BLOCK (A) EXCLUDE (X+(A-Y),Y) (A-X-Y)=Group Timer | <td>BLOCK (B)</td> | |||
Send Q(G,A-Y) | <td>INCLUDE (A)</td> | |||
<td>Send Q(G,A*B)</td> | ||||
EXCLUDE (X,Y) TO_EX (A) EXCLUDE (A-Y,Y*A) (A-X-Y)=Group Timer | </tr> | |||
Delete (X-A) | <tr> | |||
Delete (Y-A) | <td>INCLUDE (A)</td> | |||
Send Q(G,A-Y) | <td>TO_EX (B)</td> | |||
Group Timer=GMI | <td>EXCLUDE (A*B,B-A)</td> | |||
<td>(B-A)=0<br/>Delete (A-B)<br/>Send Q(G,A*B)<br/>Group Timer=GMI</td> | ||||
EXCLUDE (X,Y) TO_IN (A) EXCLUDE (X+A,Y-A) (A)=GMI | </tr> | |||
Send Q(G,X-A) | <tr> | |||
Send Q(G) | <td>INCLUDE (A)</td> | |||
]]></artwork> | <td>TO_IN (B)</td> | |||
</figure> | <td>INCLUDE (A+B)</td> | |||
</section> | <td>(B)=GMI<br/>Send Q(G,A-B)</td> | |||
</section> | </tr> | |||
<tr> | ||||
<section title="Switching Router Filter-Modes" anchor="fltr_modes"> | <td>EXCLUDE (X,Y)</td> | |||
<td>ALLOW (A)</td> | ||||
<td>EXCLUDE (X+A,Y-A)</td> | ||||
<td>(A)=GMI</td> | ||||
</tr> | ||||
<tr> | ||||
<td>EXCLUDE (X,Y)</td> | ||||
<td>BLOCK (A)</td> | ||||
<td>EXCLUDE (X+(A-Y),Y)</td> | ||||
<td>(A-X-Y)=Group Timer<br/>Send Q(G,A-Y)</td> | ||||
</tr> | ||||
<tr> | ||||
<td>EXCLUDE (X,Y)</td> | ||||
<td>TO_EX (A)</td> | ||||
<td>EXCLUDE (A-Y,Y*A)</td> | ||||
<td>(A-X-Y)=Group Timer<br/>Delete (X-A)<br/>Delete (Y-A)<br/>Send Q(G,A | ||||
-Y)<br/>Group Timer=GMI</td> | ||||
</tr> | ||||
<tr> | ||||
<td>EXCLUDE (X,Y)</td> | ||||
<td>TO_IN (A)</td> | ||||
<td>EXCLUDE (X+A,Y-A)</td> | ||||
<td>(A)=GMI<br/>Send Q(G,X-A)<br/>Send Q(G)</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>The group timer is used as a mechanism for transitioning the router | </section> | |||
</section> | ||||
<section anchor="fltr_modes" numbered="true" toc="default"> | ||||
<name>Switching Router Filter-Modes</name> | ||||
<t>The group timer is used as a mechanism for transitioning the router | ||||
filter-mode from EXCLUDE to INCLUDE.</t> | filter-mode from EXCLUDE to INCLUDE.</t> | |||
<t>When a group timer expires with a router filter-mode of EXCLUDE, a | ||||
<t>When a group timer expires with a router filter-mode of EXCLUDE, a | ||||
router assumes that there are no systems with a filter-mode of | router assumes that there are no systems with a filter-mode of | |||
EXCLUDE present on the attached network. When a router's filter-mode | EXCLUDE present on the attached network. When a router's filter-mode | |||
for a group is EXCLUDE and the group timer expires, the router | for a group is EXCLUDE and the group timer expires, the router | |||
filter-mode for the group transitions to INCLUDE.</t> | filter-mode for the group transitions to INCLUDE.</t> | |||
<t>A router uses source records with running source timers as its state | ||||
<t>A router uses source records with running source timers as its state | ||||
for the switch to a filter-mode of INCLUDE. If there are any source | for the switch to a filter-mode of INCLUDE. If there are any source | |||
records with source timers greater than zero (i.e., requested to be | records with source timers greater than zero (i.e., requested to be | |||
forwarded), a router switches to filter-mode of INCLUDE using those | forwarded), a router switches to filter-mode of INCLUDE using those | |||
source records. Source records whose timers are zero (from the | source records. Source records whose timers are zero (from the | |||
previous EXCLUDE mode) are deleted.</t> | previous EXCLUDE mode) are deleted.</t> | |||
<t>For example, if a router's state for a group is EXCLUDE(X,Y) and the | ||||
<t>For example, if a router's state for a group is EXCLUDE(X,Y) and the | ||||
group timer expires for that group, the router switches to filter- | group timer expires for that group, the router switches to filter- | |||
mode of INCLUDE with state INCLUDE(X).</t> | mode of INCLUDE with state INCLUDE(X).</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Action on Reception of Queries"> | <name>Action on Reception of Queries</name> | |||
<section title="Timer Updates"> | <section numbered="true" toc="default"> | |||
<name>Timer Updates</name> | ||||
<t>When a router sends or receives a query with a clear Suppress | <t>When a router sends or receives a query with a clear Suppress | |||
Router-Side Processing flag, it must update its timers to reflect the | Router-Side Processing flag, it must update its timers to reflect the | |||
correct timeout values for the group or sources being queried. The | correct timeout values for the group or sources being queried. <xref target=" | |||
following table describes the timer actions when sending or receiving | timer_actions"/> describes the timer actions when sending or receiving | |||
a Group-Specific or Group-and-Source Specific Query with the Suppress | a Group-Specific or Group-and-Source Specific Query with the S flag not set.< | |||
Router-Side Processing flag not set.</t> | /t> | |||
<texttable> | <table anchor="timer_actions" align="center"> | |||
<ttcol align="center">Query</ttcol> | <thead> | |||
<ttcol align="center">Action</ttcol> | <tr> | |||
<c>Q(G,A)</c><c>Source Timer for sources in A are lowered to LMQT</c> | <th align="left">Query</th> | |||
<c>Q(G)</c><c>Group Timer is lowered to LMQT</c> | <th align="left">Action</th> | |||
</texttable> | </tr> | |||
</thead> | ||||
<t>When a router sends or receives a query with the Suppress Router-Side | <tbody> | |||
Processing flag set, it will not update its timers.</t> | <tr> | |||
</section> | <td align="left">Q(G,A)</td> | |||
<td align="left">Source Timer for sources in A are lowered to LM | ||||
<section title="Querier Election"> | QT</td> | |||
</tr> | ||||
<t>IGMPv3 elects a single querier per subnet using the same querier | <tr> | |||
<td align="left">Q(G)</td> | ||||
<td align="left">Group Timer is lowered to LMQT</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>When a router sends or receives a query with the S flag set, it wil | ||||
l not update its timers.</t> | ||||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>Querier Election</name> | ||||
<t>IGMPv3 elects a single querier per subnet using the same querier | ||||
election mechanism as IGMPv2, namely by IP address. When a router | election mechanism as IGMPv2, namely by IP address. When a router | |||
receives a general query with a lower IP address, it sets the Other-Querier- | receives a general query with a lower IP address, it sets the Other Querier P | |||
Present timer to Other Querier Present Interval and ceases to send | resent | |||
timer to Other Querier Present Interval and ceases to send | ||||
general queries on the network if it was the previously elected querier. | general queries on the network if it was the previously elected querier. | |||
After its Other-Querier Present timer expires, it should begin | After its Other-Querier Present timer expires, it should begin | |||
sending General Queries.</t> | sending General Queries.</t> | |||
<t>If a router receives an older version general query, it <bcp14>MUST | ||||
<t>If a router receives an older version general query, it MUST use the oldes | </bcp14> use the oldest | |||
t | ||||
version of IGMP on the network. For a detailed description of | version of IGMP on the network. For a detailed description of | |||
compatibility issues between IGMP versions see <xref target="interop" | compatibility issues between IGMP versions, see <xref target="interop" | |||
/>.</t> | format="default"/>.</t> | |||
</section> | </section> | |||
<section anchor="ssqs" numbered="true" toc="default"> | ||||
<section title="Building and Sending Specific Queries" anchor="ssqs"> | <name>Building and Sending Specific Queries</name> | |||
<section title="Building and Sending Group Specific Queries"> | <section numbered="true" toc="default"> | |||
<name>Building and Sending Group-Specific Queries</name> | ||||
<t>When a table action "Send Q(G)" is encountered, then the group timer | <t>When a table action "Send Q(G)" is encountered, the group timer | |||
must be lowered to LMQT. The router must then immediately send a | must be lowered to LMQT. The router must then immediately send a | |||
group specific query as well as schedule [Last Member Query Count - | group-specific query as well as schedule [Last Member Query Count - | |||
1] query retransmissions to be sent every [Last Member Query | 1] query retransmissions to be sent every [Last Member Query | |||
Interval] over [Last Member Query Time].</t> | Interval] over [Last Member Query Time].</t> | |||
<t>When transmitting a group-specific query, if the group timer is | ||||
<t>When transmitting a group specific query, if the group timer is | ||||
larger than LMQT, the "Suppress Router-Side Processing" bit is set in | larger than LMQT, the "Suppress Router-Side Processing" bit is set in | |||
the query message.</t> | the query message.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Building and Sending Group and Source Specific Queries"> | <!-- [rfced] We see "Send Q(G,X-A)" not "Send Q(G,X)" in Table 9. Is | |||
this variance okay or is an update needed? | ||||
<t>When a table action "Send Q(G,X)" is encountered by a querier in the | Original: | |||
table in <xref target="slc_recs" />, the following actions must be per | When a table action "Send Q(G,X)" is encountered by a querier in the | |||
formed for | table in Section 6.4.2, the following actions must be performed for | |||
each of the sources in X of group G, with source timer larger than | each of the sources in X of group G, with source timer larger than | |||
LMQT: | LMQT: | |||
<list style="symbols"> | ||||
<t>Set number of retransmissions for each source to [Last Member Query | ||||
Count].</t> | ||||
<t>Lower source timer to LMQT.</t> | ||||
</list></t> | ||||
<t>The router must then immediately send a group and source specific | Perhaps: | |||
When a table action "Send Q(G,X-A)" is encountered by a querier in | ||||
Table 9 (Section 6.4.2), the following actions must be performed for | ||||
each of the sources in X of group G, with the source timer larger than | ||||
LMQT: | ||||
--> | ||||
<name>Building and Sending Group-and-Source-Specific Queries</name> | ||||
<t>When a table action "Send Q(G,X)" is encountered by a querier in | ||||
<xref target="router_state_9"/> (<xref target="slc_recs" format="default"/>), th | ||||
e following actions must be performed for each of the sources in X of group G, w | ||||
ith the source timer larger than | ||||
LMQT: | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t>Set the number of retransmissions for each source to [Last Me | ||||
mber Query Count].</t> | ||||
</li> | ||||
<li> | ||||
<t>Lower the source timer to LMQT.</t> | ||||
</li> | ||||
</ul> | ||||
<t>The router must then immediately send a group and source specific | ||||
query as well as schedule [Last Member Query Count - 1] query | query as well as schedule [Last Member Query Count - 1] query | |||
retransmissions to be sent every [Last Member Query Interval] over | retransmissions to be sent every [Last Member Query Interval] over | |||
[Last Member Query Time]. The contents of these queries are | [Last Member Query Time]. The contents of these queries are | |||
calculated as follows.</t> | calculated as follows.</t> | |||
<t>When building a group and source specific query for group G, two | ||||
<t>When building a group and source specific query for a group G, two | ||||
separate query messages are sent for the group. The first one has | separate query messages are sent for the group. The first one has | |||
the "Suppress Router-Side Processing" bit set and contains all the | the "Suppress Router-Side Processing" bit set and contains all the | |||
sources with retransmission state and timers greater than LMQT. The | sources with retransmission state and timers greater than LMQT. The | |||
second has the "Suppress Router-Side Processing" bit clear and | second has the "Suppress Router-Side Processing" bit clear and | |||
contains all the sources with retransmission state and timers lower | contains all the sources with retransmission state and timers lower | |||
or equal to LMQT. If either of the two calculated messages does not | or equal to LMQT. If either of the two calculated messages does not | |||
contain any sources, then its transmission is suppressed.</t> | contain any sources, then its transmission is suppressed.</t> | |||
<t>Note: If a group-specific query is scheduled to be transmitted at | ||||
<t>Note: If a group specific query is scheduled to be transmitted at the | the | |||
same time as a group and source specific query for the same group, | same time as a group and source specific query for the same group, | |||
then transmission of the group and source specific message with the | then transmission of the group and source specific message with the | |||
"Suppress Router-Side Processing" bit set may be suppressed.</t> | "Suppress Router-Side Processing" bit set may be suppressed.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="interop" numbered="true" toc="default"> | ||||
<section title="Interoperation With Older Versions of IGMP" anchor="interop"> | <name>Interoperation With Older Versions of IGMP</name> | |||
<t>IGMP version 3 hosts and routers interoperate with hosts and routers | ||||
<t>IGMP version 3 hosts and routers interoperate with hosts and routers | ||||
that have not yet been upgraded to IGMPv3. This compatibility is | that have not yet been upgraded to IGMPv3. This compatibility is | |||
maintained by hosts and routers taking appropriate actions depending | maintained by hosts and routers taking appropriate actions depending | |||
on the versions of IGMP operating on hosts and routers within a | on the versions of IGMP operating on hosts and routers within a | |||
network.</t> | network.</t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Query Version Distinctions"> | <name>Query Version Distinctions</name> | |||
<t>The IGMP version of a Membership Query message is determined as | ||||
<t>The IGMP version of a Membership Query message is determined as | ||||
follows: | follows: | |||
<list style="empty"> | </t> | |||
<t>IGMPv1 Query: length = 8 octets AND Max Resp Code field is zero</t> | <ul spacing="normal"> | |||
<t>IGMPv2 Query: length = 8 octets AND Max Resp Code field is non-zero | <li> | |||
</t> | <t>IGMPv1 Query: length = 8 octets AND Max Resp Code field is zero</ | |||
<t>IGMPv3 Query: length >= 12 octets</t> | t> | |||
</list></t> | </li> | |||
<li> | ||||
<t>Query messages that do not match any of the above conditions (e.g., a | <t>IGMPv2 Query: length = 8 octets AND Max Resp Code field is non-ze | |||
Query of length 10 octets) MUST be silently ignored.</t> | ro</t> | |||
</section> | </li> | |||
<li> | ||||
<section title="Group Member Behavior"> | <t>IGMPv3 Query: length >= 12 octets</t> | |||
<section title="In the Presence of Older Version Queriers"> | </li> | |||
</ul> | ||||
<t>In order to be compatible with older version routers, IGMPv3 hosts | <t>Query messages that do not match any of the above conditions (e.g., a | |||
MUST operate in version 1 and version 2 compatibility modes. IGMPv3 | Query of length 10 octets) <bcp14>MUST</bcp14> be silently ignored.</t> | |||
hosts MUST keep state per local interface regarding the compatibility | </section> | |||
mode of each attached network. A host's compatibility mode is | <section numbered="true" toc="default"> | |||
determined from the Host Compatibility Mode variable which can be in | <name>Group Member Behavior</name> | |||
one of three states: IGMPv1, IGMPv2 or IGMPv3. This variable is | <section numbered="true" toc="default"> | |||
<name>In the Presence of Older Version Queriers</name> | ||||
<t>In order to be compatible with older version routers, IGMPv3 hosts | ||||
<bcp14>MUST</bcp14> operate in version 1 and version 2 compatibility modes. I | ||||
GMPv3 | ||||
hosts <bcp14>MUST</bcp14> keep state per local interface regarding the compat | ||||
ibility mode of each attached network. A host's compatibility mode is | ||||
determined from the Host Compatibility Mode variable, which can be in | ||||
one of three states: IGMPv1, IGMPv2, or IGMPv3. This variable is | ||||
kept per interface and is dependent on the version of General Queries | kept per interface and is dependent on the version of General Queries | |||
heard on that interface as well as the Older Version Querier Present | heard on that interface as well as the Older Version Querier Present | |||
timers for the interface.</t> | timers for the interface.</t> | |||
<t>In order to switch gracefully between versions of IGMP, hosts keep | ||||
<t>In order to switch gracefully between versions of IGMP, hosts keep | ||||
both an IGMPv1 Querier Present timer and an IGMPv2 Querier Present | both an IGMPv1 Querier Present timer and an IGMPv2 Querier Present | |||
timer per interface. IGMPv1 Querier Present is set to Older Version | timer per interface. IGMPv1 Querier Present is set to Older Version | |||
Querier Present Timeout seconds whenever an IGMPv1 Membership Query | Querier Present Timeout seconds whenever an IGMPv1 Membership Query | |||
is received. IGMPv2 Querier Present is set to Older Version Querier | is received. IGMPv2 Querier Present is set to Older Version Querier | |||
Present Timeout seconds whenever an IGMPv2 General Query is received.< /t> | Present Timeout seconds whenever an IGMPv2 General Query is received.< /t> | |||
<t>The Host Compatibility Mode of an interface changes whenever an old | ||||
<t>The Host Compatibility Mode of an interface changes whenever an older | er | |||
version query (than the current compatibility mode) is heard or when | version query (than the current compatibility mode) is heard or when | |||
certain timer conditions occur. When the IGMPv1 Querier Present | certain timer conditions occur. When the IGMPv1 Querier Present | |||
timer expires, a host switches to Host Compatibility mode of IGMPv2 | timer expires, a host switches to Host Compatibility Mode of IGMPv2 | |||
if it has a running IGMPv2 Querier Present timer. If it does not | if it has a running IGMPv2 Querier Present timer. If it does not | |||
have a running IGMPv2 Querier Present timer then it switches to Host | have a running IGMPv2 Querier Present timer, then it switches to Host | |||
Compatibility of IGMPv3. When the IGMPv2 Querier Present timer | Compatibility of IGMPv3. When the IGMPv2 Querier Present timer | |||
expires, a host switches to Host Compatibility mode of IGMPv3.</t> | expires, a host switches to Host Compatibility Mode of IGMPv3.</t> | |||
<t>The Host Compatibility Mode variable is based on whether an older | ||||
<t>The Host Compatibility Mode variable is based on whether an older | ||||
version General query was heard in the last Older Version Querier | version General query was heard in the last Older Version Querier | |||
Present Timeout seconds. The Host Compatibility mode variable value MUST NOT | Present Timeout seconds. The Host Compatibility Mode variable value <bcp14>MU ST NOT</bcp14> | |||
be changed by an older version group-specific query. | be changed by an older version group-specific query. | |||
The Host Compatibility Mode is set depending on the following:</t> | The Host Compatibility Mode is set depending on the following:</t> | |||
<texttable> | <table align="center"> | |||
<ttcol align="center">Host Compatibility Mode</ttcol> | <thead> | |||
<ttcol align="center">Timer State</ttcol> | <tr> | |||
<c>IGMPv3 (default)</c><c>IGMPv2 Querier Present not running and IGMPv1 Qu | <th align="left">Host Compatibility Mode</th> | |||
erier Present not running</c> | <th align="left">Timer State</th> | |||
<c>IGMPv2</c><c>IGMPv2 Querier Present running and IGMPv1 Querier Present | </tr> | |||
not running</c> | </thead> | |||
<c>IGMPv1</c><c>IGMPv1 Querier Present running</c> | <tbody> | |||
</texttable> | <tr> | |||
<td align="left">IGMPv3 (default)</td> | ||||
<t>If a host receives a query which causes its Querier Present timers to | <td align="left">IGMPv2 Querier Present not running and IGMPv1 Q | |||
uerier Present not running</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">IGMPv2</td> | ||||
<td align="left">IGMPv2 Querier Present running and IGMPv1 Queri | ||||
er Present not running</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">IGMPv1</td> | ||||
<td align="left">IGMPv1 Querier Present running</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>If a host receives a query that causes its Querier Present timers t | ||||
o | ||||
be updated and correspondingly its compatibility mode, it should | be updated and correspondingly its compatibility mode, it should | |||
switch compatibility modes immediately.</t> | switch compatibility modes immediately.</t> | |||
<t>When Host Compatibility Mode is IGMPv3, a host acts using the IGMPv | ||||
<t>When Host Compatibility Mode is IGMPv3, a host acts using the IGMPv3 | 3 | |||
protocol on that interface. When Host Compatibility Mode is IGMPv2, | protocol on that interface. When Host Compatibility Mode is IGMPv2, | |||
a host acts in IGMPv2 compatibility mode, using only the IGMPv2 | a host acts in IGMPv2 compatibility mode, using only the IGMPv2 | |||
protocol, on that interface. When Host Compatibility Mode is IGMPv1, | protocol, on that interface. When Host Compatibility Mode is IGMPv1, | |||
a host acts in IGMPv1 compatibility mode, using only the IGMPv1 | a host acts in IGMPv1 compatibility mode, using only the IGMPv1 | |||
protocol on that interface.</t> | protocol on that interface.</t> | |||
<t>An IGMPv1 router will send General Queries with the Max Resp Code s | ||||
<t>An IGMPv1 router will send General Queries with the Max Resp Code set | et | |||
to 0. This MUST be interpreted as a value of 100 (10 seconds).</t> | to 0. This <bcp14>MUST</bcp14> be interpreted as a value of 100 (10 seconds) | |||
.</t> | ||||
<t>An IGMPv2 router will send General Queries with the Max Resp Code set | <t>An IGMPv2 router will send General Queries with the Max Resp Code s | |||
et | ||||
to the desired Max Resp Time, i.e., the full range of this field is | to the desired Max Resp Time, i.e., the full range of this field is | |||
linear and the exponential algorithm described in <xref target="max_re sp_code" /> is | linear and the exponential algorithm described in <xref target="max_re sp_code" format="default"/> is | |||
not used.</t> | not used.</t> | |||
<t>Whenever a host changes its compatibility mode, it cancels all its | ||||
<t>Whenever a host changes its compatibility mode, it cancels all its | ||||
pending response and retransmission timers.</t> | pending response and retransmission timers.</t> | |||
<t>An SSM-aware host that receives an IGMPv1 Query, an IGMPv2 General | ||||
<t>An SSM-aware host that receives an IGMPv1 Query, an IGMPv2 General Query, | Query, | |||
or an IGMPv2 Group Specific Query for a multicast address in the SSM address range | or an IGMPv2 Group Specific Query for a multicast address in the SSM address range | |||
SHOULD log an error. It is RECOMMENDED that implementions provide a configura | <bcp14>SHOULD</bcp14> log an error. It is <bcp14>RECOMMENDED</bcp14> that imp | |||
tion option | lementations provide a configuration option | |||
to disable use of Host Compatibility Mode to allow networks to operate only i | to disable use of the Host Compatibility Mode to allow networks to operate on | |||
n SSM mode. | ly in SSM mode. | |||
This configuration option SHOULD be disabled by default.</t> | This configuration option <bcp14>SHOULD</bcp14> be disabled by default.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="In the Presence of Older Version Group Members"> | <name>In the Presence of Older Version Group Members</name> | |||
<t>An IGMPv3 host may be placed on a network where there are hosts tha | ||||
<t>An IGMPv3 host may be placed on a network where there are hosts that | t | |||
have not yet been upgraded to IGMPv3. A host MAY allow its IGMPv3 | have not yet been upgraded to IGMPv3. A host <bcp14>MAY</bcp14> allow its IG | |||
MPv3 | ||||
Membership Record to be suppressed by either a Version 1 Membership | Membership Record to be suppressed by either a Version 1 Membership | |||
Report, or a Version 2 Membership Report. SSM-aware hosts MUST NOT allow | Report, or a Version 2 Membership Report. SSM-aware hosts <bcp14>MUST NOT</bc p14> allow | |||
its IGMPv3 Membership Record to be suppressed.</t> | its IGMPv3 Membership Record to be suppressed.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Multicast Router Behavior"> | <name>Multicast Router Behavior</name> | |||
<section title="In the Presence of Older Version Queriers"> | <section numbered="true" toc="default"> | |||
<name>In the Presence of Older Version Queriers</name> | ||||
<t>IGMPv3 routers may be placed on a network where at least one router | <t>IGMPv3 routers may be placed on a network where at least one router | |||
on the network has not yet been upgraded to IGMPv3. The following | on the network has not yet been upgraded to IGMPv3. The following | |||
requirements apply: | requirements apply: | |||
<list style="symbols"> | </t> | |||
<ul spacing="normal"> | ||||
<t>If any older versions of IGMP are present on routers, the querier | <li> | |||
MUST use the lowest version of IGMP present on the network. This | <t>If any older versions of IGMP are present on routers, the queri | |||
er | ||||
<bcp14>MUST</bcp14> use the lowest version of IGMP present on the network. | ||||
This | ||||
must be administratively assured; routers that desire to be | must be administratively assured; routers that desire to be | |||
compatible with IGMPv1 and IGMPv2 MUST have a configuration option | compatible with IGMPv1 and IGMPv2 <bcp14>MUST</bcp14> have a configuration option | |||
to act in IGMPv1 or IGMPv2 compatibility modes. When in IGMPv1 | to act in IGMPv1 or IGMPv2 compatibility modes. When in IGMPv1 | |||
mode, routers MUST send Periodic Queries with a Max Resp Code of 0 | mode, routers <bcp14>MUST</bcp14> send Periodic Queries with a Max Resp Cod | |||
and truncated at the Group Address field (i.e., 8 bytes long), and | e of 0 | |||
MUST ignore Leave Group messages. They SHOULD also warn about | and truncated at the Group Address field (i.e., 8 bytes long) and | |||
receiving an IGMPv2 or IGMPv3 query, although such warnings MUST be | <bcp14>MUST</bcp14> ignore Leave Group messages. They <bcp14>SHOULD</bcp14 | |||
rate-limited. When in IGMPv2 mode, routers MUST send Periodic | > also warn about | |||
Queries truncated at the Group Address field (i.e., 8 bytes long), | receiving an IGMPv2 or IGMPv3 query, although such warnings <bcp14>MUST</bc | |||
and SHOULD also warn about receiving an IGMPv3 query (such warnings | p14> be | |||
MUST be rate-limited). They also MUST fill in the Max Resp Time in | rate-limited. When in IGMPv2 mode, routers <bcp14>MUST</bcp14> send Period | |||
ic | ||||
Queries truncated at the Group Address field (i.e., 8 bytes long) | ||||
and <bcp14>SHOULD</bcp14> also warn about receiving an IGMPv3 query (such w | ||||
arnings | ||||
<bcp14>MUST</bcp14> be rate-limited). They also <bcp14>MUST</bcp14> fill i | ||||
n the Max Resp Time in | ||||
the Max Resp Code field, i.e., the exponential algorithm described | the Max Resp Code field, i.e., the exponential algorithm described | |||
in <xref target="max_resp_code" /> is not used.</t> | in <xref target="max_resp_code" format="default"/> is not used.</t> | |||
</li> | ||||
<t>If a router is not explicitly configured to use IGMPv1 or IGMPv2 | <li> | |||
and hears an IGMPv1 Query or IGMPv2 General Query, it SHOULD log a | <t>If a router is not explicitly configured to use IGMPv1 or IGMPv | |||
warning. These warnings MUST be rate-limited.</t> | 2 | |||
<t>It is RECOMMENDED that implementions provide a configuration option | and hears an IGMPv1 Query or IGMPv2 General Query, it <bcp14>SHOULD</bcp14> | |||
log a | ||||
warning. These warnings <bcp14>MUST</bcp14> be rate-limited.</t> | ||||
</li> | ||||
<li> | ||||
<t>It is <bcp14>RECOMMENDED</bcp14> that implementations provide a | ||||
configuration option | ||||
to disable use of compatibility mode to allow networks to operate only | to disable use of compatibility mode to allow networks to operate only | |||
in SSM mode. This configuration option SHOULD be disabled by default.</t> | in SSM mode. This configuration option <bcp14>SHOULD</bcp14> be disabled by d | |||
</list></t> | efault.</t> | |||
</section> | </li> | |||
</ul> | ||||
<section title="In the Presence of Older Version Group Members"> | </section> | |||
<section numbered="true" toc="default"> | ||||
<t>IGMPv3 routers may be placed on a network where there are hosts that | <name>In the Presence of Older Version Group Members</name> | |||
<t>IGMPv3 routers may be placed on a network where there are hosts tha | ||||
t | ||||
have not yet been upgraded to IGMPv3. In order to be compatible with | have not yet been upgraded to IGMPv3. In order to be compatible with | |||
older version hosts, IGMPv3 routers MUST operate in version 1 and | older version hosts, IGMPv3 routers <bcp14>MUST</bcp14> operate in version 1 and | |||
version 2 compatibility modes. IGMPv3 routers keep a compatibility | version 2 compatibility modes. IGMPv3 routers keep a compatibility | |||
mode per group record. A group's compatibility mode is determined | mode per group record. A group's compatibility mode is determined | |||
from the Group Compatibility Mode variable which can be in one of | from the Group Compatibility Mode variable, which can be in one of | |||
three states: IGMPv1, IGMPv2 or IGMPv3. This variable is kept per | three states: IGMPv1, IGMPv2, or IGMPv3. This variable is kept per | |||
group record and is dependent on the version of Membership Reports | group record and is dependent on the version of Membership Reports | |||
heard for that group as well as the Older Version Host Present timer | heard for that group as well as the Older Version Host Present timer | |||
for the group.</t> | for the group.</t> | |||
<t>In order to switch gracefully between versions of IGMP, routers kee | ||||
<t>In order to switch gracefully between versions of IGMP, routers keep | p | |||
an IGMPv1 Host Present timer and an IGMPv2 Host Present timer per | an IGMPv1 Host Present timer and an IGMPv2 Host Present timer per | |||
group record. The IGMPv1 Host Present timer is set to Older Version | group record. The IGMPv1 Host Present timer is set to Older Version | |||
Host Present Timeout seconds whenever an IGMPv1 Membership Report is | Host Present Timeout seconds whenever an IGMPv1 Membership Report is | |||
received. The IGMPv2 Host Present timer is set to Older Version Host | received. The IGMPv2 Host Present timer is set to Older Version Host | |||
Present Timeout seconds whenever an IGMPv2 Membership Report is | Present Timeout seconds whenever an IGMPv2 Membership Report is | |||
received.</t> | received.</t> | |||
<t>The Group Compatibility Mode of a group record changes whenever an | ||||
<t>The Group Compatibility Mode of a group record changes whenever an | ||||
older version report (than the current compatibility mode) is heard | older version report (than the current compatibility mode) is heard | |||
or when certain timer conditions occur. When the IGMPv1 Host Present | or when certain timer conditions occur. When the IGMPv1 Host Present | |||
timer expires, a router switches to Group Compatibility mode of | timer expires, a router switches to Group Compatibility Mode of | |||
IGMPv2 if it has a running IGMPv2 Host Present timer. If it does not | IGMPv2 if it has a running IGMPv2 Host Present timer. If it does not | |||
have a running IGMPv2 Host Present timer then it switches to Group | have a running IGMPv2 Host Present timer, then it switches to Group | |||
Compatibility of IGMPv3. When the IGMPv2 Host Present timer expires | Compatibility Mode of IGMPv3. When the IGMPv2 Host Present timer expires | |||
and the IGMPv1 Host Present timer is not running, a router switches | and the IGMPv1 Host Present timer is not running, a router switches | |||
to Group Compatibility mode of IGMPv3. Note that when a group | to Group Compatibility Mode of IGMPv3. Note that when a group | |||
switches back to IGMPv3 mode, it takes some time to regain source- | switches back to IGMPv3 mode, it takes some time to regain source- | |||
specific state information. Source-specific information will be | specific state information. Source-specific information will be | |||
learned during the next General Query, but sources that should be | learned during the next General Query, but sources that should be | |||
blocked will not be blocked until [Group Membership Interval] after | blocked will not be blocked until [Group Membership Interval] after | |||
that.</t> | that.</t> | |||
<t>The Group Compatibility Mode variable is based on whether an older | ||||
<t>The Group Compatibility Mode variable is based on whether an older | ||||
version report was heard in the last Older Version Host Present | version report was heard in the last Older Version Host Present | |||
Timeout seconds. The Group Compatibility Mode is set depending on | Timeout seconds. The Group Compatibility Mode is set depending on | |||
the following:</t> | the following:</t> | |||
<texttable> | <table align="center"> | |||
<ttcol align="center">Group Compatibility Mode</ttcol> | <thead> | |||
<ttcol align="center">Timer State</ttcol> | <tr> | |||
<c>IGMPv3 (default)</c><c>IGMPv2 Host Present not running and IGMPv1 Host | <th align="left">Group Compatibility Mode</th> | |||
Present not running</c> | <th align="left">Timer State</th> | |||
<c>IGMPv2</c><c>IGMPv2 Host Present running and IGMPv1 Host Present not ru | </tr> | |||
nning</c> | </thead> | |||
<c>IGMPv1</c><c>IGMPv1 Host Present running</c> | <tbody> | |||
</texttable> | <tr> | |||
<td align="left">IGMPv3 (default)</td> | ||||
<t>If a router receives a report which causes its older Host Present | <td align="left">IGMPv2 Host Present not running and IGMPv1 Host | |||
Present not running</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">IGMPv2</td> | ||||
<td align="left">IGMPv2 Host Present running and IGMPv1 Host Pre | ||||
sent not running</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">IGMPv1</td> | ||||
<td align="left">IGMPv1 Host Present running</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>If a router receives a report that causes its older Host Present | ||||
timers to be updated and correspondingly its compatibility mode, it | timers to be updated and correspondingly its compatibility mode, it | |||
SHOULD switch compatibility modes immediately.</t> | <bcp14>SHOULD</bcp14> switch compatibility modes immediately.</t> | |||
<t>When Group Compatibility Mode is IGMPv3, a router acts using the | ||||
<t>When Group Compatibility Mode is IGMPv3, a router acts using the | ||||
IGMPv3 protocol for that group.</t> | IGMPv3 protocol for that group.</t> | |||
<t>When Group Compatibility Mode is IGMPv2, a router internally | ||||
<t>When Group Compatibility Mode is IGMPv2, a router internally | ||||
translates the following IGMPv2 messages for that group to their | translates the following IGMPv2 messages for that group to their | |||
IGMPv3 equivalents:</t> | IGMPv3 equivalents:</t> | |||
<texttable> | <table align="center"> | |||
<ttcol align="center">IGMPv2 Message</ttcol> | <thead> | |||
<ttcol align="center">IGMPv3 Equivalent</ttcol> | <tr> | |||
<c>Report</c><c>IS_EX( {} )</c> | <th align="left">IGMPv2 Message</th> | |||
<c>Leave</c><c>TO_IN( {} )</c> | <th align="left">IGMPv3 Equivalent</th> | |||
</texttable> | </tr> | |||
</thead> | ||||
<t>IGMPv3 BLOCK messages are ignored, as are source-lists in TO_EX() | <tbody> | |||
<tr> | ||||
<td align="left">Report</td> | ||||
<td align="left">IS_EX( {} )</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">Leave</td> | ||||
<td align="left">TO_IN( {} )</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>IGMPv3 BLOCK messages are ignored, as are source-lists in TO_EX() | ||||
messages (i.e., any TO_EX() message is treated as TO_EX( {} )).</t> | messages (i.e., any TO_EX() message is treated as TO_EX( {} )).</t> | |||
<t>When Group Compatibility Mode is IGMPv1, a router internally | ||||
<t>When Group Compatibility Mode is IGMPv1, a router internally | ||||
translates the following IGMPv1 and IGMPv2 messages for that group to | translates the following IGMPv1 and IGMPv2 messages for that group to | |||
their IGMPv3 equivalents:</t> | their IGMPv3 equivalents:</t> | |||
<texttable> | <table align="center"> | |||
<ttcol align="center">IGMPv2 Message</ttcol> | <thead> | |||
<ttcol align="center">IGMPv3 Equivalent</ttcol> | <tr> | |||
<c>v1 Report</c><c>IS_EX( {} )</c> | <th align="left">IGMPv2 Message</th> | |||
<c>v2 Report</c><c>IS_EX( {} )</c> | <th align="left">IGMPv3 Equivalent</th> | |||
</texttable> | </tr> | |||
</thead> | ||||
<t>In addition to ignoring IGMPv3 BLOCK messages and source-lists in | <tbody> | |||
<tr> | ||||
<td align="left">v1 Report</td> | ||||
<td align="left">IS_EX( {} )</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">v2 Report</td> | ||||
<td align="left">IS_EX( {} )</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>In addition to ignoring IGMPv3 BLOCK messages and source-lists in | ||||
TO_EX() messages as in IGMPv2 Group Compatibility Mode, IGMPv2 Leave | TO_EX() messages as in IGMPv2 Group Compatibility Mode, IGMPv2 Leave | |||
messages and IGMPv3 TO_IN() messages are also ignored.</t> | messages and IGMPv3 TO_IN() messages are also ignored.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="timers" numbered="true" toc="default"> | ||||
<name>List of Timers, Counters, and Their Default Values</name> | ||||
<section title="List of Timers, Counters and Their Default Values" anchor="ti | <!--[rfced] What does "these" refer to in this sentence? Can the text | |||
mers"> | be rephrased for clarity as shown below? | |||
<t>Most of these timers are configurable. If non-default settings are | Original: | |||
used, they MUST be consistent among all systems on a single link. | 8. List of Timers, Counters and Their Default Values | |||
Note that parentheses are used to group expressions to make the | ||||
algebra clear.</t> | ||||
<section title="Robustness Variable" anchor="robust"> | Most of these timers are configurable. | |||
<t>The Robustness Variable allows tuning for the expected packet loss on | Perhaps: | |||
a network. If a network is expected to be lossy, the Robustness | 8. List of Timers, Counters, and Their Default Values | |||
Variable may be increased. IGMP is robust to (Robustness Variable - | ||||
1) packet losses. The Robustness Variable MUST NOT be zero, and | ||||
SHOULD NOT be one. Default: 2</t> | ||||
</section> | Most timers and counters are configurable. | |||
<section title="Query Interval" anchor="qry_int"> | --> | |||
<t>The Query Interval is the interval between General Queries sent by | <t>Most of these timers are configurable. If non-default settings are | |||
used, they <bcp14>MUST</bcp14> be consistent among all systems on a single li | ||||
nk. | ||||
Note that parentheses are used to group expressions to make the | ||||
algebra clear.</t> | ||||
<section anchor="robust" numbered="true" toc="default"> | ||||
<name>Robustness Variable</name> | ||||
<t>The Robustness Variable allows tuning for the expected packet loss on | ||||
a network. If a network is expected to be lossy, the Robustness | ||||
Variable may be increased. IGMP is robust to (Robustness Variable - | ||||
1) packet losses. The Robustness Variable <bcp14>MUST NOT</bcp14> be zero an | ||||
d | ||||
<bcp14>SHOULD NOT</bcp14> be one. Default: 2.</t> | ||||
</section> | ||||
<section anchor="qry_int" numbered="true" toc="default"> | ||||
<name>Query Interval</name> | ||||
<t>The Query Interval is the interval between General Queries sent by | ||||
the Querier. Default: 125 seconds.</t> | the Querier. Default: 125 seconds.</t> | |||
<t>By varying the [Query Interval], an administrator may tune the number | ||||
<t>By varying the [Query Interval], an administrator may tune the number | ||||
of IGMP messages on the network; larger values cause IGMP Queries to | of IGMP messages on the network; larger values cause IGMP Queries to | |||
be sent less often.</t> | be sent less often.</t> | |||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>Query Response Interval</name> | ||||
</section> | <!--[rfced] We updated this text to be a complete sentence. Please let | |||
<section title="Query Response Interval"> | us know if it is not correct. | |||
<t>The Max Response Time used to calculate the Max Resp Code inserted | Original: | |||
into the periodic General Queries. Default: 100 (10 seconds)</t> | 8.3. Query Response Interval | |||
<t>By varying the [Query Response Interval], an administrator may tune | The Max Response Time used to calculate the Max Resp Code inserted | |||
into the periodic General Queries. | ||||
Current: | ||||
8.3. Query Response Interval | ||||
The Query Response Interval uses the Max Response Time to calculate | ||||
the Max Resp Code that is inserted into the periodic General Queries. | ||||
--> | ||||
<t>The Query Response Interval uses the Max Response Time to calculate t | ||||
he Max Resp Code that is inserted into the periodic General Queries. Default: 1 | ||||
00 (10 seconds).</t> | ||||
<t>By varying the [Query Response Interval], an administrator may tune | ||||
the burstiness of IGMP messages on the network; larger values make | the burstiness of IGMP messages on the network; larger values make | |||
the traffic less bursty, as host responses are spread out over a | the traffic less bursty, as host responses are spread out over a | |||
larger interval. The number of seconds represented by the [Query | larger interval. The number of seconds represented by the [Query | |||
Response Interval] must be less than the [Query Interval].</t> | Response Interval] must be less than the [Query Interval].</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<section title="Group Membership Interval"> | <name>Group Membership Interval</name> | |||
<t>The Group Membership Interval is the amount of time that must pass | ||||
<t>The Group Membership Interval is the amount of time that must pass | ||||
before a multicast router decides there are no more members of a | before a multicast router decides there are no more members of a | |||
group or a particular source on a network.</t> | group or a particular source on a network.</t> | |||
<t>This value <bcp14>MUST</bcp14> be ((the Robustness Variable) times (t | ||||
<t>This value MUST be ((the Robustness Variable) times (the Query | he Query | |||
Interval)) plus (2 * Query Response Interval).</t> | Interval)) plus (2 * Query Response Interval).</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<section title="Other Querier Present Interval"> | <name>Other Querier Present Interval</name> | |||
<t>The Other Querier Present Interval is the length of time that must | ||||
<t>The Other Querier Present Interval is the length of time that must | ||||
pass before a multicast router decides that there is no longer | pass before a multicast router decides that there is no longer | |||
another multicast router which should be the querier. This value | another multicast router that should be the querier. This value | |||
MUST be ((the Robustness Variable) times (the Query Interval)) plus | <bcp14>MUST</bcp14> be ((the Robustness Variable) times (the Query Interval)) | |||
plus | ||||
(one half of one Query Response Interval).</t> | (one half of one Query Response Interval).</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<section title="Startup Query Interval"> | <name>Startup Query Interval</name> | |||
<t>The Startup Query Interval is the interval between General Queries | ||||
<t>The Startup Query Interval is the interval between General Queries | ||||
sent by a Querier on startup. Default: 1/4 the Query Interval.</t> | sent by a Querier on startup. Default: 1/4 the Query Interval.</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<section title="Startup Query Count"> | <name>Startup Query Count</name> | |||
<t>The Startup Query Count is the number of Queries sent out on startup, | ||||
<t>The Startup Query Count is the number of Queries sent out on startup, | separated by the Startup Query Interval. Default: The Robustness | |||
separated by the Startup Query Interval. Default: the Robustness | ||||
Variable.</t> | Variable.</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<section title="Last Member Query Interval"> | <name>Last Member Query Interval</name> | |||
<t>The Last Member Query Interval (LMQI) is the Max Response Time used t | ||||
<t>The Last Member Query Interval is the Max Response Time used to | o | |||
calculate the Max Resp Code inserted into Group-Specific Queries sent | calculate the Max Resp Code that is inserted into Group-Specific Queries sent | |||
in response to Leave Group messages. It is also the Max Response | in response to Leave Group messages. It is also the Max Response | |||
Time used in calculating the Max Resp Code for Group-and-Source- | Time used in calculating the Max Resp Code for Group-and-Source-Specific | |||
Specific Query messages. Default: 10 (1 second)</t> | Query messages. Default: 10 (1 second).</t> | |||
<t>Note that for values of LMQI greater than 12.8 seconds, a limited set | <t>Note that for values of LMQI greater than 12.8 seconds, a limited set | |||
of values can be represented, corresponding to sequential values of | of values can be represented, corresponding to sequential values of | |||
Max Resp Code. When converting a configured time to a Max Resp Code | Max Resp Code. When converting a configured time to a Max Resp Code | |||
value, it is recommended to use the exact value if possible, or the | value, it is recommended to use the exact value, if possible, or the | |||
next lower value if the requested value is not exactly representable.</t> | next lower value if the requested value is not exactly representable.</t> | |||
<t>This value may be tuned to modify the "leave latency" of the network. | ||||
<t>This value may be tuned to modify the "leave latency" of the network. | ||||
A reduced value results in reduced time to detect the loss of the | A reduced value results in reduced time to detect the loss of the | |||
last member of a group or source.</t> | last member of a group or source.</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<section title="Last Member Query Count"> | <name>Last Member Query Count</name> | |||
<t>The Last Member Query Count is the number of Group-Specific Queries | ||||
<t>The Last Member Query Count is the number of Group-Specific Queries | ||||
sent before the router assumes there are no local members. The Last | sent before the router assumes there are no local members. The Last | |||
Member Query Count is also the number of Group-and-Source-Specific | Member Query Count is also the number of Group-and-Source-Specific | |||
Queries sent before the router assumes there are no listeners for a | Queries sent before the router assumes there are no listeners for a | |||
particular source. Default: the Robustness Variable.</t> | particular source. Default: The Robustness Variable.</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<section title="Last Member Query Time"> | <name>Last Member Query Time</name> | |||
<t>The Last Member Query Time is the time value represented by the Last | ||||
<t>The Last Member Query Time is the time value represented by the Last | ||||
Member Query Interval, multiplied by the Last Member Query Count. It | Member Query Interval, multiplied by the Last Member Query Count. It | |||
is not a tunable value, but may be tuned by changing its components.</t> | is not a tunable value, but it may be tuned by changing its components.</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<section title="Unsolicited Report Interval"> | <name>Unsolicited Report Interval</name> | |||
<t>The Unsolicited Report Interval is the time between repetitions of a | ||||
<t>The Unsolicited Report Interval is the time between repetitions of a | ||||
host's initial report of membership in a group. Default: 1 second.</t> | host's initial report of membership in a group. Default: 1 second.</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<section title="Older Version Querier Present Interval"> | <name>Older Version Querier Present Interval</name> | |||
<t>The Older Version Querier Present Interval is the timeout for transitionin | <t>The Older Version Querier Present Interval is the timeout for transit | |||
g | ioning | |||
a host back to IGMPv3 mode once an older version query is heard. | a host back to IGMPv3 mode once an older version query is heard. | |||
When an older version query is received, hosts set their Older | When an older version query is received, hosts set their Older | |||
Version Querier Present Timer to Older Version Querier Present Interval.</t> | Version Querier Present Timer to Older Version Querier Present Interval.</t> | |||
<t>It is <bcp14>RECOMMENDED</bcp14> to use the default values for calcul | ||||
<t>It is RECOMMENDED to use the default values for calculating the interval v | ating the interval value | |||
alue | ||||
as hosts do not know the values configured on the querying routers. | as hosts do not know the values configured on the querying routers. | |||
This value SHOULD be [Robustness Variable] times [Query | This value <bcp14>SHOULD</bcp14> be [Robustness Variable] times [Query | |||
Interval] plus (10 times the Max Resp Time in the last received query message ).</t> | Interval] plus (10 times the Max Resp Time in the last received query message ).</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<section title="Older Host Present Interval"> | <name>Older Host Present Interval</name> | |||
<t>The Older Host Present Interval is the timeout for transitioning a | ||||
<t>The Older Host Present Interval is the time-out for transitioning a | ||||
group back to IGMPv3 mode once an older version report is sent for | group back to IGMPv3 mode once an older version report is sent for | |||
that group. When an older version report is received, routers set | that group. When an older version report is received, routers set | |||
their Older Host Present Timer to Older Host Present Interval.</t> | their Older Host Present Timer to Older Host Present Interval.</t> | |||
<t>This value <bcp14>MUST</bcp14> be ((the Robustness Variable) times (t | ||||
<t>This value MUST be ((the Robustness Variable) times (the Query | he Query | |||
Interval)) plus (one Query Response Interval).</t> | Interval)) plus (one Query Response Interval).</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<section title="Configuring Timers"> | <name>Configuring Timers</name> | |||
<t>This section is meant to provide advice to network administrators on | ||||
<t>This section is meant to provide advice to network administrators on | ||||
how to tune these settings to their network. Ambitious router | how to tune these settings to their network. Ambitious router | |||
implementations might tune these settings dynamically based upon | implementations might tune these settings dynamically based upon | |||
changing characteristics of the network.</t> | changing characteristics of the network.</t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Robustness Variable"> | <name>Robustness Variable</name> | |||
<t>The Robustness Variable tunes IGMP to expected losses on a link. | ||||
<t>The Robustness Variable tunes IGMP to expected losses on a link. | ||||
IGMPv3 is robust to (Robustness Variable - 1) packet losses, e.g., if | IGMPv3 is robust to (Robustness Variable - 1) packet losses, e.g., if | |||
the Robustness Variable is set to the default value of 2, IGMPv3 is | the Robustness Variable is set to the default value of 2, IGMPv3 is | |||
robust to a single packet loss but may operate imperfectly if more | robust to a single packet loss but may operate imperfectly if more | |||
losses occur. On lossy subnetworks, the Robustness Variable should | losses occur. On lossy subnetworks, the Robustness Variable should | |||
be increased to allow for the expected level of packet loss. However, | be increased to allow for the expected level of packet loss. However, | |||
increasing the Robustness Variable increases the leave latency of the | increasing the Robustness Variable increases the leave latency of the | |||
subnetwork. (The leave latency is the time between when the last | subnetwork. (The leave latency is the time between when the last | |||
member stops listening to a source or group and when the traffic | member stops listening to a source or group and when the traffic | |||
stops flowing.)</t> | stops flowing.)</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<section title="Query Interval"> | <name>Query Interval</name> | |||
<t>The overall level of periodic IGMP traffic is inversely proportiona | ||||
<t>The overall level of periodic IGMP traffic is inversely proportional | l | |||
to the Query Interval. A longer Query Interval results in a lower | to the Query Interval. A longer Query Interval results in a lower | |||
overall level of IGMP traffic. The Query Interval MUST be equal to | overall level of IGMP traffic. The Query Interval <bcp14>MUST</bcp14> be equ al to | |||
or longer than the Max Response Time inserted in General Query | or longer than the Max Response Time inserted in General Query | |||
messages.</t> | messages.</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<section title="Max Response Time"> | <name>Max Response Time</name> | |||
<t>The burstiness of IGMP traffic is inversely proportional to the Max | ||||
<t>The burstiness of IGMP traffic is inversely proportional to the Max | ||||
Response Time. A longer Max Response Time will spread Report | Response Time. A longer Max Response Time will spread Report | |||
messages over a longer interval. However, a longer Max Response Time | messages over a longer interval. However, a longer Max Response Time | |||
in Group-Specific and Source-and-Group-Specific Queries extends the | in Group-Specific and Source-and-Group-Specific Queries extends the | |||
leave latency. (The leave latency is the time between when the last | leave latency. (The leave latency is the time between when the last | |||
member stops listening to a source or group and when the traffic | member stops listening to a source or group and when the traffic | |||
stops flowing.) The expected rate of Report messages can be | stops flowing.) The expected rate of Report messages can be | |||
calculated by dividing the expected number of Reporters by the Max | calculated by dividing the expected number of Reporters by the Max | |||
Response Time. The Max Response Time may be dynamically calculated | Response Time. The Max Response Time may be dynamically calculated | |||
per Query by using the expected number of Reporters for that Query as | per Query by using the expected number of Reporters for that Query as | |||
follows:</t> | follows:</t> | |||
<texttable> | <table align="center"> | |||
<ttcol align="center">Query Type</ttcol> | <thead> | |||
<ttcol align="center">Expected number of Reporters</ttcol> | <tr> | |||
<c>General Query</c><c>All systems on subnetwork</c> | <th align="left">Query Type</th> | |||
<c>Group-Specific Query</c><c>All systems that had expressed interest in t | <th align="left">Expected Number of Reporters</th> | |||
he group on the subnetwork</c> | </tr> | |||
<c>Source-and-Group-Specific Query</c><c>All systems on the subnetwork tha | </thead> | |||
t had expressed interest in | <tbody> | |||
the source and group</c> | <tr> | |||
</texttable> | <td align="left">General Query</td> | |||
<td align="left">All systems on the subnetwork</td> | ||||
<t>A router is not required to calculate these populations or tune the | </tr> | |||
<tr> | ||||
<td align="left">Group-Specific Query</td> | ||||
<td align="left">All systems that had expressed interest in the | ||||
group on the subnetwork</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">Source-and-Group-Specific Query</td> | ||||
<td align="left">All systems on the subnetwork that had expresse | ||||
d interest in | ||||
the source and group</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>A router is not required to calculate these populations or tune the | ||||
Max Response Time dynamically; these are simply guidelines.</t> | Max Response Time dynamically; these are simply guidelines.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Security Considerations"> | <name>Security Considerations</name> | |||
<t>IGMP provides any form of confidentiality. This means any device | ||||
<t>IGMP does provide any form of confidentiality. This means any device | ||||
on a link can passively receive any IGMP message on the link. Such access | on a link can passively receive any IGMP message on the link. Such access | |||
can lead to privacy concerns around potentially sensitive multicast groups | can lead to privacy concerns around potentially sensitive multicast groups | |||
or the ability to identify/map the devices on a link.</t> | or the ability to identify/map the devices on a link.</t> | |||
<t>We consider the ramifications of a forged message of each type and | ||||
<t>We consider the ramifications of a forged message of each type, and | describe the usage of an IPsec Authentication Header (AH) to authenticate mes | |||
describe the usage of IPsec AH to authenticate messages if desired.</t> | sages if desired.</t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Query Message"> | <name>Query Message</name> | |||
<t>A forged Query message from a machine with a lower IP address than | ||||
<t>A forged Query message from a machine with a lower IP address than | ||||
the current Querier will cause Querier duties to be assigned to the | the current Querier will cause Querier duties to be assigned to the | |||
forger. If the forger then sends no more Query messages, other | forger. If the forger then sends no more Query messages, other | |||
routers' Other Querier Present timer will time out and one will | routers' Other Querier Present timer will time out and one will | |||
resume the role of Querier. During this time, if the forger ignores | resume the role of Querier. During this time, if the forger ignores | |||
Leave Messages, traffic might flow to groups with no members for up | Leave messages, traffic might flow to groups with no members for up | |||
to [Group Membership Interval].</t> | to [Group Membership Interval].</t> | |||
<t>A Denial-of-Service (DoS) attack on a host could be staged through fo | ||||
<t>A DoS attack on a host could be staged through forged Group-and- | rged Group-and- | |||
Source-Specific Queries. The attacker can find out about membership | Source-Specific Queries. The attacker can find out about membership | |||
of a specific host with a general query. After that it could send a | of a specific host with a general query. After that, it could send a | |||
large number of Group-and-Source-Specific queries, each with a large | large number of Group-and-Source-Specific queries, each with a large | |||
source list and the Maximum Response Time set to a large value. The | source list and the Maximum Response Time set to a large value. The | |||
host will have to store and maintain the sources specified in all of | host 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. | those queries for as long as it takes to send the delayed response. | |||
This would consume both memory and CPU cycles in order to augment the | This would consume both memory and CPU cycles in order to augment the | |||
recorded sources with the source lists included in the successive | recorded sources with the source lists included in the successive | |||
queries.</t> | queries.</t> | |||
<t>To protect against such a DoS attack, a host stack implementation | ||||
<t>To protect against such a DoS attack, a host stack implementation | ||||
could restrict the number of Group-and-Source-Specific Queries per | could restrict the number of Group-and-Source-Specific Queries per | |||
group membership within this interval, and/or record only a limited | group membership within this interval and/or record only a limited | |||
number of sources.</t> | number of sources.</t> | |||
<t>Forged Query messages from the local network can be easily traced. | ||||
<t>Forged Query messages from the local network can be easily traced. | ||||
There are three measures necessary to defend against externally | There are three measures necessary to defend against externally | |||
forged Queries: | forged Queries: | |||
<list style="bullets"> | </t> | |||
<t>Routers SHOULD NOT forward Queries. This is easier for a router to | <ul spacing="normal"> | |||
accomplish if the Query carries the Router-Alert option.</t> | <li> | |||
<t>Routers <bcp14>SHOULD NOT</bcp14> forward Queries. This is easie | ||||
<t>Hosts SHOULD ignore v2 or v3 Queries without the Router-Alert | r for a router to | |||
accomplish if the Query carries the Router Alert option.</t> | ||||
</li> | ||||
<li> | ||||
<t>Hosts <bcp14>SHOULD</bcp14> ignore v2 or v3 Queries without the R | ||||
outer Alert | ||||
option.</t> | option.</t> | |||
</li> | ||||
<t>Hosts SHOULD ignore v1, v2 or v3 General Queries sent to a | <li> | |||
<t>Hosts <bcp14>SHOULD</bcp14> ignore v1, v2, or v3 General Queries | ||||
sent to a | ||||
multicast address other than 224.0.0.1, the all-systems address.</t> | multicast address other than 224.0.0.1, the all-systems address.</t> | |||
</list></t> | </li> | |||
</section> | </ul> | |||
</section> | ||||
<section title="Current-State Report messages"> | <section numbered="true" toc="default"> | |||
<name>Current-State Report Messages</name> | ||||
<t>A forged Report message may cause multicast routers to think there | <t>A forged Report message may cause multicast routers to think there | |||
are members of a group on a network when there are not. Forged | are members of a group on a network when there are not. Forged | |||
Report messages from the local network are meaningless, since joining | Report messages from the local network are meaningless, as joining | |||
a group on a host is generally an unprivileged operation, so a local | a group on a host is generally an unprivileged operation, so a local | |||
user may trivially gain the same result without forging any messages. | user may trivially gain the same result without forging any messages. | |||
Forged Report messages from external sources are more troublesome; | Forged Report messages from external sources are more troublesome; | |||
there are two defenses against externally forged Reports: | there are two defenses against externally forged Reports: | |||
<list style="bullets"> | </t> | |||
<t>Ignore the Report if you cannot identify the source address of the | <ol spacing="normal"> | |||
<li> | ||||
<t>Ignore the Report if you cannot identify the source address of th | ||||
e | ||||
packet as belonging to a network assigned to the interface on which | packet as belonging to a network assigned to the interface on which | |||
the packet was received. This solution means that Reports sent by | the packet was received. This solution means that Reports sent by | |||
mobile hosts without addresses on the local network will be | mobile hosts without addresses on the local network will be | |||
ignored. Report messages with a source address of 0.0.0.0 SHOULD | ignored. Report messages with a source address of 0.0.0.0 <bcp14>SHOULD</b cp14> | |||
be accepted on any interface.</t> | be accepted on any interface.</t> | |||
</li> | ||||
<t>Ignore Report messages without Router Alert options <xref target="RFC2113" | <li> | |||
/>, and | <t>Ignore Report messages without Router Alert options <xref target= | |||
require that routers not forward Report messages. (The requirement | "RFC2113" format="default"/> and | |||
require routers to not forward Report messages. (The requirement | ||||
is not a requirement of generalized filtering in the forwarding | is not a requirement of generalized filtering in the forwarding | |||
path, since the packets already have Router Alert options in them.) | path, as the packets already have Router Alert options in them.) | |||
This solution breaks backwards compatibility with implementations | This solution breaks backwards compatibility with implementations | |||
of IGMPv1 or earlier versions of IGMPv2 which did not require | of IGMPv1 or earlier versions of IGMPv2 that did not require a | |||
Router Alert.</t> | Router Alert.</t> | |||
</list></t> | </li> | |||
</ol> | ||||
<t>A forged Version 1 Report Message may put a router into "version 1 | <t>A forged Version 1 Report Message may put a router into "version 1 | |||
members present" state for a particular group, meaning that the | members present" state for a particular group, meaning that the | |||
router will ignore Leave messages. This can cause traffic to flow to | router will ignore Leave messages. This can cause traffic to flow to | |||
groups with no members for up to [Group Membership Interval]. This | groups with no members for up to [Group Membership Interval]. This | |||
can be solved by providing routers with a configuration switch to | can be solved by providing routers with a configuration switch to | |||
ignore Version 1 messages completely. This breaks automatic | ignore Version 1 messages completely. This breaks automatic | |||
compatibility with Version 1 hosts, so should only be used in | compatibility with Version 1 hosts, so it should only be used in | |||
situations where "fast leave" is critical.</t> | situations where "fast leave" is critical.</t> | |||
<t>A forged Version 2 Report Message may put a router into "version 2 | ||||
<t>A forged Version 2 Report Message may put a router into "version 2 | ||||
members present" state for a particular group, meaning that the | members present" state for a particular group, meaning that the | |||
router will ignore IGMPv3 source-specific state messages. This can | router will ignore IGMPv3 source-specific state messages. This can | |||
cause traffic to flow from unwanted sources for up to [Group | cause traffic to flow from unwanted sources for up to [Group | |||
Membership Interval]. This can be solved by providing routers with a | Membership Interval]. This can be solved by providing routers with a | |||
configuration switch to ignore Version 2 messages completely. This | configuration switch to ignore Version 2 messages completely. This | |||
breaks automatic compatibility with Version 2 hosts, so should only | breaks automatic compatibility with Version 2 hosts, so it should only | |||
be used in situations where source include and exclude is critical.</t> | be used in situations where source include and exclude is critical.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="State-Change Report Messages"> | <name>State-Change Report Messages</name> | |||
<t>A forged State-Change Report message will cause the Querier to send | ||||
<t>A forged State-Change Report message will cause the Querier to send | ||||
out Group-Specific or Source-and-Group-Specific Queries for the group | out Group-Specific or Source-and-Group-Specific Queries for the group | |||
in question. This causes extra processing on each router and on each | in question. This causes extra processing on each router and on each | |||
member of the group, but can not cause loss of desired traffic. | member of the group, but it cannot cause loss of desired traffic. | |||
There are two defenses against externally forged State-Change Report | There are two defenses against externally forged State-Change Report | |||
messages: | messages: | |||
<list style="bullets"> | </t> | |||
<t>Ignore the State-Change Report message if you cannot identify the | <ol spacing="normal"> | |||
<li> | ||||
<t>Ignore the State-Change Report message if you cannot identify the | ||||
source address of the packet as belonging to a subnet assigned to | source address of the packet as belonging to a subnet assigned to | |||
the interface on which the packet was received. This solution | the interface on which the packet was received. This solution | |||
means that State-Change Report messages sent by mobile hosts | means that State-Change Report messages sent by mobile hosts | |||
without addresses on the local subnet will be ignored. State- | without addresses on the local subnet will be ignored. State- | |||
Change Report messages with a source address of 0.0.0.0 SHOULD be | Change Report messages with a source address of 0.0.0.0 <bcp14>SHOULD</bcp1 4> be | |||
accepted on any interface.</t> | accepted on any interface.</t> | |||
</li> | ||||
<t>Ignore State-Change Report messages without Router Alert options | <li> | |||
<xref target="RFC2113" />, and require that routers not forward State-Change | <t>Ignore State-Change Report messages without Router Alert options | |||
<xref target="RFC2113" format="default"/> and require routers to not forward | ||||
State-Change | ||||
Report messages. (The requirement is not a requirement of | Report messages. (The requirement is not a requirement of | |||
generalized filtering in the forwarding path, since the packets | generalized filtering in the forwarding path, as the packets | |||
already have Router Alert options in them.)</t> | already have Router Alert options in them.)</t> | |||
</list></t> | </li> | |||
</section> | </ol> | |||
</section> | ||||
<section title="IPsec Usage"> | <section numbered="true" toc="default"> | |||
<name>IPsec Usage</name> | ||||
<t>In addition to these measures, IPsec in Authentication Header mode | <t>In addition to these measures, IPsec in AH mode | |||
<xref target="RFC4302" /> may be used to protect against remote attacks by en | <xref target="RFC4302" format="default"/> may be used to protect against remo | |||
suring that | te attacks by ensuring that IGMPv3 messages came from a system on the LAN (or, m | |||
IGMPv3 messages came from a system on the LAN (or, more specifically, | ore specifically, | |||
a system with the proper key). When using IPsec, the messages sent | from a system with the proper key). When using IPsec, the messages sent | |||
to 224.0.0.1 and 224.0.0.22 should be authenticated using AH. When | to 224.0.0.1 and 224.0.0.22 should be authenticated using AH. When | |||
keying, there are two possibilities: | keying, there are two possibilities: | |||
<list style="numbers"> | </t> | |||
<t>Use a symmetric signature algorithm with a single key for the LAN | <ol spacing="normal" type="1"><li> | |||
<t>Use a symmetric signature algorithm with a single key for the LAN | ||||
(or a key for each group). This allows validation that a packet | (or a key for each group). This allows validation that a packet | |||
was sent by a system with the key. This has the limitation that | was sent by a system with the key. This has the limitation that | |||
any system with the key can forge a message; it is not possible to | any system with the key can forge a message; it is not possible to | |||
authenticate the individual sender precisely. It also requires | authenticate the individual sender precisely. It also requires | |||
disabling IPSec's Replay Protection.</t> | disabling IPsec's Replay Protection.</t> | |||
</li> | ||||
<t>When appropriate key management standards have been developed, use | <li> | |||
<t>When appropriate key management standards have been developed, us | ||||
e | ||||
an asymmetric signature algorithm. All systems need to know the | an asymmetric signature algorithm. All systems need to know the | |||
public key of all routers, and all routers need to know the public | public key of all routers, and all routers need to know the public | |||
key of all systems. This requires a large amount of key | key of all systems. This requires a large amount of key | |||
management but has the advantage that senders can be authenticated | management but has the advantage that senders can be authenticated | |||
individually so e.g., a host cannot forge a message that only | individually so, e.g., a host cannot forge a message that only | |||
routers should be allowed to send.</t> | routers should be allowed to send.</t> | |||
</list></t> | </li> | |||
</ol> | ||||
<t>This solution only directly applies to Query and Leave messages in | <t>This solution only directly applies to Query and Leave messages in | |||
IGMPv1 and IGMPv2, since Reports are sent to the group being reported | IGMPv1 and IGMPv2 as Reports are sent to the group being reported, | |||
and it is not feasible to agree on a key for host-to-router | and it is not feasible to agree on a key for host-to-router | |||
communication for arbitrary multicast groups.</t> | communication for arbitrary multicast groups.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="IANA Considerations"> | <name>IANA Considerations</name> | |||
<t>All IGMP types described in this document are managed via <xref target="I- | <t>All IGMP types described in this document are managed via <xref target= | |||
D.ietf-pim-3228bis"/>.</t> | "RFC9778" format="default"/>.</t> | |||
<t>References to RFC 3376 that currently exist in IANA registries are to be u | <t>IANA has replaced each reference to <xref target="RFC3376"/> with a ref | |||
pdated to reference | erence to this document in both the "IGMP Type Numbers" and "IPFIX Information E | |||
this document. This includes a reference in the IGMP Type Numbers registry an | lements" registries. | |||
d the informational | </t> | |||
reference in the IPFIX Information Elements registry.</t> | </section> | |||
</section> | ||||
<section title="Contributors"> | ||||
<t>Brad Cain, Steve Deering, Isidor Kouvelas, Bill Fenner, and Ajit Thyagaraj | ||||
an | ||||
are the authors of RFC 3376, which forms the bulk of the content contained he | ||||
rein.</t> | ||||
<t>Anuj Budhiraja, Toerless Eckert, Olufemi Komolafe and Tim Winters have con | ||||
tributed | ||||
valuable content to this version of the specification.</t> | ||||
</section> | ||||
<section title="Acknowledgments"> | ||||
<t>We would like to thank Ran Atkinson, Luis Costa, Toerless Eckert, | ||||
Dino Farinacci, Serge Fdida, Wilbert de Graaf, Sumit Gupta, Mark | ||||
Handley, Bob Quinn, Michael Speer, Dave Thaler and Rolland Vida for | ||||
comments and suggestions on RFC 3376.</t> | ||||
<t>Stig Venaas, Hitoshi Asaeda, and Mike McBride have provided valuable feedb | ||||
ack on this | ||||
version of the specification and we thank them for their input.</t> | ||||
</section> | ||||
</middle> | ||||
<back> | ||||
<references title="Normative References"> | ||||
<?rfc include="reference.RFC.1112" ?> | ||||
<?rfc include="reference.RFC.2113" ?> | ||||
<?rfc include="reference.RFC.2119" ?> | ||||
<?rfc include="reference.RFC.2236" ?> | ||||
<?rfc include="reference.RFC.4302" ?> | ||||
<?rfc include="reference.RFC.4607" ?> | ||||
<?rfc include="reference.RFC.4604" ?> | ||||
<?rfc include="reference.RFC.8174" ?> | ||||
<?rfc include="reference.I-D.ietf-pim-3228bis" ?> | ||||
</references> | ||||
<references title="Informative References"> | </middle> | |||
<?rfc include="reference.RFC.1071" ?> | <back> | |||
<?rfc include="reference.RFC.3376" ?> | <references> | |||
<?rfc include="reference.RFC.3569" ?> | <name>References</name> | |||
<?rfc include="reference.RFC.3678" ?> | <references> | |||
</references> | <name>Normative References</name> | |||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1 | ||||
112.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | ||||
113.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | ||||
119.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | ||||
236.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | ||||
302.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | ||||
607.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | ||||
604.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
174.xml"/> | ||||
<section anchor="rationale" title="Design Rationale"> | <!-- [rfced] As RFC 9778 will be published with this document, please consider | |||
<section anchor="state-change" title="The Need for State-Change Messages"> | whether the reference should be to [BCP57] or [RFC9778]. | |||
<t>IGMPv3 specifies two types of Membership Reports: Current-State and | --> | |||
State Change. This section describes the rationale for the need for | <!-- [I-D.ietf-pim-3228bis] companion document RFC 9778 --> | |||
both these types of Reports.</t> | <reference anchor="RFC9778" target="https://www.rfc-editor.org/info/rfc97 | |||
78"> | ||||
<front> | ||||
<title>IANA Considerations for Internet Group Management Protocols</t | ||||
itle> | ||||
<author initials="B." surname="Haberman" fullname="Brian Haberman" ro | ||||
le="editor"> | ||||
<organization>Johns Hopkins University Applied Physics Lab</organiz | ||||
ation> | ||||
</author> | ||||
<date month="March" year="2025"/> | ||||
</front> | ||||
<seriesInfo name="BCP" value="57"/> | ||||
<seriesInfo name="RFC" value="9778"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC9778"/> | ||||
</reference> | ||||
<t>Routers need to distinguish Membership Reports that were sent in | </references> | |||
<references> | ||||
<name>Informative References</name> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1 | ||||
071.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3 | ||||
376.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3 | ||||
569.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3 | ||||
678.xml"/> | ||||
</references> | ||||
</references> | ||||
<section anchor="rationale" numbered="true" toc="default"> | ||||
<name>Design Rationale</name> | ||||
<section anchor="state-change" numbered="true" toc="default"> | ||||
<name>The Need for State-Change Messages</name> | ||||
<t>IGMPv3 specifies two types of Membership Reports: Current-State and | ||||
State Change. This section describes the rationale for needing both types of | ||||
Reports.</t> | ||||
<t>Routers need to distinguish Membership Reports that were sent in | ||||
response to Queries from those that were sent as a result of a change | response to Queries from those that were sent as a result of a change | |||
in interface state. Membership reports that are sent in response to | in interface state. Membership reports that are sent in response to | |||
Membership Queries are used mainly to refresh the existing state at | Membership Queries are used mainly to refresh the existing state at | |||
the router; they typically do not cause transitions in state at the | the router; they typically do not cause transitions in state at the | |||
router. Membership Reports that are sent in response to changes in | router. Membership Reports that are sent in response to changes in | |||
interface state require the router to take some action in response to | interface state require the router to take some action in response to | |||
the received report (see <xref target="rcv_rpts" />).</t> | the received report (see <xref target="rcv_rpts" format="default"/>).< | |||
/t> | ||||
<t>The inability to distinguish between the two types of reports would | <t>The inability to distinguish between the two types of reports would | |||
force a router to treat all Membership Reports as potential changes | force a router to treat all Membership Reports as potential changes | |||
in state and could result in increased processing at the router as | in state, and it could result in increased processing at the router as | |||
well as an increase in IGMP traffic on the network.</t> | well as an increase in IGMP traffic on the network.</t> | |||
</section> | </section> | |||
<section anchor="suppression" numbered="true" toc="default"> | ||||
<section anchor="suppression" title="Host Suppression"> | <name>Host Suppression</name> | |||
<t>In IGMPv1 and IGMPv2, a host would cancel sending a pending | <t>In IGMPv1 and IGMPv2, a host would cancel sending pending | |||
membership reports if a similar report was observed from another | membership reports if a similar report was observed from another | |||
member on the network. In IGMPv3, this suppression of host | member on the network. In IGMPv3, this suppression of host | |||
membership reports has been removed. The following points explain | membership reports has been removed. The following points explain | |||
the reasons behind this decision. | the reasons behind this decision. | |||
<list style="numbers"> | </t> | |||
<ol spacing="normal" type="1"><li> | ||||
<t>Routers may want to track per-host membership status on an | <t>Routers may want to track per-host membership status on an | |||
interface. This allows routers to implement fast leaves (e.g., | interface. This allows routers to implement fast leaves (e.g., | |||
for layered multicast congestion control schemes) as well as track | for layered multicast congestion control schemes) as well as track | |||
membership status for possible accounting purposes.</t> | membership status for possible accounting purposes.</t> | |||
</li> | ||||
<t>Membership Report suppression does not work well on bridged LANs. | <li> | |||
Many bridges and Layer2/Layer3 switches that implement IGMP | <t>Membership Report suppression does not work well on bridged LANs. | |||
Many bridges and Layer 2 / Layer 3 switches that implement IGMP | ||||
snooping do not forward IGMP messages across LAN segments in order | snooping do not forward IGMP messages across LAN segments in order | |||
to prevent membership report suppression. Removing membership | to prevent membership report suppression. Removing membership | |||
report suppression eases the job of these IGMP snooping devices.</t> | report suppression eases the job of these IGMP snooping devices.</t> | |||
</li> | ||||
<t>By eliminating membership report suppression, hosts have fewer | <li> | |||
<t>By eliminating membership report suppression, hosts have fewer | ||||
messages to process; this leads to a simpler state machine | messages to process; this leads to a simpler state machine | |||
implementation.</t> | implementation.</t> | |||
</li> | ||||
<t>In IGMPv3, a single membership report now bundles multiple | <li> | |||
<t>In IGMPv3, a single membership report now bundles multiple | ||||
multicast group records to decrease the number of packets sent. | multicast group records to decrease the number of packets sent. | |||
In comparison, the previous versions of IGMP required that each | In comparison, the previous versions of IGMP required that each | |||
multicast group be reported in a separate message.</t> | multicast group be reported in a separate message.</t> | |||
</list></t> | </li> | |||
</section> | </ol> | |||
</section> | ||||
<section anchor="switch-modes" title="Switching Router Filter Modes from EXCL | <section anchor="switch-modes" numbered="true" toc="default"> | |||
UDE to INCLUDE"> | <name>Switching Router Filter Modes from EXCLUDE to INCLUDE</name> | |||
<t>If hosts exist in both EXCLUDE and INCLUDE modes for a single | ||||
<t>If there exist hosts in both EXCLUDE and INCLUDE modes for a single | ||||
multicast group in a network, the router must be in EXCLUDE mode as | multicast group in a network, the router must be in EXCLUDE mode as | |||
well (see <xref target="sec-rfm" />). In EXCLUDE mode, a router forwards tra ffic | well (see <xref target="sec-rfm" format="default"/>). In EXCLUDE mode, a rou ter forwards traffic | |||
from all sources unless that source exists in the exclusion source | from all sources unless that source exists in the exclusion source | |||
list. If all hosts in EXCLUDE mode cease to exist, it would be | list. If all hosts in EXCLUDE mode cease to exist, it would be | |||
desirable for the router to switch back to INCLUDE mode seamlessly | desirable for the router to switch back to INCLUDE mode seamlessly | |||
without interrupting the flow of traffic to existing receivers.</t> | without interrupting the flow of traffic to existing receivers.</t> | |||
<t>One of the ways to accomplish this is for routers to keep track of | ||||
<t>One of the ways to accomplish this is for routers to keep track of | ||||
all sources desired by hosts that are in INCLUDE mode even though the | all sources desired by hosts that are in INCLUDE mode even though the | |||
router itself is in EXCLUDE mode. If the group timer now expires in | router itself is in EXCLUDE mode. If the group timer now expires in | |||
EXCLUDE mode, it implies that there are no hosts in EXCLUDE mode on | EXCLUDE mode, it implies that there are no hosts in EXCLUDE mode on | |||
the network (otherwise a membership report from that host would have | the network (otherwise, a membership report from that host would have | |||
refreshed the group timer). The router can then switch to INCLUDE | refreshed the group timer). The router can then switch to INCLUDE | |||
mode seamlessly with the list of sources currently being forwarded in | mode seamlessly with the list of sources currently being forwarded in | |||
its source list.</t> | its source list.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="summary" numbered="true" toc="default"> | ||||
<section anchor="summary" title="Summary of Changes from IGMPv2"> | <name>Summary of Changes from IGMPv2</name> | |||
<t>While the main additional feature of IGMPv3 is the addition of source | ||||
<t>While the main additional feature of IGMPv3 is the addition of source | filtering, the following is a summary of other changes from <xref target="RFC | |||
filtering, the following is a summary of other changes from RFC 2236. | 2236"/>. | |||
<list style="symbols"> | </t> | |||
<t>State is maintained as Group + List-of-Sources, not simply Group as | <ul spacing="normal"> | |||
<li> | ||||
<t>State is maintained as Group + List-of-Sources, not simply Group as | ||||
in IGMPv2.</t> | in IGMPv2.</t> | |||
</li> | ||||
<t>Interoperability with IGMPv1 and IGMPv2 systems is defined as | <li> | |||
<t>Interoperability with IGMPv1 and IGMPv2 systems is defined as | ||||
operations on the IGMPv3 state.</t> | operations on the IGMPv3 state.</t> | |||
</li> | ||||
<t>The IP Service Interface has changed to allow specification of | <li> | |||
<t>The IP service interface has changed, to allow specification of | ||||
source-lists.</t> | source-lists.</t> | |||
</li> | ||||
<t>The Querier includes its Robustness Variable and Query Interval in | <li> | |||
<t>The Querier includes its Robustness Variable and Query Interval in | ||||
Query packets to allow synchronization of these variables on non- | Query packets to allow synchronization of these variables on non- | |||
Queriers.</t> | Queriers.</t> | |||
</li> | ||||
<t>The Max Response Time in Query messages has an exponential range, | <li> | |||
<t>The Max Response Time in Query messages has an exponential range, | ||||
changing the maximum from 25.5 seconds to about 53 minutes, for use | changing the maximum from 25.5 seconds to about 53 minutes, for use | |||
on links with huge numbers of systems.</t> | on links with a huge number of systems.</t> | |||
</li> | ||||
<li> | ||||
<t>Hosts retransmit state-change messages for increased robustness.</t | ||||
> | ||||
</li> | ||||
<li> | ||||
<t>Additional data sections are defined, to allow later extensions.</t | ||||
> | ||||
</li> | ||||
<li> | ||||
<t>Report packets are sent to 224.0.0.22, to assist Layer 2 switches | ||||
in snooping.</t> | ||||
</li> | ||||
<li> | ||||
<t>Report packets can contain multiple group records, to allow | ||||
reporting of full current state using fewer packets.</t> | ||||
</li> | ||||
<li> | ||||
<t>Hosts no longer perform suppression, to simplify implementations | ||||
and permit explicit membership tracking.</t> | ||||
</li> | ||||
<li> | ||||
<t>A new S flag in Query messages | ||||
fixes robustness issues, which were also present in IGMPv2.</t> | ||||
</li> | ||||
</ul> | ||||
</section> | ||||
<section anchor="errata-details" numbered="true" toc="default"> | ||||
<name>Summary of Changes from RFC 3376</name> | ||||
<t>The following is a list of changes made since <xref target="RFC3376"/> | ||||
was published. | ||||
</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t>Modified the definition of Older Version Querier Present | ||||
Interval to address Erratum 4375.</t> | ||||
</li> | ||||
<li> | ||||
<t>Modified the metadata to fix the Obsoletes vs. Updates relationship | ||||
with <xref target="RFC2236"/> per Erratum 1501.</t> | ||||
</li> | ||||
<li> | ||||
<t>Updated the introductory text to describe the Updates relationship | ||||
with <xref target="RFC2236"/> per Erratum 7339.</t> | ||||
</li> | ||||
<li> | ||||
<t>Updated the definition of Group Membership Interval to address Erra | ||||
tum 6725.</t> | ||||
</li> | ||||
<li> | ||||
<t>Updated the text relating to the router filter-mode to address Erra | ||||
tum 5562.</t> | ||||
</li> | ||||
<li> | ||||
<t>Clarified the use of General Queries in the Querier election proces | ||||
s.</t> | ||||
</li> | ||||
</ul> | ||||
</section> | ||||
<t>Hosts retransmit state-change messages for increased robustness.</t> | <section numbered="false" toc="default"> | |||
<name>Acknowledgments</name> | ||||
<t>We would like to thank <contact fullname="Ran Atkinson"/>, <contact | ||||
fullname="Luis Costa"/>, <contact fullname="Toerless Eckert"/>, <contact | ||||
fullname="Dino Farinacci"/>, <contact fullname="Serge Fdida"/>, <contact | ||||
fullname="Wilbert de Graaf"/>, <contact fullname="Sumit Gupta"/>, | ||||
<contact fullname="Mark Handley"/>, <contact fullname="Bob Quinn"/>, | ||||
<contact fullname="Michael Speer"/>, <contact fullname="Dave Thaler"/>, | ||||
and <contact fullname="Rolland Vida"/> for comments and suggestions on | ||||
<xref target="RFC3376"/>.</t> | ||||
<t>Additional data sections are defined to allow later extensions.</t> | <t><contact fullname="Stig Venaas"/>, <contact fullname="Hitoshi | |||
Asaeda"/>, and <contact fullname="Mike McBride"/> have provided valuable | ||||
feedback on this specification, and we thank them for their input.</t> | ||||
</section> | ||||
<section numbered="false" toc="default"> | ||||
<name>Contributors</name> | ||||
<t><contact fullname="Brad Cain"/>, <contact fullname="Steve Deering"/>, | ||||
<contact fullname="Isidor Kouvelas"/>, <contact fullname="Bill | ||||
Fenner"/>, and <contact fullname="Ajit Thyagarajan"/> are the authors of | ||||
<xref target="RFC3376"/>, which forms the bulk of the content contained he | ||||
rein.</t> | ||||
<t>Report packets are sent to 224.0.0.22, to assist layer-2 switches | <t><contact fullname="Anuj Budhiraja"/>, <contact fullname="Toerless | |||
in snooping.</t> | Eckert"/>, <contact fullname="Olufemi Komolafe"/>, and <contact | |||
fullname="Tim Winters"/> have contributed valuable content to this | ||||
specification.</t> | ||||
</section> | ||||
</back> | ||||
<t>Report packets can contain multiple group records, to allow | <!-- [rfced] Please review each artwork element in the xml file. Specifically, | |||
reporting of full current state using fewer packets.</t> | should any artwork element be tagged as sourcecode or another element, | |||
e.g., the artwork element in Section 6.4.1? If sourcecode is correct for any of | ||||
these, please let us know if the "type" attribute of each sourcecode element. | ||||
If the current list of preferred values for "type" | ||||
(https://www.rfc-editor.org/rpc/wiki/doku.php?id=sourcecode-types) | ||||
does not contain an applicable type, then feel free to let us know. | ||||
Also, it is acceptable to leave the "type" attribute not set. | ||||
--> | ||||
<t>Hosts no longer perform suppression, to simplify implementations | <!-- [rfced] Terminology | |||
and permit explicit membership tracking.</t> | ||||
<t>New Suppress Router-Side Processing (S) flag in Query messages | a) Throughout the text, the following terminology appears to be used | |||
fixes robustness issues which were also present in IGMPv2.</t> | inconsistently. Please review these occurrences and let us know if/how they | |||
</list></t> | may be made consistent. | |||
</section> | ||||
Group-and-Source-Specific Query vs. Group-and-Source Specific Query vs. | ||||
group and source specific query | ||||
Group-and-Source-Specific Queries vs. Group-and-Source-Specific queries vs. | ||||
Group-and-Source Specific Queries | ||||
Group-Specific Query vs. Group Specific Query | ||||
[Note: Table 15 uses "Source-and-Group-Specific Query" and "Group-Specifi | ||||
c Query".] | ||||
Group Record vs. group record | ||||
Group Timer (2) vs. group timer (24) | ||||
[Note: See two uppercase instances in Sections 6.4.1 and 6.6.1 (Table 10).] | ||||
Max Response Time vs. Max Resp Time | ||||
[Note: Are these terms different or the same?] | ||||
Membership Report vs. membership report | ||||
Some examples: | ||||
Membership Reports that are sent in response... | ||||
Membership reports that are sent in response... | ||||
Queries vs. queries | ||||
Ex: number of Queries | ||||
response to Queries | ||||
If while scheduling new queries | ||||
pending queries | ||||
general queries | ||||
Querier election vs. querier election | ||||
[Note: Also see Querier vs. querier below.] | ||||
b) We updated the text to reflect the forms on the right. Please let us know | ||||
if further changes are desired. | ||||
backwards compatible -> backward compatible | ||||
Filter-Mode-Change record -> Filter-Mode-Change Record (3 instances) | ||||
Host Compatibility mode -> Host Compatibility Mode (3) | ||||
Group Compatibility mode -> Group Compatibility Mode (3) | ||||
Leave Messages -> Leave messages (1) | ||||
Other-Querier Present and Other-Querier-Present -> Other Querier Present (2) | ||||
Router-Alert -> Router Alert (not hyphenated in attributive position) | ||||
Router Filter-Mode -> router filter-mode (1) | ||||
IP Service Interface -> IP service interface (1) | ||||
Source-List-Change record -> Source-List-Change Record (1) | ||||
c) Is it correct that 2 instances of "Sources" appear as uppercase in | ||||
Section 6.4.1, or should they be lowercase? | ||||
Original: | ||||
A = set of source records whose source timers > 0 (Sources that at | ||||
least one host has requested to be forwarded) | ||||
B = set of source records whose source timers = 0 (Sources that IGMP | ||||
will suggest to the routing protocol not to forward) | ||||
d) Querier vs. querier. We note that uppercase "Querier" seems to be used when | ||||
it is part of a term; otherwise, it appears as lowercase. Should "Querier" be | ||||
made lowercase in any of the sentences below, as we see instances | ||||
in the text such as "used by the querier", "sent by the querier", etc.? | ||||
Current: | ||||
The Query Interval is the interval between General Queries sent by | ||||
the Querier. | ||||
The Startup Query Interval is the interval between General Queries | ||||
sent by a Querier on startup. | ||||
A forged Query message from a machine with a lower IP address than | ||||
the current Querier will cause Querier duties to be assigned to the | ||||
forger. | ||||
If the forger then sends no more Query messages, other | ||||
routers' Other Querier Present timer will time out and one will | ||||
resume the role of Querier. | ||||
A forged State-Change Report message will cause the Querier to send | ||||
out Group-Specific or Source-and-Group-Specific Queries for the group | ||||
in question. | ||||
The Querier includes its Robustness Variable and Query Interval in | ||||
Query packets to allow synchronization of these variables on non- | ||||
Queriers. | ||||
--> | ||||
<!-- [rfced] Abbreviations | ||||
a) FYI - We have added expansions for abbreviations upon first use | ||||
per Section 3.6 of RFC 7322 ("RFC Style Guide"). Please review each | ||||
expansion in the document carefully to ensure correctness. | ||||
Authentication Header (AH) | ||||
Denial of Service (DoS) | ||||
--> | ||||
<!-- [rfced] Please review the "Inclusive Language" portion of the online | ||||
Style Guide <https://www.rfc-editor.org/styleguide/part2/#inclusive_language> | ||||
and let us know if any changes are needed. Updates of this nature typically | ||||
result in more precise language, which is helpful for readers. | ||||
Note that our script did not flag any words in particular, but this should | ||||
still be reviewed as a best practice, but please consider whether the following | ||||
could be updated with alternate wording: | ||||
hear (2) | ||||
heard (7) | ||||
hearing (1) | ||||
Could "receive", "received", and "receiving" be used instead? For example, | ||||
does the S flag perform an action upon "hearing" a Query and are General | ||||
Queries "heard" on the interface, or could "receiving" and "received", | ||||
respectively, be used as shown below? | ||||
(3376bis and 3810bis) | ||||
Original: | ||||
When set to one, the S Flag indicates to any receiving multicast | ||||
routers that they are to suppress the normal timer updates they | ||||
perform upon hearing a Query. | ||||
Perhaps: | ||||
When set to one, the S (Suppress Router-Side Processing) flag | ||||
indicates to any receiving multicast routers that they are to | ||||
suppress the normal timer updates they perform upon receiving | ||||
a Query. | ||||
(3376bis) | ||||
Original: | ||||
This variable is kept per interface and is dependent on the version | ||||
of General Queries heard on that interface as well as the Older | ||||
Version Querier Present timers for the interface. | ||||
Perhaps: | ||||
This variable is kept per interface and is dependent on the version | ||||
of General Queries received on that interface as well as the Older | ||||
Version Querier Present timers for the interface. | ||||
--> | ||||
<section anchor="errata-details" title="Summary of Changes from RFC 3376"> | ||||
<t>The following is a list of changes made since RFC 3376. | ||||
<list style="symbols"> | ||||
<t>Modified definition of Older Version Querier Present | ||||
Interval to address Erratum 4375.</t> | ||||
<t>Modified metadata to fix Obsoletes vs Updates relationship with RFC | ||||
2236 per Erratum 1501.</t> | ||||
<t>Updated introductory text to describe Updates relationship with RFC | ||||
2236 per Erratum 7339.</t> | ||||
<t>Updated Group Membership Interval definition to address Erratum 672 | ||||
5.</t> | ||||
<t>Updated text for Router Filter-Mode to address Erratum 5562.</t> | ||||
<t>Clarified the use of General Queries in the Querier election proces | ||||
s.</t> | ||||
</list></t> | ||||
</section> | ||||
</back> | ||||
</rfc> | </rfc> | |||
End of changes. 387 change blocks. | ||||
1565 lines changed or deleted | 2197 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |