﻿<?xml version="1.0" encoding="UTF-8"?>
<?xml-model href="rfc7991bis.rnc"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp "&#160;">
]>
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="3"?>
<?rfc tocindent="yes"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<rfc
  xmlns:xi="http://www.w3.org/2001/XInclude"
  category="std"
  docName="draft-ietf-pim-ipv6-zeroconf-assignment-15"
  ipr="trust200902"
  submissionType="IETF"
  consensus="true">

  <front>
    <title abbrev="Zeroconf Assignment of IPv6 Mcast Addrs">Zero-Configuration Assignment of IPv6 Multicast Addresses Using mDNS</title>

    <author fullname="Nate Karstens" initials="N" surname="Karstens">
      <organization abbrev="Garmin">Garmin International, Inc.</organization>
      <address>
        <postal>
          <street>1200 E. 151st St.</street>
          <city>Olathe</city>
          <region>KS</region>
          <code>66062-3426</code>
          <country>United States of America</country>
        </postal>
        <email>nate.karstens@gmail.com</email>
      </address>
    </author>

    <author fullname="Dino Farinacci" initials="D" surname="Farinacci">
      <organization>lispers.net</organization>
      <address>
        <postal>
          <city>San Jose</city>
          <region>CA</region>
          <country>United States of America</country>
        </postal>
        <email>farinacci@gmail.com</email>
      </address>
    </author>

    <author fullname="Mike McBride" initials="M" surname="McBride">
      <organization>Futurewei</organization>
      <address>
        <postal>
          <country>United States of America</country>
        </postal>
        <email>michael.mcbride@futurewei.com</email>
      </address>
    </author>

    <date day="23" month="October" year="2026"/>

    <abstract>
      <t>This document describes a zero-configuration protocol for dynamically assigning IPv6 multicast addresses that are unique at the link-layer. Applications randomly assign multicast group IDs from a specified range and prevent collisions by using Multicast DNS (mDNS) to publish resource records under a new "eth-addr.arpa" domain. This protocol satisfies all of the requirements and most of the desired characteristics listed in RFC 10019.</t>
    </abstract>
  </front>

  <middle>
    <section title="Introduction">
      <t><xref target="RFC10019"/> includes a problem statement and requirements for a zero-configuration method for dynamically assigning multicast addresses. This document describes a process that fulfills these requirements by having applications randomly assign IPv6 multicast group IDs from a specified range and using mDNS <xref target="RFC6762"/> to prevent collisions in both IPv6 and link-layer addresses.</t>

      <t>Note that DNS-based Service Discovery (DNS-SD) <xref target="RFC6763"/> uses several different DNS resource record types, published using either Unicast or Multicast DNS, to facilitate service discovery. This document uses a single DNS resource record type (PTR), published using Multicast DNS (mDNS), to coordinate IPv6 multicast address assignment in a zero-configuration environment. The DNS resource records in this protocol may be published alongside records for other domain name services, such as DNS-SD, or they may be published alone. mDNS is used rather than a new protocol with the expectation that functionality for address assignment can be achieved using existing mDNS implementations.</t>

      <t>The protocol described in this document is well-suited for networks that rely on IPv6 multicast and already deploy mDNS. This document makes IANA assignments for use on Ethernet and other protocols based on the IEEE 802 architecture. It may be adapted for use with other link layers, but that is outside the scope of this document.</t>

      <t>As mentioned in <xref target="RFC6762" sectionFormat="comma" section="21"/>, mDNS is an algorithm that assumes cooperating participants. Due to its reliance on mDNS, this assumption applies to the protocol described in this document as well.</t>

      <section anchor="requirements">
        <name>Requirements Language</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
      </section>
    </section>

    <section title="Procedure">
      <t>This section specifies how an application dynamically generates an IPv6 multicast address, uses mDNS to coordinate use of that address with other applications on the network, and begins transmitting its multicast stream.</t>

      <t>Because this protocol is focused specifically on allocating IPv6 multicast addresses, applications MUST send and receive mDNS messages using the IPv6 multicast address for mDNS (ff02::fb). In order to be compatible with existing mDNS implementations that require IPv4, applications MAY also send and receive mDNS messages using the IPv4 multicast address for mDNS (224.0.0.251). These addresses are documented in <xref target="RFC6762" sectionFormat="comma" section="22"/>.</t>

      <t>mDNS implementations used with this protocol MUST coordinate with all applications using the same mDNS implementation, as well as with other mDNS implementations running on the same host. Such coordination ensures that conflicts arising from independently generated, identical group IDs are detected during the probing phase, allowing the affected applications to select alternate group IDs. Note that coordination between mDNS implementations running on the same host tends to happen naturally if transmitted multicast packets are looped back into the receive pipeline.</t>

      <t>The process an application uses from initialization to transmitting a multicast stream is divided into a series of steps, outlined below.</t>

      <section title="Group ID Selection" anchor="group-id-selection">
        <t>When an application is preparing to transmit a multicast stream, it begins by selecting an IPv6 multicast group ID.</t>

        <t>If the application is either 1) transmitting a multicast stream for the first time or 2) responding to an address collision, then the application MUST select a random multicast group ID value from the range <tt>0x90000000-0x9FFFFFFF</tt>. <xref target="iana"/> details the request to assign this range from the "Dynamic Multicast Group IDs" registry.</t>

        <t>If the application has previously transmitted the multicast stream, then the selected multicast group ID is already in persistent storage (Optimization, <xref target="optimization"/>). The application MUST proceed using the stored value.</t>

        <t>Note that the range of possible group ID values means that the probability that another application has chosen the same group ID is (n / 2<sup>28</sup>), where n is the number of applications on the network.</t>
      </section>

      <section title="Address Generation" anchor="address-generation">
        <t>Once the IPv6 multicast group ID has been selected, the application MUST use this to generate two multicast addresses:</t>
        <ol>
          <li>
            <t>IPv6 Multicast Address</t>
            <t>This is a link-scoped IPv6 multicast address, calculated by combining the multicast group ID with the Interface Identifier (IID) of the link-local unicast address of the interface used to transmit the multicast stream, according to the format given in <xref target="RFC4489" sectionFormat="comma" section="3"/>.</t>
          </li>
          <li>
            <t>Multicast Ethernet Address</t>
            <t>This is the corresponding multicast Ethernet address that will be used to transmit the data. It is calculated from the IPv6 multicast address, as described in <xref target="RFC2464" sectionFormat="comma" section="7"/>.</t>
          </li>
        </ol>

        <t>For example, consider a source address of <tt>fe80::a12:34ff:fe56:7890</tt>. If the selected group ID is <tt>9abc:def0</tt>, then the calculated IPv6 multicast address would be <tt>ff32:ff:a12:34ff:fe56:7890:9abc:def0</tt> and the multicast Ethernet address would be <tt>33:33:9A:BC:DE:F0</tt>.</t>
      </section>

      <section title="Domain Name Assembly" anchor="assembly">
        <t>Once the multicast Ethernet address is determined, the application MUST use this to assemble a domain name by encoding nibbles from the multicast Ethernet address as a sequence of lower-case hexadecimal digits, separated by dots, in reverse order, and ending with the suffix <tt>".eth-addr.arpa"</tt> (a new domain in the .arpa registry).</t>

        <t>Considering the example in Address Generation (<xref target="address-generation"/>), the resulting domain name would be <tt>"0.f.e.d.c.b.a.9.3.3.3.3.eth-addr.arpa"</tt>.</t>

        <t>Note that this is similar to how DNS resource records used for reverse mapping IPv6 addresses are created (<xref target="RFC3596" sectionFormat="comma" section="2.5"/>). As such, this document reserves the domain <tt>"9.3.3.3.3.eth-addr.arpa."</tt> as a Special-Use Domain in the "Special-Use Domain Names" registry (<xref target="iana"/>). The <tt>"3.3.3.3"</tt> component of this is taken from the <tt>33:33</tt> prefix used for mapping IPv6 multicast addresses to multicast Ethernet addresses and the <tt>"9"</tt> component indicates a multicast group ID in the range <tt>0x90000000-0x9FFFFFFF</tt>.</t>
      </section>

      <section title="Record Construction" anchor="construction">
        <t>Once the domain name is assembled, the application MUST construct a unique PTR record using that domain name. The <tt>PTRDNAME</tt> field of this record MUST consist of a unique application identifier, in the form of one or more DNS labels, followed by the device's currently claimed mDNS host name (for example, "application.example.local."). Integrating a unique identifier in this manner allows for multiple applications to be on the same host.</t>

        <t>Note that the host will publish A/AAAA records for this same host name (for example, "example.local.") as part of its normal mDNS operation, though this is not a requirement for this design.</t>

        <t>To allow for the creation of veto records (<xref target="veto-records"/>), the first DNS label of the application identifier MUST NOT exceed 58 octets in length. This reflects the 63-octet limit specified in <xref target="RFC1035" sectionFormat="comma" section="2.3.4"/> while also reserving space for a 5-octet suffix.</t>

        <t>Due to the presence of a host name in the <tt>PTRDNAME</tt>, the TTL value for the resource record SHOULD be 120. This aligns with guidance in <xref target="RFC6762" sectionFormat="comma" section="10"/>.</t>
      </section>

      <section title="Probing" anchor="probing">
        <t>After the PTR record is constructed, the application MUST use the mDNS probing algorithm described in <xref target="RFC6762" sectionFormat="comma" section="8.1"/> to probe for a PTR record with the same name.</t>

        <t>Due to the large range of values for group IDs, it is unlikely that two applications would randomly choose the same group ID and begin probing at the same time. However, in that event, the conflict MUST be resolved according to the procedure in <xref target="RFC6762" sectionFormat="comma" section="8.2"/>. The loser of the conflict MUST return to Group ID Selection (<xref target="group-id-selection"/>) and choose a different group ID.</t>
      </section>

      <section title="Announcing and Responding" anchor="announcing">
        <t>If the probing algorithm started in Probing (<xref target="probing"/>) completes without any conflict, then the application MUST announce the PTR record according to the procedure in <xref target="RFC6762" sectionFormat="comma" section="8.3"/> and MUST respond to queries for the PTR record according to <xref target="RFC6762" sectionFormat="comma" section="6"/>.</t>

        <t>Because the PTR record was constructed with the host name in the <tt>PTRDNAME</tt> field (Record Construction, <xref target="construction"/>), if the host name changes due to a conflict, the host MUST announce an updated PTR record with the <tt>PTRDNAME</tt> field using the new host name. In accordance with the final paragraph of <xref target="RFC6762" sectionFormat="comma" section="8.1"/>, the host SHOULD skip Probing (<xref target="probing"/>) because it has already verified ownership of the domain name (Domain Name Assembly, <xref target="assembly"/>). This process maintains accurate state while avoiding unnecessary traffic on the network.</t>
      </section>

      <section title="Conflict Detection and Resolution" anchor="conflict">
        <t>The application MUST start a continuous query for the PTR record according to <xref target="RFC6762" sectionFormat="comma" section="5.2"/>. This helps detect a conflict in the event of a network partition and repair (<xref target="collision-detection-after-partition-repair"/>). If a conflict is detected at any time, then the application MUST resolve the conflict according to <xref target="RFC6762" sectionFormat="comma" section="9"/>. The losing application MUST stop transmitting that multicast stream and return to Group ID Selection (<xref target="group-id-selection"/>), choosing a new group ID. As before, this new group ID is also retained in persistent storage, overwriting any group ID previously saved for this multicast stream.</t>

        <t>The host network stack may monitor the network for traffic that uses the same destination multicast Ethernet address, but a different destination multicast IPv6 address. If this is detected, then the application MUST stop transmitting that multicast stream and return to Group ID Selection (<xref target="group-id-selection"/>), choosing a new group ID. It is not necessary for both applications to select a new address, the goal is to have each multicast stream using a unique multicast address. No method to coordinate this between hosts is necessary and this protocol does not specify one.</t>
      </section>

      <section title="Transmitting" anchor="transmitting">
        <t>Once the PTR record is advertised and the continuous query started, the host MAY then begin transmitting multicast data using the multicast addresses from Address Generation (<xref target="address-generation"/>).</t>
      </section>

      <section title="Optimization" anchor="optimization">
        <t>The application MUST retain the group ID value in persistent storage and use it the next time the multicast stream is transmitted. Any metadata associated with the stream, such as the network interface used to transmit, MUST also be stored.</t>

        <t>Keeping these values allows the network to quickly settle on a configuration and reduces the likelihood of future collisions, as long as the network is unchanged.</t>

        <t>Note that retaining these values does not permit the application to skip any of the preceding steps. This is consistent with <xref target="RFC6762" sectionFormat="comma" section="10.2"/> and allows the application to recover from any network changes that may have occurred when it was offline.</t>
      </section>

      <section title="Defending">
        <t>The application MUST defend the PTR record from probes as described in <xref target="RFC6762" sectionFormat="comma" section="6"/>.</t>
      </section>
    </section>

    <section title="Veto Records" anchor="veto-records">
      <t>The network infrastructure may contain managed switches that maintain an internal multicast address table and use multicast snooping to intelligently direct multicast streams to interested receivers (<xref target="RFC4541"/>). The potential for address collisions in these types of managed switches is discussed in <xref target="RFC10019" sectionFormat="comma" section="2"/>. Veto records are used to resolve these address collisions.</t>

      <t>When a managed switch detects a multicast address collision it cannot resolve, it triggers a conflict with the application by publishing a veto record. A veto record is a unique PTR record using the string generated for the address as its name. The veto record's <tt>PTRDNAME</tt> field is created by appending the string "-veto" to the first DNS label that appears in the <tt>PTRDNAME</tt> field of the PTR record that caused the address collision (for example, "application-veto"). This technique results in a veto PTR record that is always lexicographically later than the PTR record from the application (specifically, the first DNS label is always longer, so the first byte of the <tt>RDATA</tt>, which contains the length, always contains a larger value). In turn, this causes the veto record to always win the conflict resolution described in <xref target="RFC6762"/>, Sections <xref target="RFC6762" sectionFormat="bare" section="8.2"/> and <xref target="RFC6762" sectionFormat="bare" section="9"/>.</t>

      <t>Managed switches MUST publish veto records without probing. The TTL value for the veto record SHOULD be 120.</t>

      <t>Applications MUST respond to the conflict the same as to a collision, eventually resulting in a new group ID being acquired. As before, the application retains its new group ID in persistent storage, ensuring the same conflict is not repeated in the future. As such, it is unnecessary to store vetoes to persistent storage.</t>

      <t>If a managed switch transmitting a veto record determines that the PTR record for the address causing the conflict has become invalid (either due to receiving a goodbye packet or to record expiry), then it MUST query the network for the PTR record. If the managed switch does not receive a query response containing the PTR record after 10 seconds (as per <xref target="RFC6762" sectionFormat="comma" section="10.4"/>), then the managed switch MUST delay a random amount of time in the range 20-120 ms and then send a goodbye packet that invalidates the veto record.</t>
    </section>

    <section title="Use on Networks with Multiple Subnets" anchor="scopes">
      <t>The link-scoped IPv6 multicast address created in Address Generation (<xref target="address-generation"/>) cannot be forwarded beyond the local link. Forwarding a multicast stream to other subnets requires a unicast-prefix based IPv6 multicast address (<xref target="RFC3306"/>) and multicast routing; procedures for doing so are outside the scope of this document.</t>

      <t>The protocol's reliance on cooperating hosts (<xref target="security"/>) will always make it unsuited for use on the global Internet. <xref target="RFC8815"/> recommends Source-Specific Multicast in this environment.</t>
    </section>

    <section title="IANA Considerations" anchor="iana">
      <t>IANA should allocate a block of group IDs from the "Dynamic Multicast Group IDs" registry <xref target="REGISTRY"/> in the "IPv6 Multicast Address Space" registry group that was created by <xref target="RFC10028"/>. The range of this block should be <tt>0x90000000-0x9FFFFFFF</tt> and the description should be "Zero-Configuration Assignment of IPv6 Multicast Addresses Using mDNS".</t>

      <t>The domain <tt>"eth-addr.arpa"</tt> should be registered in the .arpa registry (https://www.iana.org/domains/arpa). The usage should be "For mapping Ethernet addresses to local domain names for Zero-Configuration Assignment of IPv6 Multicast Addresses" and the reference should be this document.</t>

      <t>In accordance with <xref target="RFC3172" sectionFormat="comma" section="3"/>, the <tt>"eth-addr.arpa"</tt> domain is not delegated because it only has local significance. The only names this document defines under <tt>"eth-addr.arpa"</tt> are those under <tt>"9.3.3.3.3.eth-addr.arpa"</tt> (below).</t>

      <t>The Special-Use Domain <tt>"9.3.3.3.3.eth-addr.arpa."</tt> should be registered in the "Special-Use Domain Names" registry (https://www.iana.org/assignments/special-use-domain-names). Like other Multicast DNS domains (<xref target="RFC6762" sectionFormat="comma" section="12"/>), this domain is not delegated.</t>

      <section title="Domain Name Reservation Considerations">
        <t><xref target="RFC6761" sectionFormat="comma" section="5"/> includes a list of questions that must be answered when reserving a new Special-Use Domain Name. The answers to these questions for the <tt>"9.3.3.3.3.eth-addr.arpa."</tt> Special-Use Domain, and any names falling within this domain, are as follows:</t>

        <ol>
          <li>Users are free to use these names as they would for any other reverse mapping domain. Because this mapping is closely related to the local network, users should be aware that these names are likely to yield different results on different networks.</li>
          <li>Application software SHOULD recognize these names as a reverse mapping domain and MAY associate them with the protocol described in this document. This is to avoid user confusion.</li>
          <li>Name resolution APIs and libraries SHOULD recognize these names as being used exclusively with mDNS, and so SHOULD NOT send queries for these names to their configured unicast DNS server(s). This is to avoid unnecessary traffic to the name server.</li>
          <li>Caching DNS servers SHOULD recognize these names as being used exclusively with mDNS, SHOULD NOT attempt to look up resource records associated with these names, and SHOULD respond to any query with NXDOMAIN. This is to avoid unnecessary traffic to the name server.</li>
          <li>Authoritative DNS servers SHOULD recognize these names as being used exclusively with mDNS and SHOULD respond to any query with NXDOMAIN. This is to avoid unnecessary traffic to the name server.</li>
          <li>DNS server operators MUST NOT configure an authoritative DNS server to answer queries for these names.</li>
          <li>DNS Registries/Registrars MUST NOT register <tt>"9.3.3.3.3.eth-addr.arpa."</tt> names.</li>
        </ol>
      </section>
    </section>

    <section title="Implementation Status">
      <t>Note to RFC Editor: please remove this entire section before publication, as well as the reference to <xref target="RFC7942"/>.</t>

      <t>This section records the status of known implementations of the protocol defined by this specification at the time of posting of this Internet-Draft, and is based on a proposal described in <xref target="RFC7942"/>.  The description of implementations in this section is intended to assist the IETF in its decision processes in progressing drafts to RFCs.  Please note that the listing of any individual implementation here does not imply endorsement by the IETF.  Furthermore, no effort has been spent to verify the information presented here that was supplied by IETF contributors. This is not intended as, and must not be construed to be, a catalog of available implementations or their features.  Readers are advised to note that other implementations may exist.</t>

      <t>According to <xref target="RFC7942"/>, "this will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.  It is up to the individual working groups to use this information as they see fit".</t>

      <t>A prototype for Linux using Avahi is available at <eref target="https://github.com/nkarstens/mdns-zeroconf-mcast/" brackets="angle"/>. The main program in this repository allocates a single IPv6 multicast address from a specified group ID. The repository also contains a README with instructions on how to simulate a network partition.</t>

      <t>This technology has been implemented in production in Garmin's GPSMAP 9000 series of marine multifunction displays.</t>
    </section>

    <section title="Operational Considerations">
      <t>Scalability of mDNS is an area of ongoing research and improvement (<xref target="RFC7558"/>). The protocol described in this document is subject to similar constraints. Under normal operating conditions, mDNS traffic is expected to grow linearly with the number of multicast streams.</t>

      <t>The protocol uses implicit availability: if an application does not receive any indication that an address is in use, then it assumes that the address is available for its own use. Because this coordination occurs using mDNS, any filtering of mDNS traffic by the host or network would prevent applications from coordinating use of multicast addresses. This may result in address collisions.</t>

      <t>Applications SHOULD keep timestamped logs of the following events to help troubleshoot issues with the protocol:</t>

      <ul>
        <li>Selected group ID (<xref target="group-id-selection"/>)</li>
        <li>Generated address (<xref target="address-generation"/>)</li>
        <li>Conflicts encountered during probing (<xref target="probing"/>)</li>
        <li>Conflicts detected after announcing (<xref target="conflict"/>)</li>
        <li>Multicast stream transmission (<xref target="transmitting"/>)</li>
      </ul>

      <t>Although <xref target="optimization"/> requires maintaining a persistent state, this functionality is nonetheless an optimization. The protocol is resilient to cases where none of the applications begin with persistent state (due to initial startup or clearing memory) and also to cases where all of the applications begin with the same persistent state (due to cloning a configuration). Although some of these cases do increase the likelihood that applications will experience a collision, the network will eventually reach a steady state. As such, operators have flexibility to determine when the expected behavior is to discard the persistent state and start over.</t>

      <t>When a collision occurs, <xref target="conflict"/> requires applications to cease transmitting until a new address is acquired. This process results in a brief pause in the multicast stream.</t>

      <t>This document does not specify a YANG model due to the decentralized, zero-configuration nature of the protocol.</t>
    </section>

    <section title="Security Considerations" anchor="security">
      <t>Due to its reliance on mDNS, the Security Considerations for mDNS (<xref target="RFC6762" sectionFormat="comma" section="21"/>) apply to this document as well.</t>

      <t>As with mDNS itself, this protocol only works in environments where all hosts are cooperating. There are two types of messages that a bad actor could use to attack the network:</t>

      <ol>
        <li>
          <t>Conflict Response</t>
          <t>A bad actor could monitor the network for applications probing for <tt>"9.3.3.3.3.eth-addr.arpa"</tt> PTR records and repeatedly generate conflicting response messages, preventing the application from finding an unused address.</t>
        </li>
        <li>
          <t>Veto Records</t>
          <t>A bad actor could generate veto records for addresses already allocated, repeatedly forcing the application to find a new address.</t>
        </li>
      </ol>

      <t>Both message types would prevent the application from being able to transmit its multicast stream, denying service to the multicast group. Repeatedly forcing the application to attempt new addresses also increases network traffic.</t>

      <t>The protocol's use of implicit availability means that a bad actor that is able to filter mDNS traffic could neutralize the ability of applications to use mDNS to prevent collisions. In most networks, the probability of a random collision is low. Where hosts cannot rule out non-cooperating participants, the protections prescribed in <xref target="RFC6762" sectionFormat="comma" section="21"/> apply.</t>
    </section>
  </middle>

  <back>
    <references title="Normative References">
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1035.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2464.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4489.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6761.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6762.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.10028.xml"/>
    </references>
    <references title="Informative References">
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3172.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3306.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3596.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4541.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6763.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7558.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7942.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8815.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.10019.xml"/>
      <reference anchor="REGISTRY" target="https://www.iana.org/assignments/ipv6-multicast-addresses#dynamic-multicast-group-ids">
        <front>
          <title>Dynamic Multicast Group IDs Registry</title>
          <author>
            <organization>Internet Assigned Numbers Authority</organization>
          </author>
        </front>
      </reference>
    </references>

    <section title="Example mDNS Messages">
      <t>This section illustrates the DNS message fields for the mDNS messages described in this document. The examples depict individual messages, not complete exchanges. The mDNS message format is specified in <xref target="RFC6762" section="18"/>.</t>

      <t>All domain names are fully qualified. The resource record TTL is 120 seconds in these examples; this value is illustrative. <tt>RDLENGTH</tt> values assume that <tt>PTRDNAME</tt> is encoded without DNS name compression. IPv6 and UDP headers are not shown.</t>

      <t>The encoded <tt>QCLASS</tt> value includes the unicast-response (<tt>QU</tt>) bit. The encoded resource record <tt>CLASS</tt> value includes the cache-flush bit. These bits are shown separately from the underlying DNS class, IN.</t>

      <t><xref target="fig-mdns-probe"/> shows a probe for the PTR record. The question uses <tt>QTYPE</tt> ANY, and the proposed record appears in the Authority Section. This corresponds with the operation described in <xref target="probing"/>.</t>

      <figure anchor="fig-mdns-probe">
        <name>PTR Record Probe</name>
<artwork type="ascii-art"><![CDATA[
Header:
  ID:              0
  Flags:           0x0000 (all flags clear)
  QDCOUNT:         1
  ANCOUNT:         0
  NSCOUNT:         1
  ARCOUNT:         0
Question Section:
  QNAME:           0.f.e.d.c.b.a.9.3.3.3.3.eth-addr.arpa.
  QTYPE:           ANY (255)
  QCLASS:          IN (1)
  QU bit:          1
  Encoded QCLASS:  0x8001
Answer Section:
  (empty)
Authority Section:
  NAME:            0.f.e.d.c.b.a.9.3.3.3.3.eth-addr.arpa.
  TYPE:            PTR (12)
  CLASS:           IN (1)
  Cache-flush bit: 0
  Encoded CLASS:   0x0001
  TTL:             120
  RDLENGTH:        27
  PTRDNAME:        application.example.local.
Additional Section:
  (empty)
]]></artwork>
      </figure>

      <t><xref target="fig-mdns-announcement"/> shows an announcement of the application PTR record following successful probing. The record appears in the Answer Section with the cache-flush bit set. This corresponds with the operation described in <xref target="announcing"/>.</t>

      <figure anchor="fig-mdns-announcement">
        <name>PTR Record Announcement</name>
<artwork type="ascii-art"><![CDATA[
Header:
  ID:              0
  Flags:           0x8400 (QR=1, AA=1; other flags clear)
  QDCOUNT:         0
  ANCOUNT:         1
  NSCOUNT:         0
  ARCOUNT:         0
Question Section:
  (empty)
Answer Section:
  NAME:            0.f.e.d.c.b.a.9.3.3.3.3.eth-addr.arpa.
  TYPE:            PTR (12)
  CLASS:           IN (1)
  Cache-flush bit: 1
  Encoded CLASS:   0x8001
  TTL:             120
  RDLENGTH:        27
  PTRDNAME:        application.example.local.
Authority Section:
  (empty)
Additional Section:
  (empty)
]]></artwork>
      </figure>

      <t><xref target="fig-mdns-veto-announcement"/> shows an announcement of the veto PTR record. The owner name is unchanged, but the <tt>PTRDNAME</tt> identifies the veto. This corresponds with the operation described in <xref target="veto-records"/>.</t>

      <figure anchor="fig-mdns-veto-announcement">
        <name>Veto PTR Record Announcement</name>
<artwork type="ascii-art"><![CDATA[
Header:
  ID:              0
  Flags:           0x8400 (QR=1, AA=1; other flags clear)
  QDCOUNT:         0
  ANCOUNT:         1
  NSCOUNT:         0
  ARCOUNT:         0
Question Section:
  (empty)
Answer Section:
  NAME:            0.f.e.d.c.b.a.9.3.3.3.3.eth-addr.arpa.
  TYPE:            PTR (12)
  CLASS:           IN (1)
  Cache-flush bit: 1
  Encoded CLASS:   0x8001
  TTL:             120
  RDLENGTH:        18
  PTRDNAME:        application-veto.
Authority Section:
  (empty)
Additional Section:
  (empty)
]]></artwork>
      </figure>
    </section>

    <section title="Evaluation of Solution">
      <t><xref target="RFC10019"/> contains a list of criteria to evaluate potential solutions. The following is an analysis of how this protocol satisfies the requirements listed in that document:</t>

      <ol type="[REQ-%d]" spacing="normal" indent="9">
        <li>Unique Address Assignment: Use of the protocol results in a unique address being assigned to the multicast group at both the network and link layers.</li>
        <li>Resilience to Single Points of Failure: The protocol uses mDNS, which uses a peer-to-peer communication model and so has no single points of failure, as long as network connectivity is not interrupted.</li>
        <li>Zero User Configuration: The protocol operates without requiring user or administrator configuration.</li>
        <li>Coexistence with Multicast Address Allocation Solutions: This document assigns a range of group IDs from the "Dynamic Multicast Group IDs" registry for use with the protocol, which allows the protocol to coexist with other multicast IP address allocation solutions (<xref target="RFC10028"/>).</li>
        <li>Single-Subnet Operation: The protocol supports operation within a single IPv6 subnet.</li>
        <li>No External Connectivity: The protocol does not require Internet access or connectivity to external infrastructure.</li>
        <li>Supports Multiple Host Applications: Multiple applications on the same host are supported by 1) incorporating a unique application identifier into the PTR record's <tt>PTRDNAME</tt> field and by 2) requiring the mDNS implementation(s) on a host to facilitate interaction between those applications.</li>
        <li>Collision Detection and Resolution: The protocol includes a mechanism to detect and resolve multicast address collisions at both the network and link layers. <xref target="collision-detection-after-partition-repair"/> contains additional discussion about detecting and resolving collisions after a network partition is repaired.</li>
      </ol>

      <t>The following is an analysis of how this protocol satisfies the desirable characteristics listed in <xref target="RFC10019"/>:</t>

      <ol type="[CONS-%d]" indent="10">
        <li>Multi-Subnet Support: Operating the protocol across multiple subnets is outside the scope of this document (<xref target="scopes"/>).</li>
        <li>Standards Compatibility: The protocol uses existing protocols without requiring any changes.</li>
        <li>Cross-Platform Availability: The protocol uses mDNS, which is implemented on many host platforms and operating systems.</li>
        <li>Minimal Dependency on Manufacturing Data: The protocol does not rely on preloaded configuration or device-specific manufacturing data.</li>
        <li>Low Overhead: The protocol uses mDNS, which is designed to minimize the volume and frequency of network traffic generated during normal operation.</li>
        <li>Advertisement: This document does not prescribe any mechanism for advertising the IPv6 address used for the multicast stream. However, because the protocol already uses mDNS, a natural option for doing so would be to use DNS-SD (<xref target="RFC6763"/>) to advertise a "_udp" service and publish the address used for the multicast stream in a TXT record.</li>
        <li>Network Topology: Veto records ensure that the protocol works regardless of the underlying topology and adjacencies.</li>
      </ol>

      <section title="Collision Detection After Partition Repair" anchor="collision-detection-after-partition-repair">
        <t>A network partition occurs when one part of a network is temporarily unable to communicate with another part of the network. This may happen, for example, if a switch goes offline. A partition repair happens when communication is fully restored to all parts of the network.</t>

        <t>Because mDNS is designed to be a low-bandwidth protocol, it can take a significant amount of time to detect a resource record collision after a network partition is repaired. This is not a concern on networks where all multicast streams are established before any likely partition event because all group IDs will have been selected and stored for future use.</t>

        <t>It is a greater concern on networks where multicast streams may be established at any time. Deployments on these networks may consider engaging supplemental detection and resolution mechanisms. Specifics of this functionality are open to future enhancement, but are considered out-of-scope for this document.</t>
      </section>
    </section>

    <section title="Acknowledgement" numbered="false">
      <t>Special thanks to the National Marine Electronics Association for their contributions in developing marine industry standards and their support for this work.</t>

      <t>Thanks also to the members of the PIM working group for their early brainstorming sessions and review of this draft, to Esko Dijk for his review of the draft, and to Gunter Van de Velde for his review and suggestions.</t>
    </section>
  </back>
</rfc>
