<?xml version="1.0" encoding="US-ASCII"?>
<!-- This template is for creating an Internet Draft using xml2rfc,
     which is available here: http://xml.resource.org. -->
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!-- One method to get references from the online citation libraries.
     There has to be one entity for each item to be referenced.
     An alternate method (rfc include) is described in the references. -->

<!ENTITY RFC2119 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC2629 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2629.xml">
<!ENTITY RFC3552 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3552.xml">
<!ENTITY RFC4006 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4006.xml">
<!ENTITY RFC6733 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.6733.xml">
<!ENTITY RFC7068 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.7068.xml">
<!ENTITY RFC2782 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2782.xml">
<!ENTITY I-D.ietf-dime-ovli PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml3/reference.I-D.draft-ietf-dime-ovli-03.xml'>
<!ENTITY I-D.tschofenig-dime-dlba PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml3/reference.I-D.draft-tschofenig-dime-dlba-00.xml'>
<!ENTITY I-D.roach-dime-overload-ctrl PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml3/reference.I-D.draft-roach-dime-overload-ctrl-03.xml'>
<!ENTITY I-D.korhonen-dime-ovl PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml3/reference.I-D.draft-korhonen-dime-ovl-01.xml'>
]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<!-- used by XSLT processors -->
<!-- For a complete list and description of processing instructions (PIs),
     please see http://xml.resource.org/authoring/README.html. -->
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds might want to use.
     (Here they are set differently than their defaults in xml2rfc v1.32) -->
<?rfc strict="yes" ?>
<!-- give errors regarding ID-nits and DTD validation -->
<!-- control the table of contents (ToC) -->
<?rfc toc="yes"?>
<!-- generate a ToC -->
<?rfc tocdepth="4"?>
<!-- the number of levels of subsections in ToC. default: 3 -->
<!-- control references -->
<?rfc symrefs="yes"?>
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] -->
<?rfc sortrefs="yes" ?>
<!-- sort the reference entries alphabetically -->
<!-- control vertical white space
     (using these PIs as follows is recommended by the RFC Editor) -->
<?rfc compact="yes" ?>
<!-- do not start each main section on a new page -->
<?rfc subcompact="no" ?>
<!-- keep one blank line between list items -->
<!-- end of list of popular I-D processing instructions -->
<rfc category="info" docName="draft-ietf-dime-load-00" ipr="trust200902">
<!-- category values: std, bcp, info, exp, and historic
     ipr values: full3667, noModification3667, noDerivatives3667
     you can add the attributes updates="NNNN" and obsoletes="NNNN"
     they will automatically be output with "(if approved)" -->
<!-- ***** FRONT MATTER ***** -->
  <front>
<!-- The abbreviated title is used in the page header - it is only necessary if the
  full title is longer than 39 characters -->
    <title abbrev="Abbreviated Title">Diameter Load Information Conveyance</title>
<!-- add 'role="editor"' below for the editors if appropriate -->
<!-- Another author who claims to be an editor -->
    <author fullname="Ben Campbell" initials="B."
     surname="Campbell">
      <organization>Oracle</organization>
      <address>
        <postal>
          <street>7460 Warren Parkway # 300</street>
<!-- Reorder these if your country does things differently -->
          <city>Frisco</city>
          <region>Texas</region>
          <code>75034</code>
          <country>USA</country>
        </postal>
        <phone></phone>
        <email>ben@nostrum.com</email>
<!-- uri and facsimile elements may also be added -->
      </address>
    </author>
    <author role="editor" initials="S" surname="Donovan" fullname="Steve Donovan">
      <organization>Oracle</organization>
      <address>
        <postal>
          <street>7460 Warren Parkway # 300</street>
          <city>Frisco</city>
          <region>Texas</region>
          <code>75034</code>
          <country>United States</country>
        </postal>
        <email>srdonovan@usdonovans.com</email>
      </address>
    </author>
	<author fullname = "Jean-Jacques Trottin" initials="JJ"
		surname="Trottin">
		<organization>Alcatel-Lucent</organization>
		<address>
      <postal>
        <street>Route de Villejust</street>
        <region>91620 Nozay</region>
        <country>France</country>
      </postal>
			<email>jean-jacques.trottin@alcatel-lucent.com</email>
		</address>
		</author>
    <date month="July" year="2015" />
<!-- If the month and year are both specified and are the current ones, xml2rfc will fill
  in the current day for you. If only the current year is specified, xml2rfc will fill
    in the current day and month for you. If the year is not the current one, it is
    necessary to specify at least a month (xml2rfc assumes day="1" if not specified for the
    purpose of calculating the expiry date).  With drafts it is normally sufficient to
    specify just the year. -->
<!-- Meta-data Declarations -->
    <area>General</area>
    <workgroup>Internet Engineering Task Force</workgroup>
<!-- WG name at the upperleft corner of the doc,
  IETF is fine for individual submissions.
    If this element is not present, the default is "Network Working Group",
  which is used by the RFC Editor as a nod to the history of the IETF. -->
    <keyword>Diameter</keyword>
	<keyword>load</keyword>
<!-- Keywords will be incorporated into HTML output
  files in a meta tag but they have no effect on text or nroff
  output. If you submit your draft to the RFC Editor, the
  keywords will be used for the search engine. -->
    <abstract>
      <t>
        This document defines
        a mechanism for sharing of Diameter load information.
       RFC 7068 describes requirements for Overload Control in Diameter. This
 	   includes a requirement to allow Diameter nodes to send "load" information,
	   even when the node is not overloaded. The
 	   Diameter Overload Information Conveyance (DOIC) solution describes
       a mechanism meeting most of the requirements, but does
	   not currently include the ability to send load information.
      </t>
    </abstract>
  </front>
  <middle>
    <section anchor="intro" title="Introduction">
		<t>
      <xref target="RFC7068"/> describes requirements for Overload Control
  		in <xref target="RFC6733">Diameter</xref>.  At the time of this writing,
  		the DIME working group is working on the Diameter Overload Information Conveyance
  		(DOIC) mechanism <xref target="I-D.ietf-dime-ovli"/> .
      As currently specified, DOIC fulfills some, but not all, of the
  		requirements.
    </t>
		<t>
      In particular, DOIC does not fulfill Req 24, which requires a mechanism
			where Diameter nodes can indicate their current load, even if they are not
			currently overloaded. DOIC also does not fulfill Req 23, which requires that
			nodes that divert traffic away from overloaded nodes be provided with
			sufficient information to select targets that are most likely to have sufficient capacity.
    </t>
		<t>
      There are several other requirements in RFC 7068 that mention both overload and load
			information that are only partially fulfilled by DOIC.
    </t>
		<t>
      The DIME working group explicitly chose not to fulfill these requirements in DOIC due to several
			reasons. A principal reason was that the working group did not agree on a general approach
			for conveying load information. It chose to progress the rest of DOIC, and defer load information
			conveyance to a DOIC extension or a separate mechanism.
    </t>
		<t>
      This document defines a mechanism that addresses the load-related requirements from RFC 7068.
    </t>
  </section>
  <section title="Terminology and Abbreviations" anchor="abbrev">
    <t>
     <list style="hanging">
       <t hangText="DOIC">
       <vspace blankLines="1"/>
       Diameter Overload Information Conveyance
       </t>
       <t hangText="Load">
         <vspace blankLines="1"/>
         The relative capacity of a Diameter node.  A low value indicates that the
         Diameter node is under utilized.  A high value indicated that the node is
         closer to being fully utilized.
       </t>
       <t hangText="Offered Load">
         <vspace blankLines="1"/>
         The actual traffic sent to the reporting node after overload abatement
         and routing decisions are made.
       </t>
     </list>
    </t>
  </section>
  <section title="Conventions Used in This Document">
    <t>
      The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
      "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
      document are to be interpreted as described in
      <xref
        target="RFC2119">RFC 2119</xref>.
      </t>
      <t>
        <xref
        target="RFC2119">RFC 2119</xref> interpretation does not apply for
        the above listed words when they are not used in all-caps format.
      </t>
  </section>

  <section anchor="background" title="Background">
  	<section anchor="load-overload" title="Differences between Load and Overload information">
  		<t>
        Previous discussions of how to solve the load-related requirements in
        <xref target="RFC7068"/> have shown that people have not had an agreed-upon concept of
        how "load" information differs from "overload" information. While the two concepts are highly
        interrelated,
        in the opinion of the authors, there are two primary differences. First, a
        Diameter node always has a load.  At any given time that load maybe effectively
        zero, effectively fully loaded, or somewhere in between.
  			In contrast, overload is an exceptional condition. A node only has overload
        information when it is in an overloaded state. Furthermore, the relationship between
        a node's load level and overload state at any given time may be vague.
        For example, a node may normally operate at a "fully loaded" level, but still not
        be considered overloaded. Another node may declare itself to be "overloaded" even though
  			it might not be fully "loaded".
  		</t>
  		<t>
         Second, Overload information, in the form of a <xref target="I-D.ietf-dime-ovli"> DOIC
  			 Overload Report (OLR) </xref> indicates an explicit request for action on the part of the
  			 reacting node. That is, the OLR requests that the reacting node reduce the offered load
         -- the actual traffic sent to the reporting node after overload abatement and routing
         decisions are made --
  			 by an indicated amount or to an indicated level. Effectively, DOIC provides a contract
  			 between the reporting node and the reacting node.
      </t>
  		<t>
        In contrast, load is informational. That is, load information can be considered a hint
  			to the recipient node. That node may use the load information for load balancing purposes,
  			as an input to certain overload abatement techniques, to make inferences about the likelihood
  			that the sending node becomes overloaded in the immediate future, or for other purposes.
  		</t>
  		<t>
        None of this prevents a Diameter node from deciding to reduce the offered load based on
  			load information. The fundamental difference is that an overload report requires
  			that reduction.  It is also reasonable for a Diameter node to decide to increase the
        offered load based on load information.
  		 </t>
  	</section>
  	<section anchor="use" title="How is Load Information Used?">
  	  <t>
        <xref target="RFC7068"/> contemplates two primary uses for load information.
  			Req 23 discusses how load information might be used when performing diversion
  			as an overload abatement technique, as described in <xref target="I-D.ietf-dime-ovli"/>.
  			When a reacting node diverts traffic away from an overloaded node, it needs load information
  			for the other candidates for that traffic in order to effectively load
  			balance the diverted load between potential candidates. Otherwise, diversion has a
        greater potential to drive other nodes into overload.
  		</t>
  		<t>
  			Req 24 discusses how Diameter load information might be used when no overload condition currently
  			exists. Diameter nodes can use the load information to make decisions to try to avoid overload
  			conditions in the first place. Normal load-balancing falls into this category. A node might
  			also take other proactive steps to reduce offered load based on load information,
        so that the loaded
  			node never goes into overload in the first place.
  		</t>
  		<t>
  			If the loaded nodes are Diameter servers (or clients in the case of server-to-client
        transactions), both of these uses are most effectively accomplished
  			by a Diameter node that performs server selection. Typically, server selection is performed
  			by a node (a client or an agent) that is an immediate peer of the server.
        However, there are scenarios (see <xref target="scenarios" />)
        where a client or proxy that is not
        the immediate peer to the selected servers performs server selection.  In this case,
        the client or proxy enforces the server selection by inserting a Destination-Host AVP.
  		</t>
      <t><list><t>
        For example, a Diameter node (e.g. client) can use a redirect agent to get
        candidate destination
        host addresses.  The redirect agent might return several destination host addresses,
        from which the Diameter node selects one.  The Diameter node can use load
        information received from these hosts to make the selection.
      </t></list></t>
      <t>
        Just as load information can be used as part of server selection, it can also be used
        as input to the selection of the next-hop peer to which a request is to be routed.
      </t>
      <t><list><t>
        Editor's Note:
        One area that requires thought is how load information is used, if at all, in the presence
        of an overload report from the same Diameter node.  It might be that the load information
        from that Diameter node is ignored for the duration of the time that the overload report
        is in effect.  It might also be possible that the load information can aid
        in the diverting of
        non-abated requests targeted for the overloaded Diameter node.
      </t></list></t>
  	</section>
  </section>
  <section anchor="overview" title="Solution Overview">
    <t>
      The mechanism defined here for the conveyance of load information is similar
      in some says to the mechanism defined for DOIC and is different in other ways.
    </t>
    <t>
      As with DOIC, load information is conveyed by piggy-backing the load AVPs on existing
      Diameter applications.
    </t>
    <t>
      There are two primary differences.  First, there is no capability negotiation
      process for load.  The sender of the load information is sending it with the expectation
      that any supporting nodes will use it when making routing decisions.  If there are
      no nodes that support the load extension then the load information is ignored.
    </t>
    <t>
      The second big difference between DOIC and Load is that DOIC information is sent
      end-to-end.  The DOIC overload reports much remain in the message all the way from the
      reporting node to the node that is the target for the answer message.  For the Load
      mechanism, the load information is targeted for the peer of the sender of the Load AVPs.
    </t>
    <t><list><t>
      Editor's note: It is still being discussed whether a second type of Load report
      can be included that is the load of the end-point and is carried end-to-end.
    </t></list></t>
    <t>
      The Load report applies to an individual node.  The Diameter identity of the
      node to which it applies is included in the Load report.
    </t>
    <t><list><t>
      Note, this is necessary so that supporting nodes can determine if the load report
      came from a peer node.  If the identity is for a non peer node than the peer load
      report can be ignored.
    </t></list></t>
    <t>
      In addition to the identity of the node to which the report
      applies, the load report includes the relative load of the sending node.
      This relative load
      is specified in a manner consistent with that defined for DNS SRV <xref target="RFC2782"/>.
    </t>
    <t>
      The method for calculating the load value included in the load report is left as
      an implementation decision.
    </t>
    <t>
      The frequency for sending of load reports is also left as an implementation decision.
      The sending node might choose to send load reports in all messages or it might
      choose to only send load reports when the load value has changed by some implementation
      specific value.  The important consideration is that all nodes needing the load
      information have a sufficiently accurate view of the nodes load.
    </t>
    <section anchor="theory" title="Theory of Operation">
      <t>
        This section outlines how the Diameter load mechanism is expected to work.
      </t>
      <t>
        For this discussion, assume the following Diameter network configuration:
      </t>
      <figure title="Example Diameter Network" anchor="example-net">
      <artwork><![CDATA[
        ---A1---A3----S[1], S[2]...S[p]
       /   | \ /
      C    |  x
       \   | / \
        ---A2---A4----S[p+1], S[p+2] ...S[n]
      ]]>
      </artwork>
      </figure>
      <t>
        Also assume that the request for a Diameter transaction takes the following path:
      </t>
      <figure title="Request Message Path" anchor="example-req">
      <artwork><![CDATA[
      C     A1     A4     S[n]
      |      |      |      |
      |----->|----->|----->|
      xxR     xxR    xxR

      ]]>
      </artwork>
      </figure>
      <t>
        When sending the answer message, a sending node that supports the Diameter Load
        mechanism includes it's own load information in the answer message:
      </t>
      <figure title="Answer Message from S[n]" anchor="example-a1">
      <artwork><![CDATA[
      C     A1     A4     S[n]
      |      |      |      |
      |      |      |<-----|
                     xxA(Load S[n])
      ]]>
      </artwork>
      </figure>
      <t>
        If Agent A4 supports the Load mechanism then it will verify that the load information
        received was from its peer.  This is achieved by matching the identity included in the
        load information with the identity of the peer node from which the answer message was
        received.
      </t>
      <t>
        If the load information does not match then the agent will strip the load AVPs from
        the message.
      </t>
      <t>
        If the identity included in the load information AVPs matches the identity of the
        peer from which the load information is received then Agent A4 stores the load
        information for S[n] in its routing tables.
      </t>
      <t>
        In all cases, A4 strips the load AVPs from the message.
      </t>
      <t>
        A4 then calculates its own load information and inserts load information AVPs in the message
        before sending the message to A1:
      </t>
      <figure title="Answer Message from A4" anchor="example-a2">
      <artwork><![CDATA[
      C     A1     A4     S[n]
      |      |      |      |
      |      |<-----|      |
              xxA(Load A4)
      ]]>
      </artwork>
      </figure>
      <t>
        A1 follows the same procedures as A4, resulting in the following message sent
        to C:
      </t>
      <figure title="Answer Message from A1" anchor="example-a3">
      <artwork><![CDATA[
      C     A1     A4     S[n]
      |      |      |      |
      |<-----|      |      |
       xxA(Load A1)
      ]]>
      </artwork>
      </figure>
      <t>
        C follows the same procedure for determining if the Load report was received from the
        peer from which the report was sent and, when finding it does, stores the load
        information for use when making future routing decisions.
      </t>
      <t>
        The Load information received by all nodes is then used for routing of subsequent
        request messages.
      </t>
      <t><list><t>
        Editor's note: The above needs to be updated if there is agreement to support
        end-point Load reports.
      </t></list></t>
    </section>
  </section>
  <section anchor="procedures" title="Solution Procedures">
    <section anchor="reporting" title="Reporting Node Behavior">
      <section anchor="ep-report" title="Endpoint Reporting Node Behavior">
      </section>
      <section anchor="ag-report" title="Agent Reporting Node Behavior">
      </section>
    </section>
    <section anchor="receiving" title="Receiving Node Behavior">
      <section anchor="ep-receive" title="Endpoint Receiving Node Behavior">
      </section>
      <section anchor="ag-receive" title="Agent Receiving Node Behavior">
      </section>
    </section>
    <section anchor="extend" title="Extensibility">
    </section>
  </section>
  <section anchor="avp" title="Attribute Value Pairs">
  </section>

	<section anchor="security" title="Security Considerations">
		<t>
			Load information may be sensitive information in some cases.
      Depending on the mechanism, an unauthorized recipient
			might be able to infer the topology of a Diameter network from load information.
      Load information might be useful in identifying targets for Denial of
      Service (DoS) attacks, where a node known to be already heavily loaded might
			be a tempting target. Load information might also be useful as feedback about
      the success of an ongoing DoS attack.
		</t>
		<t>
      Any load information conveyance mechanism will need to allow operators to avoid
      sending load information to nodes that are not authorized to receive it.
      Since Diameter currently only offers authentication of nodes at the transport
      level, any solution that sends load information to non-peer nodes might require
      a transitive-trust model.
		</t>
	</section>
	<section anchor="iana" title="IANA Considerations">
		<t>This document makes no requests of IANA.</t>
	</section>

</middle>
  <back>
    <references title="Normative References">
      &RFC2119;
  &RFC6733;
  &RFC7068;
  &I-D.ietf-dime-ovli;
  </references>
    <references title="Informative References">

  &RFC2782;
    </references>

    <section anchor="scenarios" title="Topology Scenarios">
      <t>
        This section presents a number of Diameter topology scenarios, and discusses
        how load information
        might be used in each scenario. Nothing in this section should be construed
        to mean that a given scenario
        is in scope for this effort, or even a good idea.  Some scenarios might be
        considered as not relevant in practice and subsequently discarded.
      </t>
    <section title="No Agent">
      <t>
        <xref target="simple-CS" /> shows a simple client-server scenario, where a client picks
        from a set of candidate servers available for a particular realm and application. The client
        selects the server for a given transaction using the load information received from each server.
      </t>
  <figure title="Basic Client Server Scenario" anchor="simple-CS">
  <artwork><![CDATA[
    ------S1
   /
  C
   \
    ------S2
  ]]>
  </artwork>
  </figure>
      <t>
        <list>
          <t>
            Open Issue: Will a Diameter node include potential peers that it is not
            currently connected to as part of the candidate set? It is unlikely the client
            would have load information from peers that it is not currently connected to.
          </t>
        </list>
      </t>
      <t><list><t>
        Note: The use of dynamic connections needs to be considered.
      </t></list></t>
    </section>
    <section title="Single Agent">
          <t>
            <xref target="simple-agent" /> shows a client that sends requests to an agent. The agent selects
        the request destination from a set of candidate servers, using load information received from
        each server. The client does not need to receive load information, since it does not select
        between multiple agents.
          </t>
  <figure title="Simple Agent Scenario" anchor="simple-agent">
  <artwork><![CDATA[
         ------S1
        /
  C----A
        \
         ------S2
            ]]>
  </artwork>
  </figure>
    </section>
    <section title="Multiple Agents">
      <t>
        <xref target="multi-agent" /> shows a client selecting between multiple agents, and each agent
        selecting from multiple servers. The client selects an agent based on the load information
        received from each agent. Each agent selects a server based on the load information received
        from its servers.
      </t>
      <t>
        This scenario adds a complication that one set of servers may be more loaded than the other set. If,
        for example, S4 was the least loaded server, C would need to know to select agent A2 to reach S4.
        This might require C to receive load information from the servers as well as the agents.
        Alternatively, each agent might use the load of its servers as an input into calculating its
        own load, in effect aggregating upstream load.
      </t>
      <t>
        Similarly, if C sends a <xref target="I-D.ietf-dime-ovli">host-routed request</xref>, it needs
        to know which agent can deliver requests to the selected server. Without
        some special, potentially proprietary, knowledge of the topology upstream of A1 and A2, C
        would select the agent based on the normal peer selection procedures for the realm and application, and
        perhaps consider the load information from A1 and A2. If C sends a request
        to A1 that contains a Destination-Host AVP with a value of S4,
        A1 will not be able to deliver the request.
      </t>
  <figure title="Multiple Agents and Servers" anchor="multi-agent">
  <artwork><![CDATA[
          -----S3
         /
    ---A1------S1
   /
  C
   \
    ---A2------S2
         \
          ---- S4
  ]]>
  </artwork>
  </figure>
    </section>
    <section title="Linked Agents">
      <t>
        <xref target="linked-agents" /> shows a scenario similar to that of
        <xref target="multi-agent" />,
        except that the agents are linked, so that A1 can forward a
        request to A2, and vice-versa.
        Each agent could receive load information from the linked agent,
        as well as its connected servers.
      </t>
      <t>
        This somewhat simplifies the complication from <xref target="multi-agent" />,
        due to the fact
        that C does not necessarily need to choose a particular agent to reach a
        particular server.
        But it creates a similar question of how, for example, A1 might know
        that S4 was less loaded than
        S1 or S3. Additionally, it creates the opportunity for sub-optimal
        request paths. For example
        [C,A1,A2,S4] vs. [C,A2,S4].
      </t>
      <t>
        A likely application for linked agents is when each agent prefers to route only to
        directly connected servers and only
        forwards requests to another agent under exceptional circumstances. For example, A1 might
        not forward requests to A2 unless both S1 and S3 are overloaded. In this case, A1 might use the
        load information from S1 and S3 to select between those, and only consider the load information
        from A2 (and other connected agents) if it needs to divert requests to different agents.
      </t>
  <figure title="Linked Agents" anchor="linked-agents">
  <artwork><![CDATA[
           -----S3
          /
     ---A1------S1
   /    |
  C     |
   \    |
     ---A2------S2
          \
           ---- S4
  ]]>
  </artwork>
  </figure>
        <t>
          <xref target="linked-agents2"/> is a variant of <xref target="linked-agents"/>.  In this
          case, C1 sends all traffic through A1 and C2 sends all traffic through A2.  By default,
          A1 will load balance traffic between S1 and S3 and A2 will load balance traffic between
          S2 and S4.
        </t>
        <t>
          Now, if S1 S3 are significantly more loaded than S2 S4, A1 may route some C1
          traffic to A2. This is non optimal path but allows a better load balancing
          between the servers. To achieve this, A1 needs to receive some load info
          from A2 about S2/S4 load.
        </t>
  <figure title="Linked Agents" anchor="linked-agents2">
  <artwork><![CDATA[
           -----S3
          /
  C1----A1------S1
        |
        |
        |
  C2----A2------S2
          \
           ---- S4
  ]]>
  </artwork>
  </figure>
    </section>
    <section title="Shared Server Pools">
      <t><xref target="shared-server-pools" /> is similar to <xref target="linked-agents" />, except
      that instead of a link between agents, each agent is linked to all servers. (The links to each set of servers
      should be interpreted as a link to each server. The links are not shown separately due to the limitations of
      ASCII art.)</t>
      <t>In this scenario, each agent can select among all of the servers, based on the load information from the servers.
        The client need only be concerned with the load information of the agents.</t>
  <figure title="Shared Server Pools" anchor="shared-server-pools">
  <artwork>
    <![CDATA[
    ---A1---S[1], S[2]...S[p]
   /     \ /
  C       x
   \     / \
    ---A2---S[p+1], S[p+2] ...S[n]
  ]]>
  </artwork>
  </figure>
    </section>
    <section title="Agent Chains">
    <t>The scenario in <xref target="agent-chains" /> is similar to that of <xref target="multi-agent" />, except that,
    instead of the client possibly needing to select an agent that can route requests to the least loaded server, in
    this case A1 and A2 need to make similar decisions when selecting between A3 or A4. As the former scenario, this
    could be mitigated if A3 and A4 aggregate upstream loads into the load information they report downstream.
    </t>
  <figure title="Agent Chains" anchor="agent-chains">
  <artwork><![CDATA[
    ---A1---A3----S[1], S[2]...S[p]
   /   | \ /
  C    |  x
   \   | / \
    ---A2---A4----S[p+1], S[p+2] ...S[n]
  ]]>
  </artwork>
  </figure>
    </section>
    <section title ="Fully Meshed Layers">
      <t><xref target="full-mesh" /> extends the scenario in <xref target="shared-server-pools" /> by adding an extra layer of
      agents. But since each layer of nodes can reach any node in the next layer, each node only needs to consider the load
      of its next-hop peer.
      </t>
  <figure title="Full Mesh" anchor="full-mesh">
  <artwork><![CDATA[
    ---A1---A3---S[1], S[2]...S[p]
   /   | \ / |\ /
  C    |  x  | x
   \   | / \ |/ \
    ---A2---A4---S[p+1], S[p+2] ...S[n]
  ]]>
  </artwork>
  </figure>
    </section>
      <section title="Partitions">
      <t>A Diameter network with multiple is said to be "partitioned" when only a subset of available servers can server
        a particular realm-routed request. For example, one group of servers may handle users whose names start with
        "A" through "M", and another group may handle "N" through "Z". </t>
       <t>In such a partitioned network, nodes cannot load-balance requests across partitions, since not all
        servers can handle the request. A client, or an intermediate agent, may still be able to load-balance
        between servers inside a partition.</t>
      </section>
      <section title="Active-Standby Nodes">
        <t>The previous scenarios assume that traffic can be load balanced among all peers that are eligible to handle
          a request. That is, the peers operate in an "active-active" configuration. In an "active-standby" configuration,
          traffic would be load-balanced among active peers. Requests would only be sent to peers in a "standby" state if the
          active peers became unavailable. For example, requests might be diverted to a stand-by peer if one or more
          active peers becomes overloaded.</t>
      </section>
      <section title="Addition and removal of Nodes">
        <t>
          When a Diameter node is added, the new node will start by advertising its load.
          Downstream nodes will need to factor the new load information into
          load balancing decisions.  The downstream nodes should attempt to ensure
          a smooth increase of the traffic to the new node, avoiding an immediate spike
          of traffic to the new node.  It should be determined if
          this use case is in the scope of the load control mechanism.
        </t>
        <t>
          When removing a node in a controlled way (e.g. for maintenance purpose, so
          outside a failure case), it might be appropriate to progressively reduce the traffic
          to this node by routing traffic to other nodes.  Simple load
          information (load percentage) would be not sufficient. It should be determined if
          this use case is in the scope of the load control mechanism.
        </t>
      </section>
    </section>
  </back>
</rfc>
