<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<?rfc strict="yes" ?>
<?rfc toc="yes"?>
<?rfc tocdepth="4"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes" ?>
<?rfc compact="yes" ?>
<?rfc subcompact="no" ?>
<rfc category="std" docName="draft-ietf-6man-icmpv6-reflection-10"
     ipr="trust200902">
  <front>
    <title abbrev="ICMPv6 Reflection">Internet Control Message Protocol
    (ICMPv6) Reflection</title>

    <author fullname="Tal Mizrahi" initials="T." surname="Mizrahi">
      <organization abbrev="">Huawei</organization>

      <address>
        <postal>
          <street>25 Matam</street>

          <city>Haifa</city>

          <code>3190501</code>

          <country>Israel</country>
        </postal>

        <email>tal.mizrahi.phd@gmail.com</email>
      </address>
    </author>

    <author fullname="Xiaoming He" initials="X." surname="He">
      <organization>China Telecom</organization>

      <address>
        <email>hexm4@chinatelecom.cn</email>
      </address>
    </author>

    <author fullname="Tianran Zhou" initials="T." surname="Zhou">
      <organization abbrev="">Huawei</organization>

      <address>
        <postal>
          <street>156 Beiqing Rd.</street>

          <city>Beijing</city>

          <code>100095</code>

          <country>China</country>
        </postal>

        <email>zhoutianran@huawei.com</email>
      </address>
    </author>

    <author fullname="Ron Bonica" initials="R." surname="Bonica">
      <organization>HPE</organization>

      <address>
        <postal>
          <country>USA</country>
        </postal>

        <email>rbonica@juniper.net</email>
      </address>
    </author>

    <author fullname="Xiao Min" initials="X." surname="Min">
      <organization>ZTE Corp.</organization>

      <address>
        <email>xiao.min2@zte.com.cn</email>
      </address>
    </author>

    <date year="2025"/>

    <workgroup>6MAN</workgroup>

    <keyword>ICMP</keyword>

    <keyword>ICMPv6</keyword>

    <abstract>
      <t>This document describes the ICMPv6 Reflection utility. The ICMPv6
      Reflection utility is a diagnostic tool, similar to Ping and the ICMPv6
      Probe utility. It is similar to Ping and Probe in that it relies on a
      stateless message exchange between a probing node and a probed node. The
      probing node sends a request to the probed node and the probed node
      responds to the request.</t>

      <t>The ICMPv6 Reflection utility differs from Ping and Probe because, in
      the ICMPv6 Reflection utility, the probing node requests a snapshot of
      the message that it sent, as it was when arrived at the probed node. The probed node returns the
      requested snapshot.</t>

      <t>The ICMPv6 Reflection utility is useful because it can allow the user to
      see how the network modified the request as it traveled from the probing
      node to the probed node.</t>
    </abstract>
  </front>

  <middle>
    <section title="Introduction">
      <t>The ICMPv6 Reflection utility is an IPv6 <xref target="RFC8200"/>
      diagnostic tool. It is similar to Ping <xref target="RFC2151"/> and the
      ICMPv6 Probe  <xref target="I-D.ietf-intarea-rfc8335bis"/> utility in the following
      respects:</t>

      <t><list style="symbols">
          <t>A probing node sends an ICMPv6 <xref target="RFC4443"/> message
          to a probed node. This ICMP message requests that it
          be reflected back to the probing node.</t>

          <t>The probed node receives the above-mentioned message, encodes it
          into another ICMPv6 message, and sends that ICMPv6
          message back to the probing node.</t>
        </list></t>

      <t>For the purposes of this document, the ICMPv6 message that the
      probing node sends is called the "request message" and the ICMPv6
      message that the probed node sends is called the "reply message".</t>

      <t>The reply message includes a copy
      of the request message, starting from its IPv6 header, as was when it arrived at
      the probed node.</t>

      <t>The ICMPv6 Reflection utility uses the ICMPv6 Extended Echo Request
      and Extended Echo Reply message types <xref
      target="I-D.ietf-intarea-rfc8335bis"/>. Each of these message types
      includes an ICMP Extension Structure <xref target="RFC4884"/>. The ICMP
      Extension Structure includes one or more extension objects. This
      document defines the 'Reflect All' object, which is used for reflecting
      the request message, as it arrived at the probed node.</t>

      <t>An alternative approach involves the probing
      node sending a UDP packet with an unused destination port to the probed
      node. This causes the probed node to send an ICMPv6 Destination Unreachable
      message, which includes "as much of invoking packet as possible without
      the ICMPv6 packet exceeding the minimum IPv6 MTU" <xref
      target="RFC4443"/>. However, middle boxes modify the invoking packet
      in ICMPv6 Destination Unreachable messages (e.g. <xref target="RFC3022"/>).
      By contrast, middle boxes are not intended to modify the Reflect All 
      object. </t>
    </section>

    <section title="Requirement Language">
      <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 anchor="UseCaseSec" title="Use Cases">
      <t>The following protocols define mutable IPv6 extension headers that
      can be used to trace a path and its performance:</t>

      <t><list style="symbols">
          <t>IPv6 Options for In Situ Operations, Administration, and
          Maintenance (IOAM) <xref target="RFC9486"/></t>

          <t>Inband Flow Analyzer <xref target="I-D.kumar-ippm-ifa"/></t>

          <t>Path Tracing in SRv6 networks <xref
          target="I-D.filsfils-ippm-path-tracing"/></t>
        </list></t>

      <t>These extensions are used to collect information along a packet's
      delivery path. Currently, the collected information is sent to a
      controller for processing. However, in some cases this information is
      relevant to the sender.</t>

      <t>The ICMPv6 Reflection utility provides a mechanism by which this
      information can be returned to the probing node.</t>

      <t>The ICMPv6 Reflection utility can also be used to determine how the
      probe message's IPv6 header has changed along its delivery path. For
      example, it can be used to determine how middleboxes have changed the
      Source Address, Destination Address, and Flow Label.</t>
    </section>

    <section anchor="TheorySec" title="Theory of Operation">
      <t>The probing node sends an ICMPv6 Extended Echo Request message <xref
      target="I-D.ietf-intarea-rfc8335bis"/> to the probed node. The ICMPv6
      Extended Echo Request message contains an ICMP Extension Structure <xref
      target="RFC4884"/> and the ICMP Extension Structure contains an
      Extension Header.  The ICMP Extension Header MUST include the Length
      field, as defined in <xref
      target="I-D.ietf-intarea-icmp-exten-hdr-len"/>.
      
      The ICMP Extension structure includes a 'Reflect All' object, which is defined
      in this document. </t>

      <t>The 'Reflect All' object contains an object payload field 
      whose length SHOULD be sufficient to carry the IPv6 and ICMP header of the
      reflected request message. The total length of both the request and 
      reply packets SHOULD NOT exceed the IPv6 minimum MTU (1280 bytes),
      to avoid triggering fragmentation.</t>

      <t>The probed node receives the ICMPv6 Extended Echo Request and formats
      an ICMPv6 Extended Echo Reply message. The total length of the ICMPv6
      Extended Echo Reply message MUST be equal to the total length of the
      corresponding request message. The main body of the ICMPv6
      Extended Echo Reply message reflects the status of an interface on the
      probed node.</t>

      <t>The ICMPv6 Extended Echo Reply message also contains an ICMP
      Extension Structure. The ICMP Extension Header MUST include the Length
      field, as defined in <xref
      target="I-D.ietf-intarea-icmp-exten-hdr-len"/>. 
      The value of the Length field in the reply message MUST be equal to the 
      value of the Length in the ICMP Extension Header of the request message.
      The ICMP Extension Structure also MUST contain the
      'Reflect All' object that the ICMPv6 Extended Echo Request message
      contained. The length of the 'Reflect All' object in the reply message 
      MUST be equal to the length
      of the 'Reflect All' object in the request message.
      If the following requirements are satisfied, the probed node
      populates the payload field of the 'Reflect All' object:</t>

      <t><list style="symbols">
          <t>The probed node supports the 'Reflect All' object.</t>

          <t>Responding to the request message does not violate the probed
          node's security policy.</t>
        </list></t>

      <t>Otherwise, the probed node sets the object payload field to all
      zeros.</t>

      <t>An example of a request and a reply is provided in <xref
      target="ReflectionFormats"/>. In this example the request message
      includes the 'Reflect All' object. The reply also includes the 'Reflect
      All' object, containing the IPv6 header, ICMPv6 header and ICMP
      Extension Header of the request message. The request and reply messages
      have the same length. The length of the IPv6 header of the request 
      message is at least 40 octets, depending on whether there are extension 
      headers, followed by an 8-octet ICMPv6 header, a 4-octet ICMP 
      Extension Header, and a 4-octet Object Header. For example,
      if the length of the IPv6 header is H octets,  and the length of the 
      object payload is H+12 octets, the reply includes the reflected 
      request message starting from the IPv6 header and up to and including 
      the ICMP Extension Header, as shown in <xref 
      target="ReflectionFormats"/>.</t>

      <t>Middle boxes must not modify the Reflect All extension object.
      This ensures that the reflected information reaches the probing node
      exactly as sent by the probed node.</t>

      <figure align="center" anchor="ReflectionFormats"
              title="ICMPv6 Reflection Message Formats">
        <artwork align="left"><![CDATA[

       +----------------------------+   +----------------------------+
       |        IPv6 Header         |   |        IPv6 Header         |
       |    and extension headers   |   |    and extension headers   |
       +----------------------------+   +----------------------------+
       |       ICMPv6 Header        |   |       ICMPv6 Header        |
       |   Extended Echo Request    |   |    Extended Echo Reply     |
       +----------------------------+   +----------------------------+
       |   ICMP Extension Header    |   |   ICMP Extension Header    |
       +----------------------------+   +----------------------------+
       |'Reflect All' Object Header |   |'Reflect All' Object Header |
       +----------------------------+   +----------------------------+
       |       Object payload       |   |   Request's IPv6 Header    |
       |  (placeholder for reply)   |   |   and extension headers    |
       |                            |   |  ------------------------  |
       |                            |   |  Request's ICMPv6 Header   |
       |                            |   |   Extended Echo Request    |
       |                            |   |  ------------------------  |
       |                            |   | Request's ICMP Ext. Header |
       +----------------------------+   +----------------------------+

       ^                            ^   ^                            ^
       |                            |   |                            |
       +-- Extended Echo Request ---+   +--- Extended Echo Reply ----+

           ]]></artwork>
      </figure>

      <t>If a node
      that does not support the 'Reflect All' object receives an ICMP Extended
      Echo Request containing this object, the expected behavior according to
      <xref target="I-D.ietf-intarea-rfc8335bis"/> and <xref target="RFC8335"/>
      is to respond with an ICMP Echo Reply message
      that includes the "Malformed Query" code in the Code field.</t>
    </section>

    <section anchor="RefEcho" title="New ICMP Extension Object">
      <t>This document defines the 'Reflect All' object.</t>

      <t>An implementation that supports ICMPv6 Reflection MUST support the
      'Reflect All' object.</t>

      <t>In the ICMPv6 Reflection utility, the 'Reflect All' object MUST be
      included in the Extension Structure. If there is more than one object,
      the 'Reflect All' object MUST be the first object. An ICMPv6 message
      MUST NOT include more than one 'Reflect All' object.</t>

      <t>The structure of the 'Reflect All' object follows the specification
      of ICMP Extension Objects as defined in <xref target="RFC4884"/> and
      MUST include the following fields:</t>

      <t><list style="symbols">
          <t>The Length of the 'Reflect All' object.</t>

          <t>An object class (as specified in <xref target="IANA"/>).</t>

          <t>C-Type as described below.</t>

          <t>An object payload field.</t>
        </list></t>

      <t>The Length field specifies the number of octets in the object.
      The Length in the 'Reflect All' object of a reply message MUST be equal
      to the Length in the 'Reflect All' object of the respective request 
      message. </t>

      <t>The C-Type value is used for indicating whether the probed node was
      able to process the object. The following C-Type values are
      supported:</t>

      <t><list style="symbols">
          <t>(0) Request</t>

          <t>(1) Reply - No Error</t>

          <t>(2) Reply - Unsupported Object</t>
        </list></t>

      <t>The C-Type field of a Reflection object in a request message MUST be
      set to the 'Request' value. If the probed node is able to process the
      'Reflect All' object, it MUST copy the request message into the object
      payload and update the C-Type field to the 'Reply - No Error' value. If
      the probed node is not able to process the object, it MUST update the
      C-Type value of the object in the Extended Echo Reply to 'Reply -
      Unsupported Object'.</t>

      <t>The object payload field in the ICMPv6 Extended Echo Request message
      is a placeholder for the corresponding reply message. Its length 
      determines the number of bytes, starting from the beginning of the IPv6
      header, that the probed node includes in the object payload of the 
      reply. The object payload field in a request message MAY contain all 
      zeros. Alternatively, this field MAY contain arbitrary data. In reply 
      messages the object payload field MUST contain the received request 
      message starting from the beginning of the IPv6 header and according 
      to the length of the object payload, provided that the probed node 
      supports the 'Reflect All' object and that responding does not conflict 
      with its security policy.</t>

      <t>If the 'Reflect All' object is sufficiently long, the reply message 
      includes the initial octets of the 'Reflect All' object. A notable use 
      case for including arbitrary data in the object payload is the inclusion 
      of a transmission timestamp, similar to how conventional Ping utilities 
      incorporate timestamps into the ICMP payload. If the initial octets of 
      the 'Reflect All' object payload contain a timestamp and the object is 
      long enough, the timestamp is reflected back to the probing node, 
      enabling round-trip time calculations.</t>
    </section>

    <section anchor="IANA" title="IANA Considerations">
      <t>IANA is requested to allocate the following values in the "ICMP
      Extension Object Classes and Class Sub-types" registry.</t>

      <figure align="center" anchor="IcmpTypes" title="IANA Allocation">
        <artwork align="left"><![CDATA[
         
+-----------+------------------+--------+---------------+-----------------+  
| Class-Num |    Object Name   | C-Type |  C-Type Name  |     Reference   |  
+-----------+------------------+--------+---------------+-----------------+  
|   TBD1    | Reflect All      |  0-2   |  See below    | [This document] |  
|           |                  |        |               |                 |
+-----------+------------------+--------+---------------+-----------------+
  ]]></artwork>
      </figure>

      <t>For each of the object classes above the following C-Type values are
      defined:</t>

      <t><list style="symbols">
          <t>(0) Request</t>

          <t>(1) Reply - No Error</t>

          <t>(2) Reply - Unsupported Object</t>
        </list></t>
    </section>

    <section anchor="Security" title="Security Considerations">
      <t>Since this document uses technologies from <xref target="RFC4443"/>,
      <xref target="RFC4884"/>, and <xref
      target="I-D.ietf-intarea-rfc8335bis"/>, it inherits security
      considerations from those documents.</t>

      <t>The Reflection procedure that is defined in this document is
      symmetric in terms of the length of the request and reply messages. This
      symmetry mitigates the potential for amplification attacks, which would
      be possible if the reply message was longer than the request
      message.</t>

      <t>Depending on the network policy and the location of nodes in the
      network, ICMPv6 informational and/or error messages are sometimes
      filtered or not supported. For example, some nodes do not reply to
      ICMPv6 Echo or do not send ICMPv6 Time Exceeded messages (used in
      Traceroute), due to policy considerations that may be related to DoS
      mitigation or to privacy. Network operators SHOULD apply similar
      considerations to ICMPv6 Extended Echo messages when they are used for
      Reflection. For example, an operator can choose to disable support for
      ICMPv6 Reflection in networks or in nodes that do not respond to ICMPv6
      Echo and/or do not generate ICMPv6 Time Exceeded messages.</t>

      <t>As specified in <xref target="I-D.ietf-intarea-rfc8335bis"/>, in
      order to protect local resources, implementations SHOULD rate-limit
      incoming ICMP Extended Echo Request messages. Moreover, as per <xref
      target="I-D.ietf-intarea-rfc8335bis"/>, by default, ICMP Extend Echo
      functionality is disabled.</t>
    </section>

    <section title="Acknowledgements">
      <t>The authors gratefully acknowledge Sebastian Moeller, Zafar Ali,
      Bob Hinden, Jen Linkova, Jeremy Duncan, Greg Mirsky, Nick Buraglio
      and Maciej Zenczykowski for their insightful comments.</t>
    </section>
  </middle>

  <back>
    <references title="Normative References">
      <?rfc include='reference.RFC.2119'?>

      <?rfc include='reference.RFC.8174'?>

      <?rfc include='reference.RFC.8200'?>

      <?rfc include='reference.RFC.4443'?>

      <?rfc include='reference.RFC.4884'?>

       <?rfc include='reference.RFC.8335'?>

      <?rfc include='reference.I-D.ietf-intarea-rfc8335bis'?>

      <?rfc include='reference.I-D.ietf-intarea-icmp-exten-hdr-len'?>
    </references>

    <references title="Informative References">
      <?rfc include='reference.RFC.9486'?>

      <?rfc include='reference.I-D.filsfils-ippm-path-tracing'?>

      <?rfc include='reference.I-D.kumar-ippm-ifa'?>

      <?rfc include='reference.RFC.2151'?>

      <?rfc include='reference.RFC.3022'?>
    </references>

    <section numbered="no" title="Contributors">
      <t>
        <figure>
          <artwork><![CDATA[ 
   Shahar Belkar
   Huawei
   8-2 Matam
   Haifa 3190501
   Israel
   Email: shahar.belkar@huawei.com

   
   Chongfeng Xie
   China Telecom
   Email: xiechf@chinatelecom.cn


   Zhenqiang Li
   China Mobile
   Email: li_zhenqiang@hotmail.com


   Justin Iurman
   Universite de Liege
   10, Allee de la decouverte (B28)
   4000 Sart-Tilman
   Belgium
   Email: justin.iurman@uliege.be

]]></artwork>
        </figure>
      </t>
    </section>
  </back>
</rfc>
