If the initiating entity includes in the initial stream header the 'version' attribute set to a
value of at least "1.0" (see ), after sending the response stream header the
receiving entity MUST send a <features/> child element (typically prefixed by the stream
namespace prefix as described under ) to the initiating entity in order to
announce any conditions for continuation of the stream negotiation process. Each condition
takes the form of a child element of the <features/> element, qualified by a namespace that
is different from the stream namespace and the content namespace. The <features/>
element can contain one child, contain multiple children, or be empty.
Implementation Note: The order of child elements contained in any given
<features/> element is not significant.
If a particular stream feature is or can be mandatory-to-negotiate, the definition of that
feature needs to do one of the following:
1. Declare that the feature is always mandatory-to-negotiate (e.g., this is true of
resource binding for XMPP clients); or
2. Specify a way for the receiving entity to flag the feature as mandatory-to-
negotiate for this interaction (e.g., for STARTTLS, this is done by including an
empty <required/> element in the advertisement for that stream feature, but
that is not a generic format for all stream features); it is RECOMMENDED that
stream feature definitions for new mandatory-to-negotiate features do so by
including an empty <required/> element as is done for STARTTLS.
Informational Note: Because there is no generic format for indicating that a
feature is mandatory-to-negotiate, it is possible that a feature that is not
understood by the initiating entity might be considered mandatory-to-negotiate
by the receiving entity, resulting in failure of the stream negotiation process.
Although such an outcome would be undesirable, the working group deemed it
rare enough that a generic format was not needed.
For security reasons, certain stream features necessitate the initiating entity to send a new
initial stream header upon successful negotiation of the feature (e.g., TLS in all cases and
SASL in the case when a security layer might be established). If this is true of a given stream
feature, the definition of that feature needs to specify that a stream restart is expected after
negotiation of the feature.
A <features/> element that contains at least one mandatory-to-negotiate feature indicates
that the stream negotiation is not complete and that the initiating entity MUST negotiate
further features.
R: <stream:features>
<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'>
<required/>
</starttls>
</stream:features>
A <features/> element MAY contain more than one mandatory-to-negotiate feature. This
means that the initiating entity can choose among the mandatory-to-negotiate features at
this stage of the stream negotiation process. As an example, perhaps a future technology will
perform roughly the same function as TLS, so the receiving entity might advertise support for
both TLS and the future technology at the same stage of the stream negotiation process.
However, this applies only at a given stage of the stream negotiation process and does not
apply to features that are mandatory-to-negotiate at different stages (e.g., the receiving
entity would not advertise both STARTTLS and SASL as mandatory-to-negotiate, or both
SASL and resource binding as mandatory-to-negotiate, because TLS would need to be
negotiated before SASL and because SASL would need to be negotiated before resource
binding).
A <features/> element that contains both mandatory-to-negotiate and voluntary-to-
negotiate features indicates that the negotiation is not complete but that the initiating entity
MAY complete the voluntary-to-negotiate feature(s) before it attempts to negotiate the
mandatory-to-negotiate feature(s).
Section 4.7.5
Section 4.8.5