rfc9028xml2.original.xml | rfc9028.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="utf-8"?> | <?xml version='1.0' encoding='UTF-8'?> | |||
<?rfc symrefs="yes"?> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | ||||
<?rfc toc="yes" ?> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" | |||
<?rfc compact="yes" ?> | category="exp" docName="draft-ietf-hip-native-nat-traversal-33" | |||
<?rfc sortrefs="no" ?> | obsoletes="" updates="" submissionType="IETF" xml:lang="en" | |||
<rfc ipr="trust200902" category="exp" | symRefs="true" tocInclude="true" sortRefs="true" version="3" | |||
docName="draft-ietf-hip-native-nat-traversal-33"> | number="9028" consensus="true"> | |||
<front> | <front> | |||
<title abbrev="HIP Native NAT Traversal Mode"> | <title abbrev="HIP Native NAT Traversal Mode"> | |||
Native NAT Traversal Mode for the Host Identity Protocol | Native NAT Traversal Mode for the Host Identity Protocol | |||
</title> | </title> | |||
<seriesInfo name="RFC" value="9028"/> | ||||
<author fullname="Ari Keranen" initials="A." surname="Keranen"> | <author fullname="Ari Keränen" initials="A." surname="Keränen"> | |||
<organization abbrev="Ericsson">Ericsson</organization> | <organization abbrev="Ericsson">Ericsson</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>Hirsalantie 11</street> | <street>Hirsalantie 11</street> | |||
<city>02420 Jorvas</city> | <city>Jorvas</city> | |||
<code>02420</code> | ||||
<country>Finland</country> | <country>Finland</country> | |||
</postal> | </postal> | |||
<email>ari.keranen@ericsson.com</email> | <email>ari.keranen@ericsson.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author initials="J." fullname="Jan Melén" surname="Melén"> | ||||
<author initials="J." fullname="Jan Melén" surname="Melén"> | ||||
<organization abbrev="Ericsson">Ericsson</organization> | <organization abbrev="Ericsson">Ericsson</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>Hirsalantie 11</street> | <street>Hirsalantie 11</street> | |||
<city>02420 Jorvas</city> | <city>Jorvas</city> | |||
<code>02420</code> | ||||
<country>Finland</country> | <country>Finland</country> | |||
</postal> | </postal> | |||
<email>jan.melen@ericsson.com</email> | <email>jan.melen@ericsson.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Miika Komu" initials="M." surname="Komu" role="editor"> | ||||
<author fullname="Miika Komu" initials="M.K.T." surname="Komu" role="editor" | ||||
> | ||||
<organization abbrev="Ericsson">Ericsson</organization> | <organization abbrev="Ericsson">Ericsson</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>Hirsalantie 11</street> | <street>Hirsalantie 11</street> | |||
<city>02420 Jorvas</city> | <city>Jorvas</city> | |||
<code>02420</code> | ||||
<country>Finland</country> | <country>Finland</country> | |||
</postal> | </postal> | |||
<email>miika.komu@ericsson.com</email> | <email>miika.komu@ericsson.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date month="June" year="2021"/> | ||||
<date year="2020" /> | ||||
<area>Internet</area> | <area>Internet</area> | |||
<workgroup>HIP Working Group</workgroup> | <workgroup>HIP</workgroup> | |||
<keyword>HIP, NAT, NAT traversal</keyword> | <keyword>HIP</keyword> | |||
<keyword>NAT</keyword> | ||||
<keyword>NAT traversal</keyword> | ||||
<abstract> | <abstract> | |||
<t> This document specifies a new Network Address Translator (NAT) | <t> This document specifies a new Network Address Translator (NAT) | |||
traversal mode for the Host Identity Protocol (HIP). The new mode is | traversal mode for the Host Identity Protocol (HIP). The new mode is | |||
based on the Interactive Connectivity Establishment (ICE) methodology and | based on the Interactive Connectivity Establishment (ICE) methodology | |||
UDP encapsulation of data and signaling traffic. The main difference from | and UDP encapsulation of data and signaling traffic. The main difference | |||
the previously specified modes is the use of HIP messages instead of ICE f | from the previously specified modes is the use of HIP messages instead | |||
or all NAT | of ICE for all NAT traversal procedures due to the kernel-space | |||
traversal procedures due to the kernel-space dependencies of HIP. | dependencies of HIP. | |||
</t> | </t> | |||
</abstract> | </abstract> | |||
</front> | </front> | |||
<!-- XX FIXME: CHECK NEW ICE SPECS? --> | ||||
<middle> | <middle> | |||
<section anchor="sec_intro" numbered="true" toc="default"> | ||||
<name>Introduction</name> | ||||
<t> The Host Identity Protocol (HIP) <xref target="RFC7401" | ||||
format="default"/> is specified to run directly on top of IPv4 or | ||||
IPv6. However, many middleboxes found in the Internet, such as NATs and | ||||
firewalls, often allow only UDP or TCP traffic to pass <xref | ||||
target="RFC5207" format="default"/>. Also, NATs usually require the host | ||||
behind a NAT to create a forwarding state in the NAT before other hosts | ||||
outside of the NAT can contact the host behind the NAT. To overcome this | ||||
problem, different methods, commonly referred to as NAT traversal | ||||
techniques, have been developed. </t> | ||||
<t>As one solution, the HIP experiment report <xref target="RFC6538" | ||||
format="default"/> mentions Teredo-based NAT traversal for HIP and | ||||
related Encapsulating Security Payload (ESP) traffic (with double | ||||
tunneling overhead). Another solution is specified in <xref | ||||
target="RFC5770" format="default"/>, which will be referred to as | ||||
"Legacy ICE-HIP" in this document. The experimental Legacy ICE-HIP | ||||
specification combines the Interactive Connectivity Establishment (ICE) | ||||
protocol (originally <xref target="RFC5245" format="default"/>) with HIP s | ||||
o that | ||||
basically, ICE is responsible for NAT traversal and connectivity | ||||
testing, while HIP is responsible for end-host authentication and IPsec | ||||
key management. The resulting protocol uses HIP, Session Traversal | ||||
Utilities for NAT (STUN), and ESP messages tunneled over a single UDP | ||||
flow. The benefit of using ICE and its STUN / Traversal Using Relays | ||||
around NAT (TURN) messaging formats is | ||||
that one can reuse the NAT traversal infrastructure already available | ||||
in the Internet, such as STUN and TURN servers. Also, some middleboxes | ||||
may be STUN aware and may be able to do something "smart" when they see | ||||
STUN being used for NAT traversal.</t> | ||||
<!-- ***************************************************************** --> | <t>HIP poses a unique challenge to using standard ICE, not only due to | |||
kernel-space dependencies of HIP, but also due to its close integration | ||||
<section title="Introduction" anchor="sec:intro"> | with kernel-space IPsec; and, while <xref target="RFC5770" | |||
format="default"/> provides a technically workable path, HIP incurs | ||||
<t> The Host Identity Protocol (HIP) <xref | ||||
target="RFC7401"/> is specified to run directly on top | ||||
of IPv4 or IPv6. However, many middleboxes found in the Internet, such as | ||||
NATs and firewalls, often allow only UDP or TCP traffic to pass <xref | ||||
target="RFC5207"/>. Also, NATs usually require the host behind | ||||
a NAT to create a forwarding state in the NAT before other hosts outside | ||||
of the NAT can contact the host behind the NAT. To overcome this problem, | ||||
different methods, commonly referred to as NAT traversal techniques, have | ||||
been developed. </t> | ||||
<t>As one solution, the HIP experiment report <xref | ||||
target="RFC6538" /> mentions Teredo-based NAT traversal for | ||||
HIP and related ESP traffic (with double tunneling overhead). | ||||
Another solution is specified in <xref target="RFC5770"/>, which | ||||
will be referred to as "Legacy ICE-HIP" in this document. The | ||||
experimental Legacy ICE-HIP specification combines Interactive Connectivit | ||||
y Establishment | ||||
(ICE) protocol <xref target="RFC5245"/> with | ||||
HIP, so that basically ICE is responsible for NAT traversal and | ||||
connectivity testing, while HIP is responsible for end-host | ||||
authentication and IPsec key management. The resulting protocol | ||||
uses HIP, STUN and ESP messages tunneled over a single UDP | ||||
flow. The benefit of using ICE and its STUN/TURN messaging | ||||
formats is that one can re-use the NAT traversal infrastructure | ||||
already available in the Internet, such as STUN and TURN | ||||
servers. Also, some middleboxes may be STUN-aware and may be | ||||
able to do something "smart" when they see STUN being used for | ||||
NAT traversal.</t> | ||||
<t>HIP poses a unique challenge to using standard ICE, due not | ||||
only to kernel-space dependencies of HIP, but also due to its | ||||
close integration with kernel-space IPSec; and, that while <xref target="R | ||||
FC5770" /> | ||||
provides a technically workable path, it incurs | ||||
unacceptable performance drawbacks for kernel-space | unacceptable performance drawbacks for kernel-space | |||
implementations. Also, implementing and integrating a full ICE/STUN/TURN p | implementations. Also, implementing and integrating a full ICE/STUN/TURN | |||
rotocol stack as specified | protocol stack as specified in Legacy ICE-HIP results in a considerable | |||
in Legacy ICE-HIP results in a considerable amount of effort and | amount of effort and code, which could be avoided by reusing and | |||
code which could be avoided by re-using and extending HIP | extending HIP messages and state machines for the same purpose. Thus, | |||
messages and state machines for the same purpose. | this document specifies an alternative NAT traversal mode referred to as | |||
Thus, this | "Native ICE-HIP" that employs the HIP messaging format instead of STUN | |||
document specifies an alternative NAT traversal mode referred as | or TURN for the connectivity checks, keepalives, and data relaying. | |||
"Native ICE-HIP" that employs HIP messaging format instead of | Native ICE-HIP also specifies how mobility management works in the | |||
STUN or TURN for the connectivity checks, keepalives and data | context of NAT traversal, which is missing from the Legacy ICE-HIP | |||
relaying. Native ICE-HIP also specifies how mobility management | specification. The native specification is also based on HIPv2, whereas | |||
works in the context of NAT traversal, which is missing from the | the legacy specification is based on HIPv1. The differences to Legacy | |||
Legacy ICE-HIP specification. The native specification is also based on HI | ICE-HIP are further elaborated in <xref target="sec_ice_diff" | |||
Pv2, whereas legacy specification is based on HIPv1. The differences to the | format="default"/>.</t> | |||
Legacy ICE-HIP are further elaborated in <xref target="sec:ice_diff" />.</ | ||||
t> | ||||
<t>Similarly as Legacy ICE-HIP, also this specification builds | ||||
on the HIP registration extensions <xref target="RFC8003" /> and | ||||
the base exchange procedure <xref target="RFC7401" /> and its closing proc | ||||
edures, so the | ||||
reader is recommended to get familiar with the relevant | ||||
specifications. In a nutshell, the registration extensions allow | ||||
a HIP Initiator (usually a "client" host) to ask for specific | ||||
services from a HIP Responder (usually a "server" host). The | ||||
registration parameters are included in a base exchange, which | ||||
is essentially a four-way Diffie-Hellman key exchange | ||||
authenticated using the public keys of the end-hosts. When the | ||||
hosts negotiate support for ESP <xref target="RFC7402" /> during | ||||
the base exchange, they can deliver ESP protected application | ||||
payload to each other. When either of the hosts moves and | ||||
changes its IP address, the two hosts re-establish connectivity | ||||
using the mobility extensions <xref target="RFC8046" />. The | ||||
reader is also recommended to get familiar with the mobility | ||||
extensions, but basically it is a three-way procedure, where the | ||||
mobile host first announces its new location to the peer, and | ||||
then the peer tests for connectivity (so called return | ||||
routability check), for which the mobile hosts must respond in | ||||
order to activate its new location. This specification builds on | ||||
the mobility procedures, but modifies it to be compatible with | ||||
ICE. The differences to the mobility extensions specified in <xref target= | ||||
"sec:hip_diff" />. | ||||
It is worth noting that multihoming support as specified in <xref target=" | ||||
RFC8047" /> is left | ||||
for further study. | ||||
</t> | ||||
<t>This specification builds heavily on the ICE methodology, so | <t>Similar to Legacy ICE-HIP, this specification builds on the HIP | |||
it is recommended that the reader is familiar with the ICE | registration extensions <xref target="RFC8003" format="default"/> and | |||
specification <xref target="RFC8445" /> | the base exchange procedure <xref target="RFC7401" format="default"/> | |||
(especially the overview). However, native ICE-HIP does not | and its closing procedures; therefore, the reader is recommended to get | |||
implement all the features in ICE, and, hence, the different | familiar with the relevant specifications. In a nutshell, the | |||
features of ICE are cross referenced using <xref | registration extensions allow a HIP Initiator (usually a "client" host) | |||
target="RFC2119"/> terminology for clarity. <xref | to ask for specific services from a HIP Responder (usually a "server" | |||
target="sec:ice_diff" /> explains the differences to ICE, and it is | host). The registration parameters are included in a base exchange, | |||
recommended that the reader would read also this section in addition to th | which is essentially a four-way Diffie-Hellman key exchange | |||
e | authenticated using the public keys of the end hosts. When the hosts | |||
ICE specification. | negotiate support for ESP <xref target="RFC7402" format="default"/> | |||
</t> | during the base exchange, they can deliver ESP-protected application | |||
payload to each other. When either of the hosts moves and changes its | ||||
IP address, the two hosts re-establish connectivity using the mobility | ||||
extensions <xref target="RFC8046" format="default"/>. The reader is also | ||||
recommended to get familiar with the mobility extensions; basically, | ||||
the process is a three-way procedure where the mobile host first | ||||
announces its new location to the peer; then, the peer tests | ||||
for connectivity (the so-called return routability check); and then, the | ||||
mobile host must respond to the announcement in order to activate its | ||||
new location. This specification builds on the mobility procedures, but | ||||
modifies them to be compatible with ICE. The differences in the mobility | ||||
extensions are specified in <xref target="sec_hip_diff" | ||||
format="default"/>. It is worth noting that multihoming support as | ||||
specified in <xref target="RFC8047" format="default"/> is left for | ||||
further study.</t> | ||||
<!-- | <t>This specification builds heavily on the ICE methodology, so it is | |||
<t>Two HIP specific NAT traversal techniques for HIP are specified in <xre | recommended that the reader is familiar with the ICE specification <xref | |||
f | target="RFC8445" format="default"/> (especially the overview). However, | |||
target="RFC5770"/>. One of them uses only UDP encapsulation, while the | Native ICE-HIP does not implement all the features in ICE; hence, | |||
other uses also the Interactive Connectivity Establishment (ICE) <xref | the different features of ICE are cross referenced using <xref | |||
target="RFC8445"/> protocol, which in turn uses Session Traversal | target="RFC2119" format="default"/> terminology for clarity. <xref | |||
Utilities for NAT (STUN) <xref target="RFC5389"/> and Traversal Using | target="sec_ice_diff" format="default"/> explains the differences to | |||
Relays around NAT (TURN) <xref target="RFC5766"/> protocols to achieve a | ICE, and it is recommended that the reader read this section | |||
reliable NAT traversal solution. </t> --> | in addition to the ICE specification.</t> | |||
</section> | </section> | |||
<!-- ***************************************************************** --> | <section numbered="true" toc="default"> | |||
<name>Terminology</name> | ||||
<section title="Terminology"> | ||||
<!-- | ||||
<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"/>. </t> --> | ||||
<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> | ||||
<t>This document borrows terminology from <xref target="RFC5770"/>, <xref | ||||
target="RFC7401"/>, <xref | ||||
target="RFC8046"/>, <xref target="I-D.ietf-hip-rfc4423-bis"/>, <xref | ||||
target="RFC8445"/>, and <xref target="RFC5389"/>. | ||||
The following terms recur in the text: | ||||
<list style="hanging"> | ||||
<!-- | ||||
<t hangText="Rendezvous server:"><vspace blankLines="0"/> A host | ||||
that forwards I1 packets to the Responder.<vspace | ||||
blankLines="0"/></t> --> | ||||
<t hangText="ICE:"><vspace blankLines="0"/> | ||||
Interactive Connectivity Establishment (ICE) protocol as specified in < | ||||
xref | ||||
target="RFC8445"/> | ||||
<vspace blankLines="0"/></t> | ||||
<t hangText="Legacy ICE-HIP:"><vspace blankLines="0"/> | ||||
Refers to the "Basic Host Identity Protocol (HIP) Extensions | ||||
for Traversal of Network Address Translators" as specified | ||||
in <xref target="RFC5770" />. The protocol specified in this | ||||
document offers an alternative to Legacy ICE-HIP.<vspace | ||||
blankLines="0"/></t> | ||||
<t hangText="Native ICE-HIP:"><vspace blankLines="0"/> | ||||
The protocol specified in this document (Native NAT Traversal Mode for | ||||
HIP). | ||||
<vspace blankLines="0"/></t> | ||||
<t hangText="Initiator:"><vspace | ||||
blankLines="0"/> The Initiator is the host that initiates the base exc | ||||
hange using I1 message <xref target="RFC7401" />. | ||||
</t> | ||||
<t hangText="Responder:"><vspace | ||||
blankLines="0"/> The Responder is the host that receives the I1 packet | ||||
from the Initiator <xref target="RFC7401" />. | ||||
</t> | ||||
<t hangText="Control Relay Server"><vspace blankLines="0"/> A registra | ||||
r host that | ||||
forwards any kind of HIP control plane packets between the Initiator a | ||||
nd | ||||
the Responder. This host is critical because it relays the locators be | ||||
tween the Initiator | ||||
and the Responder, so that they can try to establish a direct communic | ||||
ation path with each other. | ||||
This host is used to replace HIP rendezvous servers <xref target="RFC8 | ||||
004" /> for hosts operating in private address realms. | ||||
In the Legacy ICE-HIP specification <xref target="RFC5770" />, this ho | ||||
st is denoted as "HIP Relay Server". | ||||
<vspace blankLines="0"/></t> | ||||
<t hangText="Control Relay Client:"><vspace blankLines="0"/> | ||||
A requester host that registers to a Control Relay Server requesting it | ||||
to forward | ||||
control-plane traffic (i.e. HIP control messages). | ||||
In the Legacy ICE-HIP specification <xref target="RFC5770" />, this is | ||||
denoted as "HIP Relay Client". | ||||
<vspace blankLines="1"/></t> | ||||
<t hangText="Data Relay Server:"><vspace blankLines="0"/> A new entity | ||||
introduced | ||||
in this document; a registrar host that | ||||
forwards HIP related data plane packets, such as Encapsulating Securit | ||||
y Payload | ||||
(ESP) <xref target="RFC7402"/>, between two hosts. This host implement | ||||
s similar | ||||
functionality as TURN servers. | ||||
<vspace blankLines="0"/></t> | ||||
<t hangText="Data Relay Client:"><vspace blankLines="0"/> | ||||
A requester host that registers to a Data Relay Server requesting it to | ||||
forward | ||||
data-plane traffic (e.g. ESP traffic). This functionality is a new and | ||||
introduced in this | ||||
document. | ||||
<vspace blankLines="1"/></t> | ||||
<!-- | ||||
<t hangText="TURN server:"><vspace blankLines="0"/> A server that | ||||
forwards data traffic between two end-hosts as defined in <xref | ||||
target="RFC5766"/>.<vspace blankLines="0"/></t> --> | ||||
<t hangText="Locator:"><vspace blankLines="0"/> As defined in <xref | ||||
target="RFC8046"/>: "A name that controls how the packet is routed | ||||
through the network and demultiplexed by the end-host. It may include | ||||
a concatenation of traditional network addresses such as an IPv6 | ||||
address and end-to-end identifiers such as an ESP Security Parameter I | ||||
ndex (SPI). It may also | ||||
include transport port numbers or IPv6 Flow Labels as demultiplexing | ||||
context, or it may simply be a network address." | ||||
<vspace blankLines="0"/></t> | ||||
<t hangText="LOCATOR_SET (written in capital letters):"><vspace | ||||
blankLines="0"/> Denotes a HIP control packet parameter that bundles | ||||
multiple locators together <xref target="RFC8046" />. <vspace blankLi | ||||
nes="0"/></t> | ||||
<t hangText="HIP offer:"><vspace blankLines="0"/> | ||||
Before two end-hosts can establish a communication channel using the NA | ||||
T traversal procedures defined in this document, | ||||
they need exchange their locators (i.e. candidates) with each other. In | ||||
ICE, this procedure is called | ||||
Candidate Exchange and it does not specify how the candidates are excha | ||||
nged but Session Description Protocol (SDP) "offer/answer" is mentioned as an ex | ||||
ample. | ||||
In contrast, the Candidate Exchange in HIP is the base exchange itself | ||||
or a subsequent UPDATE prodecure occurring | ||||
after a handover. Following <xref target="RFC5770" /> and | ||||
SDP related naming conventions <xref target="RFC3264" />, "HIP offer" i | ||||
s the the Initiator's | ||||
LOCATOR_SET parameter in a HIP I2 or in an UPDATE control packet. | ||||
</t> | ||||
<t hangText="HIP answer:"><vspace blankLines="0"/> The Responder's | ||||
LOCATOR_SET parameter in a HIP R2 or UPDATE control packet. Correspond | ||||
s to the | ||||
SDP answer parameter <xref target="RFC3264" />, but is HIP specific. P | ||||
lease refer also to the longer description of the "HIP offer" term above.</t> | ||||
<t hangText="HIP connectivity checks:"><vspace | ||||
blankLines="0"/> In order to obtain a direct end-to-end | ||||
communication path (without employing a Data Relay Server), two commun | ||||
icating HIP hosts try to | ||||
"punch holes" through their NAT boxes using this mechanism. | ||||
It is similar to the ICE connectivity checks, but implemented | ||||
using HIP return routability checks. | ||||
</t> | ||||
<t hangText="Controlling host:"><vspace | ||||
blankLines="0"/>The controlling host <xref target="RFC8445" /> is alwa | ||||
ys the Initiator in the context of this specification. It nominates the candidat | ||||
e pair to be used with the controlled host. | ||||
</t> | ||||
<t hangText="Controlled host:"><vspace | ||||
blankLines="0"/>The controlled host <xref target="RFC8445" /> is alway | ||||
s the Responder in the context of this specification. It waits for the controlli | ||||
ng to nominate an address candidate pair. | ||||
</t> | ||||
<t hangText="Checklist:"><vspace blankLines="0"/>A list of address can | ||||
didate pairs that need to be tested for connectivity (same as in <xref target="R | ||||
FC8445" />).<vspace | ||||
blankLines="0"/></t> | ||||
<t hangText="Transport address:"><vspace blankLines="0"/> Transport | ||||
layer port and the corresponding IPv4/v6 address (same as in <xref tar | ||||
get="RFC8445" />).<vspace | ||||
blankLines="0"/></t> | ||||
<t hangText="Candidate:"><vspace blankLines="0"/> A transport address | ||||
that is a potential point of contact for receiving data (same as in <x | ||||
ref target="RFC8445" />).<vspace | ||||
blankLines="0"/></t> | ||||
<t hangText="Host candidate:"><vspace blankLines="0"/> A candidate | ||||
obtained by binding to a specific port from an IP address on the | ||||
host (same as in <xref target="RFC8445" />).<vspace blankLines="0"/></ | ||||
t> | ||||
<t hangText="Server reflexive candidate:"><vspace blankLines="0"/> A | ||||
translated transport address of a host as observed by a Control or Dat | ||||
a Relay Server (same as in <xref target="RFC8445" />). <vspace blankLines="0"/>< | ||||
/t> | ||||
<t hangText="Peer reflexive candidate:"><vspace blankLines="0"/> A | ||||
translated transport address of a host as observed by its peer (same a | ||||
s in <xref target="RFC8445" />). | ||||
<vspace blankLines="0"/></t> | ||||
<t hangText="Relayed candidate:"><vspace blankLines="0"/> A transport | ||||
address that exists on a Data Relay Server. Packets that arrive at thi | ||||
s | ||||
address are relayed towards the Data Relay Client. The concept is the | ||||
same as in <xref target="RFC8445" />, | ||||
but a Data Relay Server is used instead of a TURN server.</t> | ||||
<t hangText="Permission:"><vspace blankLines="0"/> In the context of D | <t> | |||
ata Relay Server, | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | |||
permission refers to a concept similar to TURN's (<xref target="RFC5 | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
766" />) channels. Before a host can use a relayed candidate | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | |||
to forward traffic through a Data Relay Server, the host must activa | "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
te the relayed candidate with a | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are | |||
specific peer host. | to be interpreted as | |||
<vspace blankLines="0"/></t> | described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | |||
when, and only when, they appear in all capitals, as shown here. | ||||
</t> | ||||
<t>This document borrows terminology from <xref target="RFC5770" | ||||
format="default"/>, <xref target="RFC7401" format="default"/>, <xref | ||||
target="RFC8046" format="default"/>, <xref | ||||
target="RFC9068" format="default"/>, <xref | ||||
target="RFC8445" format="default"/>, and <xref target="RFC8489" | ||||
format="default"/>. The following terms recur in the text:</t> | ||||
<dl newline="true" spacing="normal"> | ||||
<t hangText="Base:"><vspace blankLines="0"/> Similarly as in <xref tar | <dt>ICE:</dt> | |||
get="RFC8445" />, the base of a candidate is the local source | <dd>Interactive Connectivity Establishment (ICE) protocol as specified | |||
address a host uses to send packets for the associated candidate. For | in <xref target="RFC8445" format="default"/>.</dd> | |||
example, the base of a | <dt>Legacy ICE-HIP:</dt> | |||
server reflexive address is the local address the host used for regist | <dd>Refers to the "Basic Host Identity Protocol (HIP) Extensions for | |||
ering itself to the associated Control or Data Relay Server. The base | Traversal of Network Address Translators" as specified in <xref | |||
of a host candidate is equal to the host candidate itself. | target="RFC5770" format="default"/>. The protocol specified in this | |||
<vspace blankLines="0"/></t> | document offers an alternative to Legacy ICE-HIP.</dd> | |||
<dt>Native ICE-HIP:</dt> | ||||
<dd>The protocol specified in this document (Native NAT Traversal Mode | ||||
for HIP).</dd> | ||||
<dt>Initiator:</dt> | ||||
<dd>The host that initiates the base exchange using | ||||
I1 message <xref target="RFC7401" format="default"/>.</dd> | ||||
<dt>Responder:</dt> | ||||
<dd> The host that receives the I1 packet from the | ||||
Initiator <xref target="RFC7401" format="default"/>.</dd> | ||||
<dt>Control Relay Server</dt> | ||||
<dd>A registrar host that forwards any kind of HIP control plane | ||||
packets between the Initiator and the Responder. This host is critical | ||||
because it relays the locators between the Initiator and the | ||||
Responder so that they can try to establish a direct communication | ||||
path with each other. This host is used to replace HIP Rendezvous | ||||
Servers <xref target="RFC8004" format="default"/> for hosts operating | ||||
in private address realms. In the Legacy ICE-HIP specification <xref | ||||
target="RFC5770" format="default"/>, this host is denoted as "HIP | ||||
Relay Server".</dd> | ||||
<dt>Control Relay Client:</dt> | ||||
<dd>A requester host that registers to a Control Relay Server | ||||
requesting it to forward control plane traffic (i.e., HIP control | ||||
messages). In the Legacy ICE-HIP specification <xref target="RFC5770" | ||||
format="default"/>, this is denoted as "HIP Relay Client".</dd> | ||||
<dt>Data Relay Server:</dt> | ||||
<dd>A new entity introduced in this document; a registrar host that | ||||
forwards HIP related data plane packets, such as Encapsulating | ||||
Security Payload (ESP) <xref target="RFC7402" format="default"/>, | ||||
between two hosts. This host implements similar functionality as TURN | ||||
servers.</dd> | ||||
<dt>Data Relay Client:</dt> | ||||
<dd>A requester host that registers to a Data Relay Server requesting | ||||
it to forward data plane traffic (e.g. ESP traffic). This | ||||
functionality is a new and introduced in this document.</dd> | ||||
</list> | <dt>Locator:</dt> | |||
<dd><t>As defined in <xref target="RFC8046" format="default"/>: "A | ||||
name that controls how the packet is routed through the network and | ||||
demultiplexed by the end host. It may include a concatenation of | ||||
traditional network addresses such as an IPv6 address and end-to-end | ||||
identifiers such as an ESP SPI. It may also include transport port | ||||
numbers or IPv6 Flow Labels as demultiplexing context, or it may | ||||
simply be a network address." | ||||
</t> | </t> | |||
</dd> | ||||
<dt>LOCATOR_SET (written in capital letters):</dt> | ||||
<dd>Denotes a HIP control packet parameter that bundles multiple | ||||
locators together <xref target="RFC8046" format="default"/>.</dd> | ||||
<dt>HIP offer:</dt> | ||||
<dd>Before two end hosts can establish a communication channel using | ||||
the NAT traversal procedures defined in this document, they need to | ||||
exchange their locators (i.e., candidates) with each other. In ICE, | ||||
this procedure is called Candidate Exchange; it does not specify how | ||||
the candidates are exchanged, but Session Description Protocol (SDP) | ||||
"offer/answer" is mentioned as an example. In contrast, the Candidate | ||||
Exchange in HIP is the base exchange itself or a subsequent UPDATE | ||||
procedure occurring after a handover. Following <xref target="RFC5770" | ||||
format="default"/> and SDP-related naming conventions <xref | ||||
target="RFC3264" format="default"/>, "HIP offer" is the Initiator's | ||||
LOCATOR_SET parameter in a HIP I2 or in an UPDATE control packet.</dd> | ||||
<dt>HIP answer:</dt> | ||||
<dd> The Responder's LOCATOR_SET parameter in a HIP R2 or UPDATE | ||||
control packet. The HIP answer corresponds to the SDP answer parameter <x | ||||
ref | ||||
target="RFC3264" format="default"/> but is HIP specific. Please refer | ||||
also to the longer description of the "HIP offer" term above.</dd> | ||||
<dt>HIP connectivity checks:</dt> | ||||
<dd> In order to obtain a direct end-to-end communication path | ||||
(without employing a Data Relay Server), two communicating HIP hosts | ||||
try to "punch holes" through their NAT boxes using this mechanism. It | ||||
is similar to the ICE connectivity checks but implemented using HIP | ||||
return routability checks.</dd> | ||||
<dt>Controlling host:</dt> | ||||
<dd>The controlling host <xref target="RFC8445" format="default"/> is | ||||
always the Initiator in the context of this specification. It | ||||
nominates the candidate pair to be used with the controlled host.</dd> | ||||
<dt>Controlled host:</dt> | ||||
<dd>The controlled host <xref target="RFC8445" format="default"/> is | ||||
always the Responder in the context of this specification. It waits | ||||
for the controlling host to nominate an address candidate pair.</dd> | ||||
</section><!-- Terminology --> | <dt>Checklist:</dt> | |||
<dd>A list of address candidate pairs that need to be tested for | ||||
connectivity (same as in <xref target="RFC8445" | ||||
format="default"/>).</dd> | ||||
<dt>Transport address:</dt> | ||||
<dd>Transport-layer port and the corresponding IPv4/v6 address (same | ||||
as in <xref target="RFC8445" format="default"/>).</dd> | ||||
<dt>Candidate:</dt> | ||||
<dd>A transport address that is a potential point of contact for | ||||
receiving data (same as in <xref target="RFC8445" | ||||
format="default"/>).</dd> | ||||
<dt>Host candidate:</dt> | ||||
<dd>A candidate obtained by binding to a specific port from an IP | ||||
address on the host (same as in <xref target="RFC8445" | ||||
format="default"/>).</dd> | ||||
<dt>Server-reflexive candidate:</dt> | ||||
<dd>A translated transport address of a host as observed by a Control | ||||
or Data Relay Server (same as in <xref target="RFC8445" | ||||
format="default"/>).</dd> | ||||
<dt>Peer-reflexive candidate:</dt> | ||||
<dd>A translated transport address of a host as observed by its peer | ||||
(same as in <xref target="RFC8445" format="default"/>).</dd> | ||||
<dt>Relayed candidate:</dt> | ||||
<dd>A transport address that exists on a Data Relay Server. Packets | ||||
that arrive at this address are relayed towards the Data Relay | ||||
Client. The concept is the same as in <xref target="RFC8445" | ||||
format="default"/>, but a Data Relay Server is used instead of a TURN | ||||
server.</dd> | ||||
<dt>Permission:</dt> | ||||
<dd>In the context of Data Relay Server, permission refers to a | ||||
concept similar to TURN's <xref target="RFC8656" format="default"/> | ||||
channels. Before a host can use a relayed candidate to forward traffic | ||||
through a Data Relay Server, the host must activate the relayed | ||||
candidate with a specific peer host.</dd> | ||||
<section title="Overview of Operation"> | <dt>Base:</dt> | |||
<dd>Similar to that described in <xref target="RFC8445" format="default" | ||||
/>, the | ||||
base of a candidate is the local source address a host uses to send | ||||
packets for the associated candidate. For example, the base of a | ||||
server-reflexive address is the local address the host used for | ||||
registering itself to the associated Control or Data Relay Server. The | ||||
base of a host candidate is equal to the host candidate itself.</dd> | ||||
</dl> | ||||
</section> | ||||
<?rfc needLines="20" ?> | <section numbered="true" toc="default"> | |||
<figure anchor="fig:overview" | <name>Overview of Operation</name> | |||
title="Example Network Configuration"> | <figure anchor="fig_overview"> | |||
<artwork align="center"><![CDATA[ | <name>Example Network Configuration</name> | |||
<artwork align="center" name="" type="" alt=""><![CDATA[ | ||||
+--------------+ | +--------------+ | |||
| Control | | | Control | | |||
+--------+ | Relay Server | +--------+ | +--------+ | Relay Server | +--------+ | |||
| Data | +----+-----+---+ | Data | | | Data | +----+-----+---+ | Data | | |||
| Relay | / \ | Relay | | | Relay | / \ | Relay | | |||
| Server | / \ | Server | | | Server | / \ | Server | | |||
+--------+ / \ +--------+ | +--------+ / \ +--------+ | |||
/ \ | / \ | |||
/ \ | / \ | |||
/ \ | / \ | |||
skipping to change at line 370 ¶ | skipping to change at line 339 ¶ | |||
+-------+ +-------+ | +-------+ +-------+ | |||
| NAT | | NAT | | | NAT | | NAT | | |||
+-------+ +-------+ | +-------+ +-------+ | |||
/ \ | / \ | |||
/ \ | / \ | |||
+-------+ +-------+ | +-------+ +-------+ | |||
| Init- | | Resp- | | | Init- | | Resp- | | |||
| iator | | onder | | | iator | | onder | | |||
+-------+ +-------+ | +-------+ +-------+ | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t> In the example configuration depicted in <xref target="fig_overview" | ||||
<t> In the example configuration depicted in <xref | format="default"/>, both Initiator and Responder are behind one or more | |||
target="fig:overview"/>, both Initiator and Responder are behind | NATs, and both private networks are connected to the public Internet. To | |||
one or more NATs, and both private networks are connected to the | be contacted from behind a NAT, at least the Responder must be | |||
public Internet. To be contacted from behind a NAT, at least the | registered with a Control Relay Server reachable on the public | |||
Responder must be registered with a Control Relay Server reachable | Internet. The Responder may have also registered to a Data Relay Server | |||
on the public Internet. | that can forward the data plane in case NAT traversal fails. While, | |||
The Responder may have also registered to a Data Relay Server that can for | strictly speaking, the Initiator does not need a Data Relay Server, it | |||
ward the data plane in case NAT traversal fails. | may act in the other role with other hosts; connectivity with the | |||
While, strictly speaking, the Initiator does not need a Data Relay Server, | Data Relay Server of the Responder may fail, so the Initiator may also | |||
it may act in the other role | need to register to a Control and/or Data Relay Server. It is worth | |||
with other hosts, and connectivity with the Data Relay Server of the Respo | noting that a Control and Data Relay does not forge the source address | |||
nder may fail, so the Initiator may also | of a passing packet but always translates the source address and source | |||
need to register to a Cotrol and/or Data Relay Server. | port of a packet to be forwarded (to its own).</t> | |||
It is worth noting that a Control and Data Relay does not forge the source | <t>We assume, as a starting point, that the Initiator knows both the | |||
address of a passing packet, but | Responder's Host Identity Tag (HIT) and the address(es) of the | |||
always translates the source address and source port of a packet to be for | Responder's Control Relay Server(s) (how the Initiator learns of the | |||
warded (to its own).</t> | Responder's Control Relay Server is outside of the scope of this | |||
document, but it may be learned through DNS or another name service). The | ||||
<t> | first | |||
We assume, as a starting point, that | steps are for both the Initiator and Responder to register with a | |||
the Initiator knows both the Responder's Host Identity Tag (HIT) | Control Relay Server (need not be the same one) and gather a set of | |||
and the address(es) of the Responder's Control Relay Server(s) (how the In | address candidates. The hosts use either Control Relay Servers or Data | |||
itiator | Relay Servers for gathering the candidates. Next, the HIP base exchange | |||
learns of the Responder's Control Relay Server is outside of the scope | is carried out by encapsulating the HIP control packets in UDP datagrams | |||
of this document, but may be through DNS or another name | and sending them through the Responder's Control Relay Server. As part | |||
service). | of the base exchange, each HIP host learns of the peer's candidate | |||
The first steps are for both the Initiator and Responder to register | addresses through the HIP offer/answer procedure embedded in the base | |||
with a Control Relay Server (need not be the same one) and gather a set of | exchange. | |||
address candidates. The hosts use either Control Relay Servers or Data Rel | </t> | |||
ay Servers for gathering | ||||
the candidates. Next, the HIP base exchange is carried out by | ||||
encapsulating the HIP control packets in UDP datagrams and sending them | ||||
through the Responder's Control Relay Server. As part of the base exchang | ||||
e, each | ||||
HIP host learns of the peer's candidate addresses through the HIP | ||||
offer/answer procedure embedded in the base exchange. <!--, which follows | ||||
closely the ICE <xref target="RFC8445"/> protocol. --> </t> | ||||
<!-- WHAT ABOUT HICCUPS AND DATA RELAY ??? | ||||
Jeff: I think you can omit this, since RFC 6078 is for RFC 5201 (HIPv | ||||
1). (Wait until if/when 6078 is updated for HIPv2.) --> | ||||
<!-- send ESP transform -> hiccups incompatible (no need to defined here b | ||||
ecause hiccups is not HIPv2 compatible -Jeff) --> | ||||
<t> Once the base exchange is completed, two HIP hosts have established a | ||||
working | ||||
communication session (for signaling) via a Control Relay Server, but the | ||||
hosts | ||||
still have to find a better path, preferably without a Data Relay Server, | ||||
for the ESP | ||||
data flow. For this, connectivity checks are carried out until a | ||||
working pair of addresses is discovered. At the end of the procedure, if | ||||
successful, the hosts will have established a UDP-based tunnel that traver | ||||
ses | ||||
both NATs, with the data flowing directly from NAT to NAT or via a Data Re | ||||
lay Server. | ||||
At this point, also the HIP signaling can be sent over the same address/po | ||||
rt | ||||
pair, and is demultiplexed (or, in other words, separated) from IPsec as d | ||||
escribed in the UDP encapsulation standard for IPsec <xref target="RFC3948"/>. | ||||
Finally, the two hosts send NAT keepalives as needed in order keep their U | ||||
DP-tunnel state active | ||||
in the associated NAT boxes.</t> | ||||
<t> Once the base exchange is completed, two HIP hosts have established | ||||
a working communication session (for signaling) via a Control Relay | ||||
Server, but the hosts still have to find a better path, preferably | ||||
without a Data Relay Server, for the ESP data flow. For this, | ||||
connectivity checks are carried out until a working pair of addresses is | ||||
discovered. At the end of the procedure, if successful, the hosts will | ||||
have established a UDP-based tunnel that traverses both NATs with the | ||||
data flowing directly from NAT to NAT or via a Data Relay Server. At | ||||
this point, the HIP signaling can also be sent over the same | ||||
address/port pair, and is demultiplexed (or, in other words, separated) | ||||
from IPsec as described in the UDP encapsulation standard for IPsec | ||||
<xref target="RFC3948" format="default"/>. Finally, the two hosts send | ||||
NAT keepalives as needed in order keep their UDP-tunnel state active in | ||||
the associated NAT boxes.</t> | ||||
<t> If either one of the hosts knows that it is not behind a NAT, hosts | <t> If either one of the hosts knows that it is not behind a NAT, hosts | |||
can negotiate during the base exchange a different mode of NAT traversal | can negotiate during the base exchange a different mode of NAT traversal | |||
that does not use HIP connectivity checks, but only UDP encapsulation of | that does not use HIP connectivity checks, but only UDP encapsulation of | |||
HIP and ESP. Also, it is possible for the Initiator to simultaneously try | HIP and ESP. Also, it is possible for the Initiator to simultaneously try | |||
a base exchange with and without UDP encapsulation. If a base exchange | a base exchange with and without UDP encapsulation. If a base exchange | |||
without UDP encapsulation succeeds, no HIP connectivity checks or UDP | without UDP encapsulation succeeds, no HIP connectivity checks or UDP | |||
encapsulation of ESP are needed. </t> | encapsulation of ESP are needed. </t> | |||
</section> | </section> | |||
<!-- ***************************************************************** --> | <section anchor="sec_protocol" numbered="true" toc="default"> | |||
<name>Protocol Description</name> | ||||
<section anchor="sec:protocol" title="Protocol Description"> | ||||
<!-- | ||||
<t> This section describes the normative behavior of the protocol | ||||
extension. Examples of packet exchanges are provided for illustration | ||||
purposes.</t> --> | ||||
<t> This section describes the normative behavior of the "Native ICE-HIP" | ||||
protocol | ||||
extension. Most of the procedures are similar to what is defined in <xref | ||||
target="RFC5770"/> but with different, or additional, parameter types and | ||||
values. In addition, a new type of relaying server, Data Relay Server, is | ||||
specified. Also, it should be noted that HIP version 2 <xref | ||||
target="RFC7401"/> MUST be used instead of HIPv1 with this NAT | ||||
traversal mode. </t> | ||||
<section anchor="sec:registration" title="Relay Registration"> | ||||
<t>In order for two hosts to communicate over NATted | ||||
environments, they need a reliable way to exchange | ||||
information. To achieve this, "HIP Relay Server" is defined in <xref | ||||
target="RFC5770"/>. It supports relaying of HIP control plane | ||||
traffic over UDP in NATted environments, and | ||||
forwards HIP control packets between the Initiator and the | ||||
Responder. In this document, the HIP Relay Server is | ||||
denoted as "Control Relay Server" for better alignment with the rest of | ||||
the terminology. The registration to the | ||||
Control Relay Server can be achieved using RELAY_UDP_HIP | ||||
parameter as explained later in this section.</t> | ||||
<t>To guarantee also data plane delivery over varying types of NAT | ||||
devices, a host MAY also register for UDP encapsulated ESP | ||||
relaying using Registration Type RELAY_UDP_ESP (value [TBD by | ||||
IANA: 3]). This service may be coupled with the Control Relay Server | ||||
or offered separately on another server. | ||||
If the server supports relaying of UDP | ||||
encapsulated ESP, the host is allowed to register for a data | ||||
relaying service using the registration extensions in Section 3.3 of <xr | ||||
ef | ||||
target="RFC8003"/>). If the server has | ||||
sufficient relaying resources (free port numbers, bandwidth, | ||||
etc.) available, it opens a UDP port on one of its | ||||
addresses and signals the address and port to the registering | ||||
host using the RELAYED_ADDRESS parameter (as defined in <xref | ||||
target="sec:relayed_address"/> in this document). If the Data Relay Serv | ||||
er | ||||
would accept the data relaying request but does not currently | ||||
have enough resources to provide data relaying service, it | ||||
MUST reject the request with Failure Type "Insufficient | ||||
resources" <xref target="RFC8003"/>. </t> | ||||
<!-- | <t> This section describes the normative behavior of the "Native | |||
A Control Relay Server MUST silently drop packets to a | ICE-HIP" protocol extension. Most of the procedures are similar to what | |||
Control Relay Client that has not previously registered with | is defined in <xref target="RFC5770" format="default"/> but with | |||
the HIP relay (since it would not anyway know where to relay ). --> | different, or additional, parameter types and values. In addition, a new | |||
type of relaying server, Data Relay Server, is specified. Also, it | ||||
should be noted that HIP version 2 <xref target="RFC7401" | ||||
format="default"/> <bcp14>MUST</bcp14> be used instead of HIPv1 with | ||||
this NAT traversal mode. </t> | ||||
<section anchor="sec_registration" numbered="true" toc="default"> | ||||
<name>Relay Registration</name> | ||||
<t>In order for two hosts to communicate over NATed environments, | ||||
they need a reliable way to exchange information. To achieve this, | ||||
"HIP Relay Server" is defined in <xref target="RFC5770" | ||||
format="default"/>. It supports the relaying of HIP control plane traffic | ||||
over UDP in NATed environments and forwards HIP control packets | ||||
between the Initiator and the Responder. In this document, the HIP | ||||
Relay Server is denoted as "Control Relay Server" for better alignment | ||||
with the rest of the terminology. The registration to the Control | ||||
Relay Server can be achieved using the RELAY_UDP_HIP parameter as | ||||
explained later in this section.</t> | ||||
<t> | <t>To also guarantee data plane delivery over varying types of NAT | |||
The registration process follows the generic | devices, a host <bcp14>MAY</bcp14> also register for UDP-encapsulated | |||
registration extensions defined in <xref target="RFC8003"/>. | ESP relaying using Registration Type RELAY_UDP_ESP (value 3). This servi | |||
The HIP control plane relaying registration follows <xref | ce may be coupled with the Control Relay Server | |||
target="RFC5770"/>, but the data plane registration is | or offered separately on another server. If the server supports | |||
different. It is worth noting that if the HIP control and data | relaying of UDP-encapsulated ESP, the host is allowed to register for | |||
plane relay services reside on different hosts, the client has | a data-relaying service using the registration extensions in <xref | |||
to register separately to each of them. In the example shown | target="RFC8003" sectionFormat="of" section="3.3"/>. If the server | |||
in <xref target="fig:reg"/>, the two services are coupled on a | has sufficient relaying resources (free port numbers, bandwidth, etc.) | |||
single host. The text uses "Relay Client" and "Relay | available, it opens a UDP port on one of its addresses and signals the | |||
Server" as a shorthand when the procedures apply both to control and dat | address and port to the registering host using the RELAYED_ADDRESS | |||
a cases.</t> | parameter (as defined in <xref target="sec_relayed_address" | |||
format="default"/> in this document). If the Data Relay Server would | ||||
accept the data-relaying request but does not currently have enough | ||||
resources to provide data-relaying service, it <bcp14>MUST</bcp14> | ||||
reject the request with Failure Type "Insufficient resources" <xref | ||||
target="RFC8003" format="default"/>. </t> | ||||
<figure anchor="fig:reg" title="Example Registration with a HIP Relay"> | <t>The registration process follows the generic registration | |||
<artwork align="center"><![CDATA[ | extensions defined in <xref target="RFC8003" format="default"/>. The | |||
HIP control plane relaying registration follows <xref target="RFC5770" | ||||
format="default"/>, but the data plane registration is different. It | ||||
is worth noting that if the HIP control and data plane relay services | ||||
reside on different hosts, the client has to register separately to | ||||
each of them. In the example shown in <xref target="fig_reg" | ||||
format="default"/>, the two services are coupled on a single host. The | ||||
text uses "Relay Client" and "Relay Server" as a shorthand when the | ||||
procedures apply both to control and data cases.</t> | ||||
<figure anchor="fig_reg"> | ||||
<name>Example Registration with a HIP Relay</name> | ||||
<artwork align="center" name="" type="" alt=""><![CDATA[ | ||||
Control/Data Control/Data | Control/Data Control/Data | |||
Relay Client (Initiator) Relay Server (Responder) | Relay Client (Initiator) Relay Server (Responder) | |||
| 1. UDP(I1) | | | 1. UDP(I1) | | |||
+---------------------------------------------------------------->| | +---------------------------------------------------------------->| | |||
| | | | | | |||
| 2. UDP(R1(REG_INFO(RELAY_UDP_HIP,[RELAY_UDP_ESP]))) | | | 2. UDP(R1(REG_INFO(RELAY_UDP_HIP,[RELAY_UDP_ESP]))) | | |||
|<----------------------------------------------------------------+ | |<----------------------------------------------------------------+ | |||
| | | | | | |||
| 3. UDP(I2(REG_REQ(RELAY_UDP_HIP),[RELAY_UDP_ESP])) | | | 3. UDP(I2(REG_REQ(RELAY_UDP_HIP),[RELAY_UDP_ESP])) | | |||
+---------------------------------------------------------------->| | +---------------------------------------------------------------->| | |||
| | | | | | |||
| 4. UDP(R2(REG_RES(RELAY_UDP_HIP,[RELAY_UDP_ESP]), REG_FROM, | | | 4. UDP(R2(REG_RES(RELAY_UDP_HIP,[RELAY_UDP_ESP]), REG_FROM, | | |||
| [RELAYED_ADDRESS])) | | | [RELAYED_ADDRESS])) | | |||
|<----------------------------------------------------------------+ | |<----------------------------------------------------------------+ | |||
| | | | | | |||
]]> | ]]></artwork> | |||
</artwork> | ||||
</figure> | </figure> | |||
<t> In step 1, the Relay Client (Initiator) starts the registration | <t> In step 1, the Relay Client (Initiator) starts the registration | |||
procedure by sending an I1 packet over UDP to the Relay Server. It is RE | procedure by sending an I1 packet over UDP to the Relay Server. It is | |||
COMMENDED that the | <bcp14>RECOMMENDED</bcp14> that the Relay Client select a random | |||
Relay Client select a random source port number from the ephemeral port | source port number from the ephemeral port range 49152-65535 for | |||
range | initiating a base exchange. Alternatively, a host <bcp14>MAY</bcp14> | |||
49152-65535 for initiating a base exchange. Alternatively, a host MAY | also use a single fixed port for initiating all outgoing | |||
also use a single fixed port for initiating all outgoing | connections. However, the allocated port <bcp14>MUST</bcp14> be | |||
connections. However, the allocated port MUST be maintained until all | maintained until all of the corresponding HIP associations are | |||
of the corresponding HIP Associations are closed. It is RECOMMENDED | closed. It is <bcp14>RECOMMENDED</bcp14> that the Relay Server listen | |||
that the Relay Server listen to incoming connections at UDP port | to incoming connections at UDP port 10500. If some other port number | |||
10500. If some other port number is used, it needs to be known by | is used, it needs to be known by potential Relay Clients.</t> | |||
potential Relay Clients.</t> | <t> In step 2, the Relay Server (Responder) lists the services that it | |||
supports in the R1 packet. The support for HIP control plane over UDP | ||||
<t> In step 2, the Relay Server (Responder) lists the services that | relaying is denoted by the Registration Type value RELAY_UDP_HIP (see | |||
it supports in the R1 packet. The support for HIP control plane over UDP | <xref target="sec_reg-types" format="default"/>). If the server also | |||
relaying is | supports the relaying of ESP traffic over UDP, it also includes | |||
denoted by the Registration Type value RELAY_UDP_HIP (see <xref | the Registration Type value RELAY_UDP_ESP.</t> | |||
target="sec:reg-types"/>). If the server supports also relaying of ESP t | <t> In step 3, the Relay Client selects the services for which it | |||
raffic over UDP, | registers and lists them in the REG_REQ parameter. The Relay Client | |||
it includes also Registration type value RELAY_UDP_ESP.</t> | registers for the Control Relay service by listing the RELAY_UDP_HIP | |||
value in the request parameter. If the Relay Client also requires ESP | ||||
<t> In step 3, the Relay Client selects the services for which it regist | relaying over UDP, it lists also RELAY_UDP_ESP.</t> | |||
ers and | <t> In step 4, the Relay Server concludes the registration procedure | |||
lists them in the REG_REQ parameter. The Relay Client registers for the | with an R2 packet and acknowledges the registered services in the | |||
Control Relay | REG_RES parameter. The Relay Server denotes unsuccessful registrations | |||
service by listing the RELAY_UDP_HIP value in the request | (if any) in the REG_FAILED parameter of R2. The Relay Server also | |||
parameter. If the Relay Client requires also ESP relaying over UDP, it l | includes a REG_FROM parameter that contains the transport address of | |||
ists also RELAY_UDP_ESP. | the Relay Client as observed by the Relay Server (server-reflexive | |||
</t> | candidate). If the Relay Client registered to ESP-relaying service, | |||
the Relay Server includes a RELAYED_ADDRESS parameter that describes the | ||||
<t> In step 4, the Relay Server concludes the registration procedure wit | UDP port allocated to the Relay Client for ESP relaying. It is worth | |||
h | noting that the Data Relay Client must first activate this UDP port by | |||
an R2 packet and acknowledges the registered services in the REG_RES | sending an UPDATE message to the Data Relay Server that includes a | |||
parameter. The Relay Server denotes unsuccessful registrations (if any) | PEER_PERMISSION parameter as described in <xref | |||
in | target="sec_forwarding" format="default"/> both after base exchange | |||
the REG_FAILED parameter of R2. The Relay Server also includes a REG_FRO | and handover procedures. Also, the Data Relay Server should follow the | |||
M | port allocation recommendations in <xref target="sec_reuse" | |||
parameter that contains the transport address of the Relay Client as obs | format="default"/>.</t> | |||
erved | <t>After the registration, the Relay Client periodically sends NAT | |||
by the Relay Server (Server Reflexive candidate). If the Relay Client re | keepalives to the Relay Server in order to keep the NAT bindings | |||
gistered to ESP relaying | between the Relay Client and the relay alive. The keepalive extensions | |||
service, the Relay Server includes RELAYED_ADDRESS parameter that descri | are described in <xref target="sec_nat-keepalives" | |||
bes | format="default"/>.</t> | |||
the UDP port allocated to the Relay Client for ESP relaying. It is worth | <t> The Data Relay Client <bcp14>MUST</bcp14> maintain an active HIP | |||
noting that | association with the Data Relay Server as long as it requires the | |||
the Data Relay Client must first activate this UDP port by sending an UP | data-relaying service. When the HIP association is closed (or times | |||
DATE message to the Data Relay | out), or the registration lifetime passes without the Data Relay | |||
Server that includes a PEER_PERMISSION parameter as described in <xref t | Client refreshing the registration, the Data Relay Server | |||
arget="sec:forwarding" /> | <bcp14>MUST</bcp14> stop relaying packets for that host and close the | |||
both after base exchange and handover procedures. Also, the Data Relay S | corresponding UDP port (unless other Data Relay Clients are still | |||
erver should follow the port allocation recommendations in <xref target="sec:reu | using it). </t> | |||
se" />. | <t> The Data Relay Server <bcp14>SHOULD</bcp14> offer a different | |||
</t> | relayed address and port for each Data Relay Client because not doing | |||
so can cause problems with stateful firewalls (see <xref | ||||
<t>After the registration, the | target="sec_reuse" format="default"/>). </t> | |||
Relay Client sends periodically NAT keepalives to the Relay Server in or | <t>When a Control Relay Client sends an UPDATE (e.g., due to host | |||
der to keep | ||||
the NAT bindings between the Relay Client and the relay alive. The keepa | ||||
live extensions | ||||
are described in <xref target="sec:nat-keepalives"/>.</t> | ||||
<t> The Data Relay Client MUST maintain an active HIP association with | ||||
the Data Relay Server as long as it requires the data relaying service. | ||||
When | ||||
the HIP association is closed (or times out), or the registration | ||||
lifetime passes without the Data Relay Client refreshing the | ||||
registration, the Data Relay Server MUST stop relaying packets for that | ||||
host | ||||
and close the corresponding UDP port (unless other Data Relay Clients ar | ||||
e | ||||
still using it). </t> | ||||
<t> The Data Relay Server SHOULD offer a different relayed address and p | ||||
ort for | ||||
each Data Relay Client because not doing so can cause problems with | ||||
stateful firewalls (see <xref target="sec:reuse" />). </t> | ||||
<t>When a Control Relay Client sends an UPDATE (e.g., due to host | ||||
movement or to renew service registration), the Control Relay Server | movement or to renew service registration), the Control Relay Server | |||
MUST follow the general guidelines defined in <xref | <bcp14>MUST</bcp14> follow the general guidelines defined in <xref | |||
target="RFC8003" />, with the difference that all UPDATE | target="RFC8003" format="default"/>, with the difference that all | |||
messages are delivered on top of UDP. In addition to this, | UPDATE messages are delivered on top of UDP. In addition to this, the | |||
the Control Relay Server MUST include the REG_FROM parameter in all | Control Relay Server <bcp14>MUST</bcp14> include the REG_FROM | |||
UPDATE responses sent to the Control Relay Client. | parameter in all UPDATE responses sent to the Control Relay Client. | |||
This applies to both renewals of service registration and to host | This applies to both renewals of service registration and to host | |||
movement. It is especially important for the case of host | movement. It is especially important for the case of host | |||
movement, as this is the mechanism that allows the Control Relay | movement, as this is the mechanism that allows the Control Relay | |||
Client to learn its new server reflexive address candidate. | Client to learn its new server-reflexive address candidate.</t> | |||
</t> | <t>A Data Relay Client can request multiple relayed candidates from | |||
the Data Relay Server (e.g., for the reasons described in <xref | ||||
<t>A Data Relay Client can request multiple relayed candidates | target="sec_conflicting" format="default"/>). After the base exchange | |||
from the Data Relay Server (e.g., for the reasons described | with registration, the Data Relay Client can request additional | |||
in <xref target="sec:conflicting" />). After the base exchange | relayed candidates similarly as during the base exchange. The Data | |||
with registration, the Data Relay Client can request | Relay Client sends an UPDATE message REG_REQ parameter requesting for | |||
additional relayed candidates similarly as during the base | the RELAY_UDP_ESP service. The UPDATE message <bcp14>MUST</bcp14> also | |||
exchange. The Data Relay Client sends an UPDATE message | include a SEQ and an ECHO_REQUEST_SIGNED parameter. The Data Relay | |||
REG_REQ parameter requesting for the RELAY_UDP_ESP | Server <bcp14>MUST</bcp14> respond with an UPDATE message that | |||
service. The UPDATE message MUST also include a SEQ and a | includes the corresponding response parameters: REG_RES, ACK and | |||
ECHO_REQUEST_SIGNED parameter. The Data Relay Server MUST | ECHO_REQUEST_SIGNED. In case the Data Relay Server allocated a new | |||
respond with an UPDATE message that includes the corresponding | relayed UDP port for the Data Relay Client, the REG_RES parameter | |||
response parameters: REG_RES, ACK and ECHO_REQUEST_SIGNED . In | <bcp14>MUST</bcp14> list RELAY_UDP_ESP as a service and the UPDATE | |||
case the Data Relay Server allocated a new relayed UDP port for | message <bcp14>MUST</bcp14> also include a RELAYED_ADDRESS parameter | |||
the Data Relay Client, the REG_RES parameter MUST list | describing the relayed UDP port. The Data Relay Server | |||
RELAY_UDP_ESP as a service and the UPDATE message MUST also | <bcp14>MUST</bcp14> also include the server-reflexive candidate in a | |||
include a RELAYED_ADDRESS parameter describing the relayed UDP | REG_FROM parameter. It is worth mentioning that the Data Relay Client | |||
port. The Data Relay Server MUST also include the Server | <bcp14>MUST</bcp14> activate the UDP port as described in <xref | |||
Reflexive candidate in a REG_FROM parameter. It is worth | target="sec_forwarding" format="default"/> before it can be used for | |||
mentioning that Data Relay Client MUST activate the UDP port | any ESP relaying.</t> | |||
as described in <xref target="sec:forwarding" /> before it can | ||||
be used for any ESP relaying.</t> | ||||
<t>A Data Relay Client may unregister a relayed candidate in | <t>A Data Relay Client may unregister a relayed candidate in | |||
two ways. It can wait for its lifetime to expire or it can | two ways. It can wait for its lifetime to expire or it can | |||
explicitly request it with zero lifetime using the UPDATE | explicitly request it with zero lifetime using the UPDATE | |||
mechanism. The Data Relay Client can send an REG_REQ parameter | mechanism. The Data Relay Client can send a REG_REQ parameter | |||
with zero lifetime to the Data Relay Server in order to expire | with zero lifetime to the Data Relay Server in order to expire | |||
all relayed candidates. To expire a specific relayed | all relayed candidates. To expire a specific relayed | |||
candidate, the Data Relay Client MUST also include | candidate, the Data Relay Client <bcp14>MUST</bcp14> also include | |||
RELAYED_ADDRESS parameter as sent by the server in the UPDATE | a RELAYED_ADDRESS parameter as sent by the server in the UPDATE | |||
message. Upon closing the HIP association (CLOSE-CLOSE-ACK | message. Upon closing the HIP association (CLOSE-CLOSE-ACK | |||
procedure initiated by either party), the Data Relay Server | procedure initiated by either party), the Data Relay Server | |||
MUST also expire all relayed candidates.</t> | <bcp14>MUST</bcp14> also expire all relayed candidates.</t> | |||
<t>Please also refer to <xref target="sec_cross_protocol" | ||||
<t>Please also refer to <xref target="sec:cross_protocol" /> for | format="default"/> for protection against cross-protocol attacks for | |||
protection against cross-protocol attacks for both Control | both Control Relay Client and Server.</t> | |||
Relay Client and Server.</t> | ||||
<!-- explained elsewhere... | ||||
<t>As the relay is assumed to have a publicly-reachable | ||||
address, it does not have to include a NAT_TRAVERSAL_MODE | ||||
parameter in an R1 message, thus avoiding any NAT penetration | ||||
procedures. This results in the HIP control and data plane | ||||
being tunneled over UDP as described in <xref | ||||
target="sec:minimal" />. In other words, a relay SHOULD NOT | ||||
OFFER ICE-HIP-UDP mode, but it MAY offer UDP-ENCAPSULATION as | ||||
NAT traversal mode in a NAT_TRAVERSAL_MODE parameter in an R1 | ||||
message (which has the same result as omitting the parameter). | ||||
</t> | ||||
--> | ||||
</section> <!-- relay reg --> | ||||
<section anchor="sec:gathering" title="Transport Address Candidate Gatheri ng at the Relay Client"> | </section> | |||
<section anchor="sec_gathering" numbered="true" toc="default"> | ||||
<name>Transport Address Candidate Gathering at the Relay Client</name> | ||||
<t> An Initiator needs to gather a set of address candidates | <t> An Initiator needs to gather a set of address candidates | |||
before contacting a (non-relay) Responder. The candidates are | before contacting a (non-relay) Responder. The candidates are | |||
needed for connectivity checks that allow two hosts to | needed for connectivity checks that allow two hosts to | |||
discover a direct, non-relayed path for communicating with | discover a direct, non-relayed path for communicating with | |||
each other. One server reflexive candidate can be discovered | each other. One server-reflexive candidate can be discovered | |||
during the registration with the Control Relay Server from the | during the registration with the Control Relay Server from the | |||
REG_FROM parameter (and another from Data Relay Server if one | REG_FROM parameter (and another from Data Relay Server if one | |||
is employed). <!-- It should be noted discovering multiple address | is employed). | |||
candidates in a multihoming configuration are left for further | ||||
study. --> </t> | ||||
</t> | ||||
<t> The candidate gathering can be done at any time, but it needs to be | <t> The candidate gathering can be done at any time, but it needs to be | |||
done before sending an I2 or R2 in the base exchange if ICE-HIP-UDP mode is to be | done before sending an I2 or R2 in the base exchange if ICE-HIP-UDP mode is to be | |||
used for the connectivity checks. It is RECOMMENDED that all three | used for the connectivity checks. It is <bcp14>RECOMMENDED</bcp14> that all three | |||
types of candidates (host, server reflexive, and relayed) are gathered | types of candidates (host, server reflexive, and relayed) are gathered | |||
to maximize the probability of successful NAT traversal. However, if no | to maximize the probability of successful NAT traversal. However, if no | |||
Data Relay Server is used, and the host has only a single local IP addre ss to | Data Relay Server is used, and the host has only a single local IP addre ss to | |||
use, the host MAY use the local address as the only host candidate and | use, the host <bcp14>MAY</bcp14> use the local address as the only host candidate and | |||
the address from the REG_FROM parameter discovered during the Control Re lay Server | the address from the REG_FROM parameter discovered during the Control Re lay Server | |||
registration as a server reflexive candidate. In this case, no further | registration as a server-reflexive candidate. In this case, no further | |||
candidate gathering is needed. </t> | candidate gathering is needed. </t> | |||
<t>A Data Relay Client <bcp14>MAY</bcp14> register only a single | ||||
<t>A Data Relay Client MAY register only a single relayed | relayed candidate that it uses with multiple other peers. However, it | |||
candidate that it uses with multiple other peers. However, it is | is <bcp14>RECOMMENDED</bcp14> that a Data Relay Client registers a new | |||
RECOMMENDED that a Data Relay Client registers a new server relayed | server relayed candidate for each of its peers for the reasons | |||
candidate for each of its peer for the reasons described in <xref | described in <xref target="sec_conflicting" format="default"/>. The | |||
target="sec:conflicting" />. The procedures for registering | procedures for registering multiple relayed candidates are described | |||
multiple relayed candidates are described in <xref | in <xref target="sec_registration" format="default"/>.</t> | |||
target="sec:registration" />.</t> | ||||
<t> If a Relay Client has more than one network interface, it | <t> If a Relay Client has more than one network interface, it | |||
can discover additional server reflexive candidates by sending | can discover additional server-reflexive candidates by sending | |||
UPDATE messages from each of its interfaces to the Relay | UPDATE messages from each of its interfaces to the Relay | |||
Server. Each such UPDATE message MUST include the following | Server. Each such UPDATE message <bcp14>MUST</bcp14> include the follow | |||
parameters: registration request (REG_REQ) parameter with | ing | |||
Registration Type CANDIDATE_DISCOVERY (value [TBD by IANA: 4]) | parameters: the registration request (REG_REQ) parameter with | |||
and ECHO_REQUEST_SIGNED parameter. When a Control Relay Server | Registration Type CANDIDATE_DISCOVERY (value 4) | |||
and the ECHO_REQUEST_SIGNED parameter. When a Control Relay Server | ||||
receives an UPDATE message with registration request | receives an UPDATE message with registration request | |||
containing a CANDIDATE_DISCOVERY type, it MUST include a | containing a CANDIDATE_DISCOVERY type, it <bcp14>MUST</bcp14> include a | |||
REG_FROM parameter, containing the same information as if this | REG_FROM parameter, containing the same information as if this | |||
were a Control Relay Server registration, to the response (in | were a Control Relay Server registration, to the response (in | |||
addition to the mandatory ECHO_RESPONSE_SIGNED parameter). This request | addition to the mandatory ECHO_RESPONSE_SIGNED parameter). This request | |||
type SHOULD NOT create any state at the Control Relay | type <bcp14>SHOULD NOT</bcp14> create any state at the Control Relay | |||
Server.</t> | Server.</t> | |||
<t>The rules in <xref target="RFC8445" sectionFormat="of" | ||||
section="5.1.1"/> for candidate gathering are followed here. A number | ||||
of host candidates (loopback, anycast and others) should be excluded as | ||||
described in the ICE specification (<xref target="RFC8445" | ||||
sectionFormat="of" section="5.1.1.1"/>). Relayed candidates | ||||
<bcp14>SHOULD</bcp14> be gathered in order to guarantee successful NAT | ||||
traversal, and implementations <bcp14>SHOULD</bcp14> support this | ||||
functionality even if it will not be used in deployments in order to | ||||
enable it by software configuration update if needed at some point. | ||||
<t>The rules in section 5.1.1 in <xref target="RFC8445" /> | Similarly, as explained in the ICE specification (<xref | |||
for candidate gathering are followed here. A number of host | target="RFC8445" sectionFormat="of" section="5.1.1.2"/>), if an | |||
candidates (loopback, anycast and others) should be excluded as | IPv6-only host is in a network that utilizes NAT64 <xref | |||
described in section 5.1.1.1 of the ICE specification <xref target="RFC84 | target="RFC6146" format="default"/> and DNS64 <xref target="RFC6147" | |||
45" />. Relayed | format="default"/> technologies, it may also gather IPv4 | |||
candidates SHOULD be gathered in order to guarantee successful | server-reflexive and/or relayed candidates from IPv4-only Control or | |||
NAT traversal, and implementations SHOULD | Data Relay Servers. IPv6-only hosts <bcp14>SHOULD</bcp14> also | |||
support this functionality even if it will not be used in | utilize IPv6 prefix discovery <xref target="RFC7050" | |||
deployments in order to enable it by software configuration | format="default"/> to discover the IPv6 prefix used by NAT64 (if any) | |||
update if needed at some point. | and generate server-reflexive candidates for each IPv6-only interface, | |||
<!-- A host SHOULD employ only a single | ||||
server for gathering the candidates for a single HIP | ||||
association; either one server providing both Control and Data Relay Serv | ||||
er | ||||
functionality, or one Control Relay Server and | ||||
also Data Relay Server if the functionality is offered by another | ||||
server. When the relay service is split between two hosts, the | ||||
server reflexive candidate from the Control Relay Server SHOULD be used | ||||
instead of the one provided by the Data Relay Server. --> | ||||
<!-- If a relayed | ||||
candidate is identical to a host candidate, the relayed | ||||
candidate must be discarded. NAT64 considerations in section | ||||
4.1.1.2 of <xref target="RFC8445" /> apply as well. --> | ||||
Similarly as explained in section 5.1.1.2 of the ICE specification <xref | ||||
target="RFC8445" />, | ||||
if an IPv6-only host is in a network that utilizes NAT64 <xref target="RF | ||||
C6146" /> | ||||
and DNS64 <xref target="RFC6147" /> technologies, it may also gather IPv4 | ||||
server- | ||||
reflexive and/or relayed candidates from IPv4-only Control or Data Relay | ||||
Servers. IPv6-only hosts SHOULD also utilize IPv6 prefix discovery | ||||
<xref target="RFC7050" /> to discover the IPv6 prefix used by NAT64 (if a | ||||
ny) and | ||||
generate server-reflexive candidates for each IPv6-only interface, | ||||
accordingly. The NAT64 server-reflexive candidates are prioritized | accordingly. The NAT64 server-reflexive candidates are prioritized | |||
like IPv4 server-reflexive candidates. | like IPv4 server-reflexive candidates.</t> | |||
<t>HIP-based connectivity can be utilized by IPv4 applications using | ||||
</t> | Local Scope Identifiers (LSIs) and by IPv6-based applications using | |||
HITs. The LSIs and HITs of the local virtual interfaces | ||||
<t>HIP based connectivity can be utilized by IPv4 applications | <bcp14>MUST</bcp14> be excluded in the candidate gathering phase as | |||
using Local Scope Identifiers (LSIs) and by IPv6 based applications using | well to avoid creating unnecessary loopback connectivity tests.</t> | |||
HITs. The LSIs and HITs | ||||
of the local virtual interfaces MUST be excluded in the candidate gatherin | ||||
g | ||||
phase as well to avoid creating unnecessary loopback connectivity tests.</ | ||||
t> | ||||
<!-- was: ..if STUN and *TURN* servers are available.. --> | ||||
<t>Gathering of candidates MAY also be performed by other means | ||||
than described in this section. For example, the candidates | ||||
could be gathered as specified in Section 4.2 of <xref | ||||
target="RFC5770"/> if STUN servers are available, or if the host | ||||
has just a single interface and no STUN or Data Relay Server are | ||||
available. </t> | ||||
<t>Each local address candidate MUST be assigned a | ||||
priority. The following recommended formula (as described | ||||
in <xref target="RFC8445" />) SHOULD be used: | ||||
<list style="empty"> | ||||
<t>priority = (2^24)*(type preference) + | ||||
(2^8)*(local preference) + | ||||
(2^0)*(256 - component ID)</t> | ||||
</list></t> | ||||
<t>In the formula, the type preference follows the ICE specification (as d | ||||
efined in section 5.1.2.1 in <xref target="RFC8445" />): | ||||
the RECOMMENDED values are 126 for | ||||
host candidates, 100 for server reflexive candidates, 110 for | ||||
peer reflexive candidates, and 0 for relayed candidates. The | ||||
highest value is 126 (the most preferred) and lowest is 0 (last | ||||
resort). For all candidates of the same type, the preference type | ||||
value MUST be identical, and, correspondingly, the value MUST be | ||||
different for different types. For peer reflexive values, the | ||||
type preference value MUST be higher than for server reflexive | ||||
types. It should be noted that peer reflexive values are learned | ||||
later during connectivity checks, so a host cannot employ it | ||||
during candidate gathering stage yet.</t> | ||||
<t>Following the ICE specification, the local preference MUST be | ||||
an integer from 0 (lowest preference) to 65535 (highest | ||||
preference) inclusive. In the case the host has only a single address | ||||
candidate, the value SHOULD be 65535. In the case of multiple | ||||
candidates, each local preference value MUST be | ||||
unique. Dual-stack considerations for IPv6 | ||||
apply also here as defined in <xref target="RFC8445" /> in section 5.1.2.2 | ||||
.</t> | ||||
<t>Unlike with SDP used in conjunction with ICE, this protocol only create | ||||
s a single UDP flow | ||||
between the two communicating hosts, so only a single component | ||||
exists. Hence, the component ID value MUST always be set to | ||||
1.</t> | ||||
<t>As defined in section 14.3 in <xref target="RFC8445" />, the retransmis | ||||
sion timeout | ||||
(RTO) for address gathering from a Control/Data Relay Server SHOULD be cal | ||||
culated as | ||||
follows: | ||||
<list style="empty"> | ||||
<t>RTO = MAX (1000ms, Ta * (Num-Of-Cands))</t> | ||||
</list> | ||||
</t> | ||||
<t>where Ta is the value used for the | ||||
connectivity check pacing and Num-Of-Cands | ||||
is the number of server-reflexive and relay candidates. A smaller value th | ||||
an 1000 ms for | ||||
the RTO MUST NOT be used. | ||||
</t> | ||||
<t>Gathering of candidates <bcp14>MAY</bcp14> also be performed by other | ||||
means than described in this section. For example, the candidates could | ||||
be gathered as specified in <xref target="RFC5770" | ||||
sectionFormat="of" section="4.2"/> if STUN servers are available, or if | ||||
the host has just a single interface and no STUN or Data Relay Server | ||||
are available. </t> | ||||
<t>Each local address candidate <bcp14>MUST</bcp14> be assigned a | ||||
priority. The following recommended formula (as described in <xref | ||||
target="RFC8445" format="default"/>) <bcp14>SHOULD</bcp14> be | ||||
used:</t> | ||||
<t indent="3"> | ||||
priority = (2<sup>24</sup>)*(type preference) + | ||||
(2<sup>8</sup>)*(local preference) + | ||||
(2<sup>0</sup>)*(256 - component ID) | ||||
</t> | ||||
<t>In the formula, the type preference follows the ICE specification | ||||
(as defined in <xref target="RFC8445" sectionFormat="of" | ||||
section="5.1.2.1"/>): the <bcp14>RECOMMENDED</bcp14> values are 126 | ||||
for host candidates, 100 for server-reflexive candidates, 110 for | ||||
peer-reflexive candidates, and 0 for relayed candidates. The highest | ||||
value is 126 (the most preferred) and lowest is 0 (last resort). For | ||||
all candidates of the same type, the preference type value | ||||
<bcp14>MUST</bcp14> be identical, and, correspondingly, the value | ||||
<bcp14>MUST</bcp14> be different for different types. For | ||||
peer-reflexive values, the type preference value <bcp14>MUST</bcp14> | ||||
be higher than for server-reflexive types. It should be noted that | ||||
peer-reflexive values are learned later during connectivity | ||||
checks.</t> | ||||
<t>Following the ICE specification, the local preference | ||||
<bcp14>MUST</bcp14> be an integer from 0 (lowest preference) to 65535 | ||||
(highest preference) inclusive. In the case the host has only a single | ||||
address candidate, the value <bcp14>SHOULD</bcp14> be 65535. In the | ||||
case of multiple candidates, each local preference value | ||||
<bcp14>MUST</bcp14> be unique. Dual-stack considerations for IPv6 also | ||||
apply here as defined in <xref target="RFC8445" sectionFormat="of" | ||||
section="5.1.2.2"/>.</t> | ||||
<t>Unlike with SDP used in conjunction with ICE, this protocol only | ||||
creates a single UDP flow between the two communicating hosts, so only | ||||
a single component exists. Hence, the component ID value | ||||
<bcp14>MUST</bcp14> always be set to 1.</t> | ||||
<t>As defined in <xref target="RFC8445" sectionFormat="of" | ||||
section="14.3"/>, the retransmission timeout (RTO) for address | ||||
gathering from a Control/Data Relay Server <bcp14>SHOULD</bcp14> be | ||||
calculated as follows:</t> | ||||
<t indent="3"> | ||||
RTO = MAX (1000 ms, Ta * (Num-Of-Cands)) | ||||
</t> | ||||
<t>where Ta is the value used for the connectivity check pacing and | ||||
Num-Of-Cands is the number of server-reflexive and relay candidates. A | ||||
smaller value than 1000 ms for the RTO <bcp14>MUST NOT</bcp14> be | ||||
used.</t> | ||||
</section> | </section> | |||
<section anchor="sec_nat_traversal_mode" numbered="true" toc="default"> | ||||
<section anchor="sec:nat_traversal_mode" | <name>NAT Traversal Mode Negotiation</name> | |||
title="NAT Traversal Mode Negotiation"> | <t> This section describes the usage of a non-critical parameter type | |||
called NAT_TRAVERSAL_MODE with a new mode called ICE-HIP-UDP. The | ||||
<t> This section describes the usage of a non-critical parameter | presence of the new mode in the NAT_TRAVERSAL_MODE parameter in a HIP | |||
type called NAT_TRAVERSAL_MODE with a new mode called ICE-HIP-UDP. The p | base exchange means that the end host supports NAT traversal | |||
resence of the new mode in the NAT_TRAVERSAL_MODE parameter in a HIP base exchan | extensions described in this document. As the parameter is | |||
ge means that | non-critical (as defined in <xref target="RFC7401" sectionFormat="of" | |||
the end-host supports NAT traversal extensions described in this | section="5.2.1"/>), it can be ignored by an end host, which means that | |||
document. As the parameter is non-critical (as defined in Section 5.2.1 | the host is not required to support it or may decline to use it.</t> | |||
of <xref target="RFC7401"/>), it can be ignored by a end-host, which | <t> With registration with a Control/Data Relay Server, it is usually | |||
means that the host is not required to support it or may decline to | sufficient to use the UDP-ENCAPSULATION mode of NAT traversal since | |||
use it.</t> | the Relay Server is assumed to be in public address space. Thus, the | |||
Relay Server <bcp14>SHOULD</bcp14> propose the UDP-ENCAPSULATION mode | ||||
<t> With registration with a Control/Data Relay Server, it is usually su | as the preferred or only mode. The NAT traversal mode negotiation in | |||
fficient to use | a HIP base exchange is illustrated in <xref | |||
the UDP-ENCAPSULATION mode of NAT traversal since the Relay Server is as | target="fig_nat_traversal_mode" format="default"/>. It is worth noting | |||
sumed | that the Relay Server could be located between the hosts, but is | |||
to be in public address space. Thus, the Relay Server SHOULD propose the | omitted here for simplicity.</t> | |||
UDP-ENCAPSULATION mode as the preferred or only mode. The NAT | <figure anchor="fig_nat_traversal_mode"> | |||
traversal mode negotiation in a HIP base exchange is illustrated in | <name>Negotiation of NAT Traversal Mode</name> | |||
<xref target="fig:nat_traversal_mode"/>. It is worth noting that the | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
Relay Server could be located between the hosts, but is omitted here for | ||||
simplicity.</t> | ||||
<figure anchor="fig:nat_traversal_mode" | ||||
title="Negotiation of NAT Traversal Mode"> | ||||
<artwork align="center"><![CDATA[ | ||||
Initiator Responder | Initiator Responder | |||
| 1. UDP(I1) | | | 1. UDP(I1) | | |||
+----------------------------------------------------------------->| | +----------------------------------------------------------------->| | |||
| | | | | | |||
| 2. UDP(R1(.., NAT_TRAVERSAL_MODE(ICE-HIP-UDP), ..)) | | | 2. UDP(R1(.., NAT_TRAVERSAL_MODE(ICE-HIP-UDP), ..)) | | |||
|<-----------------------------------------------------------------+ | |<-----------------------------------------------------------------+ | |||
| | | | | | |||
| 3. UDP(I2(.., NAT_TRAVERSAL_MODE(ICE-HIP-UDP), ENC(LOC_SET), ..))| | | 3. UDP(I2(.., NAT_TRAVERSAL_MODE(ICE-HIP-UDP), ENC(LOC_SET), ..))| | |||
+----------------------------------------------------------------->| | +----------------------------------------------------------------->| | |||
| | | | | | |||
| 4. UDP(R2(.., ENC(LOC_SET), ..)) | | | 4. UDP(R2(.., ENC(LOC_SET), ..)) | | |||
|<-----------------------------------------------------------------+ | |<-----------------------------------------------------------------+ | |||
| | | | | | |||
]]> | ]]></artwork> | |||
</artwork> | ||||
</figure> | </figure> | |||
<t> In step 1, the Initiator sends an I1 to the Responder.</t> | ||||
<t> In step 1, the Initiator sends an I1 to the Responder. In step 2, | <t>In step 2, | |||
the Responder responds with an R1. As specified in <xref target="RFC577 | the Responder responds with an R1. As specified in <xref | |||
0"/>, | target="RFC5770" format="default"/>, the NAT_TRAVERSAL_MODE parameter | |||
the NAT_TRAVERSAL_MODE parameter in | in R1 contains a list of NAT traversal modes the Responder | |||
R1 contains a list of NAT traversal modes the Responder supports. The | supports. The mode specified in this document is ICE-HIP-UDP (value | |||
mode specified in this document is ICE-HIP-UDP (value [TBD by IANA: 3]). | 3).</t> | |||
</t> | ||||
<t> In step 3, the Initiator sends an I2 that includes a | <t> In step 3, the Initiator sends an I2 that includes a | |||
NAT_TRAVERSAL_MODE parameter. It contains the mode selected by the | NAT_TRAVERSAL_MODE parameter. It contains the mode selected by the | |||
Initiator from the list of modes offered by the Responder. If ICE-HIP-UD | Initiator from the list of modes offered by the Responder. If | |||
P mode | ICE-HIP-UDP mode was selected, the I2 also includes the "Transport | |||
was selected, the I2 also includes the "Transport address" locators (as | address" locators (as defined in <xref target="sec_locator_format" | |||
defined in <xref target="sec:locator_format"/>) of the Initiator in a | format="default"/>) of the Initiator in a LOCATOR_SET parameter | |||
LOCATOR_SET parameter (denoted here with LOC_SET). | (denoted here with LOC_SET). With ICE-HIP-UDP mode, the LOCATOR_SET | |||
With ICE-HIP-UDP mode, the LOCATOR_SET parameter MUST be encapsulated wi | parameter <bcp14>MUST</bcp14> be encapsulated within an ENCRYPTED | |||
thin an ENCRYPTED parameter (denoted here with ENC) | parameter (denoted here with ENC) according to the procedures in | |||
according to the procedures in sections 5.2.18 and 6.5 in <xref target=" | Sections <xref target="RFC7401" section="5.2.18" | |||
RFC7401" />. | sectionFormat="bare"/> and <xref target="RFC7401" section="6.5" | |||
The locators in I2 are the "HIP offer".</t> | sectionFormat="bare"/> in <xref target="RFC7401" | |||
format="default"/>. The locators in I2 are the "HIP offer".</t> | ||||
<t> In step 4, the Responder concludes the base exchange with an R2 | <t> In step 4, the Responder concludes the base exchange with an R2 | |||
packet. If the Initiator chose ICE-HIP-UDP traversal mode, the Responder | packet. If the Initiator chose ICE-HIP-UDP traversal mode, the | |||
includes a LOCATOR_SET parameter in the R2 packet. | Responder includes a LOCATOR_SET parameter in the R2 packet. With | |||
With ICE-HIP-UDP mode, the LOCATOR_SET parameter MUST be encapsulated wi | ICE-HIP-UDP mode, the LOCATOR_SET parameter <bcp14>MUST</bcp14> be | |||
thin an ENCRYPTED parameter | encapsulated within an ENCRYPTED parameter according to the procedures | |||
according to the procedures in sections 5.2.18 and 6.5 in <xref target=" | in Sections <xref target="RFC7401" section="5.2.18" | |||
RFC7401" />. | sectionFormat="bare"/> and <xref target="RFC7401" section="6.5" | |||
The locators in R2, encoded like the locators in I2, are the "ICE answer" | sectionFormat="bare"/> in <xref target="RFC7401" | |||
. If the NAT | format="default"/>. The locators in R2, encoded like the locators in | |||
traversal mode selected by the Initiator is not supported by the | I2, are the "ICE answer". If the NAT traversal mode selected by the | |||
Responder, the Responder SHOULD reply with a NOTIFY packet with type | Initiator is not supported by the Responder, the Responder | |||
NO_VALID_NAT_TRAVERSAL_MODE_PARAMETER and abort the base exchange.</t> | <bcp14>SHOULD</bcp14> reply with a NOTIFY packet with type | |||
NO_VALID_NAT_TRAVERSAL_MODE_PARAMETER and abort the base exchange.</t> | ||||
</section> | </section> | |||
<section anchor="sec_check_pacing_neg" numbered="true" toc="default"> | ||||
<section anchor="sec:check_pacing_neg" | <name>Connectivity Check Pacing Negotiation</name> | |||
title="Connectivity Check Pacing Negotiation"> | <t> As explained in Legacy ICE-HIP <xref target="RFC5770" format="defaul | |||
t"/>, when a NAT | ||||
<t> As explained in Legacy ICE-HIP <xref target="RFC5770"/>, when a NAT | ||||
traversal mode with connectivity checks is used, new transactions | traversal mode with connectivity checks is used, new transactions | |||
should not be started too fast to avoid congestion and overwhelming the | should not be started too fast to avoid congestion and overwhelming the | |||
NATs. For this purpose, during the base exchange, hosts can negotiate a | NATs. For this purpose, during the base exchange, hosts can negotiate a | |||
transaction pacing value, Ta, using a TRANSACTION_PACING parameter in | transaction pacing value, Ta, using a TRANSACTION_PACING parameter in | |||
R1 and I2 packets. The parameter contains the minimum time (expressed | R1 and I2 packets. The parameter contains the minimum time (expressed | |||
in milliseconds) the host would wait between two NAT traversal | in milliseconds) the host would wait between two NAT traversal | |||
transactions, such as starting a new connectivity check or retrying a | transactions, such as starting a new connectivity check or retrying a | |||
previous check. The value that is used by both of the hosts is the highe r | previous check. The value that is used by both of the hosts is the highe r | |||
of the two offered values.</t> | of the two offered values.</t> | |||
<t> The minimum Ta value <bcp14>SHOULD</bcp14> be configurable, and if | ||||
<t> The minimum Ta value SHOULD be configurable, and if no | no value is configured, a value of 50 ms <bcp14>MUST</bcp14> be | |||
value is configured, a value of 50 ms MUST be | used. Guidelines for selecting a Ta value are given in <xref | |||
used. Guidelines for selecting a Ta value are given in <xref | target="sec_selecting_pacing_value" format="default"/>. Hosts | |||
target="sec:selecting_pacing_value"/>. Hosts MUST NOT use | <bcp14>MUST NOT</bcp14> use values smaller than 5 ms for the minimum | |||
values smaller than 5 ms for the minimum Ta, since such | Ta, since such values may not work well with some NATs (as explained | |||
values may not work well with some NATs (as explained in <xref | in <xref target="RFC8445" format="default"/>). The Initiator | |||
target="RFC8445"/>). The Initiator MUST NOT propose a smaller | <bcp14>MUST NOT</bcp14> propose a smaller value than what the | |||
value than what the Responder offered. If a host does not | Responder offered. If a host does not include the TRANSACTION_PACING | |||
include the TRANSACTION_PACING parameter in the base exchange, | parameter in the base exchange, a Ta value of 50 ms | |||
a Ta value of 50 ms MUST be used as that host's minimum | <bcp14>MUST</bcp14> be used as that host's minimum value.</t> | |||
value.</t> | ||||
</section> | </section> | |||
<section anchor="sec_relay_bex" numbered="true" toc="default"> | ||||
<section anchor="sec:relay_bex" | <name>Base Exchange via Control Relay Server</name> | |||
title="Base Exchange via Control Relay Server"> | <t> This section describes how the Initiator and Responder perform a | |||
base exchange through a Control Relay Server. Connectivity pacing | ||||
<t> This section describes how the Initiator and Responder | (denoted as TA_P here) was described in <xref | |||
perform a base exchange through a Control Relay Server. | target="sec_check_pacing_neg" format="default"/> and is not repeated | |||
Connectivity pacing (denoted as TA_P here) was described in | here. Similarly, the NAT traversal mode negotiation process (denoted | |||
<xref target="sec:check_pacing_neg"/> and is not repeated | as NAT_TM in the example) was described in <xref | |||
here. Similarly, the NAT traversal mode negotiation process | target="sec_nat_traversal_mode" format="default"/> and is also not | |||
(denoted as NAT_TM in the example) was described in <xref | repeated here. If a Control Relay Server receives an R1 or I2 packet | |||
target="sec:nat_traversal_mode"/> and is also not repeated | without the NAT traversal mode parameter, it <bcp14>MUST</bcp14> drop | |||
here. If | it and <bcp14>SHOULD</bcp14> send a NOTIFY error packet with type | |||
a Control Relay Server receives an R1 or I2 packet without the NAT trave | NO_VALID_NAT_TRAVERSAL_MODE_PARAMETER to the sender of the R1 or | |||
rsal | I2.</t> | |||
mode parameter, it MUST drop it and SHOULD send a NOTIFY error | <t> It is <bcp14>RECOMMENDED</bcp14> that the Initiator send an I1 packe | |||
packet with type NO_VALID_NAT_TRAVERSAL_MODE_PARAMETER to the | t | |||
sender of the R1 or I2. | ||||
</t> | ||||
<t> It is RECOMMENDED that the Initiator send an I1 packet | ||||
encapsulated in UDP when it is destined to an IP address of the | encapsulated in UDP when it is destined to an IP address of the | |||
Responder. Respectively, the Responder MUST respond to such an I1 | Responder. Respectively, the Responder <bcp14>MUST</bcp14> respond to su ch an I1 | |||
packet with a UDP-encapsulated R1 packet, and also the rest of the commu nication | packet with a UDP-encapsulated R1 packet, and also the rest of the commu nication | |||
related to the HIP association MUST also use UDP encapsulation.</t> | related to the HIP association <bcp14>MUST</bcp14> also use UDP encapsul | |||
ation.</t> | ||||
<t><xref target="fig:bex"/> illustrates a base exchange | <t><xref target="fig_bex" format="default"/> illustrates a base | |||
via a Control Relay Server. We assume that the Responder (i.e. a Control | exchange via a Control Relay Server. We assume that the Responder | |||
Relay Client) | (i.e., a Control Relay Client) has already registered to the Control | |||
has already registered to the Control Relay Server. The Initiator may ha | Relay Server. The Initiator may have also registered to another (or | |||
ve also registered | the same Control Relay Server), but the base exchange will traverse | |||
to another (or the same Control Relay Server), but the base exchange wil | always through the Control Relay Server of the Responder.</t> | |||
l traverse always through | <figure anchor="fig_bex"> | |||
the Control Relay Server of the Responder. | <name>Base Exchange via a HIP Relay Server</name> | |||
</t> | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
<figure anchor="fig:bex" title="Base Exchange via a HIP Relay Server"> | ||||
<artwork align="center"><![CDATA[ | ||||
Initiator Control Relay Server Responder | Initiator Control Relay Server Responder | |||
| 1. UDP(I1) | | | | 1. UDP(I1) | | | |||
+--------------------------------->| 2. UDP(I1(RELAY_FROM)) | | +--------------------------------->| 2. UDP(I1(RELAY_FROM)) | | |||
| +------------------------------->| | | +------------------------------->| | |||
| | | | | | | | |||
| | 3. UDP(R1(RELAY_TO, NAT_TM, | | | | 3. UDP(R1(RELAY_TO, NAT_TM, | | |||
| | TA_P)) | | | | TA_P)) | | |||
| 4. UDP(R1(RELAY_TO, NAT_TM, |<-------------------------------+ | | 4. UDP(R1(RELAY_TO, NAT_TM, |<-------------------------------+ | |||
| TA_P)) | | | | TA_P)) | | | |||
|<---------------------------------+ | | |<---------------------------------+ | | |||
skipping to change at line 932 ¶ | skipping to change at line 837 ¶ | |||
| NAT_TM, TA_P)) | | | | NAT_TM, TA_P)) | | | |||
+--------------------------------->| 6. UDP(I2(ENC(LOC_SET), | | +--------------------------------->| 6. UDP(I2(ENC(LOC_SET), | | |||
| | RELAY_FROM, NAT_TM, TA_P))| | | | RELAY_FROM, NAT_TM, TA_P))| | |||
| +------------------------------->| | | +------------------------------->| | |||
| | | | | | | | |||
| | 7. UDP(R2(ENC(LOC_SET), | | | | 7. UDP(R2(ENC(LOC_SET), | | |||
| 8. UDP(R2(ENC(LOC_SET), | RELAY_TO)) | | | 8. UDP(R2(ENC(LOC_SET), | RELAY_TO)) | | |||
| RELAY_TO)) |<-------------------------------+ | | RELAY_TO)) |<-------------------------------+ | |||
|<---------------------------------+ | | |<---------------------------------+ | | |||
| | | | | | | | |||
]]> | ]]></artwork> | |||
</artwork> | ||||
</figure> | </figure> | |||
<t> In step 1 of <xref target="fig_bex" format="default"/>, the | ||||
<t> In step 1 of <xref target="fig:bex"/>, the Initiator sends an I1 | Initiator sends an I1 packet over UDP via the Control Relay Server to | |||
packet over UDP via the Control Relay Server to the Responder. In the HI | the Responder. In the HIP header, the source HIT belongs to the | |||
P header, | Initiator and the destination HIT to the Responder. The Initiator | |||
the source HIT belongs to the Initiator and the destination HIT to the | sends the I1 packet from its IP address to the IP address of the | |||
Responder. The initiator sends the I1 packet from its IP address to the | Control Relay Server over UDP.</t> | |||
IP address of the Control Relay Server over UDP.</t> | ||||
<t> In step 2, the Control Relay Server receives the I1 packet. If the | <t> In step 2, the Control Relay Server receives the I1 packet. If the | |||
destination HIT belongs to a successfully registered Control Relay Clien | destination HIT belongs to a successfully registered Control Relay | |||
t (i.e., the host marked "Responder" in <xref target="fig:bex"/>), the Control R | Client (i.e., the host marked "Responder" in <xref target="fig_bex" | |||
elay Server processes | format="default"/>), the Control Relay Server processes the | |||
the packet. Otherwise, the Control Relay Server MUST drop the packet sil | packet. Otherwise, the Control Relay Server <bcp14>MUST</bcp14> drop | |||
ently. The | the packet silently. The Control Relay Server appends a RELAY_FROM | |||
Control Relay Server appends a RELAY_FROM parameter to the I1 packet, wh | parameter to the I1 packet, which contains the transport source | |||
ich contains | address and port of the I1 as observed by the Control Relay | |||
the transport source address and port of the I1 as observed by the | Server. The Control Relay Server protects the I1 packet with | |||
Control Relay Server. The Control Relay Server protects the I1 packet wi | RELAY_HMAC, except that the parameter type is different as described | |||
th RELAY_HMAC, | in <xref target="sec_relay-hmac" format="default"/>. The Control Relay | |||
except that the parameter type is different as described in | Server changes the source and destination ports and IP addresses of | |||
<xref target="sec:relay-hmac"/>. The Control Relay Server changes the so | the packet to match the values the Responder used when registering to | |||
urce and | the Control Relay Server, i.e., the reverse of the R2 used in the | |||
destination ports and IP addresses of the packet to match the values | registration. The Control Relay Server <bcp14>MUST</bcp14> recalculate | |||
the Responder used when registering to the Control Relay Server, i.e., t | the transport checksum and forward the packet to the Responder. </t> | |||
he reverse of | ||||
the R2 used in the registration. The Control Relay Server MUST recalcula | ||||
te the | ||||
transport checksum and forward the packet to the Responder. </t> | ||||
<t> In step 3, the Responder receives the I1 packet. The Responder | <t> In step 3, the Responder receives the I1 packet. The Responder | |||
processes it according to the rules in <xref target="RFC7401"/>. In | processes it according to the rules in <xref target="RFC7401" | |||
addition, the Responder validates the RELAY_HMAC according to <xref targ | format="default"/>. In addition, the Responder validates the | |||
et="sec:relay-hmac"/> | RELAY_HMAC according to <xref target="sec_relay-hmac" | |||
and silently drops the packet if the validation | format="default"/> and silently drops the packet if the validation | |||
fails. The Responder replies with an R1 packet to which it includes | fails. The Responder replies with an R1 packet to which it includes | |||
RELAY_TO and NAT traversal mode parameters. The responder MUST | RELAY_TO and NAT traversal mode parameters. The Responder | |||
include ICE-HIP-UDP in the NAT traversal modes. | <bcp14>MUST</bcp14> include ICE-HIP-UDP in the NAT traversal | |||
The RELAY_TO parameter MUST | modes. The RELAY_TO parameter <bcp14>MUST</bcp14> contain the same | |||
contain the same information as the RELAY_FROM parameter, i.e., the | information as the RELAY_FROM parameter, i.e., the Initiator's | |||
Initiator's transport address, but the type of the parameter is | transport address, but the type of the parameter is different. The | |||
different. The RELAY_TO parameter is not integrity protected by the | RELAY_TO parameter is not integrity protected by the signature of the | |||
signature of the R1 to allow pre-created R1 packets at the | R1 to allow pre-created R1 packets at the Responder. </t> | |||
Responder. </t> | <t> In step 4, the Control Relay Server receives the R1 packet. The | |||
Control Relay Server drops the packet silently if the source HIT | ||||
<t> In step 4, the Control Relay Server receives the R1 packet. The Cont | belongs to a Control Relay Client that has not successfully | |||
rol Relay Server drops the | registered. The Control Relay Server <bcp14>MAY</bcp14> verify the | |||
packet silently if the source HIT belongs to a Control Relay Client that | signature of the R1 packet and drop it if the signature is | |||
has not successfully registered. The | invalid. Otherwise, the Control Relay Server rewrites the source | |||
Control Relay Server MAY verify the signature of the R1 packet and drop | address and port, and changes the destination address and port to | |||
it if the | match RELAY_TO information. Finally, the Control Relay Server | |||
signature is invalid. Otherwise, the Control Relay Server rewrites the s | recalculates the transport checksum and forwards the packet. </t> | |||
ource address | ||||
and port, and changes the destination address and port to match | ||||
RELAY_TO information. Finally, the Control Relay Server recalculates the | ||||
transport | ||||
checksum and forwards the packet. </t> | ||||
<!-- XX FIXME: remove HIP candidate term --> | ||||
<t> In step 5, the Initiator receives the R1 packet and processes it | <t> In step 5, the Initiator receives the R1 packet and processes it | |||
according to <xref target="RFC7401"/>. The Initiator MAY use the | according to <xref target="RFC7401" format="default"/>. The Initiator | |||
address in the RELAY_TO parameter as a local peer-reflexive candidate | <bcp14>MAY</bcp14> use the address in the RELAY_TO parameter as a | |||
for this HIP association if it is different from all known local | local peer-reflexive candidate for this HIP association if it is | |||
candidates. The Initiator replies with an I2 packet that uses the | different from all known local candidates. The Initiator replies with | |||
destination transport address of R1 as the source address and port. The | an I2 packet that uses the destination transport address of R1 as the | |||
I2 packet contains a LOCATOR_SET parameter inside an ENCRYPTED parameter | source address and port. The I2 packet contains a LOCATOR_SET | |||
that lists all the HIP | parameter inside an ENCRYPTED parameter that lists all the HIP | |||
candidates (HIP offer) of the Initiator. The candidates are encoded | candidates (HIP offer) of the Initiator. The candidates are encoded | |||
using the format defined in <xref target="sec:locator_format"/>. The I2 | using the format defined in <xref target="sec_locator_format" | |||
packet MUST also contain a NAT traversal mode parameter that includes IC | format="default"/>. The I2 packet <bcp14>MUST</bcp14> also contain a | |||
E-HIP-UDP mode. | NAT traversal mode parameter that includes ICE-HIP-UDP mode. The | |||
The ENCRYPTED parameter along with its key material generation are descr | ENCRYPTED parameter along with its key material generation is | |||
ibed in detail | described in detail in Sections <xref target="RFC7401" | |||
in sections 5.2.18 and 6.5 in <xref target="RFC7401" />.</t> | section="5.2.18" sectionFormat="bare"/> and <xref target="RFC7401" | |||
section="6.5" sectionFormat="bare"/> in <xref target="RFC7401" | ||||
<t> In step 6, the Control Relay Server receives the I2 packet. The Cont | format="default"/>.</t> | |||
rol Relay Server appends a | <t> In step 6, the Control Relay Server receives the I2 packet. The | |||
RELAY_FROM and a RELAY_HMAC to the I2 packet similarly as explained in s | Control Relay Server appends a RELAY_FROM and a RELAY_HMAC to the I2 | |||
tep | packet similar to that explained in step 2, and forwards the packet to | |||
2, and forwards the packet to the Responder. </t> | the Responder. </t> | |||
<t> In step 7, the Responder receives the I2 packet and processes it | <t> In step 7, the Responder receives the I2 packet and processes it | |||
according to <xref target="RFC7401"/>. | according to <xref target="RFC7401" format="default"/>. The Responder | |||
The Responder validates the RELAY_HMAC according to <xref target="sec:rel | validates the RELAY_HMAC according to <xref target="sec_relay-hmac" | |||
ay-hmac"/> | format="default"/> and silently drops the packet if the validation | |||
and silently drops the packet if the validation | fails. It replies with an R2 packet and includes a RELAY_TO parameter | |||
fails. | as explained in step 3. The R2 packet includes a LOCATOR_SET parameter | |||
It replies with an R2 packet and | inside an ENCRYPTED parameter that lists all the HIP candidates (ICE | |||
includes a RELAY_TO parameter as explained in step 3. The R2 packet | ||||
includes a LOCATOR_SET parameter inside an ENCRYPTED parameter that list | ||||
s all the HIP candidates (ICE | ||||
answer) of the Responder. The RELAY_TO parameter is protected by the | answer) of the Responder. The RELAY_TO parameter is protected by the | |||
HMAC. The ENCRYPTED parameter along with its key material generation are | Hashed Message Authentication Code (HMAC). The ENCRYPTED parameter | |||
described in detail | along with its key material generation is described in detail in | |||
in sections 5.2.18 and 6.5 in <xref target="RFC7401" />.</t> | Sections <xref target="RFC7401" section="5.2.18" | |||
sectionFormat="bare"/> and <xref target="RFC7401" section="6.5" | ||||
<t> In step 8, the Control Relay Server processes the R2 as described in | sectionFormat="bare"/> in <xref target="RFC7401" | |||
step 4. The | format="default"/>.</t> | |||
Control Relay Server forwards the packet to the Initiator. After the Ini | <t> In step 8, the Control Relay Server processes the R2 as described | |||
tiator has | in step 4. The Control Relay Server forwards the packet to the | |||
received the R2 and processed it successfully, the base exchange is | Initiator. After the Initiator has received the R2 and processed it | |||
completed. </t> | successfully, the base exchange is completed. </t> | |||
<t> Hosts <bcp14>MUST</bcp14> include the address of one or more | ||||
<t> Hosts MUST include the address of one or more Control Relay Servers | Control Relay Servers (including the one that is being used for the | |||
(including the one that is being used for the initial signaling) in the | initial signaling) in the LOCATOR_SET parameter in I2 and R2 messages | |||
LOCATOR_SET parameter in I2 and R2 messages if they intend to use such s | if they intend to use such servers for relaying HIP signaling | |||
ervers for | immediately after the base exchange completes. The traffic type of | |||
relaying HIP signaling immediately after the base exchange completes. | these addresses <bcp14>MUST</bcp14> be "HIP signaling" (see <xref | |||
The traffic type of these addresses MUST be "HIP signaling" (see <xref t | target="sec_locator_format" format="default"/>) and they <bcp14>MUST | |||
arget="sec:locator_format" />) and they | NOT</bcp14> be used for the connectivity tests described in <xref | |||
MUST NOT be used for the connectivity tests described in <xref target="s | target="sec_conn_checks" format="default"/>. If the Control Relay | |||
ec:conn_checks" />. If the Control Relay Server locator | Server locator used for relaying the base exchange is not included in | |||
used for relaying the base exchange is not included in I2 or R2 LOCATOR_ | I2 or R2 LOCATOR_SET parameters, it <bcp14>SHOULD NOT</bcp14> be used | |||
SET parameters, | after the base exchange. Instead, further HIP signaling | |||
it SHOULD NOT be used after the base exchange. Instead, further HIP | <bcp14>SHOULD</bcp14> use the same path as the data traffic. It is | |||
signaling SHOULD use the same path as the data traffic. It is RECOMMENDE | <bcp14>RECOMMENDED</bcp14> to use the same Control Relay Server | |||
D to use the | throughout the lifetime of the host association that was used for | |||
same Control Relay Server throughout the lifetime of the host association | forwarding the base exchange if the Responder includes it in the | |||
that | locator parameter of the R2 message.</t> | |||
was used for forwarding the base exchange if the Responder includes it i | </section> | |||
n the locator parameter of the R2 message.</t> | ||||
</section> <!-- Base Exchange via HIP Relay Server --> | ||||
<section anchor="sec:conn_checks" title="Connectivity Checks"> | ||||
<t>When the Initiator and Responder complete the base exchange | ||||
through the Control Relay Server, both of them employ the IP address of | ||||
the Control Relay Server as the destination address for the packets. | ||||
The address of the Control Relay Server MUST NOT be used as a destination | ||||
for data plane traffic unless | ||||
the server supports also Data Relay Server functionality, and the Client | ||||
has successfully | ||||
registered to use it. | ||||
When NAT | ||||
traversal mode with ICE-HIP-UDP was successfully negotiated | ||||
and selected, the Initiator and Responder MUST start the | ||||
connectivity checks in order to attempt to obtain direct end-to-end | ||||
connectivity through NAT devices. It is worth noting that the connectivi | ||||
ty checks | ||||
MUST be completed even though no ESP_TRANSFORM would be negotiated and s | ||||
elected. | ||||
</t> | ||||
<section anchor="sec_conn_checks" numbered="true" toc="default"> | ||||
<name>Connectivity Checks</name> | ||||
<t>When the Initiator and Responder complete the base exchange through | ||||
the Control Relay Server, both of them employ the IP address of the | ||||
Control Relay Server as the destination address for the packets. The | ||||
address of the Control Relay Server <bcp14>MUST NOT</bcp14> be used as | ||||
a destination for data plane traffic unless the server also supports | ||||
Data Relay Server functionality, and the Client has successfully | ||||
registered to use it. When NAT traversal mode with ICE-HIP-UDP was | ||||
successfully negotiated and selected, the Initiator and Responder | ||||
<bcp14>MUST</bcp14> start the connectivity checks in order to attempt | ||||
to obtain direct end-to-end connectivity through NAT devices. It is | ||||
worth noting that the connectivity checks <bcp14>MUST</bcp14> be | ||||
completed even though no ESP_TRANSFORM would be negotiated and | ||||
selected.</t> | ||||
<t>The connectivity checks follow the ICE methodology <xref | <t>The connectivity checks follow the ICE methodology <xref | |||
target="I-D.rosenberg-mmusic-ice-nonsip"/>, but UDP encapsulated HIP con | target="I-D.rosenberg-mmusic-ice-nonsip" format="default"/>, but | |||
trol | UDP-encapsulated HIP control messages are used instead of ICE | |||
messages are used instead of ICE messages. | messages. As stated in the ICE specification, the basic procedure for | |||
As stated in the ICE specification, the basic procedure for connectivity | connectivity checks has three phases: sorting the candidate pairs | |||
checks has three phases: | according to their priority, sending checks in the prioritized order, | |||
sorting the candidate pairs according their priority, sending checks in t | and acknowledging the checks from the peer host. | |||
he prioritized order and | </t> | |||
acknowledging the checks from the peer host. | ||||
</t> | ||||
<t>The Initiator MUST take the role of controlling host and | ||||
the Responder acts as the controlled host. The roles MUST | ||||
persist throughout the HIP associate lifetime (to be reused in | ||||
the possibly mobility UPDATE procedures). In the case both | ||||
communicating nodes are initiating the communications to each | ||||
other using an I1 packet, the conflict is resolved as defined | ||||
in section 6.7 in <xref target="RFC7401" />: the host with the | ||||
"larger" HIT changes to its Role to Responder. In such a case, | ||||
the host changing its role to Responder MUST also switch to | ||||
controlled role. | ||||
</t> | ||||
<t>The protocol follows standard HIP UPDATE sending and | <t>The Initiator <bcp14>MUST</bcp14> take the role of controlling | |||
processing rules as defined in section 6.11 and 6.12 in <xref | host, and the Responder acts as the controlled host. The roles | |||
target="RFC7401" />, but some new parameters are introduced | <bcp14>MUST</bcp14> persist throughout the HIP associate lifetime (to | |||
(CANDIDATE_PRIORITY, MAPPED_ADDRESS and NOMINATE).</t> | be reused even during mobility UPDATE procedures). In the case in | |||
which both communicating nodes are initiating communication to | ||||
each other using an I1 packet, the conflict is resolved as defined in | ||||
<xref target="RFC7401" sectionFormat="of" section="6.7"/>; the host | ||||
with the "larger" HIT changes its role to Responder. In such a | ||||
case, the host changing its role to Responder <bcp14>MUST</bcp14> also | ||||
switch to the controlled role.</t> | ||||
<section anchor="sec:conn_check_proc" title="Connectivity Check Procedur | <t>The protocol follows standard HIP UPDATE sending and processing | |||
e"> | rules as defined in Sections <xref target="RFC7401" section="6.11" | |||
sectionFormat="bare"/> and <xref target="RFC7401" section="6.12" | ||||
sectionFormat="bare"/> in <xref target="RFC7401" format="default"/>, | ||||
but some new parameters are introduced (CANDIDATE_PRIORITY, | ||||
MAPPED_ADDRESS, NOMINATE, PEER_PERMISSION, and RELAYED_ADDRESS).</t> | ||||
<t><xref target="fig:cc1"/> illustrates connectivity checks | <section anchor="sec_conn_check_proc" numbered="true" toc="default"> | |||
in a simplified scenario, where the Initiator and Responder | <name>Connectivity Check Procedure</name> | |||
<t><xref target="fig_cc1" format="default"/> illustrates connectivity | ||||
checks | ||||
in a simplified scenario where the Initiator and Responder | ||||
have only a single candidate pair to check. Typically, NATs | have only a single candidate pair to check. Typically, NATs | |||
drop messages until both sides have sent messages using the | drop messages until both sides have sent messages using the | |||
same port pair. In this scenario, the Responder sends a | same port pair. In this scenario, the Responder sends a | |||
connectivity check first but the NAT of the Initiator drops | connectivity check first but the NAT of the Initiator drops | |||
it. However, the connectivity check from the Initiator | it. However, the connectivity check from the Initiator | |||
reaches the Responder because it uses the same port pair as | reaches the Responder because it uses the same port pair as | |||
the first message. It is worth noting that the message flow | the first message. It is worth noting that the message flow | |||
in this section is idealistic, and, in practice, more | in this section is idealistic, and, in practice, more | |||
messages would be dropped, especially in the beginning. For | messages would be dropped, especially in the beginning. For | |||
instance, connectivity tests always start with the | instance, connectivity tests always start with the | |||
candidates with the highest priority, which would be host | candidates with the highest priority, which would be host | |||
candidates (which would not reach the recipient in this | candidates (which would not reach the recipient in this | |||
scenario).</t> | scenario).</t> | |||
<figure anchor="fig_cc1"> | ||||
<?rfc needLines="30" ?> | <name>Connectivity Checks</name> | |||
<figure anchor="fig:cc1" title="Connectivity Checks"> | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
<artwork align="center"><![CDATA[ | ||||
Initiator NAT1 NAT2 Responder | Initiator NAT1 NAT2 Responder | |||
| | 1. UDP(UPDATE(SEQ, CAND_PRIO, | | | | | 1. UDP(UPDATE(SEQ, CAND_PRIO, | | | |||
| | ECHO_REQ_SIGN)) | | | | | ECHO_REQ_SIGN)) | | | |||
| X<-----------------------------------+----------------+ | | X<-----------------------------------+----------------+ | |||
| | | | | | | | | | |||
| 2. UDP(UPDATE(SEQ, ECHO_REQ_SIGN, CAND_PRIO)) | | | | 2. UDP(UPDATE(SEQ, ECHO_REQ_SIGN, CAND_PRIO)) | | | |||
+-------------+------------------------------------+--------------->| | +-------------+------------------------------------+--------------->| | |||
| | | | | | | | | | |||
| 3. UDP(UPDATE(ACK, ECHO_RESP_SIGN, MAPPED_ADDR)) | | | | 3. UDP(UPDATE(ACK, ECHO_RESP_SIGN, MAPPED_ADDR)) | | | |||
|<------------+------------------------------------+----------------+ | |<------------+------------------------------------+----------------+ | |||
skipping to change at line 1122 ¶ | skipping to change at line 1037 ¶ | |||
| 8. UDP(UPDATE(SEQ, ACK, ECHO_REQ_SIGN, ECHO_RESP_SIGN, | | | 8. UDP(UPDATE(SEQ, ACK, ECHO_REQ_SIGN, ECHO_RESP_SIGN, | | |||
| NOMINATE)) | | | | NOMINATE)) | | | |||
|<------------+------------------------------------+----------------+ | |<------------+------------------------------------+----------------+ | |||
| | | | | | | | | | |||
| 9. UDP(UPDATE(ACK, ECHO_RESP_SIGN)) | | | | 9. UDP(UPDATE(ACK, ECHO_RESP_SIGN)) | | | |||
+-------------+------------------------------------+--------------->+ | +-------------+------------------------------------+--------------->+ | |||
| | | | | | | | | | |||
| 10. ESP data traffic over UDP | | | | 10. ESP data traffic over UDP | | | |||
+<------------+------------------------------------+--------------->+ | +<------------+------------------------------------+--------------->+ | |||
| | | | | | | | | | |||
]]> | ]]></artwork> | |||
</artwork> | ||||
</figure> | </figure> | |||
<t>In step 1, the Responder sends a connectivity check to the | <t>In step 1, the Responder sends a connectivity check to the | |||
Initiator that the NAT of the Initiator drops. The message | Initiator that the NAT of the Initiator drops. The message includes | |||
includes a number of parameters. As specified in <xref | a number of parameters. As specified in <xref target="RFC7401" | |||
target="RFC7401" />), the SEQ parameter includes a running | format="default"/>, the SEQ parameter includes a running sequence | |||
sequence identifier for the connectivity check. | identifier for the connectivity check. The candidate priority | |||
The candidate priority (denoted "CAND_PRIO" in the figure) | (denoted CAND_PRIO in the figure) describes the priority of the | |||
describes the priority of the address candidate being | address candidate being tested. The ECHO_REQUEST_SIGNED (denoted | |||
tested. The ECHO_REQUEST_SIGNED (denoted ECHO_REQ_SIGN in the | ECHO_REQ_SIGN in the figure) includes a nonce that the recipient | |||
figure) includes a nonce that the recipient must sign and echo back as | must sign and echo back as it is.</t> | |||
it is.</t> | ||||
<t>In step 2, the Initiator sends a connectivity check, using | <t>In step 2, the Initiator sends a connectivity check, using | |||
the same address pair candidate as in the previous step, and the | the same address pair candidate as in the previous step, and the | |||
message traverses successfully the NAT boxes. The message | message successfully traverses the NAT boxes. The message | |||
includes the same parameters as in the previous step. It | includes the same parameters as in the previous step. It | |||
should be noted that the sequence identifier is locally | should be noted that the sequence identifier is locally | |||
assigned by the Initiator, so it can be different than in | assigned by the Initiator, so it can be different than in | |||
the previous step.</t> | the previous step.</t> | |||
<t>In step 3, the Responder has successfully received the previous | ||||
<!-- XX FIXME: explain what happens to the SEQ ids of dropped packets a | connectivity check from the Initiator and starts to build a response | |||
nd SEQ window --> | message. Since the message from the Initiator included a SEQ, the | |||
Responder must acknowledge it using an ACK parameter. Also, the | ||||
<t>In step 3, the Responder has successfully received the | nonce contained in the echo request must be echoed back in an | |||
previous connectivity check from the Initiator and starts to build a r | ECHO_RESPONSE_SIGNED (denoted ECHO_RESP_SIGN) parameter. The | |||
esponse message. Since the | Responder also includes a MAPPED_ADDRESS parameter (denoted | |||
message from the Initiator included a SEQ, the Responder must acknowle | MAPPED_ADDR in the figure) that contains the transport address of | |||
dge it using an ACK | the Initiator as observed by the Responder (i.e., peer-reflexive | |||
parameter. Also, the nonce contained in the echo request must | candidate). This message is successfully delivered to the Initiator; | |||
be echoed back in an ECHO_RESPONSE_SIGNED (denoted | upon reception, the Initiator marks the candidate pair as valid.</t> | |||
ECHO_RESP_SIGN) parameter. The | ||||
Responder includes also a MAPPED_ADDRESS parameter (denoted MAPPED_ADD | ||||
R in the figure) that | ||||
contains the transport address of the Initiator as observed by | ||||
the Responder (i.e. peer reflexive candidate). This message is success | ||||
fully delivered to the Initiator, and upon reception | ||||
the Initiator marks the candidate pair as valid. | ||||
</t> | ||||
<t>In step 4, the Responder retransmits the connectivity | <t>In step 4, the Responder retransmits the connectivity | |||
check sent in the first step, since it was not acknowledged | check sent in the first step, since it was not acknowledged | |||
yet.</t> | yet.</t> | |||
<t>In step 5, the Initiator responds to the previous | <t>In step 5, the Initiator responds to the previous | |||
connectivity check message from the Responder. The Initiator | connectivity check message from the Responder. The Initiator | |||
acknowledges the SEQ parameter from the previous message | acknowledges the SEQ parameter from the previous message | |||
using ACK parameter and the ECHO_REQUEST_SIGNED parameter with | using an ACK parameter and the ECHO_REQUEST_SIGNED parameter with | |||
ECHO_RESPONSE_SIGNED. In addition, it includes MAPPED_ADDR | ECHO_RESPONSE_SIGNED. In addition, it includes the MAPPED_ADDR | |||
parameter that includes the peer reflexive candidate. This | parameter that includes the peer-reflexive candidate. This | |||
response message is successfully delivered to the | response message is successfully delivered to the | |||
Responder, and upon reception the Initiator marks the candidate pair a | Responder; upon reception, the Initiator marks the candidate pair as v | |||
s valid.</t> | alid.</t> | |||
<t>In step 6, despite the two hosts now having valid address | ||||
<t>In step 6, despite the two hosts now having valid address | ||||
candidates, the hosts still test the remaining address candidates | candidates, the hosts still test the remaining address candidates | |||
in a similar way as in the previous steps. It should be noted that each | in a similar way as in the previous steps. It should be noted that each | |||
connectivity check has a unique sequence number in the SEQ | connectivity check has a unique sequence number in the SEQ | |||
parameter.</t> | parameter.</t> | |||
<t>In step 7, the Initiator has completed testing all | <t>In step 7, the Initiator has completed testing all | |||
address candidates and nominates one address candidate to be | address candidates and nominates one address candidate to be | |||
used. It sends an UPDATE message using the selected address | used. It sends an UPDATE message using the selected address | |||
candidates that includes a number of parameters: SEQ, | candidates that includes a number of parameters: SEQ, | |||
ECHO_REQUEST_SIGNED, CANDIDATE_PRIORITY and the NOMINATE parameter.</t | ECHO_REQUEST_SIGNED, CANDIDATE_PRIORITY, and the NOMINATE parameter.</ | |||
> | t> | |||
<t>In step 8, the Responder receives the message with the NOMINATE | ||||
<t>In step 8, the Responder receives the message with | parameter from the Initiator. It sends a response that includes the | |||
NOMINATE parameter from the Initiator. It sends a response | NOMINATE parameter in addition to a number of other parameters. The | |||
that includes the NOMINATE parameter in addition to a number | ACK and ECHO_RESPONSE_SIGNED parameters acknowledge the SEQ and | |||
of other parameters. The ACK and ECHO_RESPONSE_SIGNED parameters | ECHO_REQUEST_SIGNED parameters from the previous message from the | |||
acknowledge the SEQ and ECHO_REQUEST_SIGNED parameters from previous m | ||||
essage from the | ||||
Initiator. The Responder includes SEQ and ECHO_REQUEST_SIGNED | Initiator. The Responder includes SEQ and ECHO_REQUEST_SIGNED | |||
parameters in order to receive an acknowledgment from the | parameters in order to receive an acknowledgment from the | |||
Responder.</t> | Responder.</t> | |||
<t>In step 9, the Initiator completes the candidate | <t>In step 9, the Initiator completes the candidate | |||
nomination process by confirming the message reception to | nomination process by confirming the message reception to | |||
the Responder. In the confirmation message, the ACK and | the Responder. In the confirmation message, the ACK and | |||
ECHO_RESPONSE_SIGNED parameters correspond to the SEQ and | ECHO_RESPONSE_SIGNED parameters correspond to the SEQ and | |||
ECHO_REQUEST_SIGNED parameters in the message sent by the | ECHO_REQUEST_SIGNED parameters in the message sent by the | |||
Responder in the previous step.</t> | Responder in the previous step.</t> | |||
<t>In step 10, the Initiator and Responder can start sending | <t>In step 10, the Initiator and Responder can start sending | |||
application payload over the successfully nominated address | application payload over the successfully nominated address | |||
candidates.</t> | candidates.</t> | |||
<t>It is worth noting that if either host has registered a relayed | ||||
<t>It is worth noting that if either host has registered a | address candidate from a Data Relay Server, the host | |||
relayed address candidate from a Data Relay Server, the host MUST | <bcp14>MUST</bcp14> activate the address before connectivity checks | |||
activate the address before connectivity checks by sending | by sending an UPDATE message containing the PEER_PERMISSION parameter a | |||
an UPDATE message containing PEER_PERMISSION parameter as | s | |||
described in <xref target="sec:forwarding" />. Otherwise, | described in <xref target="sec_forwarding" | |||
the Data Relay Server drops ESP packets using the relayed address. | format="default"/>. Otherwise, the Data Relay Server drops ESP | |||
</t> | packets using the relayed address.</t> | |||
<t>It should be noted that in the case in which both the Initiator and | ||||
<t>It should be noted that in the case both Initiator and | Responder are advertising their own relayed address | |||
Responder both advertising their own relayed address | ||||
candidates, it is possible that the two hosts choose the two | candidates, it is possible that the two hosts choose the two | |||
relayed addresses as a result of the ICE nomination | relayed addresses as a result of the ICE nomination | |||
algorithm. While this is possible (and even could be | algorithm. While this is possible (and even could be | |||
desirable for privacy reasons), it can be unlikely due to | desirable for privacy reasons), it can be unlikely due to | |||
low priority assigned for the relayed address candidates. In | low priority assigned for the relayed address candidates. In | |||
such a event, the nominated address pair is always | such an event, the nominated address pair is always | |||
symmetric; the nomination algorithm prevents asymmetric | symmetric; the nomination algorithm prevents asymmetric | |||
address pairs (i.e. each side choosing different pair), such | address pairs (i.e., each side choosing different pair) such | |||
as a Data Relay Client using its own Data Relay Server to | as a Data Relay Client using its own Data Relay Server to | |||
send data directly to its peer while receiving data from the | send data directly to its peer while receiving data from the | |||
Data Relay Server of its peer. | Data Relay Server of its peer. | |||
</t> | ||||
</section> <!-- "Connectivity Check Procedure" --> | ||||
<!-- | ||||
seq: 385 | ||||
ack: 449 | ||||
echo_req_sign: 897 | ||||
echo_resp_sign: 961 | ||||
mapped_address: 4660 | ||||
cand_prio: 4700 | ||||
NOMINATE: 4710 | ||||
<section title="Rules for Connectivity Checks"> | ||||
<!-- XX FIXME: should we explicitly explain here the ordering of the I | ||||
CE candidates? --> | ||||
<t>The HITs of the two communicating hosts MUST be used as | ||||
credentials in this protocol (in contrast to ICE which | ||||
employs username-password fragments). A HIT | ||||
pair uniquely identifies the corresponding HIT association, | ||||
and a SEQ number in an UPDATE message identifies a | ||||
particular connectivity check.</t> | ||||
<t>All of the connectivity check messages MUST be protected | ||||
with HIP_HMAC and signatures (even though the illustrations | ||||
in this specification omit them for simplicity) according to <xref tar | ||||
get="RFC7401"/>. Each connectivity check sent | ||||
by a host MUST include a SEQ parameter and ECHO_REQUEST_SIGNED | ||||
parameter, and correspondingly the peer MUST respond to | ||||
these using ACK and ECHO_RESPONSE_SIGNED according to the rules | ||||
specified in <xref target="RFC7401" />. | ||||
</t> | </t> | |||
</section> | ||||
<!-- <t>The host sending a connectivity check should check that | <section numbered="true" toc="default"> | |||
the response uses also the same pair of UDP ports. If the | <name>Rules for Connectivity Checks</name> | |||
UDP ports do not match, the connectivity checks for this | ||||
candidate pair MUST be considered to have failed.</t> | ||||
XX FIXME: vurnerable to replay attacks??? | <t>The HITs of the two communicating hosts <bcp14>MUST</bcp14> be | |||
--> | used as credentials in this protocol (in contrast to ICE, which | |||
employs username-password fragments). A HIT pair uniquely identifies | ||||
the corresponding HIT association, and a SEQ number in an UPDATE | ||||
message identifies a particular connectivity check.</t> | ||||
<t>All of the connectivity check messages <bcp14>MUST</bcp14> be | ||||
protected with HIP_HMAC and signatures (even though the | ||||
illustrations in this specification omit them for simplicity) | ||||
according to <xref target="RFC7401" format="default"/>. Each | ||||
connectivity check sent by a host <bcp14>MUST</bcp14> include a SEQ | ||||
parameter and ECHO_REQUEST_SIGNED parameter; correspondingly, the | ||||
peer <bcp14>MUST</bcp14> respond to these using ACK and | ||||
ECHO_RESPONSE_SIGNED according to the rules specified in <xref | ||||
target="RFC7401" format="default"/>.</t> | ||||
<t>The host sending a connectivity check MUST validate that | <t>The host sending a connectivity check <bcp14>MUST</bcp14> validate t hat | |||
the response uses the same pair of UDP ports, and drop the | the response uses the same pair of UDP ports, and drop the | |||
packet if this is not the case.</t> | packet if this is not the case.</t> | |||
<t>A host may receive a connectivity check before it has received | ||||
<t>A host may receive a connectivity check before it has | the candidates from its peer. In such a case, the host | |||
received the candidates from its peer. In such a case, the | <bcp14>MUST</bcp14> immediately queue a response by placing it in | |||
host MUST immediately queue a response by placing it in the triggered-c | the triggered-check queue and then continue waiting for the | |||
heck queue, and then continue | candidates. A host <bcp14>MUST NOT</bcp14> select a candidate pair | |||
waiting for the candidates. A host MUST NOT select a | until it has verified the pair using a connectivity check as defined | |||
candidate pair until it has verified the pair using a | in <xref target="sec_conn_check_proc" format="default"/>.</t> | |||
connectivity check as defined in <xref | <t><xref target="RFC7401" sectionFormat="of" section="5.3.5"/> | |||
target="sec:conn_check_proc" />.</t> | states that UPDATE packets have to include either a SEQ or ACK | |||
parameter (but can include both). In the connectivity check | ||||
<t><xref target="RFC7401"/> section 5.3.5 states that UPDATE packets h | procedure specified in <xref target="sec_conn_check_proc" | |||
ave | format="default"/>, each SEQ parameter should be acknowledged | |||
to include either a SEQ or ACK parameter (but can include | separately. In the context of NATs, this means that some of the SEQ | |||
both). In the connectivity check procedure specified in <xref target=" | parameters sent in connectivity checks will be lost or arrive out of | |||
sec:conn_check_proc" />, each SEQ parameter should be | order. From the viewpoint of the recipient, this is not a problem | |||
acknowledged separately. In the context of NATs, this means | since the recipient will just "blindly" acknowledge the | |||
that some of the SEQ parameters sent in connectivity checks | SEQ. However, the sender needs to be prepared for lost sequence | |||
will be lost or arrive out of order. From the viewpoint of the | identifiers and ACK parameters that arrive out of order.</t> | |||
recipient, this is not a problem since the recipient | <t>As specified in <xref target="RFC7401" format="default"/>, an ACK | |||
will just "blindly" acknowledge the SEQ. However, the sender | ||||
needs to be prepared for lost sequence identifiers and ACKs | ||||
parameters that arrive out of order.</t> | ||||
<t>As specified in <xref target="RFC7401"/>, an ACK | ||||
parameter may acknowledge multiple sequence | parameter may acknowledge multiple sequence | |||
identifiers. While the examples in the previous sections do | identifiers. While the examples in the previous sections do | |||
not illustrate such functionality, it is also permitted when | not illustrate such functionality, it is also permitted when | |||
employing ICE-HIP-UDP mode.</t> | employing ICE-HIP-UDP mode.</t> | |||
<t>In ICE-HIP-UDP mode, a retransmission of a connectivity check | ||||
<t>In ICE-HIP-UDP mode, a retransmission of a connectivity | <bcp14>SHOULD</bcp14> be sent with the same sequence identifier in | |||
check SHOULD be sent with the same sequence identifier in the | the SEQ parameter. Some tested address candidates will never produce | |||
SEQ parameter. Some tested address candidates will never | a working address pair and may thus cause retransmissions. Upon | |||
produce a working address pair, and thus may cause | successful nomination of an address pair, a host | |||
retransmissions. Upon successful nomination of an address pair, | <bcp14>SHOULD</bcp14> immediately stop sending such | |||
a host SHOULD immediately stop sending such retransmissions.</t> | retransmissions.</t> | |||
<!-- XX FIXME: no lite mode anymore in ICE --> | ||||
<t>Full ICE procedures for prioritizing candidates, eliminating | <t>Full ICE procedures for prioritizing candidates, eliminating | |||
redundant candidates, forming check lists (including | redundant candidates, forming checklists (including pruning), and | |||
pruning) and triggered check-queues MUST be followed as specified in se | triggered-check queues <bcp14>MUST</bcp14> be followed as specified | |||
ction 6.1 <xref | in <xref target="RFC8445" sectionFormat="of" section="6.1"/>, with | |||
target="RFC8445"/>, with the exception of that | the exception being that the foundation, frozen candidates, and | |||
the foundation, frozen candidates and default candidates are not used. | default candidates are not used. From the viewpoint of the ICE | |||
From | specification <xref target="RFC8445" format="default"/>, the | |||
viewpoint of the ICE specification <xref target="RFC8445"/>, the protoc | protocol specified in this document operates using a component ID of | |||
ol specified in | 1 on all candidates, and the foundation of all candidates is | |||
this document operates using Component ID of 1 on all | unique. This specification defines only "full ICE" mode, and the | |||
candidates, and the foundation of all candidates is | "lite ICE" is not supported. The reasoning behind the missing | |||
unique. This specification defines only "full ICE" mode, and | features is described in <xref target="sec_ice_diff" | |||
the "lite ICE" is not supported. The reasoning behind | format="default"/>.</t> | |||
the missing features is described in <xref | <t> The connectivity check messages <bcp14>MUST</bcp14> be paced by | |||
target="sec:ice_diff" />.</t> | the Ta value negotiated during the base exchange as described in | |||
<xref target="sec_check_pacing_neg" format="default"/>. If neither | ||||
<t> The connectivity check messages MUST be paced by the Ta value | one of the hosts announced a minimum pacing value, a value of 50 ms | |||
negotiated during the base exchange as described in <xref | <bcp14>MUST</bcp14> be used.</t> | |||
target="sec:check_pacing_neg"/>. If neither one of the hosts announced | <t>Both hosts <bcp14>MUST</bcp14> form a | |||
a minimum pacing value, a value of 50 ms MUST be used. </t> | ||||
<t>Both hosts MUST form a | ||||
priority ordered checklist and begin to check transactions every Ta | priority ordered checklist and begin to check transactions every Ta | |||
milliseconds as long as the checks are running and there are candidate | milliseconds as long as the checks are running and there are candidate | |||
pairs whose tests have not started. The retransmission timeout (RTO) | pairs whose tests have not started. The retransmission timeout (RTO) | |||
for the connectivity check UPDATE packets SHOULD be calculated as foll | for the connectivity check UPDATE packets <bcp14>SHOULD</bcp14> be | |||
ows: | calculated as follows:</t> | |||
<t indent="3"> | ||||
<list style="empty"> | RTO = MAX (1000 ms, Ta * (Num-Waiting + Num-In-Progress)) | |||
<t>RTO = MAX (1000ms, Ta * (Num-Waiting + Num-In-Progress))</t> | ||||
</list> | ||||
</t> | </t> | |||
<t> In the RTO formula, Ta is the value used for the connectivity | ||||
<t> In the RTO formula, Ta is the value used for the | check pacing, Num-Waiting is the number of pairs in the checklist in | |||
connectivity check pacing, Num-Waiting is the number of | the "Waiting" state, and Num-In-Progress is the number of pairs in | |||
pairs in the checklist in the "Waiting" state, and | the "In-Progress" state. This is identical to the formula in <xref | |||
Num-In-Progress is the number of pairs in the "In-Progress" | target="RFC8445" format="default"/> when there is only one | |||
state. This is identical to the formula in <xref | checklist. A smaller value than 1000 ms for the RTO <bcp14>MUST | |||
target="RFC8445"/> when there is only one | NOT</bcp14> be used.</t> | |||
checklist. A smaller value than 1000 ms for the RTO MUST NOT | <t> Each connectivity check request packet <bcp14>MUST</bcp14> contain | |||
be used.</t> | a | |||
CANDIDATE_PRIORITY parameter (see <xref target="sec_con-check" format= | ||||
<t> Each connectivity check request packet MUST contain a | "default"/>) with | |||
CANDIDATE_PRIORITY parameter (see <xref target="sec:con-check"/>) with | the priority value that would be assigned to a peer-reflexive candidat | |||
the priority value that would be assigned to a peer reflexive candidat | e | |||
e | ||||
if one was learned from the corresponding check. An UPDATE packet that acknowledges | if one was learned from the corresponding check. An UPDATE packet that acknowledges | |||
a connectivity check request MUST be sent from the same address that | a connectivity check request <bcp14>MUST</bcp14> be sent from the same address that | |||
received the check and delivered to the same address where the check w as received | received the check and delivered to the same address where the check w as received | |||
from. Each acknowledgment UPDATE packet MUST contain a MAPPED_ADDRESS | from. Each acknowledgment UPDATE packet <bcp14>MUST</bcp14> contain a MAPPED_ADDRESS | |||
parameter with the port, protocol, and IP address of the address where | parameter with the port, protocol, and IP address of the address where | |||
the connectivity check request was received from.</t> | the connectivity check request was received from.</t> | |||
<!-- XX FIXME: reference UDP-over-ESP --> | <t>Following the ICE guidelines <xref target="RFC8445" | |||
format="default"/>, it is <bcp14>RECOMMENDED</bcp14> to restrict the | ||||
<t>Following the ICE guidelines <xref | total number of connectivity checks to 100 for each host | |||
target="RFC8445"/>, it is RECOMMENDED to | association. This can be achieved by limiting the connectivity | |||
restrict the total number of connectivity checks to 100 for each | checks to the 100 candidate pairs with the highest priority.</t> | |||
host association. This can be achieved by limiting the | </section> | |||
connectivity checks to the 100 candidate pairs with the | ||||
highest priority.</t> | ||||
</section> <!-- Rules for Connectivity Checks --> | ||||
<section title="Rules for Concluding Connectivity Checks"> | ||||
<t>The controlling agent may find multiple working candidate | ||||
pairs. To conclude the connectivity checks, it SHOULD | ||||
nominate the pair with the highest priority. The controlling | ||||
agent MUST nominate a candidate pair essentially by | ||||
repeating a connectivity check using an UPDATE message that | ||||
contains a SEQ parameter (with new sequence number), a | ||||
ECHO_REQUEST_SIGNED parameter, the priority of the candidate | ||||
in a CANDIDATE_PRIORITY parameter and NOMINATE parameter to signify | ||||
conclusion of the connectivity checks. Since the nominated | ||||
address pair has already been tested for reachability, the | ||||
controlled host should be able to receive the message. Upon | ||||
reception, the controlled host SHOULD select the nominated | ||||
address pair. The response message MUST include a SEQ | ||||
parameter with a new sequence id, acknowledgment of the | ||||
sequence from the controlling host in an ACK parameter, a | ||||
new ECHO_REQUEST_SIGNED parameter, ECHO_RESPONSE_SIGNED parameter | ||||
corresponding to the ECHO_REQUEST_SIGNED parameter from the | ||||
controlling host and the NOMINATE parameter. After sending | ||||
this packet, the controlled host can create IPsec security | ||||
associations using the nominated address candidate for | ||||
delivering application payload to the controlling host. Since | ||||
the message from the controlled host included a new sequence | ||||
id and echo request for signature, the controlling host MUST | ||||
acknowledge this with a new UPDATE message that includes an | ||||
ACK and ECHO_RESPONSE_SIGNED parameters. After this final | ||||
concluding message, the controlling host also can create | ||||
IPsec security associations for delivering application payload | ||||
to the controlled host. | ||||
</t> | ||||
<t>It is possible that packets are delayed by the | ||||
network. Both hosts MUST continue to respond to any | ||||
connectivity checks despite an address pair having been nominated.</t> | ||||
<t> If all the connectivity checks have failed, the hosts MUST NOT sen | ||||
d ESP | ||||
traffic to each other but MAY continue communicating using HIP packets | ||||
and the locators used for the base exchange. Also, the hosts SHOULD | ||||
notify each other about the failure with a CONNECTIVITY_CHECKS_FAILED | ||||
NOTIFY packet (see <xref target="sec:notify-types"/>).</t> | ||||
</section> <!-- Rules for Concluding Connectivity Checks --> | ||||
</section> <!-- connectivity checks --> | ||||
<section anchor="sec:alternatives" title="NAT Traversal Optimizations"> | <section numbered="true" toc="default"> | |||
<name>Rules for Concluding Connectivity Checks</name> | ||||
<t>The controlling agent may find multiple working candidate | ||||
pairs. To conclude the connectivity checks, it <bcp14>SHOULD</bcp14> | ||||
nominate the pair with the highest priority. The controlling agent | ||||
<bcp14>MUST</bcp14> nominate a candidate pair essentially by | ||||
repeating a connectivity check using an UPDATE message that contains | ||||
a SEQ parameter (with a new sequence number), an ECHO_REQUEST_SIGNED | ||||
parameter, the priority of the candidate in a CANDIDATE_PRIORITY | ||||
parameter, and a NOMINATE parameter to signify conclusion of the | ||||
connectivity checks. Since the nominated address pair has already | ||||
been tested for reachability, the controlled host should be able to | ||||
receive the message. Upon reception, the controlled host | ||||
<bcp14>SHOULD</bcp14> select the nominated address pair. The | ||||
response message <bcp14>MUST</bcp14> include a SEQ parameter with a | ||||
new sequence identifier, acknowledgment of the sequence from the contr | ||||
olling | ||||
host in an ACK parameter, a new ECHO_REQUEST_SIGNED parameter, | ||||
an ECHO_RESPONSE_SIGNED parameter corresponding to the | ||||
ECHO_REQUEST_SIGNED parameter from the controlling host, and the | ||||
NOMINATE parameter. After sending this packet, the controlled host | ||||
can create IPsec security associations using the nominated address | ||||
candidate for delivering application payload to the controlling | ||||
host. Since the message from the controlled host included a new | ||||
sequence identifier echo request for the signature, the controlling ho | ||||
st | ||||
<bcp14>MUST</bcp14> acknowledge this with a new UPDATE message that | ||||
includes an ACK and ECHO_RESPONSE_SIGNED parameters. After this | ||||
final concluding message, the controlling host also can create IPsec | ||||
security associations for delivering application payload to the | ||||
controlled host.</t> | ||||
<t>It is possible that packets are delayed by the network. Both | ||||
hosts <bcp14>MUST</bcp14> continue to respond to any connectivity | ||||
checks despite an address pair having been nominated.</t> | ||||
<t> If all the connectivity checks have failed, the hosts | ||||
<bcp14>MUST NOT</bcp14> send ESP traffic to each other but | ||||
<bcp14>MAY</bcp14> continue communicating using HIP packets and the | ||||
locators used for the base exchange. Also, the hosts | ||||
<bcp14>SHOULD</bcp14> notify each other about the failure with a | ||||
CONNECTIVITY_CHECKS_FAILED NOTIFY packet (see <xref | ||||
target="sec_notify-types" format="default"/>).</t> | ||||
</section> | ||||
<section title="Minimal NAT Traversal Support" anchor="sec:minimal"> | </section> | |||
<section anchor="sec_alternatives" numbered="true" toc="default"> | ||||
<name>NAT Traversal Optimizations</name> | ||||
<section anchor="sec_minimal" numbered="true" toc="default"> | ||||
<name>Minimal NAT Traversal Support</name> | ||||
<t>If the Responder has a fixed and publicly reachable IPv4 | <t>If the Responder has a fixed and publicly reachable IPv4 | |||
address and does not employ a Control Relay Server, the explicit NAT | address and does not employ a Control Relay Server, the explicit NAT | |||
traversal mode negotiation MAY be omitted, and thus even the | traversal mode negotiation <bcp14>MAY</bcp14> be omitted; thus, even t he | |||
UDP-ENCAPSULATION mode does not have to be negotiated. In | UDP-ENCAPSULATION mode does not have to be negotiated. In | |||
such a scenario, the Initiator sends an I1 message over UDP | such a scenario, the Initiator sends an I1 message over UDP | |||
and the Responder responds with an R1 message over UDP without | and the Responder responds with an R1 message over UDP without | |||
including any NAT traversal mode parameter. The rest of the | including any NAT traversal mode parameter. The rest of the | |||
base exchange follows the procedures defined in <xref | base exchange follows the procedures defined in <xref | |||
target="RFC7401"/>, except that the control and data plane | target="RFC7401" format="default"/>, except that the control and | |||
use UDP encapsulation. Here, the use of UDP for NAT | data plane use UDP encapsulation. Here, the use of UDP for NAT | |||
traversal is agreed implicitly. This way of operation is | traversal is agreed upon implicitly. This way of operation is still | |||
still subject to NAT timeouts, and the hosts MUST employ NAT | subject to NAT timeouts, and the hosts <bcp14>MUST</bcp14> employ | |||
keepalives as defined in <xref | NAT keepalives as defined in <xref target="sec_nat-keepalives" | |||
target="sec:nat-keepalives"/>.</t> | format="default"/>.</t> | |||
<t>When UDP-ENCAPSULATION mode is chosen either explicitly | ||||
or implicitly, the connectivity checks as defined in this | ||||
document MUST NOT be used. When hosts lose connectivity, | ||||
they MUST instead utilize <xref target="RFC8046" /> or <xref | ||||
target="RFC8047" /> procedures, but with the difference being that | ||||
UDP-based tunneling MUST be employed for the entire lifetime of | ||||
the corresponding Host Association.</t> | ||||
<t>When UDP-ENCAPSULATION mode is chosen either explicitly or | ||||
implicitly, the connectivity checks as defined in this document | ||||
<bcp14>MUST NOT</bcp14> be used. When hosts lose connectivity, they | ||||
<bcp14>MUST</bcp14> instead utilize <xref target="RFC8046" | ||||
format="default"/> or <xref target="RFC8047" format="default"/> | ||||
procedures, but with the difference being that UDP-based tunneling | ||||
<bcp14>MUST</bcp14> be employed for the entire lifetime of the | ||||
corresponding HIP association.</t> | ||||
</section> | </section> | |||
<section anchor="sec:no_relay" | <section anchor="sec_no_relay" numbered="true" toc="default"> | |||
title="Base Exchange without Connectivity Checks"> | <name>Base Exchange without Connectivity Checks</name> | |||
<t>It is possible to run a base exchange without any connectivity | ||||
<t>It is possible to run a base exchange without any | checks as defined in Legacy ICE-HIP (<xref target="RFC5770" | |||
connectivity checks as defined in Legacy ICE-HIP section 4.8 <xref | sectionFormat="of" section="4.8"/>). The procedure is also applicable | |||
target="RFC5770" />. The procedure is applicable also in the | in the context of this specification, so it is repeated here for | |||
context of this specification, so it is repeated here for | ||||
completeness.</t> | completeness.</t> | |||
<t> In certain network environments, the connectivity checks can be | <t> In certain network environments, the connectivity checks can be | |||
omitted to reduce initial connection set-up latency because a base | omitted to reduce initial connection setup latency because a base | |||
exchange acts as an implicit connectivity test itself. For this to | exchange acts as an implicit connectivity test itself. For this to | |||
work, the Initiator MUST be able to reach the Responder by simply UDP | work, the Initiator <bcp14>MUST</bcp14> be able to reach the Responder by simply UDP | |||
encapsulating HIP and ESP packets sent to the Responder's address. | encapsulating HIP and ESP packets sent to the Responder's address. | |||
Detecting and configuring this particular scenario is prone to failure | Detecting and configuring this particular scenario is prone to failure | |||
unless carefully planned. </t> | unless carefully planned. </t> | |||
<t> In such a scenario, the Responder <bcp14>MAY</bcp14> include | ||||
<t> In such a scenario, the Responder MAY include UDP-ENCAPSULATION NA | UDP-ENCAPSULATION NAT traversal mode as one of the supported modes | |||
T | in the R1 packet. If the Responder has registered to a Control Relay | |||
traversal mode as one of the supported modes in the R1 packet. If the | Server in order to discover its address candidates, it | |||
Responder has registered to a Control Relay Server in order to discove | <bcp14>MUST</bcp14> also include a LOCATOR_SET parameter | |||
r its address candidates, it MUST also include a | encapsulated inside an ENCRYPTED parameter in an R1 message that | |||
LOCATOR_SET parameter encapsulated inside an ENCRYPTED parameter in R1 | contains a preferred address where the Responder is able to receive | |||
message that contains a preferred address where the | UDP-encapsulated ESP and HIP packets. This locator | |||
Responder is able to receive UDP-encapsulated ESP and HIP packets. Thi | <bcp14>MUST</bcp14> be of type "Transport address", its Traffic type | |||
s | <bcp14>MUST</bcp14> be "both", and it <bcp14>MUST</bcp14> have the | |||
locator MUST be of type "Transport address", its Traffic type MUST be | "Preferred bit" set (see <xref target="tbl_locator" | |||
"both", and it MUST have the "Preferred bit" set (see <xref | format="default"/>). If there is no such locator in R1, the | |||
target="tbl:locator"/>). If there is no such locator in R1, the Initia | Initiator <bcp14>MUST</bcp14> use the source address of the R1 as | |||
tor MUST use the source | the Responder's preferred address. </t> | |||
address of the R1 as the Responder's preferred address. </t> | <t> The Initiator <bcp14>MAY</bcp14> choose the UDP-ENCAPSULATION | |||
mode if the Responder listed it in the supported modes and the | ||||
<t> The Initiator MAY choose the UDP-ENCAPSULATION mode if the | Initiator does not wish to use the connectivity checks defined in | |||
Responder listed it in the supported modes and the Initiator does not | this document for searching for a more optimal path. In this case, | |||
wish to use the connectivity checks defined in this document for searc | the Initiator sends the I2 with UDP-ENCAPSULATION mode in the NAT | |||
hing for a more optimal path. In this case, | traversal mode parameter directly to the Responder's preferred | |||
the Initiator sends the I2 with UDP-ENCAPSULATION mode in the NAT | address (i.e., to the preferred locator in R1 or to the address | |||
traversal mode parameter directly to the Responder's preferred address | where R1 was received from if there was no preferred locator in | |||
(i.e., to the preferred locator in R1 or to the address where R1 was | R1). The Initiator <bcp14>MAY</bcp14> include locators in I2 but | |||
received from if there was no preferred locator in R1). The Initiator | they <bcp14>MUST NOT</bcp14> be taken as address candidates, since | |||
MAY include locators in I2 but they MUST NOT be taken as address | connectivity checks defined in this document will not be used for | |||
candidates, since connectivity checks defined in this document will no | connections with UDP-ENCAPSULATION NAT traversal mode. Instead, if | |||
t be used for connections with | R2 and I2 are received and processed successfully, a security | |||
UDP-ENCAPSULATION NAT traversal mode. Instead, if R2 and I2 are | association can be created and UDP-encapsulated ESP can be exchanged | |||
received and processed successfully, a security association can be | between the hosts after the base exchange completes according to the | |||
created and UDP-encapsulated ESP can be exchanged between the hosts | rules in <xref target="RFC7401" sectionFormat="of" section="4.4"/>. | |||
after the base exchange completes according to the rules in Section 4. | </t> | |||
4 in <xref target="RFC7401" />. | <t>The Control Relay Server can be used for discovering address | |||
<!-- However, the Responder SHOULD NOT | candidates but it is not intended to be used for relaying end-host | |||
send any ESP to the Initiator's address before it has received data | packets using the UDP-ENCAPSULATION NAT mode. Since an I2 packet | |||
from the Initiator, as specified in Sections 4.4.3. and 6.9 of <xref | with UDP-ENCAPSULATION NAT traversal mode selected <bcp14>MUST | |||
target="RFC7401"/> and in Sections 3.3.1 and 5.4 of <xref | NOT</bcp14> be sent via a Control Relay Server, the Responder | |||
target="RFC8046"/>. --> </t> | <bcp14>SHOULD</bcp14> reject such I2 packets and reply with a | |||
NO_VALID_NAT_TRAVERSAL_MODE_PARAMETER NOTIFY packet (see <xref | ||||
<t>The Control Relay Server can be used for discovering address candid | target="sec_notify-types" format="default"/>).</t> | |||
ates but it is not intended to be used | ||||
for relaying end-host packets using the UDP-ENCAPSULATION NAT mode. | ||||
Since an I2 packet with UDP-ENCAPSULATION NAT traversal mode | ||||
selected MUST NOT be sent via a Control Relay Server, the Responder SH | ||||
OULD reject such | ||||
I2 packets and reply with a NO_VALID_NAT_TRAVERSAL_MODE_PARAMETER NOTI | ||||
FY | ||||
packet (see <xref target="sec:notify-types"/>). </t> | ||||
<t> If there is no answer for the I2 packet sent directly to the | <t> If there is no answer for the I2 packet sent directly to the | |||
Responder's preferred address, the Initiator MAY send another I2 via | Responder's preferred address, the Initiator <bcp14>MAY</bcp14> send | |||
the Control Relay Server, but it MUST NOT choose UDP-ENCAPSULATION NAT | another I2 via the Control Relay Server, but it <bcp14>MUST | |||
traversal mode for that I2. </t> | NOT</bcp14> choose UDP-ENCAPSULATION NAT traversal mode for that | |||
I2.</t> | ||||
</section> <!-- Base Exchange without ICE Connectivity Checks --> | </section> | |||
<section anchor="sec:no_udp" | ||||
title="Initiating a Base Exchange both with and without UDP Enc | ||||
apsulation"> | ||||
<t>It is possible to run a base exchange in parallel both with | ||||
and without UDP encapsulation as defined in Legacy ICE-HIP section 4.9 | ||||
in <xref | ||||
target="RFC5770" />. The procedure is applicable also in the | ||||
context of this specification, so it is repeated here for | ||||
completeness.</t> | ||||
<t>The Initiator MAY also try to simultaneously perform a base exchang | ||||
e | ||||
with the Responder without UDP encapsulation. In such a case, the | ||||
Initiator sends two I1 packets, one without and one with UDP | ||||
encapsulation, to the Responder. The Initiator MAY wait for a while | ||||
before sending the other I1. How long to wait and in which order to | ||||
send the I1 packets can be decided based on local policy. For | ||||
retransmissions, the procedure is repeated.</t> | ||||
<t>The I1 packet without UDP encapsulation may arrive directly, withou | <section anchor="sec_no_udp" numbered="true" toc="default"> | |||
t | <name>Initiating a Base Exchange Both with and without UDP Encapsulati | |||
passing any a Control Relay Server, at the Responder. When this happen | on</name> | |||
s, the procedures in | <t>It is possible to run a base exchange in parallel both with and | |||
<xref target="RFC7401" /> are followed for the rest of the base | without UDP encapsulation as defined in Legacy ICE-HIP (<xref | |||
target="RFC5770" sectionFormat="of" section="4.9"/>). The procedure | ||||
is also applicable in the context of this specification, so it is | ||||
repeated here for completeness.</t> | ||||
<t>The Initiator <bcp14>MAY</bcp14> also try to simultaneously | ||||
perform a base exchange with the Responder without UDP | ||||
encapsulation. In such a case, the Initiator sends two I1 packets, | ||||
one without and one with UDP encapsulation, to the Responder. The | ||||
Initiator <bcp14>MAY</bcp14> wait for a while before sending the | ||||
other I1. How long to wait and in which order to send the I1 packets | ||||
can be decided based on local policy. For retransmissions, the | ||||
procedure is repeated.</t> | ||||
<t>The I1 packet without UDP encapsulation may arrive directly, | ||||
without passing a Control Relay Server, at the Responder. When | ||||
this happens, the procedures in <xref target="RFC7401" | ||||
format="default"/> are followed for the rest of the base | ||||
exchange. The Initiator may receive multiple R1 packets, with and | exchange. The Initiator may receive multiple R1 packets, with and | |||
without UDP encapsulation, from the Responder. However, after receivin | without UDP encapsulation, from the Responder. However, after | |||
g | receiving a valid R1 and answering it with an I2, further R1 packets | |||
a valid R1 and answering it with an I2, further R1 packets that are no | that are not retransmissions of the R1 message received first | |||
t | <bcp14>MUST</bcp14> be ignored. </t> | |||
retransmissions of the R1 message received first MUST be ignored. </t> | ||||
<t>The I1 packet without UDP encapsulation may also arrive at a | <t>The I1 packet without UDP encapsulation may also arrive at a | |||
HIP-capable middlebox. When the middlebox is a HIP rendezvous server | HIP-capable middlebox. When the middlebox is a HIP Rendezvous Server | |||
and the Responder has successfully registered with the rendezvous | and the Responder has successfully registered with the rendezvous | |||
service, the middlebox follows rendezvous procedures in <xref | service, the middlebox follows rendezvous procedures in <xref | |||
target="RFC8004" />. </t> | target="RFC8004" format="default"/>.</t> | |||
<t>If the Initiator receives a NAT traversal mode parameter in R1 | <t>If the Initiator receives a NAT traversal mode parameter in R1 | |||
without UDP encapsulation, the Initiator MAY ignore this parameter and | without UDP encapsulation, the Initiator <bcp14>MAY</bcp14> ignore | |||
send an I2 without UDP encapsulation and without any selected NAT | this parameter and send an I2 without UDP encapsulation and without | |||
traversal mode. When the Responder receives the I2 without UDP | any selected NAT traversal mode. When the Responder receives the I2 | |||
encapsulation and without NAT traversal mode, it will assume that no | without UDP encapsulation and without NAT traversal mode, it will | |||
NAT traversal mechanism is needed. The packet processing will be done | assume that no NAT traversal mechanism is needed. The packet | |||
as described in <xref target="RFC7401"/>. The Initiator MAY store the | processing will be done as described in <xref target="RFC7401" | |||
NAT traversal modes for future use, e.g., in case of a mobility or | format="default"/>. The Initiator <bcp14>MAY</bcp14> store the NAT | |||
multihoming event that causes NAT traversal to be used during the | traversal modes for future use, e.g., in case of a mobility or | |||
lifetime of the HIP association. </t> | multihoming event that causes NAT traversal to be used during the | |||
lifetime of the HIP association. </t> | ||||
</section> <!-- Base Exchange without UDP Encapsulation --> | </section> | |||
</section> <!-- NAT Traversal Alternatives --> | ||||
<section anchor="sec:control_no_relay" | ||||
title="Sending Control Packets after the Base Exchange"> | ||||
<t>The same considerations of sending control packets after | ||||
the base exchange described in legacy ICE-HIP section 5.10 in <xref | ||||
target="RFC5770"/> apply also here, so they are repeated here | ||||
for completeness.</t> | ||||
<t>After the base exchange, the two end-hosts MAY send HIP control packe | ||||
ts | ||||
directly to each other using the transport address pair established for | ||||
a data channel without sending the control packets through any Control R | ||||
elay | ||||
Servers . When a host does not receive acknowledgments, e.g., to an | ||||
UPDATE or CLOSE packet after a timeout based on local policies, a | ||||
host SHOULD resend the packet through the associated Data Relay Server o | ||||
f the peer (if the peer listed it in | ||||
its LOCATOR_SET parameter in the base exchange according the rules speci | ||||
fied in section 4.4.2 in <xref | ||||
target="RFC7401"/>. | ||||
</t> | ||||
<t> If Control Relay Client sends a packet through a Control Relay Serve | </section> | |||
r, the Control Relay Client | ||||
MUST always utilize the RELAY_TO parameter. The Control Relay Server SHO | ||||
ULD forward HIP control packets originating from a Control Relay Client to the | ||||
address denoted in the RELAY_TO parameter. In the other direction, the C | ||||
ontrol Relay Server SHOULD forward HIP control packets to the | ||||
Control Relay Clients, and MUST add a RELAY_FROM parameter to the contro | ||||
l packets it relays to the Control Relay Clients. | ||||
</t> | ||||
<section anchor="sec_control_no_relay" numbered="true" toc="default"> | ||||
<name>Sending Control Packets after the Base Exchange</name> | ||||
<t>The same considerations with regard to sending control packets after | ||||
the base | ||||
exchange as described in Legacy ICE-HIP (<xref target="RFC5770" | ||||
sectionFormat="of" section="5.10"/>) also apply here, so they are | ||||
repeated here for completeness.</t> | ||||
<t>After the base exchange, the two end hosts <bcp14>MAY</bcp14> send | ||||
HIP control packets directly to each other using the transport address | ||||
pair established for a data channel without sending the control | ||||
packets through any Control Relay Servers. When a host does not | ||||
receive acknowledgments, e.g., to an UPDATE or CLOSE packet after a | ||||
timeout based on local policies, a host <bcp14>SHOULD</bcp14> resend | ||||
the packet through the associated Data Relay Server of the peer (if | ||||
the peer listed it in its LOCATOR_SET parameter in the base exchange | ||||
according to the rules specified in <xref target="RFC7401" | ||||
sectionFormat="of" section="4.4.2"/>).</t> | ||||
<t> If a Control Relay Client sends a packet through a Control Relay | ||||
Server, the Control Relay Client <bcp14>MUST</bcp14> always utilize | ||||
the RELAY_TO parameter. The Control Relay Server <bcp14>SHOULD</bcp14> | ||||
forward HIP control packets originating from a Control Relay Client to | ||||
the address denoted in the RELAY_TO parameter. In the other direction, | ||||
the Control Relay Server <bcp14>SHOULD</bcp14> forward HIP control | ||||
packets to the Control Relay Clients and <bcp14>MUST</bcp14> add a | ||||
RELAY_FROM parameter to the control packets it relays to the Control | ||||
Relay Clients.</t> | ||||
<t> If the Control Relay Server is not willing or able to relay a HIP | <t> If the Control Relay Server is not willing or able to relay a HIP | |||
packet, it MAY notify the sender of the packet with | packet, it <bcp14>MAY</bcp14> notify the sender of the packet with a | |||
MESSAGE_NOT_RELAYED error notification (see <xref | MESSAGE_NOT_RELAYED error notification (see <xref | |||
target="sec:notify-types"/>). </t> | target="sec_notify-types" format="default"/>). </t> | |||
</section> | ||||
</section> <!-- Sending Control Packets after the Base Exchange --> | ||||
<section anchor="sec:mobility" title="Mobility Handover Procedure"> | ||||
<section anchor="sec_mobility" numbered="true" toc="default"> | ||||
<name>Mobility Handover Procedure</name> | ||||
<t>A host may move after base exchange and connectivity | <t>A host may move after base exchange and connectivity | |||
checks. Mobility extensions for HIP <xref | checks. Mobility extensions for HIP <xref target="RFC8046" | |||
target="RFC8046"/> define handover procedures | format="default"/> define handover procedures | |||
without NATs. In this section, we define how two hosts | without NATs. In this section, we define how two hosts | |||
interact with handover procedures in scenarios involving | interact with handover procedures in scenarios involving | |||
NATs. The specified extensions define only simple mobility | NATs. The specified extensions define only simple mobility | |||
using a pair of security associations, and multihoming | using a pair of security associations, and multihoming | |||
extensions are left to be defined in later specifications. | extensions are left to be defined in later specifications. | |||
The procedures in this section offer the same functionality as "ICE rest | The procedures in this section offer the same functionality as "ICE | |||
art" specified in <xref | restart" specified in <xref target="RFC8445" format="default"/>. The | |||
target="RFC8445"/>. The | ||||
example described in this section shows only a Control Relay Server | example described in this section shows only a Control Relay Server | |||
for the peer host for the sake of simplicity, but the | for the peer host for the sake of simplicity, but the | |||
mobile host may also have a Control Relay Server.</t> | mobile host may also have a Control Relay Server.</t> | |||
<t>The assumption here is that the two hosts have successfully negotiate d | <t>The assumption here is that the two hosts have successfully negotiate d | |||
and chosen the ICE-HIP-UDP mode during the base exchange as | and chosen the ICE-HIP-UDP mode during the base exchange as | |||
defined in <xref | defined in <xref target="sec_nat_traversal_mode" | |||
target="sec:nat_traversal_mode"/>. The Initiator of the base | format="default"/>. The Initiator of the base | |||
exchange MUST store information that it was the controlling | exchange <bcp14>MUST</bcp14> store information that it was the controlli | |||
host during the base exchange. Similarly, the Responder MUST | ng | |||
host during the base exchange. Similarly, the Responder <bcp14>MUST</bcp | ||||
14> | ||||
store information that it was the controlled host during the | store information that it was the controlled host during the | |||
base exchange.</t> | base exchange.</t> | |||
<t>Prior to starting the handover procedures with all peer | <t>Prior to starting the handover procedures with all peer hosts, the | |||
hosts, the mobile host SHOULD first send its locators in UPDATE messages | mobile host <bcp14>SHOULD</bcp14> first send its locators in UPDATE | |||
to | messages to its Control and Data Relay Servers if it has registered to | |||
its Control and Data Relay Servers if it has registered to such. It | such. It <bcp14>SHOULD</bcp14> wait for all of them to respond for a | |||
SHOULD wait for all of them to respond for a configurable time, by defaul | configurable time, by default two minutes, and then continue with the | |||
t two minutes, and | handover procedure without information from the Relay Server that did | |||
then continue with the handover procedure without information | not respond. As defined in <xref target="sec_registration" | |||
from the Relay Server that did not respond. As defined in | format="default"/>, a response message from a Control Relay Server | |||
<xref target="sec:registration" />, a response message from a | includes a REG_FROM parameter that describes the server-reflexive | |||
Control Relay Server includes a REG_FROM parameter that describes the ser | candidate of the mobile host to be used in the candidate exchange | |||
ver | during the handover. Similarly, an UPDATE to a Data Relay Server is | |||
reflexive candidate of the mobile host to be used in the | necessary to make sure the Data Relay Server can forward data to the | |||
candidate exchange during the handover. Similarly, an UPDATE | correct IP address after a handover.</t> | |||
to a Data Relay Server is necessary to make sure the Data Relay Server ca | ||||
n | ||||
forward data to the correct IP address after a handoff.</t> | ||||
<t>The mobility extensions for NAT traversal are illustrated | <t>The mobility extensions for NAT traversal are illustrated | |||
in <xref target="fig:update"/>. The mobile host is the | in <xref target="fig_update" format="default"/>. The mobile host is the | |||
host that has changed its locators, and the peer host is the | host that has changed its locators, and the peer host is the | |||
host it has a host association with. The mobile host may have | host it has a host association with. The mobile host may have | |||
multiple peers and it repeats the process with all of its | multiple peers, and it repeats the process with all of its | |||
peers. In the figure, the Control Relay Server belongs to the peer host, | peers. In the figure, the Control Relay Server belongs to the peer host, | |||
i.e., the peer host is a Control Relay Client for the Control Relay Serv er. | i.e., the peer host is a Control Relay Client for the Control Relay Serv er. | |||
Note that the figure corresponds to figure 3 in <xref | Note that the figure corresponds to figure 3 in <xref target="RFC8046" | |||
target="RFC8046"/>, but the difference is that the main | format="default"/>, but the difference is that the main | |||
UPDATE procedure is carried over the relay and the | UPDATE procedure is carried over the relay and the | |||
connectivity is tested separately. Next, we describe the | connectivity is tested separately. Next, we describe the | |||
procedure in the figure in detail.</t> | procedure of that figure in detail.</t> | |||
<figure anchor="fig_update"> | ||||
<?rfc needLines="21" ?> | <name>HIP UPDATE Procedure</name> | |||
<figure anchor="fig:update" title="HIP UPDATE procedure"> | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
<artwork align="center"><![CDATA[ | ||||
Mobile Host Control Relay Server Peer Host | Mobile Host Control Relay Server Peer Host | |||
| 1. UDP(UPDATE(ESP_INFO, | | | | 1. UDP(UPDATE(ESP_INFO, | | | |||
| ENC(LOC_SET), SEQ)) | | | | ENC(LOC_SET), SEQ)) | | | |||
+--------------------------------->| 2. UDP(UPDATE(ESP_INFO, | | +--------------------------------->| 2. UDP(UPDATE(ESP_INFO, | | |||
| | ENC(LOC_SET), SEQ, | | | | ENC(LOC_SET), SEQ, | | |||
| | RELAY_FROM)) | | | | RELAY_FROM)) | | |||
| +------------------------------->| | | +------------------------------->| | |||
| | | | | | | | |||
| | 3. UDP(UPDATE(ESP_INFO, SEQ, | | | | 3. UDP(UPDATE(ESP_INFO, SEQ, | | |||
| | ACK, ECHO_REQ_SIGN, | | | | ACK, ECHO_REQ_SIGN, | | |||
skipping to change at line 1661 ¶ | skipping to change at line 1519 ¶ | |||
| | ECHO_RESP_SIGNED, | | | | ECHO_RESP_SIGNED, | | |||
| | RELAY_FROM)) | | | | RELAY_FROM)) | | |||
| +------------------------------->| | | +------------------------------->| | |||
| | | | | | | | |||
| 7. connectivity checks over UDP | | | 7. connectivity checks over UDP | | |||
+<----------------------------------------------------------------->+ | +<----------------------------------------------------------------->+ | |||
| | | | | | | | |||
| 8. ESP data over UDP | | | 8. ESP data over UDP | | |||
+<----------------------------------------------------------------->+ | +<----------------------------------------------------------------->+ | |||
| | | | | | | | |||
]]> | ]]></artwork> | |||
</artwork> | ||||
</figure> | </figure> | |||
<t>In step 1, the mobile host has changed location and sends a | <t>In step 1, the mobile host has changed location and sends a | |||
location update to its peer through the Control Relay Server of the | location update to its peer through the Control Relay Server of the | |||
peer. It sends an UPDATE packet with source HIT belonging to | peer. It sends an UPDATE packet with the source HIT belonging to | |||
itself and destination HIT belonging to the peer host. In the | itself and destination HIT belonging to the peer host. In the packet, | |||
packet, the source IP address belongs to the mobile host and | the source IP address belongs to the mobile host and the destination | |||
the destination to the Control Relay Server. The packet contains an | to the Control Relay Server. The packet contains an ESP_INFO parameter | |||
ESP_INFO parameter, where, in this case, the OLD SPI and NEW | where, in this case, the OLD SPI and NEW SPI parameters both contain | |||
SPI parameters both contain the pre-existing incoming SPI. The | the pre-existing incoming SPI. The packet also contains the locators | |||
packet also contains the locators of the mobile host in a | of the mobile host in a LOCATOR_SET parameter, encapsulated inside an | |||
LOCATOR_SET parameter, encapsulated inside an ENCRYPTED parameter | ENCRYPTED parameter (see Sections <xref target="RFC7401" | |||
(see sections 5.2.18 and 6.5 in <xref target="RFC7401" /> for details on | section="5.2.18" sectionFormat="bare"/> and <xref target="RFC7401" | |||
the ENCRYPTED parameter). | section="6.5" sectionFormat="bare"/> in <xref target="RFC7401" | |||
The packet contains also a SEQ number to be acknowledged by the peer. As | format="default"/> for details on the ENCRYPTED parameter). The packet | |||
specified in <xref | also contains a SEQ number to be acknowledged by the peer. As | |||
target="RFC8046"/>, the packet may also include a HOST_ID (for | specified in <xref target="RFC8046" format="default"/>, the packet may | |||
middlebox inspection) and DIFFIE_HELLMAN parameter for rekeying.</t> | also include a HOST_ID (for middlebox inspection) and DIFFIE_HELLMAN | |||
parameter for rekeying.</t> | ||||
<t>In step 2, the Control Relay Server receives the UPDATE packet and fo rwards it | <t>In step 2, the Control Relay Server receives the UPDATE packet and fo rwards it | |||
to the peer host (i.e. Control Relay Client). The Control Relay Server | to the peer host (i.e., Control Relay Client). The Control Relay Server | |||
rewrites the destination IP address and appends a RELAY_FROM | rewrites the destination IP address and appends a RELAY_FROM | |||
parameter to the message.</t> | parameter to the message.</t> | |||
<t>In step 3, the peer host receives the UPDATE packet, | <t>In step 3, the peer host receives the UPDATE packet, | |||
processes it and responds with another UPDATE message. The | processes it, and responds with another UPDATE message. The | |||
message is destined to the HIT of mobile host and to the IP | message is destined to the HIT of the mobile host and to the IP | |||
address of the Control Relay Server. The message includes an ESP_INFO | address of the Control Relay Server. The message includes an ESP_INFO | |||
parameter where, in this case, the OLD SPI and NEW SPI | parameter where, in this case, the OLD SPI and NEW SPI | |||
parameters both contain the pre-existing incoming SPI. The | parameters both contain the pre-existing incoming SPI. The | |||
peer includes a new SEQ and ECHO_REQUEST_SIGNED parameters to be | peer includes a new SEQ and ECHO_REQUEST_SIGNED parameter to be | |||
acknowledged by the mobile host. The message acknowledges the | acknowledged by the mobile host. The message acknowledges the | |||
SEQ parameter of the earlier message with an ACK parameter. | SEQ parameter of the earlier message with an ACK parameter. | |||
The RELAY_TO parameter specifies the address of the mobile host where th e | The RELAY_TO parameter specifies the address of the mobile host where th e | |||
Control Relay Server should forward the message. | Control Relay Server should forward the message. | |||
</t> | </t> | |||
<t>In step 4, the Control Relay Server receives the message, rewrites th e | <t>In step 4, the Control Relay Server receives the message, rewrites th e | |||
destination IP address and UDP port according to the RELAY_TO parameter, and | destination IP address and UDP port according to the RELAY_TO parameter, and | |||
then forwards the modified message to the mobile host. | then forwards the modified message to the mobile host. | |||
</t> | </t> | |||
<t>In step 5, the mobile host receives the UPDATE packet and processes | ||||
<t>In step 5, the mobile host receives the UPDATE packet and processes i | it. The mobile host concludes the handover procedure by acknowledging | |||
t. The mobile host concludes the handover procedure | the received SEQ parameter with an ACK parameter and the | |||
by acknowledging the received SEQ parameter with an | ECHO_REQUEST_SIGNED parameter with an ECHO_RESPONSE_SIGNED | |||
ACK parameter and the ECHO_REQUEST_SIGNED parameter with | parameter. The mobile host sends the packet to the HIT of the peer and | |||
ECHO_RESPONSE_SIGNED parameter. The mobile host delivers the | to the address of the HIP relay. The mobile host can start | |||
packet to the HIT of the peer and to the address of the HIP | connectivity checks after this packet. </t> | |||
relay. The mobile host can start connectivity checks after this packet. | <t>In step 6, the HIP relay receives the UPDATE packet and | |||
</t> | forwards it to the peer host (i.e., Relay Client). The HIP | |||
<t>In step 6, HIP relay receives the UPDATE packet and | ||||
forwards it to the peer host (i.e. Relay Client). The HIP | ||||
relay rewrites the destination IP address and port, and then appends a | relay rewrites the destination IP address and port, and then appends a | |||
RELAY_FROM parameter to the message. When the peer host | RELAY_FROM parameter to the message. When the peer host | |||
receives this concluding UPDATE packet, it can initiate the | receives this concluding UPDATE packet, it can initiate the | |||
connectivity checks. | connectivity checks. | |||
</t> | </t> | |||
<t>In step 7, the two hosts test for connectivity across NATs | <t>In step 7, the two hosts test for connectivity across NATs | |||
according to procedures described in <xref | according to procedures described in <xref target="sec_conn_checks" | |||
target="sec:conn_checks"/>. The original Initiator of the | format="default"/>. The original Initiator of the | |||
communications is the controlling and the original Responder is | communications is the controlling host and the original Responder is | |||
the controlled host.</t> | the controlled host.</t> | |||
<t>In step 8, the connectivity checks are successfully | <t>In step 8, the connectivity checks are successfully | |||
completed and the controlling host has nominated one address | completed and the controlling host has nominated one address | |||
pair to be used. The hosts set up security associations to | pair to be used. The hosts set up security associations to | |||
deliver the application payload.</t> | deliver the application payload.</t> | |||
<t>It is worth noting that the Control and Data Relay Client | <t>It is worth noting that the Control and Data Relay Client | |||
do not have to re-register for the related services after a | do not have to reregister for the related services after a | |||
handoff. However, if a Data Relay Client has registered a | handover. However, if a Data Relay Client has registered a | |||
relayed address candidate from a Data Relay Server, the Data | relayed address candidate from a Data Relay Server, the Data | |||
Relay Client MUST reactivate the address before the | Relay Client <bcp14>MUST</bcp14> reactivate the address before the | |||
connectivity checks by sending an UPDATE message containing | connectivity checks by sending an UPDATE message containing | |||
PEER_PERMISSION parameter as described in <xref | the PEER_PERMISSION parameter as described in <xref | |||
target="sec:forwarding" />. Otherwise, the Data Relay Server | target="sec_forwarding" format="default"/>. Otherwise, the Data Relay | |||
Server | ||||
drops ESP packets sent to the relayed address.</t> | drops ESP packets sent to the relayed address.</t> | |||
<t>In the so-called "double jump" or simultaneous mobility | ||||
<t>In so called "double jump" or simultaneous mobility | scenario, both peers change their location simultaneously. In | |||
scenario both peers change their location simultaneously. In | ||||
such a case, both peers trigger the procedure described | such a case, both peers trigger the procedure described | |||
earlier in this section at the same time. In other words, both | earlier in this section at the same time. In other words, both | |||
of the communicating hosts send an UPDATE packet carrying | of the communicating hosts send an UPDATE packet carrying | |||
locators at the same time or with some delay. When the | locators at the same time or with some delay. When the | |||
locators are exchanged almost simultaneously (reliably via | locators are exchanged almost simultaneously (reliably via | |||
Control Relay Servers), the two hosts can continue with | Control Relay Servers), the two hosts can continue with | |||
connectivity checks after both have completed separately the | connectivity checks after both have completed separately the | |||
steps in <xref target="fig:update" />. The problematic case | steps in <xref target="fig_update" format="default"/>. The problematic ca | |||
occurs when one of the hosts (referred here as host "M") | se | |||
occurs when one of the hosts (referred to here as host "M") | ||||
moves later during the connectivity checks. In such a case, | moves later during the connectivity checks. In such a case, | |||
host M sends a locator to the peer which is in the middle of | host M sends a locator to the peer, which is in the middle of | |||
connectivity checks. Upon receiving the UPDATE message, the | connectivity checks. Upon receiving the UPDATE message, the | |||
peer responds with an UPDATE with ECHO_REQ_SIGN as described | peer responds with an UPDATE with ECHO_REQ_SIGN as described | |||
in step 3 in <xref target="fig:update" />. Upon receiving the | in step 3 in <xref target="fig_update" format="default"/>. Upon receiving the | |||
valid response from host M as described in step 6, the peer | valid response from host M as described in step 6, the peer | |||
host MUST restart the connectivity checks with host M. This | host <bcp14>MUST</bcp14> restart the connectivity checks with host M. Thi s | |||
way, both hosts start the connectivity checks roughly in a | way, both hosts start the connectivity checks roughly in a | |||
synchronized way. It is also important that peer host does not | synchronized way. It is also important that the peer host does not | |||
restart the connectivity checks until the step 6 is | restart the connectivity checks until step 6 is | |||
successfully completed because the UPDATE message | successfully completed, because the UPDATE message | |||
carrying locators in step 1 could be replayed by an attacker.</t> | carrying locators in step 1 could be replayed by an attacker.</t> | |||
</section> | </section> | |||
<section anchor="sec_nat-keepalives" numbered="true" toc="default"> | ||||
<section title="NAT Keepalives" anchor="sec:nat-keepalives"> | <name>NAT Keepalives</name> | |||
<t>To prevent NAT states from expiring, communicating hosts | <t>To prevent NAT states from expiring, communicating hosts | |||
MUST send periodic keepalives to other hosts with which they | <bcp14>MUST</bcp14> send periodic keepalives to other hosts with which | |||
have established a Host Association every 15 seconds (the so | they have established a HIP association every 15 seconds (the | |||
called Tr value in ICE). Other values MAY be used, | so-called Tr value in ICE). Other values <bcp14>MAY</bcp14> be used, | |||
but a Tr value smaller than 15 seconds MUST NOT be used. | but a Tr value smaller than 15 seconds <bcp14>MUST NOT</bcp14> be | |||
Both a Control/Data Relay Client and Control/Data Relay | used. Both a Control/Data Relay Client and Control/Data Relay Server, | |||
Server, as well as two peers employing UDP-ENCAPSULATION or | as well as two peers employing UDP-ENCAPSULATION or ICE-HIP-UDP mode, | |||
ICE-HIP-UDP mode, SHOULD send HIP NOTIFY packets unless they | <bcp14>SHOULD</bcp14> send HIP NOTIFY packets unless they have | |||
have exchanged some other traffic over the used UDP ports. | exchanged some other traffic over the used UDP ports. However, the | |||
However, the Data Relay Client and Data Relay Server MUST employ only HIP | Data Relay Client and Data Relay Server <bcp14>MUST</bcp14> employ | |||
NOTIFY packets | only HIP NOTIFY packets in order to keep the server-reflexive | |||
in order to keep the server reflexive candidates alive. | candidates alive. The keepalive message encoding format is defined in | |||
The keepalive message encoding format is defined in <xref | <xref target="sec_keepalive" format="default"/>. | |||
target="sec:keepalive" />. | ||||
<!-- only NOTIFY works for the reflexive candidates because this address | ||||
is not really a part of the Host Association of the Data Relay Server) --> | ||||
<!-- Likewise, if a host has not sent any data to another | If the base exchange or mobility handover procedure occurs during an | |||
host it has established a host association in the ICE-HIP_UDP | extremely slow path, a host (with a HIP association with the peer) | |||
mode within 15 seconds, it MUST send either a HIP NOTIFY packet or, alte | <bcp14>MAY</bcp14> also | |||
rnatively, an ICMPv6 | ||||
echo request inside the related ESP tunnel. Control Relay Server | ||||
servers MAY refrain from sending keepalives if it's known that | ||||
they are not behind a middlebox that requires keepalives. --> | ||||
If the base exchange or mobility handover procedure occurs during an ext | ||||
remely slow path, a host (with a Host Association with the peer) MAY also | ||||
send HIP NOTIFY packets every 15 seconds to keep the path active with th e recipient. | send HIP NOTIFY packets every 15 seconds to keep the path active with th e recipient. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="sec_close" numbered="true" toc="default"> | ||||
<section anchor="sec:close" title="Closing Procedure"> | <name>Closing Procedure</name> | |||
<t>The two-way procedure for closing a HIP association and the related | <t>The two-way procedure for closing a HIP association and the related | |||
security associations is defined in <xref | security associations is defined in <xref target="RFC7401" | |||
target="RFC7401"/>. One host initiates the procedure by | format="default"/>. One host initiates the procedure by sending a | |||
sending a CLOSE message and the recipient confirms it with | CLOSE message and the recipient confirms it with CLOSE_ACK. All | |||
CLOSE_ACK. All packets are protected using HMACs and | packets are protected using HMACs and signatures, and the CLOSE | |||
signatures, and the CLOSE messages includes a | messages include an ECHO_REQUEST_SIGNED parameter to protect against | |||
ECHO_REQUEST_SIGNED parameter to protect against replay attacks.</t> | replay attacks.</t> | |||
<t>The same procedure for closing HIP associations also applies here, | ||||
<t>The same procedure for closing HIP associations applies | but the messaging occurs using the UDP-encapsulated tunnel that the | |||
also here, but the messaging occurs using the UDP encapsulated | two hosts employ. A host sending the CLOSE message | |||
tunnel that the two hosts employ. A host sending the CLOSE | <bcp14>SHOULD</bcp14> first send the message over a direct link. After | |||
message SHOULD first send the message over a direct | a number of retransmissions, it <bcp14>MUST</bcp14> send over a | |||
link. After a number of retransmissions, it MUST send over a | Control Relay Server of the recipient if one exists. The host | |||
Control Relay Server of the recipient if one exists. The host receiving | receiving the CLOSE message directly without a Control Relay Server | |||
the CLOSE message directly without a Control Relay Server SHOULD respond | <bcp14>SHOULD</bcp14> respond directly. If the CLOSE message came via a | |||
directly. If CLOSE message came via a Control Relay Server, the host SHO | Control Relay Server, the host <bcp14>SHOULD</bcp14> respond using the | |||
ULD | same Control Relay Server.</t> | |||
respond using the same Control Relay Server.</t> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Relaying Considerations"> | <name>Relaying Considerations</name> | |||
<section anchor="sec_forwarding" numbered="true" toc="default"> | ||||
<section anchor="sec:forwarding" title="Forwarding Rules and Permissions | <name>Forwarding Rules and Permissions</name> | |||
"> | ||||
<t> The Data Relay Server uses a similar permission model as a | <t> The Data Relay Server uses a similar permission model as a | |||
TURN server: before the Data Relay Server forwards any ESP data | TURN server: before the Data Relay Server forwards any ESP data | |||
packets from a peer to a Data Relay Client (or the other direction), | packets from a peer to a Data Relay Client (or the other direction), | |||
the client MUST set a permission for the peer's address. The | the client <bcp14>MUST</bcp14> set a permission for the peer's address . The | |||
permissions also install a forwarding rule for each direction, similar to | permissions also install a forwarding rule for each direction, similar to | |||
TURN's channels, based on the Security Parameter Index (SPI) | TURN's channels, based on the Security Parameter Index (SPI) | |||
values in the ESP packets. | values in the ESP packets.</t> | |||
</t> | ||||
<t>Permissions are not required for HIP control packets. | <t>Permissions are not required for HIP control packets. | |||
However, if a relayed address (as conveyed in the RELAYED_ADDRESS para | However, if a relayed address (as conveyed in the RELAYED_ADDRESS | |||
meter from the Data Relay Server) is selected to be used for | parameter from the Data Relay Server) is selected to be used for | |||
data, the Control Relay Client MUST send an UPDATE message to the | data, the Control Relay Client <bcp14>MUST</bcp14> send an UPDATE mess | |||
age to the | ||||
Data Relay Server containing a PEER_PERMISSION parameter (see <xref | Data Relay Server containing a PEER_PERMISSION parameter (see <xref | |||
target="sec:peer_permission"/>) with the following information: the UD | target="sec_peer_permission" format="default"/>) with the following | |||
P port and address for the server reflexive address, the UDP port and | information: the UDP port and address for the server-reflexive | |||
address, the UDP port and | ||||
address of the peer, and the inbound and outbound SPIs used for ESP. | address of the peer, and the inbound and outbound SPIs used for ESP. | |||
The packet MUST be sent to the same UDP tunnel | The packet <bcp14>MUST</bcp14> be sent to the same UDP tunnel | |||
the Client employed in the base exchange to contact the Server (i.e., | the Client employed in the base exchange to contact the Server | |||
not to the port occupied by the server reflexive candidate). | (i.e., not to the port occupied by the server-reflexive candidate). | |||
To avoid packet | To avoid packet | |||
dropping of ESP packets, the Control Relay Client SHOULD send the | dropping of ESP packets, the Control Relay Client <bcp14>SHOULD</bcp14 > send the | |||
PEER_PERMISSION parameter before connectivity checks both in | PEER_PERMISSION parameter before connectivity checks both in | |||
the case of base exchange and a mobility handover. It is | the case of base exchange and a mobility handover. It is | |||
worth noting that the UPDATE message includes a SEQ | worth noting that the UPDATE message includes a SEQ | |||
parameter (as specified in <xref target="RFC7401"/>) that | parameter (as specified in <xref target="RFC7401" format="default"/>) that | |||
the Data Relay Server must acknowledge, so that the Control Relay Clie nt | the Data Relay Server must acknowledge, so that the Control Relay Clie nt | |||
can resend the message with PEER_PERMISSION parameter if it | can resend the message with the PEER_PERMISSION parameter if it | |||
gets lost.</t> | gets lost.</t> | |||
<!-- should the message with PEER_PERMISSION include ECHO_SIGNED? NO (W | ||||
OULD ACTUALLY REQUIRE 3-WAY MESSAGING) --> | ||||
<!-- should the ESP data relay really do DPI or just use ports? Ari: r | ||||
elay can run out of ports. Miika: new SPI collision mechanism --> | ||||
<t> When a Data Relay Server receives an UPDATE with a | <t> When a Data Relay Server receives an UPDATE with a | |||
PEER_PERMISSION parameter, it MUST check if the sender of the | PEER_PERMISSION parameter, it <bcp14>MUST</bcp14> check if the | |||
UPDATE is registered for data relaying service, and drop the | sender of the UPDATE is registered for data-relaying service, and | |||
UPDATE if the host was not registered. If the host was | drop the UPDATE if the host was not registered. If the host was | |||
registered, the Data Relay Server checks if there is a permission with | registered, the Data Relay Server checks if there is a permission | |||
matching information (protocol, addresses, ports and SPI | with matching information (protocol, addresses, ports, and SPI | |||
values). If there is no such permission, a new permission MUST | values). If there is no such permission, a new permission | |||
be created and its lifetime MUST be set to 5 minutes. If an | <bcp14>MUST</bcp14> be created and its lifetime <bcp14>MUST</bcp14> | |||
identical permission already existed, it MUST be refreshed by | be set to 5 minutes. If an identical permission already existed, it | |||
setting the lifetime to 5 minutes. A Data Relay Client SHOULD | <bcp14>MUST</bcp14> be refreshed by setting the lifetime to 5 | |||
refresh permissions 1 minute before the expiration when the | minutes. A Data Relay Client <bcp14>SHOULD</bcp14> refresh | |||
permission is still needed. </t> | permissions 1 minute before the expiration when the permission is | |||
still needed. </t> | ||||
<t>When a Data Relay Server receives an UPDATE from a registered client | <t>When a Data Relay Server receives an UPDATE from a registered | |||
but without a | client but without a PEER_PERMISSION parameter and with a new | |||
PEER_PERMISSION parameter and with a new locator set, the | locator set, the Data Relay Server can assume that the mobile host | |||
Data Relay Server can assume that the mobile host has changed its | has changed its location and is thus not reachable in its previous | |||
location and, thus, is not reachable in its previous | location. In such an event, the Data Relay Server | |||
location. In such an event, the Data Relay Server SHOULD deactivate | <bcp14>SHOULD</bcp14> deactivate the permission and stop relaying | |||
the permission and stop relaying data plane traffic to the client.</t> | data plane traffic to the client.</t> | |||
<t>The relayed address <bcp14>MUST</bcp14> be activated with the | ||||
<t>The relayed address MUST be activated with the | PEER_PERMISSION parameter both after a base exchange and after a | |||
PEER_PERMISSION parameter both after a base exchange and | handover procedure with another ICE-HIP-UDP-capable host. Unless | |||
after a handover procedure with another ICE-HIP-UDP capable | activated, the Data Relay Server <bcp14>MUST</bcp14> drop all ESP | |||
host. Unless activated, the Data Relay Server MUST drop all ESP | packets. It is worth noting that a Data Relay Client does not have | |||
packets. It is worth noting that a Data Relay Client does not | to renew its registration upon a change of location UPDATE, but only | |||
have to renew its registration upon a change of location | when the lifetime of the registration is close to end.</t> | |||
UPDATE, but only when the lifetime of the registration is close to end | </section> | |||
.</t> | ||||
</section> <!-- Forwarding Rules and Permissions --> | ||||
<section title="HIP Data Relay and Relaying of Control Packets"> | ||||
<t>When a Data Relay Server accepts to relay UDP encapsulated | ||||
ESP between a Data Relay Client and its peer, the Data Relay Server op | ||||
ens a UDP port (relayed | ||||
address) for this purpose as described in <xref | ||||
target="sec:registration"/>. This port can be used for delivering also | ||||
control packets because | ||||
connectivity checks also cover the path through the Data Relay Server. | ||||
If the Data Relay Server receives a UDP encapsulated HIP control | ||||
packet on that port, it MUST forward the packet to the | ||||
Data Relay Client and add a RELAY_FROM parameter to the packet | ||||
as if the Data Relay Server were acting as a Control Relay Server. | ||||
When the Data Relay Client replies to a control | ||||
packet with a RELAY_FROM parameter via its Data Relay Server, the | ||||
Data Relay Client MUST add a RELAY_TO parameter containing the | ||||
peer's address and use the address of its Data Relay Server as the | ||||
destination address. Further, the Data Relay Server MUST send this | ||||
packet to the peer's address from the relayed address.</t> | ||||
<section numbered="true" toc="default"> | ||||
<name>HIP Data Relay and Relaying of Control Packets</name> | ||||
<t>When a Data Relay Server accepts to relay UDP-encapsulated ESP | ||||
between a Data Relay Client and its peer, the Data Relay Server | ||||
opens a UDP port (relayed address) for this purpose as described in | ||||
<xref target="sec_registration" format="default"/>. This port can be | ||||
used for also delivering control packets because connectivity checks | ||||
also cover the path through the Data Relay Server. If the Data Relay | ||||
Server receives a UDP-encapsulated HIP control packet on that port, | ||||
it <bcp14>MUST</bcp14> forward the packet to the Data Relay Client | ||||
and add a RELAY_FROM parameter to the packet as if the Data Relay | ||||
Server were acting as a Control Relay Server. When the Data Relay | ||||
Client replies to a control packet with a RELAY_FROM parameter via | ||||
its Data Relay Server, the Data Relay Client <bcp14>MUST</bcp14> add | ||||
a RELAY_TO parameter containing the peer's address and use the | ||||
address of its Data Relay Server as the destination | ||||
address. Further, the Data Relay Server <bcp14>MUST</bcp14> send | ||||
this packet to the peer's address from the relayed address.</t> | ||||
<t> If the Data Relay Server receives a UDP packet that is not a | <t> If the Data Relay Server receives a UDP packet that is not a | |||
HIP control packet to the relayed address, it MUST check if | HIP control packet to the relayed address, it <bcp14>MUST</bcp14> chec k if | |||
it has a permission set for the peer the packet is arriving | it has a permission set for the peer the packet is arriving | |||
from (i.e., the sender's address and SPI value matches to an | from (i.e., the sender's address and SPI value matches to an | |||
installed permission). If permissions are set, the Data Relay Server | installed permission). If permissions are set, the Data Relay Server | |||
MUST forward the packet to the Data Relay Client that | <bcp14>MUST</bcp14> forward the packet to the Data Relay Client that | |||
created the permission. The Data Relay Server MUST also implement | created the permission. The Data Relay Server <bcp14>MUST</bcp14> also | |||
the similar checks for the reverse direction (i.e. ESP packets | implement | |||
from the Data Relay Client to the peer). Packets without a permission | the similar checks for the reverse direction (i.e., ESP packets | |||
MUST be dropped | from the Data Relay Client to the peer). Packets without a | |||
silently.</t> | permission <bcp14>MUST</bcp14> be dropped silently.</t> | |||
</section> | ||||
</section> <!-- HIP Data Relay and Relaying of Control Packets --> | ||||
<section title="Handling Conflicting SPI Values" anchor="sec:conflicting | ||||
"> | ||||
<t>From the viewpoint of a host, its remote peers can have | ||||
overlapping inbound SPI numbers because the IPsec uses also | ||||
the destination IP address to index the remote peer | ||||
host. However, a Data Relay Server can represent multiple | ||||
remote peers, thus masquerading the actual | ||||
destination. Since a Data Relay Server may have to deal with | ||||
a multitude of Relay Clients and their peers, a Data Relay | ||||
Server may experience collisions in the SPI namespace, thus | ||||
being unable forward datagrams to the correct | ||||
destination. Since the SPI space is 32 bits and the SPI | ||||
values should be random, the probability for a conflicting | ||||
SPI value is fairly small, but could occur on a busy Data Relay Server. | ||||
The two problematic cases are described in this section.</t> | ||||
<t>In the first scenario, the SPI collision problems occurs | <section anchor="sec_conflicting" numbered="true" toc="default"> | |||
<name>Handling Conflicting SPI Values</name> | ||||
<t>From the viewpoint of a host, its remote peers can have | ||||
overlapping inbound SPI numbers because the IPsec also uses the | ||||
destination IP address to index the remote peer host. However, a | ||||
Data Relay Server can represent multiple remote peers, thus | ||||
masquerading the actual destination. Since a Data Relay Server may | ||||
have to deal with a multitude of Relay Clients and their peers, a | ||||
Data Relay Server may experience collisions in the SPI namespace, | ||||
thus being unable to forward datagrams to the correct | ||||
destination. Since the SPI space is 32 bits and the SPI values | ||||
should be random, the probability for a conflicting SPI value is | ||||
fairly small but could occur on a busy Data Relay Server. The two | ||||
problematic cases are described in this section.</t> | ||||
<t>In the first scenario, the SPI collision problem occurs | ||||
if two hosts have registered to the same Data Relay Server | if two hosts have registered to the same Data Relay Server | |||
and a third host initiates base exchange with both of | and a third host initiates base exchange with both of | |||
them. Here, the two Responders (i.e. Data Relay Clients) | them. Here, the two Responders (i.e., Data Relay Clients) | |||
claim the same inbound SPI number with the same Initiator | claim the same inbound SPI number with the same Initiator | |||
(peer). However, in this case, the Data Relay Server has | (peer). However, in this case, the Data Relay Server has | |||
allocated separate UDP ports for the two Data Relay Clients | allocated separate UDP ports for the two Data Relay Clients | |||
acting now as Responders (as recommended in <xref | acting now as Responders (as recommended in <xref target="sec_reuse" | |||
target="sec:reuse" />). When the third host sends an ESP packet, | format="default"/>). When the third host sends an ESP packet, | |||
the Data Relay Server is able to forward the packet to the | the Data Relay Server is able to forward the packet to the | |||
correct Data Relay Client because the destination UDP port | correct Data Relay Client because the destination UDP port | |||
is different for each of the clients.</t> | is different for each of the clients.</t> | |||
<t>In the second scenario, an SPI collision may occur when | ||||
<t>In the second scenario, an SPI collision may occur when | ||||
two Initiators run a base exchange to the same Responder | two Initiators run a base exchange to the same Responder | |||
(i.e. Data Relay Client), and both of the Initiators claim | (i.e., Data Relay Client), and both of the Initiators claim | |||
the same inbound SPI at the Data Relay Server using | the same inbound SPI at the Data Relay Server using | |||
PEER_PERMISSION Parameter. In this case, the Data Relay | the PEER_PERMISSION parameter. In this case, the Data Relay | |||
Server cannot disambiguate the correct destination of an ESP | Server cannot disambiguate the correct destination of an ESP | |||
packet originating from the Data Relay Client because the | packet originating from the Data Relay Client because the | |||
SPI could belong to either of the peers (and destination IP | SPI could belong to either of the peers (and the destination IP | |||
and UDP port belonging to the Data Relay Server are not | and UDP port belonging to the Data Relay Server are not | |||
unique either). The recommended way and a contingency plan | unique either). The recommended way and a contingency plan | |||
to solve this issue are described below.</t> | to solve this issue are described below.</t> | |||
<t>The recommend way to mitigate the problem is as follows. For each | ||||
<t>The recommend way to mitigate the problem is as | new HIP association, a Data Relay Client acting as a Responder | |||
follows. For each new Host Association, A Data Relay Client acting as | <bcp14>SHOULD</bcp14> register a new server-reflexive candidate as | |||
a Responder SHOULD register | described in <xref target="sec_gathering" | |||
a new server reflexive candidate as described in <xref | format="default"/>. Similarly, the Data Relay Server <bcp14>SHOULD | |||
target="sec:gathering" />. Similarly, the Data Relay Server | NOT</bcp14> reuse the port numbers as described in <xref | |||
SHOULD NOT re-use the port numbers as described in <xref | target="sec_reuse" format="default"/>. This way, each | |||
target="sec:reuse" />. This way, each server reflexive | server-reflexive candidate for the Data Relay Client has a separate | |||
candidate for the Data Relay Client has a separate UDP port | UDP port that the Data Relay Server can use to disambiguate packet | |||
that the Data Relay Server can use to disambiguate packet destinations | destinations in case of SPI collisions.</t> | |||
in case of SPI collisions.</t> | <t>When the Data Relay Client is not registering or failed | |||
<t>When the Data Relay Client is not registering or failed | ||||
to register a new relay candidate for a new peer, the Data | to register a new relay candidate for a new peer, the Data | |||
Relay Client MUST follow a contingency plan as follows. | Relay Client <bcp14>MUST</bcp14> follow a contingency plan as follows. | |||
Upon receiving an I2 with a colliding SPI, the Data Relay | Upon receiving an I2 with a colliding SPI, the Data Relay | |||
client acting as the Responder MUST NOT include the relayed | Client acting as the Responder <bcp14>MUST NOT</bcp14> include the rela yed | |||
address candidate in the R2 message because the Data Relay | address candidate in the R2 message because the Data Relay | |||
Server would not be able demultiplex the related ESP packet | Server would not be able to demultiplex the related ESP packet | |||
to the correct Initiator. The same applies also the | to the correct Initiator. The same also applies to the | |||
handover procedures; the Data Relay Client MUST NOT include | handover procedures; the Data Relay Client <bcp14>MUST NOT</bcp14> incl | |||
ude | ||||
the relayed address candidate when sending its new locator | the relayed address candidate when sending its new locator | |||
set in an UPDATE to its peer if it would cause a SPI | set in an UPDATE to its peer if it would cause an SPI | |||
conflict with another peer. | conflict with another peer. | |||
<!-- | ||||
However, a Data | ||||
Relay Client with many peers MAY proactively decrease the | ||||
odds of a conflict by registering to multiple Data Relay | ||||
Servers. Thus, the described collision scenario can be | ||||
avoided if the Responder delivers a new relayed address | ||||
candidate upon SPI collisions. Each relayed address has a | ||||
separate UDP port reserved to it, so collision problem does | ||||
not occur. --> | ||||
</t> | ||||
<!-- | ||||
<t>The inbound SPI values of the registered | ||||
clients should be unique so that a Control and Data Relay Server can p | ||||
roperly demultiplex | ||||
incoming packets from peer hosts to the correct registered clients. Li | ||||
kewise, | ||||
the inbound SPIs of the peer hosts should be unique for the same reaso | ||||
n. These two cases are | ||||
discussed in this section separately.</t> | ||||
--> | ||||
<!-- registeration using multiple local addresses does not work in the | ||||
case of HIP? --> | ||||
<!-- no sending of NOTIFYs upon SPI collisions --> | ||||
<!-- | </t> | |||
<t>In first case, the SPI collision problem occurs when two | ||||
Initiators run a base exchange to the same Responder | ||||
(i.e. Data Relay Client), and both the Initiators claim the | ||||
same inbound SPI. This is not a problem for the Responder since | ||||
the two Initiators can be distinguished by their transport | ||||
addresses. However, it is an issue for the Data Relay Server | ||||
because it cannot demultiplex packets from the Initiator | ||||
to the correct Responder. | ||||
--> | ||||
</section> <!-- Handling Conflicting SPI Values --> | </section> | |||
</section> <!-- Relay Considerations --> | </section> | |||
</section> | </section> | |||
<!-- ***************************************************************** --> | <section anchor="sec_format" numbered="true" toc="default"> | |||
<name>Packet Formats</name> | ||||
<section anchor="sec:format" title="Packet Formats"> | ||||
<t> The following subsections define the parameter and packet encodings | <t> The following subsections define the parameter and packet encodings | |||
for the HIP and ESP packets. All values MUST be | for the HIP and ESP packets. All values <bcp14>MUST</bcp14> be in | |||
in network byte order.</t> | network byte order.</t> | |||
<t>It is worth noting that all of the parameters are shown for the sake | ||||
<t>It is worth noting that all of the parameters are shown for | of completeness even though they are specified already in Legacy ICE-HIP | |||
the sake of completeness even though they are specified already in Legacy | <xref target="RFC5770" format="default"/>. New parameters are explicitly | |||
ICE-HIP <xref | described as new.</t> | |||
target="RFC5770" />. New parameters are explicitly described as new.</t> | <section anchor="sec_udphip" numbered="true" toc="default"> | |||
<name>HIP Control Packets</name> | ||||
<section anchor="sec:udphip" title="HIP Control Packets"> | <t><xref target="fig_udphip" format="default"/> illustrates the packet | |||
format for UDP-encapsulated HIP. The format is identical to Legacy | ||||
<t><xref target="fig:udphip"/> illustrates the packet | ICE-HIP <xref target="RFC5770" format="default"/>.</t> | |||
format for UDP-encapsulated HIP. The format is identical to Legacy ICE-H | <figure anchor="fig_udphip"> | |||
IP <xref target="RFC5770"/>.</t> | <name>Format of UDP-Encapsulated HIP Control Packets</name> | |||
<artwork align="center" name="" type="" alt=""><![CDATA[ | ||||
<figure anchor="fig:udphip" | ||||
title="Format of UDP-Encapsulated HIP Control Packets"> | ||||
<artwork align="center"><![CDATA[ | ||||
0 1 2 3 | 0 1 2 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Source Port | Destination Port | | | Source Port | Destination Port | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Length | Checksum | | | Length | Checksum | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| 32 bits of zeroes | | | 32 bits of zeroes | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | |||
~ HIP Header and Parameters ~ | ~ HIP Header and Parameters ~ | |||
| | | | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t> HIP control packets are encapsulated in UDP packets as defined in | <t> HIP control packets are encapsulated in UDP packets as defined in | |||
Section 2.2 of <xref target="RFC3948"/>, "IKE Header Format for Port | <xref target="RFC3948" sectionFormat="of" section="2.2"/>, "IKE Header | |||
4500", except that a different port number is used. <xref | Format for Port 4500", except that a different port number is | |||
target="fig:udphip"/> illustrates the encapsulation. The UDP header is | used. <xref target="fig_udphip" format="default"/> illustrates the | |||
followed by 32 zero bits that can be used to differentiate HIP control | encapsulation. The UDP header is followed by 32 zero bits that can be | |||
packets from ESP packets. The HIP header and parameters follow the | used to differentiate HIP control packets from ESP packets. The HIP | |||
conventions of <xref target="RFC7401"/> with the exception that the HIP | header and parameters follow the conventions of <xref target="RFC7401" | |||
header checksum MUST be zero. The HIP header checksum is zero for two | format="default"/> with the exception that the HIP header checksum | |||
reasons. First, the UDP header already contains a checksum. Second, the | <bcp14>MUST</bcp14> be zero. The HIP header checksum is zero for two | |||
checksum definition in <xref target="RFC7401"/> includes the IP | reasons. First, the UDP header already contains a checksum. Second, | |||
addresses in the checksum calculation. The NATs that are unaware of HIP | the checksum definition in <xref target="RFC7401" format="default"/> | |||
cannot | includes the IP addresses in the checksum calculation. The NATs that | |||
recompute the HIP checksum after changing IP addresses. </t> | are unaware of HIP cannot recompute the HIP checksum after changing IP | |||
addresses.</t> | ||||
<t> A Control/Data Relay Server or a non-relay Responder SHOULD listen a | <t> A Control/Data Relay Server or a non-relay Responder | |||
t | <bcp14>SHOULD</bcp14> listen at UDP port 10500 for incoming | |||
UDP port 10500 for incoming UDP-encapsulated HIP control packets. If | UDP-encapsulated HIP control packets. If some other port number is | |||
some other port number is used, it needs to be known by potential | used, it needs to be known by potential Initiators. </t> | |||
Initiators. </t> | ||||
<!-- | ||||
<t>It is worth noting that UDP encapsulation of HIP packets | ||||
reduces the Maximum Transfer Unit (MTU) size of the control | ||||
plane by 12 bytes.</t> --> | ||||
<t>UDP encapsulation of HIP packets reduces the Maximum | <t>UDP encapsulation of HIP packets reduces the Maximum | |||
Transfer Unit (MTU) size of the control plane by 12 bytes | Transmission Unit (MTU) size of the control plane by 12 bytes | |||
(8-byte UDP header plus 4-byte zero SPI marker), and the data | (8-byte UDP header plus 4-byte zero SPI marker), and the data | |||
plane by 8 bytes. Additional HIP relay parameters, such as | plane by 8 bytes. Additional HIP relay parameters, such as | |||
RELAY_HMAC, RELAY_UDP_HIP, RELAY_UDP_ESP, etc., further | RELAY_HMAC, RELAY_UDP_HIP, RELAY_UDP_ESP, etc., further | |||
increase the size of certain HIP packets. In regard to MTU, | increase the size of certain HIP packets. In regard to MTU, | |||
the following aspects need to be considered in an | the following aspects need to be considered in an | |||
implementation: | implementation: | |||
</t> | </t> | |||
<t><list style="symbols"> | ||||
<t>A HIP host SHOULD implement ICMP message handling to | ||||
support path MTU discovery (PMTUD) discovery as | ||||
described in <xref target="RFC1063" /> <xref target="RFC8201" | ||||
/></t> | ||||
<t>Reliance on IP fragmentation is unlikely to be a viable | ||||
strategy through NATs. If ICMP MTU discovery is not working, | ||||
MTU related path black holes may occur.</t> | ||||
<t>A mitigation strategy is to constrain the MTU, especially for | ||||
virtual interfaces, to expected safe MTU values, | ||||
e.g., 1400 bytes for the underlying interfaces that support 1500 | ||||
bytes MTU.</t> | ||||
<t>Further extensions to this specification may define a HIP-based mechan | ||||
ism | ||||
to find a working path MTU without unnecessary constraining that size usi | ||||
ng | ||||
Packetization Layer Path MTU Discovery for Datagram Transports <xref targ | ||||
et="I-D.ietf-tsvwg-datagram-plpmtud"/>. | ||||
For instance, such mechanism could be implemented between a HIP Relay Cli | ||||
ent and HIP Relay Server. | ||||
</t> | ||||
<t>It is worth noting that further HIP extensions can trim off | ||||
8 bytes in the ESP header by negotiating implicit IV support | ||||
in the ESP_TRANSFORM parameter as described in <xref | ||||
target="RFC8750" />.</t> | ||||
</list></t> | ||||
</section> <!-- HIP Control Packets --> | <ul spacing="normal"> | |||
<li>A HIP host <bcp14>SHOULD</bcp14> implement ICMP message handling | ||||
to support Path MTU Discovery (PMTUD) as described in | ||||
<xref target="RFC1191" format="default"/> and <xref target="RFC8201" | ||||
format="default"/>.</li> | ||||
<li>Reliance on IP fragmentation is unlikely to be a viable strategy | ||||
through NATs. If ICMP MTU discovery is not working, MTU-related path | ||||
black holes may occur.</li> | ||||
<section anchor="sec:con_checks" title="Connectivity Checks"> | <li>A mitigation strategy is to constrain the MTU, especially for | |||
virtual interfaces, to expected safe MTU values, e.g., 1400 bytes | ||||
for the underlying interfaces that support 1500 bytes MTU.</li> | ||||
<li>Further extensions to this specification may define a HIP-based | ||||
mechanism to find a working path MTU without unnecessary | ||||
constraining that size using Packetization Layer Path MTU Discovery | ||||
for Datagram Transports <xref | ||||
target="RFC8899" format="default"/>. For | ||||
instance, such a mechanism could be implemented between a HIP Relay | ||||
Client and HIP Relay Server.</li> | ||||
<li>It is worth noting that further HIP extensions can trim off 8 | ||||
bytes in the ESP header by negotiating implicit initialization | ||||
vector (IV) support in the ESP_TRANSFORM parameter as described in | ||||
<xref target="RFC8750" format="default"/>.</li> | ||||
</ul> | ||||
</section> | ||||
<section anchor="sec_con_checks" numbered="true" toc="default"> | ||||
<name>Connectivity Checks</name> | ||||
<t>HIP connectivity checks are HIP UPDATE packets. The format | <t>HIP connectivity checks are HIP UPDATE packets. The format | |||
is specified in <xref target="RFC7401"/>.</t> | is specified in <xref target="RFC7401" format="default"/>.</t> | |||
</section> | ||||
<section anchor="sec_keepalive" numbered="true" toc="default"> | ||||
<name>Keepalives</name> | ||||
<t>The <bcp14>RECOMMENDED</bcp14> encoding format for keepalives is | ||||
HIP NOTIFY packets as specified in <xref target="RFC7401" | ||||
format="default"/> with the Notify message type field set to | ||||
NAT_KEEPALIVE (16385) and with an empty Notification data field. It is | ||||
worth noting that the sending of such a HIP NOTIFY message | ||||
<bcp14>SHOULD</bcp14> be omitted if the host is sending some other | ||||
traffic (HIP or ESP) to the peer host over the related UDP tunnel | ||||
during the Tr period. For instance, the host <bcp14>MAY</bcp14> | ||||
actively send ICMPv6 requests (or respond with an ICMPv6 response) | ||||
inside the ESP tunnel to test the health of the associated IPsec | ||||
security association. Alternatively, the host <bcp14>MAY</bcp14> use | ||||
UPDATE packets as a substitute. A minimal UPDATE packet would consist | ||||
of a SEQ and a single ECHO_REQ_SIGN parameter, and a more complex one | ||||
would involve rekeying procedures as specified in <xref | ||||
target="RFC7402" sectionFormat="of" section="6.8"/>. It is worth | ||||
noting that a host actively sending periodic UPDATE packets to a busy | ||||
server may increase the computational load of the server since it has | ||||
to verify HMACs and signatures in UPDATE messages.</t> | ||||
</section> | </section> | |||
<section anchor="sec:keepalive" title="Keepalives"> | <section anchor="sec_nat_tm-param" numbered="true" toc="default"> | |||
<name>NAT Traversal Mode Parameter</name> | ||||
<t>The RECOMMENDED encoding format for keepalives is HIP | ||||
NOTIFY packets as specified in <xref target="RFC7401"/> with | ||||
Notify message type field set to NAT_KEEPALIVE [TBD by IANA: | ||||
16385] and with an empty Notification data field. It is worth noting | ||||
that sending of such a HIP NOTIFY message SHOULD be omitted if the host | ||||
is actively (or passively) sending some other traffic (HIP or ESP) to th | ||||
e peer | ||||
host over the related UDP tunnel during the Tr period. For instance, the | ||||
host MAY | ||||
actively send ICMPv6 requests (or respond with an ICMPv6 | ||||
response) inside the ESP tunnel to test the health of the | ||||
associated IPsec security association. Alternatively, the | ||||
host MAY use UPDATE packets as a substitute. A minimal UPDATE | ||||
packet would consist of a SEQ and ECHO_REQ_SIGN parameters, | ||||
and a more complex would involve rekeying procedures as | ||||
specified in section 6.8 in <xref target="RFC7402" />. It is | ||||
worth noting that a host actively sending periodic UPDATE packets to | ||||
a busy server may increase the computational load of the server since it | ||||
has to verify | ||||
HMACs and signatures in UPDATE messages.</t> | ||||
</section> <!-- keepalive --> | ||||
<section anchor="sec:nat_tm-param" title="NAT Traversal Mode Parameter"> | ||||
<!-- XX FIXME: TRANSPORT_MODE MISSING --> | ||||
<t>The format of NAT traversal mode parameter is defined in Legacy ICE-H | ||||
IP <xref target="RFC5770"/> but repeated here for completeness. | ||||
The format of the NAT_TRAVERSAL_MODE parameter is similar to the format | ||||
of the ESP_TRANSFORM parameter in <xref target="RFC7402"/> and is shown | ||||
in <xref target="fig:nat_tfm" />. The Native ICE-HIP extension specified | ||||
in this document defines the new NAT traversal | ||||
mode identifier for ICE-HIP-UDP and reuses the UDP-ENCAPSULATION mode fr | ||||
om Legacy ICE-HIP <xref target="RFC5770"/>. The identifier | ||||
named RESERVED is reserved for future use. Future specifications may def | ||||
ine | ||||
more traversal modes. </t> | ||||
<figure anchor="fig:nat_tfm" | ||||
title="Format of the NAT_TRAVERSAL_MODE Parameter"> | ||||
<artwork align="center"><![CDATA[ | ||||
<t>The format of the NAT traversal mode parameter is defined in Legacy | ||||
ICE-HIP <xref target="RFC5770" format="default"/> but repeated here | ||||
for completeness. The format of the NAT_TRAVERSAL_MODE parameter is | ||||
similar to the format of the ESP_TRANSFORM parameter in <xref | ||||
target="RFC7402" format="default"/> and is shown in <xref | ||||
target="fig_nat_tfm" format="default"/>. The Native ICE-HIP extension | ||||
specified in this document defines the new NAT traversal mode | ||||
identifier for ICE-HIP-UDP and reuses the UDP-ENCAPSULATION mode from | ||||
Legacy ICE-HIP <xref target="RFC5770" format="default"/>. The | ||||
identifier named RESERVED is reserved for future use. Future | ||||
specifications may define more traversal modes. </t> | ||||
<figure anchor="fig_nat_tfm"> | ||||
<name>Format of the NAT_TRAVERSAL_MODE Parameter</name> | ||||
<artwork align="center" name="" type="" alt=""><![CDATA[ | ||||
0 1 2 3 | 0 1 2 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Type | Length | | | Type | Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Reserved | Mode ID #1 | | | Reserved | Mode ID #1 | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Mode ID #2 | Mode ID #3 | | | Mode ID #2 | Mode ID #3 | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Mode ID #n | Padding | | | Mode ID #n | Padding | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
]]></artwork> | ||||
Type 608 | ||||
Length length in octets, excluding Type, Length, and padding | ||||
Reserved zero when sent, ignored when received | ||||
Mode ID defines the proposed or selected NAT traversal mode(s) | ||||
The following NAT traversal mode IDs are defined: | ||||
ID name Value | ||||
RESERVED 0 | ||||
UDP-ENCAPSULATION 1 | ||||
ICE-STUN-UDP 2 | ||||
ICE-HIP-UDP 3 | ||||
]]></artwork> | ||||
</figure> | </figure> | |||
<t> The sender of a NAT_TRAVERSAL_MODE parameter MUST make sure that | <dl newline="false" spacing="normal" indent="12"> | |||
<dt>Type:</dt> | ||||
<dd>608</dd> | ||||
<dt>Length:</dt> | ||||
<dd>Length in octets, excluding Type, Length, and Padding</dd> | ||||
<dt>Reserved:</dt> | ||||
<dd>Zero when sent, ignored when received</dd> | ||||
<dt>Mode ID:</dt> | ||||
<dd>Defines the proposed or selected NAT traversal mode(s)</dd> | ||||
</dl> | ||||
<t>The following NAT traversal mode IDs are defined:</t> | ||||
<table align="center"> | ||||
<name>NAT Traversal Mode IDs | ||||
</name> | ||||
<thead> | ||||
<tr> | ||||
<th>ID name</th> | ||||
<th>Value</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td>RESERVED</td> | ||||
<td>0</td> | ||||
</tr> | ||||
<tr> | ||||
<td>UDP-ENCAPSULATION</td> | ||||
<td>1</td> | ||||
</tr> | ||||
<tr> | ||||
<td>ICE-STUN-UDP</td> | ||||
<td>2</td> | ||||
</tr> | ||||
<tr> | ||||
<td>ICE-HIP-UDP</td> | ||||
<td>3</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t> The sender of a NAT_TRAVERSAL_MODE parameter <bcp14>MUST</bcp14> mak | ||||
e sure that | ||||
there are no more than six (6) Mode IDs in one NAT_TRAVERSAL_MODE | there are no more than six (6) Mode IDs in one NAT_TRAVERSAL_MODE | |||
parameter. Conversely, a recipient MUST be prepared to handle received | parameter. Conversely, a recipient <bcp14>MUST</bcp14> be prepared to ha ndle received | |||
NAT traversal mode parameters that contain more than six Mode IDs by | NAT traversal mode parameters that contain more than six Mode IDs by | |||
accepting the first six Mode IDs and dropping the rest. The limited | accepting the first six Mode IDs and dropping the rest. The limited | |||
number of Mode IDs sets the maximum size of the NAT_TRAVERSAL_MODE | number of Mode IDs sets the maximum size of the NAT_TRAVERSAL_MODE | |||
parameter. The modes MUST be in preference order, most preferred | parameter. The modes <bcp14>MUST</bcp14> be in preference order, most pr eferred | |||
mode(s) first. </t> | mode(s) first. </t> | |||
<t>Implementations conforming to this specification | ||||
<bcp14>MUST</bcp14> implement UDP-ENCAPSULATION and | ||||
<bcp14>SHOULD</bcp14> implement ICE-HIP-UDP modes.</t> | ||||
</section> | ||||
<t>Implementations conforming to this specification MUST | <section anchor="sec_check-pacing-param" numbered="true" toc="default"> | |||
implement UDP-ENCAPSULATION and SHOULD implement ICE-HIP-UDP modes.</t> | <name>Connectivity Check Transaction Pacing Parameter</name> | |||
<t> The TRANSACTION_PACING parameter is defined in <xref target="RFC5770 | ||||
</section> <!-- NAT Traversal Mode Parameter --> | " | |||
format="default"/> but repeated in <xref target="fig_check_pacing" | ||||
<section anchor="sec:check-pacing-param" | format="default"/> for completeness. It contains only the connectivity | |||
title="Connectivity Check Transaction Pacing Parameter"> | check pacing value, expressed in milliseconds, as a 32-bit unsigned | |||
integer.</t> | ||||
<t> The TRANSACTION_PACING is defined in <xref target="RFC5770"/>, but r | <figure anchor="fig_check_pacing"> | |||
epeated in | <name>Format of the TRANSACTION_PACING Parameter</name> | |||
<xref target="fig:check_pacing"/> for completeness. It contains onl | <artwork name="" type="" alt=""><![CDATA[ | |||
y the connectivity check pacing | ||||
value, expressed in milliseconds, as a 32-bit unsigned integer.</t> | ||||
<figure anchor="fig:check_pacing" | ||||
title="Format of the TRANSACTION_PACING Parameter"> | ||||
<artwork align="center"><![CDATA[ | ||||
0 1 2 3 | 0 1 2 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Type | Length | | | Type | Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Min Ta | | | Min Ta | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
]]></artwork> | ||||
Type 610 | ||||
Length 4 | ||||
Min Ta the minimum connectivity check transaction pacing | ||||
value the host would use (in milliseconds) | ||||
]]></artwork> | ||||
</figure> | </figure> | |||
<dl newline="false" spacing="normal" indent="12"> | ||||
<dt>Type:</dt> | ||||
<dd>610</dd> | ||||
<dt>Length:</dt> | ||||
<dd>4</dd> | ||||
<dt>Min Ta:</dt> | ||||
<dd>The minimum connectivity check transaction pacing value the host would | ||||
use (in milliseconds)</dd> | ||||
</dl> | ||||
</section> | </section> | |||
<section anchor="sec:rel-reg-params" | <section anchor="sec_rel-reg-params" numbered="true" toc="default"> | |||
title="Relay and Registration Parameters"> | <name>Relay and Registration Parameters</name> | |||
<t> The format of the REG_FROM, RELAY_FROM, and RELAY_TO parameters is | ||||
<t> The format of the REG_FROM, RELAY_FROM, and RELAY_TO parameters is s | shown in <xref target="fig_reg_from" format="default"/>. All | |||
hown | parameters are identical except for the type. Of the three, only | |||
in <xref target="fig:reg_from" />. All parameters are identical except | REG_FROM is covered by the signature. </t> | |||
for the type. Of the three, only REG_FROM is covered by the | <figure anchor="fig_reg_from"> | |||
signature. </t> | <name>Format of the REG_FROM, RELAY_FROM, and RELAY_TO Parameters</nam | |||
e> | ||||
<figure anchor="fig:reg_from" | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
title="Format of the REG_FROM, RELAY_FROM, and RELAY_TO Parameters"> | ||||
<artwork align="center"><![CDATA[ | ||||
0 1 2 3 | 0 1 2 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Type | Length | | | Type | Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Port | Protocol | Reserved | | | Port | Protocol | Reserved | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | |||
| Address | | | Address | | |||
| | | | | | |||
| | | | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
]]></artwork> | ||||
Type REG_FROM: 950 | ||||
RELAY_FROM: 63998 | ||||
RELAY_TO: 64002 | ||||
Length 20 | ||||
Port transport port number; zero when plain IP is used | ||||
Protocol IANA assigned, Internet Protocol number. | ||||
17 for UDP, 0 for plain IP | ||||
Reserved reserved for future use; zero when sent, ignored | ||||
when received | ||||
Address an IPv6 address or an IPv4 address in "IPv4-Mapped | ||||
IPv6 address" format | ||||
]]></artwork> | ||||
</figure> | </figure> | |||
<dl newline="false" spacing="normal" indent="12"> | ||||
<dt>Type:</dt> | ||||
<dd> | ||||
<dl newline="false" spacing="compact"> | ||||
<dt>REG_FROM:</dt> | ||||
<dd>950</dd> | ||||
<dt>RELAY_FROM:</dt> | ||||
<dd>63998</dd> | ||||
<dt>RELAY_TO:</dt> | ||||
<dd>64002</dd> | ||||
</dl> | ||||
</dd> | ||||
<dt>Length:</dt> | ||||
<dd>20 </dd> | ||||
<dt>Port:</dt> | ||||
<dd>Transport port number; zero when plain IP is used</dd> | ||||
<dt>Protocol:</dt> | ||||
<dd>IANA-assigned, Internet Protocol number. 17 for UDP; 0 for plain | ||||
IP</dd> | ||||
<dt>Reserved:</dt> | ||||
<dd>Reserved for future use; zero when sent, ignored when received</dd> | ||||
<dt>Address:</dt> | ||||
<dd>An IPv6 address or an IPv4 address in "IPv4-mapped IPv6 address" | ||||
format</dd> | ||||
</dl> | ||||
<t> REG_FROM contains the transport address and protocol from which the Control | <t> REG_FROM contains the transport address and protocol from which the Control | |||
Relay Server sees the registration coming. RELAY_FROM contains the | Relay Server sees the registration coming. RELAY_FROM contains the | |||
address from which the relayed packet was received by the Control Relay Server | address from which the relayed packet was received by the Control Relay Server | |||
and the protocol that was used. RELAY_TO contains the same information | and the protocol that was used. RELAY_TO contains the same information | |||
about the address to which a packet should be forwarded. </t> | about the address to which a packet should be forwarded. </t> | |||
</section> | ||||
</section> <!-- Relay and Registration Parameters --> | <section anchor="sec_locator_format" numbered="true" toc="default"> | |||
<name>LOCATOR_SET Parameter</name> | ||||
<section title="LOCATOR_SET Parameter" anchor="sec:locator_format"> | <t>This specification reuses the format for UDP-based locators as | |||
specified in Legacy ICE-HIP <xref target="RFC5770" format="default"/> | ||||
<t>This specification reuses the format for UDP-based locators as specif | to be used for communicating the address candidates between two | |||
ied | hosts. The generic and NAT-traversal-specific locator parameters are | |||
in Legacy ICE-HIP <xref target="RFC5770"/> to be used for communicating | illustrated in <xref target="fig_locator" format="default"/>. </t> | |||
the | <figure anchor="fig_locator"> | |||
address candidates between two hosts. The generic and NAT-traversal-spec | <name>LOCATOR_SET Parameter</name> | |||
ific locator parameters | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
are illustrated in <xref target="fig:locator"/>. </t> | ||||
<figure anchor="fig:locator" title="LOCATOR_SET Parameter"> | ||||
<artwork align="center"><![CDATA[ | ||||
0 1 2 3 | 0 1 2 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Type | Length | | | Type | Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Traffic Type | Locator Type | Locator Length| Reserved |P| | | Traffic Type | Locator Type | Locator Length| Reserved |P| | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Locator Lifetime | | | Locator Lifetime | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Locator | | | Locator | | |||
skipping to change at line 2320 ¶ | skipping to change at line 2147 ¶ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| SPI | | | SPI | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Address | | | Address | | |||
| | | | | | |||
| | | | | | |||
| | | | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
]]></artwork> | ]]></artwork> | |||
</figure> | </figure> | |||
<t> The individual fields in the LOCATOR_SET parameter are described in | <t> The individual fields in the LOCATOR_SET parameter are described in | |||
<xref target="tbl:locator"/>. </t> | <xref target="tbl_locator" format="default"/>. </t> | |||
<table anchor="tbl_locator" align="center"> | ||||
<texttable anchor="tbl:locator" | <name>Fields of the LOCATOR_SET Parameter</name> | |||
title="Fields of the LOCATOR_SET Parameter"> | <thead> | |||
<ttcol align="left">Field</ttcol> | <tr> | |||
<ttcol align="left">Value(s)</ttcol> | <th align="left">Field</th> | |||
<ttcol align="left">Purpose</ttcol> | <th align="left">Value(s)</th> | |||
<c>Type</c> | <th align="left">Purpose</th> | |||
<c>193</c> | </tr> | |||
<c>Parameter type</c> | </thead> | |||
<c>Length</c> | <tbody> | |||
<c>Variable</c> | <tr> | |||
<c>Length in octets, excluding Type and Length fields and padding</c> | <td align="left">Type</td> | |||
<c>Traffic Type</c> | <td align="left">193</td> | |||
<c>0-2</c> | <td align="left">Parameter type</td> | |||
<c>Is the locator for HIP signaling (1), for ESP (2), or for | </tr> | |||
both (0)</c> | <tr> | |||
<c>Locator Type</c> | <td align="left">Length</td> | |||
<c>2</c> | <td align="left">Variable</td> | |||
<c>"Transport address" locator type</c> | <td align="left">Length in octets, excluding Type and Length field | |||
<c>Locator Length</c> | s and padding</td> | |||
<c>7</c> | </tr> | |||
<c>Length of the fields after Locator Lifetime in 4-octet units</c> | <tr> | |||
<c>Reserved</c> | <td align="left">Traffic Type</td> | |||
<c>0</c> | <td align="left">0-2</td> | |||
<c>Reserved for future extensions</c> | <td align="left">The locator for either HIP signaling (1) or ESP ( | |||
<c>Preferred (P) bit</c> | 2), or for | |||
<c>0 or 1</c> | both (0)</td> | |||
<c>Set to 1 for a Locator in R1 if the Responder can use it for the | </tr> | |||
rest of the base exchange, otherwise set to zero</c> | <tr> | |||
<c>Locator Lifetime</c> | <td align="left">Locator Type</td> | |||
<c>Variable</c> | <td align="left">2</td> | |||
<c>Locator lifetime in seconds, see Section 4 in <xref target="RFC8046 | <td align="left">"Transport address" locator type</td> | |||
" /></c> | </tr> | |||
<c>Transport Port</c> | <tr> | |||
<c>Variable</c> | <td align="left">Locator Length</td> | |||
<c>Transport layer port number</c> | <td align="left">7</td> | |||
<c>Transport Protocol</c> | <td align="left">Length of the fields after Locator Lifetime in 4- | |||
<c>Variable</c> | octet units</td> | |||
<c>IANA assigned, transport layer Internet Protocol number. | </tr> | |||
Currently only UDP (17) is supported.</c> | <tr> | |||
<c>Kind</c> | <td align="left">Reserved</td> | |||
<c>Variable</c> | <td align="left">0</td> | |||
<c>0 for host, 1 for server reflexive, 2 for peer reflexive (currently | <td align="left">Reserved for future extensions</td> | |||
unused) or 3 for | </tr> | |||
relayed address</c> | <tr> | |||
<c>Priority</c> | <td align="left">Preferred (P) bit</td> | |||
<c>Variable</c> | <td align="left">0 or 1</td> | |||
<c>Locator's priority as described in | <td align="left">Set to 1 for a Locator in R1 if the Responder can | |||
<xref target="RFC8445"/>. It is worth noting that while the priority | use it for the | |||
of a single locator candidate is 32-bits, but | rest of the base exchange, otherwise set to zero</td> | |||
an implementation should use a 64-bit integer to calculate the priori | </tr> | |||
ty of a candidate pair for the ICE priority algorithm.</c> | <tr> | |||
<c>SPI</c> | <td align="left">Locator Lifetime</td> | |||
<c>Variable</c> | <td align="left">Variable</td> | |||
<c>Security Parameter Index (SPI) value that the host expects to see i | <td align="left">Locator lifetime in seconds, see | |||
n incoming ESP packets | <xref target="RFC8046" sectionFormat="of" section="4"/></td> | |||
that use this locator</c> | </tr> | |||
<c>Address</c> | <tr> | |||
<c>Variable</c> | <td align="left">Transport Port</td> | |||
<c>IPv6 address or an "IPv4-Mapped IPv6 address" format IPv4 | <td align="left">Variable</td> | |||
address <xref target="RFC4291"/></c> | <td align="left">Transport-layer port number</td> | |||
</texttable> | </tr> | |||
<tr> | ||||
<t>The LOCATOR parameter MUST be encapsulated inside an ENCRYPTED paramet | <td align="left">Transport Protocol</td> | |||
er.</t> | <td align="left">Variable</td> | |||
<td align="left">IANA-assigned, transport-layer Internet Protocol | ||||
</section> <!-- locator parameter format --> | number. | |||
Currently, only UDP (17) is supported.</td> | ||||
<section anchor="sec:relay-hmac" title="RELAY_HMAC Parameter"> | </tr> | |||
<tr> | ||||
<t>As specified in Legacy ICE-HIP <xref target="RFC5770"/>, | <td align="left">Kind</td> | |||
the RELAY_HMAC parameter value has the TLV type 65520. It has | <td align="left">Variable</td> | |||
the same semantics as RVS_HMAC as specified in section 4.2.1 | <td align="left">0 for host, 1 for server reflexive, 2 for peer | |||
in <xref target="RFC8004"/>. Similarly as with RVS_HMAC, also | reflexive (currently unused), or 3 for relayed address</td> | |||
RELAY_HMAC is keyed with the HIP integrity key (HIP-lg or | </tr> | |||
HIP-gl as specified in section 6.5 in <xref target="RFC7401" | <tr> | |||
/>), established during the relay registration procedure as | <td align="left">Priority</td> | |||
described in <xref target="sec:registration" />.</t> | <td align="left">Variable</td> | |||
<td align="left">Locator's priority as described in <xref | ||||
target="RFC8445" format="default"/>. It is worth noting that | ||||
while the priority of a single locator candidate is 32 bits, an | ||||
implementation should a 64-bit integer to calculate the priority | ||||
of a candidate pair for the ICE priority algorithm.</td> | ||||
</section> <!-- RELAY_HMAC --> | </tr> | |||
<tr> | ||||
<td align="left">SPI</td> | ||||
<td align="left">Variable</td> | ||||
<td align="left">Security Parameter Index (SPI) value that the | ||||
host expects to see in incoming ESP packets that use this | ||||
locator</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">Address</td> | ||||
<td align="left">Variable</td> | ||||
<td align="left">IPv6 address or an "IPv4-mapped IPv6 address" | ||||
format IPv4 address <xref target="RFC4291" | ||||
format="default"/></td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>The LOCATOR parameter <bcp14>MUST</bcp14> be encapsulated inside an | ||||
ENCRYPTED parameter.</t> | ||||
</section> | ||||
<section anchor="sec:reg-types" title="Registration Types"> | <section anchor="sec_relay-hmac" numbered="true" toc="default"> | |||
<name>RELAY_HMAC Parameter</name> | ||||
<t>As specified in Legacy ICE-HIP <xref target="RFC5770" | ||||
format="default"/>, the RELAY_HMAC parameter value has the TLV type | ||||
65520. It has the same semantics as RVS_HMAC as specified in <xref | ||||
target="RFC8004" sectionFormat="of" section="4.2.1"/>. Similar to | ||||
RVS_HMAC, RELAY_HMAC is also keyed with the HIP integrity key | ||||
(HIP-lg or HIP-gl as specified in <xref target="RFC7401" section="6.5" | ||||
sectionFormat="of"/>), established during the relay registration | ||||
procedure as described in <xref target="sec_registration" | ||||
format="default"/>.</t> | ||||
</section> | ||||
<section anchor="sec_reg-types" numbered="true" toc="default"> | ||||
<name>Registration Types</name> | ||||
<t> The REG_INFO, REG_REQ, REG_RESP, and REG_FAILED parameters contain | <t> The REG_INFO, REG_REQ, REG_RESP, and REG_FAILED parameters contain | |||
Registration Type <xref target="RFC8003"/> values for Control Relay Serv | Registration Type <xref target="RFC8003" format="default"/> values for | |||
er | Control Relay Server registration. The value for RELAY_UDP_HIP is 2 as | |||
registration. The value for RELAY_UDP_HIP is 2 as specified in Legacy IC | specified in Legacy ICE-HIP <xref target="RFC5770" | |||
E-HIP <xref target="RFC5770"/>. | format="default"/>. The value for RELAY_UDP_ESP is 3.</t> | |||
The value for RELAY_UDP_ESP is (value [TBD by IANA: 3]). | </section> | |||
</t> | ||||
</section> <!-- Registration Types --> | ||||
<section anchor="sec:notify-types" title="Notify Packet Types"> | ||||
<t>A Control/Data Relay Server and end-hosts can use NOTIFY packets to s | ||||
ignal | ||||
different error conditions. The NOTIFY packet types are the same as in L | ||||
egacy ICE-HIP <xref target="RFC5770"/> except for the two last ones, which are n | ||||
ew.</t> | ||||
<t>The Notify Packet Types <xref | ||||
target="RFC7401"/> are shown below. The | ||||
Notification Data field for the error notifications SHOULD contain the | ||||
HIP header of the rejected packet and SHOULD be empty for the | ||||
CONNECTIVITY_CHECKS_FAILED type. </t> | ||||
<figure> <artwork> | ||||
NOTIFICATION PARAMETER - ERROR TYPES Value | ||||
NO_VALID_NAT_TRAVERSAL_MODE_PARAMETER 60 | ||||
</artwork> </figure> | ||||
<t><list> | ||||
<t> If a Control Relay Server does not forward a base exchange | ||||
packet due to missing NAT traversal mode parameter, or the | ||||
Initiator selects a NAT traversal mode that the (non-relay) Responde | ||||
r did not | ||||
expect, the Control Relay Server or the Responder may send back a NO | ||||
TIFY error | ||||
packet with this type. </t> | ||||
</list></t> | ||||
<figure> <artwork> | ||||
CONNECTIVITY_CHECKS_FAILED 61 | ||||
</artwork> </figure> | ||||
<t><list> | ||||
<t> Used by the end-hosts to signal that NAT traversal connectivity | ||||
checks failed and did not produce a working path. </t> | ||||
</list> </t> | ||||
<figure> <artwork> | ||||
MESSAGE_NOT_RELAYED 62 | ||||
</artwork> </figure> | ||||
<t><list> | <section anchor="sec_notify-types" numbered="true" toc="default"> | |||
<t> Used by a Control Relay Server to signal that is was not able or | <name>Notify Packet Types</name> | |||
willing to relay a HIP packet. </t> | <t>A Control/Data Relay Server and end hosts can use NOTIFY packets to | |||
</list> </t> | signal different error conditions. The NOTIFY packet types are the | |||
same as in Legacy ICE-HIP <xref target="RFC5770" format="default"/> | ||||
except for the two last ones, which are new.</t> | ||||
<t>The Notify Packet Types <xref target="RFC7401" format="default"/> | ||||
are shown below. The Notification Data field for the error | ||||
notifications <bcp14>SHOULD</bcp14> contain the HIP header of the | ||||
rejected packet and <bcp14>SHOULD</bcp14> be empty for the | ||||
CONNECTIVITY_CHECKS_FAILED type. </t> | ||||
<figure> <artwork> | <table anchor="notif-param-error-types"> | |||
SERVER_REFLEXIVE_CANDIDATE_ALLOCATION_FAILED 63 | <name>Notify Packet Types | |||
</artwork> </figure> | </name> | |||
<thead> | ||||
<t><list> | <tr> | |||
<t> Used by a Data Relay Server to signal that is was not able or | <th>NOTIFICATION PARAMETER - ERROR TYPES</th> | |||
willing to allocate a new server reflexive candidate for the Data Re | <th>Value</th> | |||
lay Client</t> | </tr> | |||
</list> </t> | </thead> | |||
<tbody> | ||||
<tr> | ||||
<td><t>NO_VALID_NAT_TRAVERSAL_MODE_PARAMETER</t> | ||||
<t>If a Control Relay Server does not forward a base exchange packet due | ||||
to a missing NAT traversal mode parameter, or the Initiator selects a | ||||
NAT traversal mode that the (non-relay) Responder did not expect, the | ||||
Control Relay Server or the Responder may send back a NOTIFY error | ||||
packet with this type.</t></td> | ||||
<td>60</td> | ||||
</tr> | ||||
<tr> | ||||
<figure> <artwork> | <td><t>CONNECTIVITY_CHECKS_FAILED</t> | |||
RVS_HMAC_PROHIBITED_WITH_RELAY 64 | <t>Used by the end hosts to signal that NAT traversal | |||
</artwork> </figure> | connectivity checks failed and did not produce a working path.</t></td> | |||
<td>61</td> | ||||
</tr> | ||||
<t><list> | <tr> | |||
<t> In the unintended event that a Control Relay Server sends any HIP | <td><t>MESSAGE_NOT_RELAYED</t> | |||
message with a RVS_HMAC parameter, | <t>Used by a Control Relay Server to signal that it was not able or | |||
the Control Relay Client drops the received HIP message and sends a | willing to relay a HIP packet.</t></td> | |||
notify message back to the Control Relay Server using this notify type</t> | <td>62</td> | |||
</list></t> | </tr> | |||
</section> <!-- Notify Packet Types --> | <tr> | |||
<td><t>SERVER_REFLEXIVE_CANDIDATE_ALLOCATION_FAILED</t> | ||||
<t>Used by a Data Relay Server to signal that it was not able or | ||||
willing to allocate a new server-reflexive candidate for the Data | ||||
Relay Client.</t></td> | ||||
<td>63</td> | ||||
</tr> | ||||
<tr> | ||||
<section anchor="sec:udpesp" title="ESP Data Packets"> | <td><t>RVS_HMAC_PROHIBITED_WITH_RELAY</t> | |||
<t>In the unintended event that a Control Relay Server sends any HIP | ||||
message with an RVS_HMAC parameter, the Control Relay Client drops the | ||||
received HIP message and sends a notify message back to the Control | ||||
Relay Server using this notify type.</t></td> | ||||
<td>64</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>The format for ESP data packets is identical to Legacy ICE-HIP <xref target="RFC5770"/>.</t> | </section> | |||
<t> <xref target="RFC3948"/> describes the UDP encapsulation of the | <section anchor="sec_udpesp" numbered="true" toc="default"> | |||
<name>ESP Data Packets</name> | ||||
<t>The format for ESP data packets is identical to Legacy ICE-HIP | ||||
<xref target="RFC5770" format="default"/>.</t> | ||||
<t> <xref target="RFC3948" format="default"/> describes the UDP encapsul | ||||
ation of the | ||||
IPsec ESP transport and tunnel mode. On the wire, the HIP ESP packets | IPsec ESP transport and tunnel mode. On the wire, the HIP ESP packets | |||
do not differ from the transport mode ESP, and thus the encapsulation | do not differ from the transport mode ESP; thus, the encapsulation | |||
of the HIP ESP packets is same as the UDP encapsulation transport mode | of the HIP ESP packets is same as the UDP encapsulation transport mode | |||
ESP. However, the (semantic) difference to Bound End-to-End Tunnel | ESP. However, the (semantic) difference to Bound End-to-End Tunnel | |||
(BEET) mode ESP packets used by HIP is that IP header is not used in | (BEET) mode ESP packets used by HIP is that the IP header is not used in | |||
BEET integrity protection calculation.</t> | BEET integrity protection calculation.</t> | |||
<t> During the HIP base exchange, the two peers exchange parameters | <t> During the HIP base exchange, the two peers exchange parameters | |||
that enable them to define a pair of IPsec ESP security associations | that enable them to define a pair of IPsec ESP security associations | |||
(SAs) as described in <xref target="RFC7402"/>. When two peers perform | (SAs) as described in <xref target="RFC7402" format="default"/>. When tw | |||
a UDP-encapsulated base exchange, they MUST define a pair of IPsec SAs | o peers perform | |||
a UDP-encapsulated base exchange, they <bcp14>MUST</bcp14> define a pair | ||||
of IPsec SAs | ||||
that produces UDP-encapsulated ESP data traffic. </t> | that produces UDP-encapsulated ESP data traffic. </t> | |||
<t> The management of encryption/authentication protocols and SPIs is | <t> The management of encryption/authentication protocols and SPIs is | |||
defined in <xref target="RFC7402"/>. The UDP encapsulation format and | defined in <xref target="RFC7402" format="default"/>. The UDP | |||
processing of HIP ESP traffic is described in Section 6.1 of <xref | encapsulation format and processing of HIP ESP traffic is described in | |||
target="RFC7402"/>. </t> | <xref target="RFC7402" sectionFormat="of" section="6.1"/>. </t> | |||
<!-- | ||||
<t>It is worth noting that UDP encapsulation of ESP reduces | ||||
the MTU size of data plane by 8 bytes. | ||||
</t> | ||||
--> | ||||
</section> | </section> | |||
<section anchor="sec_relayed_address" numbered="true" toc="default"> | ||||
<section anchor="sec:relayed_address" | <name>RELAYED_ADDRESS and MAPPED_ADDRESS Parameters</name> | |||
title="RELAYED_ADDRESS and MAPPED_ADDRESS Parameters"> | <t>While the type values are new, the format of the RELAYED_ADDRESS | |||
and MAPPED_ADDRESS parameters (<xref target="fig_relayed_address" | ||||
<t>While the type values are new, the format of the RELAYED_ADDRESS and | format="default"/>) is identical to REG_FROM, RELAY_FROM, and RELAY_TO | |||
MAPPED_ADDRESS parameters | parameters. This document specifies only the use of UDP relaying; | |||
(<xref target="fig:relayed_address"/>) is identical to REG_FROM, | thus, only protocol 17 is allowed. However, future documents may | |||
RELAY_FROM and RELAY_TO parameters. This document specifies only the use | specify support for other protocols.</t> | |||
of | <figure anchor="fig_relayed_address"> | |||
UDP relaying, and, thus, only protocol 17 is allowed. However, future | <name>Format of the RELAYED_ADDRESS and MAPPED_ADDRESS Parameters</nam | |||
documents may specify support for other protocols.</t> | e> | |||
<artwork align="center" name="" type="" alt=""><![CDATA[ | ||||
<figure anchor="fig:relayed_address" | ||||
title="Format of the RELAYED_ADDRESS and MAPPED_ADDRESS Parameters"> | ||||
<artwork align="center"><![CDATA[ | ||||
0 1 2 3 | 0 1 2 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Type | Length | | | Type | Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Port | Protocol | Reserved | | | Port | Protocol | Reserved | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | |||
| Address | | | Address | | |||
| | | | | | |||
| | | | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
]]></artwork> | ||||
Type [TBD by IANA; | ||||
RELAYED_ADDRESS: 4650 | ||||
MAPPED_ADDRESS: 4660] | ||||
Length 20 | ||||
Port the UDP port number | ||||
Protocol IANA assigned, Internet Protocol number (17 for UDP) | ||||
Reserved reserved for future use; zero when sent, ignored | ||||
when received | ||||
Address an IPv6 address or an IPv4 address in "IPv4-Mapped | ||||
IPv6 address" format | ||||
]]></artwork> | ||||
</figure> | </figure> | |||
<!-- These parameters are not in the RVS and relaying range | <dl newline="false" spacing="normal" indent="12"> | |||
since they should be signed by the Relay Server --> | <dt>Type:</dt> | |||
<dd> | ||||
<dl newline="false" spacing="compact"> | ||||
<dt>RELAYED_ADDRESS:</dt> | ||||
<dd>4650</dd> | ||||
<dt>MAPPED_ADDRESS:</dt> | ||||
<dd>4660</dd> | ||||
</dl> | ||||
</dd> | ||||
<dt>Length:</dt> | ||||
<dd>20</dd> | ||||
<dt>Port:</dt> | ||||
<dd>The UDP port number</dd> | ||||
<dt>Protocol:</dt> | ||||
<dd>IANA-assigned, Internet Protocol number (17 for UDP)</dd> | ||||
<dt>Reserved:</dt> | ||||
<dd>Reserved for future use; zero when sent, ignored when received</dd> | ||||
<dt>Address:</dt> | ||||
<dd>An IPv6 address or an IPv4 address in "IPv4-mapped IPv6 address" | ||||
format</dd> | ||||
</dl> | ||||
</section> | </section> | |||
<section anchor="sec_peer_permission" numbered="true" toc="default"> | ||||
<section anchor="sec:peer_permission" | <name>PEER_PERMISSION Parameter</name> | |||
title="PEER_PERMISSION Parameter"> | ||||
<t> The format of the new PEER_PERMISSION parameter is shown in <xref | <t> The format of the new PEER_PERMISSION parameter is shown in <xref | |||
target="fig:peer_permission"/>. The parameter is used for setting up | target="fig_peer_permission" format="default"/>. The parameter is used | |||
and refreshing forwarding rules and the permissions for data packets at | for setting up and refreshing forwarding rules and the permissions for | |||
the Data Relay Server. The parameter contains one or more sets of Port, | data packets at the Data Relay Server. The parameter contains one or | |||
Protocol, Address, Outbound SPI (OSPI), and Inbound SPI (ISPI) | more sets of Port, Protocol, Address, Outbound SPI (OSPI), and Inbound | |||
values. One set defines a rule for one peer address. </t> | SPI (ISPI) values. One set defines a rule for one peer address. </t> | |||
<figure anchor="fig_peer_permission"> | ||||
<figure anchor="fig:peer_permission" | <name>Format of the PEER_PERMISSION Parameter</name> | |||
title="Format of the PEER_PERMISSION Parameter"> | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
<artwork align="center"><![CDATA[ | ||||
0 1 2 3 | 0 1 2 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Type | Length | | | Type | Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| RPort | PPort | | | RPort | PPort | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Protocol | Reserved | | | Protocol | Reserved | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | |||
skipping to change at line 2582 ¶ | skipping to change at line 2446 ¶ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | |||
| PAddress | | | PAddress | | |||
| | | | | | |||
| | | | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| OSPI | | | OSPI | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| ISPI | | | ISPI | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
]]></artwork> | ||||
Type [TBD by IANA; 4680] | ||||
Length 48 | ||||
RPort the transport layer (UDP) port at the Data Relay Server | ||||
(i.e. the port of the server reflexive candidate) | ||||
PPort the transport layer (UDP) port number of the peer | ||||
Protocol IANA assigned, Internet Protocol number (17 for UDP) | ||||
Reserved reserved for future use; zero when sent, ignored | ||||
when received | ||||
RAddress an IPv6 address, or an IPv4 address in "IPv4-Mapped | ||||
IPv6 address" format, of the server reflexive candidate | ||||
PAddress an IPv6 address, or an IPv4 address in "IPv4-Mapped | ||||
IPv6 address" format, of the peer | ||||
OSPI the outbound SPI value the Data Relay Client is using for | ||||
the peer | ||||
ISPI the inbound SPI value the Data Relay Client is using for | ||||
the peer | ||||
]]></artwork> | ||||
</figure> | </figure> | |||
</section> | <dl newline="false" spacing="normal" indent="12"> | |||
<dt>Type:</dt> | ||||
<section anchor="sec:con-check" title="HIP Connectivity Check Packets"> | <dd>4680</dd> | |||
<dt>Length:</dt> | ||||
<t>The connectivity request messages are HIP UPDATE packets containing a | <dd>48</dd> | |||
new | <dt>RPort:</dt> | |||
CANDIDATE_PRIORITY parameter (<xref target="fig:candidate_priority"/>). | <dd>The transport-layer (UDP) port at the Data Relay Server (i.e., the port | |||
Response UPDATE packets contain a MAPPED_ADDRESS parameter (<xref | of the server-reflexive candidate)</dd> | |||
target="fig:relayed_address"/>). </t> | <dt>PPort:</dt> | |||
<dd>The transport-layer (UDP) port number of the peer</dd> | ||||
<dt>Protocol:</dt> | ||||
<dd>IANA-assigned, Internet Protocol number (17 for UDP)</dd> | ||||
<dt>Reserved:</dt> | ||||
<dd>Reserved for future use; zero when sent, ignored when received</dd> | ||||
<dt>RAddress:</dt> | ||||
<dd>An IPv6 address, or an IPv4 address in "IPv4-mapped IPv6 address" | ||||
format, of the server-reflexive candidate</dd> | ||||
<dt>PAddress:</dt> | ||||
<dd>An IPv6 address, or an IPv4 address in "IPv4-mapped IPv6 address" | ||||
format, of the peer</dd> | ||||
<dt>OSPI:</dt> | ||||
<dd>The outbound SPI value the Data Relay Client is using for the peer</dd> | ||||
<dt>ISPI:</dt> | ||||
<dd>The inbound SPI value the Data Relay Client is using for the peer</dd> | ||||
</dl> | ||||
<figure anchor="fig:candidate_priority" | </section> | |||
title="Format of the CANDIDATE_PRIORITY Parameter"> | <section anchor="sec_con-check" numbered="true" toc="default"> | |||
<artwork align="center"><![CDATA[ | <name>HIP Connectivity Check Packets</name> | |||
<t>The connectivity request messages are HIP UPDATE packets containing | ||||
a new CANDIDATE_PRIORITY parameter (<xref | ||||
target="fig_candidate_priority" format="default"/>). Response UPDATE | ||||
packets contain a MAPPED_ADDRESS parameter (<xref | ||||
target="fig_relayed_address" format="default"/>). </t> | ||||
<figure anchor="fig_candidate_priority"> | ||||
<name>Format of the CANDIDATE_PRIORITY Parameter</name> | ||||
<artwork align="center" name="" type="" alt=""><![CDATA[ | ||||
0 1 2 3 | 0 1 2 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Type | Length | | | Type | Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Priority | | | Priority | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
]]></artwork> | ||||
Type [TBD by IANA; 4700] | ||||
Length 4 | ||||
Priority the priority of a (potential) peer reflexive candidate | ||||
]]></artwork> | ||||
</figure> | </figure> | |||
<dl newline="false" spacing="normal" indent="12"> | ||||
<dt>Type:</dt> | ||||
<dd>4700</dd> | ||||
<dt>Length:</dt> | ||||
<dd>4</dd> | ||||
<dt>Priority:</dt> | ||||
<dd>The priority of a (potential) peer-reflexive candidate</dd> | ||||
</dl> | ||||
</section> | </section> | |||
<section anchor="sec:nominate" title="NOMINATE parameter"> | <section anchor="sec_nominate" numbered="true" toc="default"> | |||
<name>NOMINATE Parameter</name> | ||||
<t><xref target="fig:nominate"/> shows the NOMINATE | <t><xref target="fig_nominate" format="default"/> shows the NOMINATE | |||
parameter that is used to conclude the candidate nomination | parameter that is used to conclude the candidate nomination | |||
process.</t> | process.</t> | |||
<figure anchor="fig_nominate"> | ||||
<figure anchor="fig:nominate" | <name>Format of the NOMINATE Parameter</name> | |||
title="Format of the NOMINATE Parameter"> | <artwork align="center" name="" type="" alt=""><![CDATA[ | |||
<artwork align="center"><![CDATA[ | ||||
0 1 2 3 | 0 1 2 3 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Type | Length | | | Type | Length | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Reserved | | | Reserved | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
]]></artwork> | ||||
Type [TBD by IANA; 4710] | ||||
Length 4 | ||||
Reserved Reserved for future extension purposes | ||||
]]></artwork> | ||||
</figure> | </figure> | |||
</section> | <dl newline="false" spacing="normal" indent="12"> | |||
<dt>Type:</dt> | ||||
<dd>4710</dd> | ||||
<dt>Length:</dt> | ||||
<dd>4</dd> | ||||
<dt>Reserved:</dt> | ||||
<dd>Reserved for future extension purposes</dd> | ||||
</dl> | ||||
</section> | ||||
</section> | </section> | |||
<!-- ***************************************************************** --> | <section> | |||
<name>IAB Considerations | ||||
<section title="Security Considerations"> | </name> | |||
<t>Since the control plane protocol and Control Relay Server are | <t>The ICE specification <xref target="RFC8445" format="default"/> discuss | |||
essentially the same (with some minor differences) in this | es | |||
document as in Legacy ICE-HIP <xref target="RFC5770"/>, the | "Unilateral Self-Address Fixing" in Section <xref target="RFC8445" | |||
same security considerations (in <xref target="sec:privacy" />, <xref targ | sectionFormat="bare" section="18"/>. This protocol is based on ICE; thus, | |||
et="sec:opportunistic" />, <xref target="sec:bex_replay" /> and <xref target="se | the same considerations also apply here. | |||
c:demux" />,) are still | ||||
valid, but are repeated here for the sake of completeness. | ||||
New security considerations related to the new Data Relay Server are discu | ||||
ssed in <xref target="sec:reuse"/>, and considerations related to the new | ||||
connectivity check protocol are discussed in <xref target="sec:amplificati | ||||
on" /> and <xref target="sec:conn_attack" />. | ||||
</t> | </t> | |||
</section> | ||||
<section anchor="sec:privacy" title="Privacy Considerations"> | <section numbered="true" toc="default"> | |||
<name>Security Considerations</name> | ||||
<!-- | ||||
<t> The locators are in plain text format in favor of inspection at | <t>Since the control plane protocol and Control Relay Server are | |||
HIP-aware middleboxes in the future. The current document does not speci | essentially the same (with some minor differences) in this document as | |||
fy | in Legacy ICE-HIP <xref target="RFC5770" format="default"/>, the same | |||
encrypted versions of LOCATOR_SETs, even though it could be beneficial f | security considerations (in Sections <xref target="sec_privacy" | |||
or | format="counter"/>, <xref target="sec_opportunistic" format="counter"/>, | |||
privacy reasons to avoid disclosing them to middleboxes. </t> | <xref target="sec_bex_replay" format="counter"/>, and <xref | |||
--> | target="sec_demux" format="counter"/>) are still valid, but are | |||
repeated here for the sake of completeness. New security considerations | ||||
related to the new Data Relay Server are discussed in <xref | ||||
target="sec_reuse" format="default"/>, and considerations related to the | ||||
new connectivity check protocol are discussed in Sections <xref | ||||
target="sec_amplification" format="counter"/> and <xref | ||||
target="sec_conn_attack" format="counter"/>.</t> | ||||
<section anchor="sec_privacy" numbered="true" toc="default"> | ||||
<name>Privacy Considerations</name> | ||||
<t> It is also possible that end-users may not want to reveal all | <t> It is also possible that end users may not want to reveal all | |||
locators to each other. For example, tracking the physical location of | locators to each other. For example, tracking the physical location of | |||
a multihoming end-host may become easier if it reveals all locators to | a multihoming end host may become easier if it reveals all locators to | |||
its peer during a base exchange. Also, revealing host addresses exposes | its peer during a base exchange. Also, revealing host addresses exposes | |||
information about the local topology that may not be allowed in all | information about the local topology that may not be allowed in all | |||
corporate environments. | corporate environments. | |||
For these two local policy reasons, it might be tempting exclude | For these two local policy reasons, it might be tempting to exclude | |||
certain host addresses from the LOCATOR_SET parameter of an end-host but | certain host addresses from the LOCATOR_SET parameter of an end host, bu | |||
this is NOT RECOMMENDED. | t | |||
<!-- but this requires further experimentation. --> | this is <bcp14>NOT RECOMMENDED</bcp14>. | |||
For instance, such | For instance, such | |||
behavior creates non-optimal paths when the hosts are located behind | behavior creates non-optimal paths when the hosts are located behind | |||
the same NAT. Especially, this could be problematic with a legacy NAT | the same NAT. Especially, this could be problematic with a legacy NAT | |||
that does not support routing from the private address realm back to | that does not support routing from the private address realm back to | |||
itself through the outer address of the NAT. This scenario is referred | itself through the outer address of the NAT. This scenario is referred | |||
to as the hairpin problem <xref target="RFC5128"/>. With such a legacy | to as the hairpin problem <xref target="RFC5128" format="default"/>. Wit h such a legacy | |||
NAT, the only option left would be to use a relayed transport address | NAT, the only option left would be to use a relayed transport address | |||
from an Data Relay Server.</t> | from a Data Relay Server.</t> | |||
<t> The use of Control and Data Relay Servers can also be useful for | ||||
<t> The use of Control and Data Relay Servers can be also useful for | privacy purposes. For example, a privacy-concerned Responder may reveal | |||
privacy purposes. For example, a privacy concerned Responder may reveal | ||||
only its Control Relay Server and Relayed candidates to Initiators. This | only its Control Relay Server and Relayed candidates to Initiators. This | |||
partially protects the Responder against Denial-of-Service (DoS) | partially protects the Responder against Denial-of-Service (DoS) | |||
attacks by allowing the Responder to initiate new connections even if | attacks by allowing the Responder to initiate new connections even if | |||
its relays would be unavailable due to a DoS attack. </t> | its relays would be unavailable due to a DoS attack. </t> | |||
</section> | ||||
</section> <!-- privacy --> | <section anchor="sec_opportunistic" numbered="true" toc="default"> | |||
<name>Opportunistic Mode</name> | ||||
<section anchor="sec:opportunistic" title="Opportunistic Mode"> | <t>In opportunistic HIP mode (cf. <xref target="RFC7401" | |||
sectionFormat="of" section="4.1.8"/>), an Initiator sends an I1 | ||||
<t>In opportunistic HIP mode (cf. Section 4.1.8 in <xref target="RFC7401 | without setting the destination HIT of the Responder (i.e., the | |||
" />), an Initiator sends an I1 with | Control Relay Client). A Control Relay Server <bcp14>SHOULD</bcp14> | |||
without setting the destination HIT of the Responder (i.e. the | have a unique IP address per the Control Relay Client when the Control | |||
Control Relay Client). A Control Relay Server SHOULD have a | ||||
unique IP address per Control Relay Client when the Control | ||||
Relay Server is serving more than one Control Relay Client and | Relay Server is serving more than one Control Relay Client and | |||
supports opportunistic mode. Otherwise, the Control Relay | supports opportunistic mode. Otherwise, the Control Relay Server | |||
Server cannot guarantee to deliver the I1 packet to the | cannot guarantee to deliver the I1 packet to the intended recipient. | |||
intended recipient. Future extensions of this document may | Future extensions of this document may allow opportunistic mode to be | |||
allow opportunistic mode to be used with non-unique IP | used with non-unique IP addresses to be utilized either as a HIP-level | |||
addresses to be utilized either as a HIP-level anycast or multicast | anycast or multicast mechanism. Both of the mentioned cases would | |||
mechanism. Both of the mentioned cases would require a separate registra | require separate registration parameters that the Control Relay | |||
tion | Server proposes and the Control Client Server accepts during | |||
parameters that the Control Relay Server proposes and the | registration.</t> | |||
Control Client Server accepts during registration.</t> | </section> | |||
</section> <!-- opportunistic --> | ||||
<section anchor="sec:bex_replay" title="Base Exchange Replay Protection fo | ||||
r Control Relay Server"> | ||||
<section anchor="sec_bex_replay" numbered="true" toc="default"> | ||||
<name>Base Exchange Replay Protection for Control Relay Server</name> | ||||
<t> In certain scenarios, it is possible that an attacker, or two | <t> In certain scenarios, it is possible that an attacker, or two | |||
attackers, can replay an earlier base exchange through a Control Relay S erver | attackers, can replay an earlier base exchange through a Control Relay S erver | |||
by masquerading as the original Initiator and Responder. The | by masquerading as the original Initiator and Responder. The | |||
attack does not require the attacker(s) to compromise the private | attack does not require the attacker(s) to compromise the private | |||
key(s) of the attacked host(s). However, for this attack to succeed, | key(s) of the attacked host(s). However, for this attack to succeed, | |||
the legitimate Responder has to be disconnected from the Control Relay S erver. </t> | the legitimate Responder has to be disconnected from the Control Relay S erver. </t> | |||
<t> The Control Relay Server can protect itself against replay attacks b y becoming | <t> The Control Relay Server can protect itself against replay attacks b y becoming | |||
involved in the base exchange by introducing nonces that the end-hosts | involved in the base exchange by introducing nonces that the end hosts | |||
(Initiator and Responder) are required to sign. One way to do this is | (Initiator and Responder) are required to sign. One way to do this is | |||
to add ECHO_REQUEST_M parameters to the R1 and I2 packets as described | to add ECHO_REQUEST_M parameters to the R1 and I2 packets as described | |||
in <xref target="I-D.heer-hip-middle-auth" /> and drop the I2 or R2 | in <xref target="I-D.heer-hip-middle-auth" format="default"/> and drop t he I2 or R2 | |||
packets if the corresponding ECHO_RESPONSE_M parameters are not | packets if the corresponding ECHO_RESPONSE_M parameters are not | |||
present. </t> | present. </t> | |||
</section> | </section> | |||
<section anchor="sec_demux" numbered="true" toc="default"> | ||||
<name>Demultiplexing Different HIP Associations</name> | ||||
<section anchor="sec:demux" title="Demultiplexing Different HIP Associatio | <t><xref target="RFC3948" sectionFormat="of" section="5.1"/> describes | |||
ns"> | a security issue for the UDP encapsulation in the standard IP tunnel | |||
mode when two hosts behind different NATs have the same private IP | ||||
<t> Section 5.1 of <xref target="RFC3948"/> describes a security issue | address and initiate communication to the same Responder in the public | |||
for the UDP encapsulation in the standard IP tunnel mode when two hosts | Internet. The Responder cannot distinguish between two hosts because | |||
behind different NATs have the same private IP address and initiate | security associations are based on the same inner IP addresses. </t> | |||
communication to the same Responder in the public Internet. The | ||||
Responder cannot distinguish between two hosts, because security | ||||
associations are based on the same inner IP addresses. </t> | ||||
<t> This issue does not exist with the UDP encapsulation of HIP ESP | <t> This issue does not exist with the UDP encapsulation of HIP ESP | |||
transport format because the Responder uses HITs to distinguish between | transport format because the Responder uses HITs to distinguish between | |||
different Initiators. </t> | different Initiators. </t> | |||
</section> | ||||
<section anchor="sec_reuse" numbered="true" toc="default"> | ||||
<name>Reuse of Ports at the Data Relay Server</name> | ||||
<t> If the Data Relay Server uses the same relayed address and port | ||||
(as conveyed in the RELAYED_ADDRESS parameter) for multiple Data Relay | ||||
Clients, it appears to all the peers, and their firewalls, that all | ||||
the Data Relay Clients are at the same address. Thus, a stateful | ||||
firewall may allow packets to pass from hosts that would not normally be | ||||
able to send packets to a peer behind the firewall. Therefore, a Data | ||||
Relay Server <bcp14>SHOULD NOT</bcp14> reuse the port numbers. If | ||||
port numbers need to be reused, the Data Relay Server | ||||
<bcp14>SHOULD</bcp14> have a sufficiently large pool of port numbers | ||||
and randomly select ports from the pool to decrease the chances of a | ||||
Data Relay Client obtaining the same address that another host | ||||
behind the same firewall is using. </t> | ||||
</section> | </section> | |||
<section anchor="sec:reuse" title="Reuse of Ports at the Data Relay Server | <section anchor="sec_amplification" numbered="true" toc="default"> | |||
"> | <name>Amplification Attacks</name> | |||
<t>A malicious host may send an invalid list of candidates to | ||||
<t> If the Data Relay Server uses the same relayed address and port (as | ||||
conveyed in the RELAYED_ADDRESS parameter) for multiple | ||||
Data Relay Clients, it appears to all the peers, and their firewalls, th | ||||
at | ||||
all the Data Relay Clients are at the same address. Thus, a | ||||
stateful firewall may allow packets pass from hosts that would not | ||||
normally be able to send packets to a peer behind the | ||||
firewall. Therefore, a Data Relay Server SHOULD NOT re-use the port | ||||
numbers. If port numbers need to be re-used, the Data Relay Server SHOUL | ||||
D have a | ||||
sufficiently large pool of port numbers and select ports from the pool | ||||
randomly to decrease the chances of a Data Relay Client obtaining the sa | ||||
me | ||||
address that a another host behind the same firewall is using. </t> | ||||
</section> <!-- Reuse of Ports at the Data Relay --> | ||||
<section anchor="sec:amplification" title="Amplification attacks"> | ||||
<t>A malicious host may send an invalid list of candidates to | ||||
its peer that are used for targeting a victim host by flooding | its peer that are used for targeting a victim host by flooding | |||
it with connectivity checks. To mitigate the attack, this | it with connectivity checks. To mitigate the attack, this | |||
protocol adopts the ICE mechanism to cap the total amount of | protocol adopts the ICE mechanism to cap the total amount of | |||
connectivity checks as defined in <xref | connectivity checks as defined in <xref target="sec_alternatives" | |||
target="sec:alternatives" />.</t> | format="default"/>.</t> | |||
</section> | ||||
</section> <!-- Amplification attacks --> | ||||
<section anchor="sec:conn_attack" title="Attacks against Connectivity Chec | ||||
ks and Candidate Gathering"> | ||||
<t>Section 19.2 in <xref target="RFC8445" /> | ||||
describes attacks against ICE connectivity checks. HIP | ||||
bases its control plane security on Diffie-Hellman key | ||||
exchange, public keys and Hashed Message Authentication codes, | ||||
meaning that the mentioned security concerns do not apply to | ||||
HIP either. The mentioned section discusses also of | ||||
man-in-the-middle replay attacks that are difficult to | ||||
prevent. The connectivity checks in this protocol are effectively immune | ||||
against replay attacks because a connectivity request includes | ||||
a random nonce that the recipient must sign and send back as a response. | ||||
</t> | ||||
<t>Section 19.3 in <xref target="RFC8445" /> | <section anchor="sec_conn_attack" numbered="true" toc="default"> | |||
describes attacks on server reflexive address | <name>Attacks against Connectivity Checks and Candidate Gathering</name> | |||
gathering. Similarly here, if the DNS, a Control Relay Server or a Data R | <t><xref target="RFC8445" sectionFormat="of" section="19.2"/> | |||
elay Server | describes attacks against ICE connectivity checks. HIP bases its | |||
control plane security on Diffie-Hellman key exchange, public keys, | ||||
and Hashed Message Authentication codes, meaning that the mentioned | ||||
security concerns do not apply to HIP either. The mentioned section | ||||
also discusses man-in-the-middle replay attacks that are difficult to | ||||
prevent. The connectivity checks in this protocol are effectively | ||||
immune against replay attacks because a connectivity request includes | ||||
a random nonce that the recipient must sign and send back as a | ||||
response. | ||||
</t> | ||||
<t><xref target="RFC8445" sectionFormat="of" section="19.3"/> | ||||
describes attacks on server-reflexive address | ||||
gathering. Similarly here, if the DNS, a Control Relay Server, or a Data | ||||
Relay Server | ||||
has been compromised, not much can be done. However, | has been compromised, not much can be done. However, | |||
the case where attacker can inject fake messages (located on a | the case where attackers can inject fake messages (located on a | |||
shared network segment like Wifi) does not apply here. HIP | shared network segment like Wi-Fi) does not apply here. HIP | |||
messages are integrity and replay protected, so it is not | messages are integrity and replay protected, so it is not | |||
possible inject fake server reflexive address candidates. | possible to inject fake server-reflexive address candidates. | |||
</t> | </t> | |||
<t><xref target="RFC8445" sectionFormat="of" section="19.4"/> | ||||
<t>Section 19.4 in <xref target="RFC8445" /> | ||||
describes attacks on relayed candidate gathering. Similarly to | describes attacks on relayed candidate gathering. Similarly to | |||
ICE TURN servers, Data Relay Server require an authenticated base | ICE TURN servers, a Data Relay Server requires an authenticated base | |||
exchange that protects relayed address gathering against fake | exchange that protects relayed address gathering against fake | |||
requests and responses. Further, replay attacks are not | requests and responses. Further, replay attacks are not | |||
possible because the HIP base exchange (and also UPDATE | possible because the HIP base exchange (and also UPDATE | |||
procedure) is protected against replay attacks. | procedure) is protected against replay attacks. | |||
</t> | </t> | |||
</section> | ||||
</section> <!-- Attacks against Connectivity Checks and Candidate Gatheri | ||||
ng --> | ||||
<section anchor="sec:cross_protocol" title="Cross-Protocol Attacks"> | ||||
<t><xref target="sec:registration"/> explains how a Control | ||||
Relay Client registers for the RELAY_UDP_HIP service from a | ||||
Control Relay Server. However, the same server may offer also | ||||
Rendezvous functionality, and, thus, a client can register | ||||
both to a RELAY_UDP_HIP and a RENDEZVOUS (see <xref | ||||
target="RFC8004"/>) service from the same server. Potentially, | ||||
this introduces a cross-protocol attack (or actually a | ||||
"cross-message" attack) because the key material is the same | ||||
for the Control Relay Service and Rendezvous HMACs. While the | ||||
problem could be avoided by deriving different keys for the | ||||
Control Relay Service, a more simple measure was chosen | ||||
because the exact attack scenario was unclear. Consequently, | ||||
this section defines a mandatory mitigation mechanism against | ||||
the cross-protocol attack that works by preventing the | ||||
simultanous use of Rendezvous and Control Relay Service in the | ||||
context of a single HIP Association.</t> | ||||
<t>The registration involves three parameters typically | <section anchor="sec_cross_protocol" numbered="true" toc="default"> | |||
delivered sequentally in R1 (REG_INFO parameter), I2 | <name>Cross-Protocol Attacks</name> | |||
(REG_REQUEST) and R2 (REG_RESPONSE) messages but can also be | <t><xref target="sec_registration" format="default"/> explains how a | |||
delivered in UPDATE messages as described in <xref target="RFC8003" />. T | Control Relay Client registers for the RELAY_UDP_HIP service from a | |||
he parameters and the | Control Relay Server. However, the same server may also offer | |||
Rendezvous functionality; thus, a client can register both to a | ||||
RELAY_UDP_HIP and a RENDEZVOUS (see <xref target="RFC8004" | ||||
format="default"/>) service from the same server. Potentially, this | ||||
introduces a cross-protocol attack (or actually a "cross-message" | ||||
attack) because the key material is the same for the Control Relay | ||||
Service and Rendezvous HMACs. While the problem could be avoided by | ||||
deriving different keys for the Control Relay Service, a more simple | ||||
measure was chosen because the exact attack scenario was | ||||
unclear. Consequently, this section defines a mandatory mitigation | ||||
mechanism against the cross-protocol attack that works by preventing | ||||
the simultaneous use of Rendezvous and Control Relay Service in the | ||||
context of a single HIP Association.</t> | ||||
<t>The registration involves three parameters typically | ||||
delivered sequentially in R1 (REG_INFO parameter), I2 | ||||
(REG_REQUEST), and R2 (REG_RESPONSE) messages but can also be | ||||
delivered in UPDATE messages as described in <xref target="RFC8003" | ||||
format="default"/>. The parameters and the | ||||
modifications to their processing are described below:</t> | modifications to their processing are described below:</t> | |||
<dl newline="false" spacing="normal"> | ||||
<dt>REG_INFO:</dt> | ||||
<dd>The Control Relay Server advertises its available services using | ||||
this parameter. RELAY_UDP_HIP and RENDEZVOUS services | ||||
<bcp14>MAY</bcp14> be included in the first advertisement for the | ||||
HIP association, but subsequent ones <bcp14>MUST</bcp14> include only | ||||
one of them as agreed in earlier registrations (see steps 2 and | ||||
3).</dd> | ||||
<dt>REG_REQUEST:</dt> | ||||
<dd>The Control Relay Client chooses the services it requires using | ||||
this parameter. If the Control Relay Server offered both RENDEZVOUS | ||||
or RELAY_UDP_HIP, the Control Relay Client <bcp14>MUST</bcp14> | ||||
choose only one of them in the REG_REQUEST parameter. Upon choosing | ||||
one of the two, it persists throughout the lifetime of the HIP | ||||
association, and the Control Relay Client <bcp14>MUST NOT</bcp14> | ||||
register the other remaining one in a subsequent UPDATE | ||||
message.</dd> | ||||
<dt>REG_RESPONSE:</dt> | ||||
<dd>The Control Relay Server verifies the services requested by the | ||||
Control Relay Client using this parameter. If the Control Relay | ||||
Server offered both RENDEZVOUS and RELAY_UDP_HIP service, and the | ||||
Control Relay Client requested for both of them, the Control Relay | ||||
Client <bcp14>MUST</bcp14> offer only RELAY_UDP_HIP service in the | ||||
REG_RESPONSE parameter and include a REG_FAILED parameter in the | ||||
same message, with RENDEZVOUS as the Registration Type and | ||||
9 as the Failure Type.</dd> | ||||
</dl> | ||||
<t>As a further measure against cross-protocol attacks, the Control Rela | ||||
y | ||||
Client <bcp14>MUST</bcp14> drop any HIP message that includes an | ||||
RVS_HMAC parameter when it originates from a successfully registered | ||||
Control Relay Server. Upon such an (unintended) event, the Control | ||||
Relay Client <bcp14>MUST</bcp14> send a NOTIFY message with | ||||
RVS_HMAC_PROHIBITED_WITH_RELAY as the Notify Message Type to the | ||||
Control Relay Server.</t> | ||||
</section> | ||||
</section> | ||||
<t><list style="numbers"> | <section anchor="sec_iana" numbered="true" toc="default"> | |||
<t>REG_INFO: the Control Relay Server advertizes its available services | <name>IANA Considerations</name> | |||
using this parameter. RELAY_UDP_HIP and RENDEZVOUS services MAY be included in | ||||
the first advertizement for the HIP association but subsequent ones MUST include | ||||
only one of them as agreed in earlier registrations (see steps 2 and 3).</t> | ||||
<t>REG_REQUEST: the Control Relay Client chooses the services it requir | ||||
es using this parameter. If the Control Relay Server offered both RENDEZVOUS or | ||||
RELAY_UDP_HIP, the Control Relay Client MUST choose only one of them in the REG_ | ||||
REQUEST parameter. Upon choosing one of of the two, it persists throughout the l | ||||
ifetime of the HIP association, and the Control Relay Client MUST NOT register t | ||||
he other remaining one in a subsequent UPDATE message.</t> | ||||
<t>REG_RESPONSE: the Control Relay Server verifies the services request | ||||
ed by the Control Relay Client using this parameter. If the Control Relay Server | ||||
offered both RENDEZVOUS and RELAY_UDP_HIP service, and the Control Relay Client | ||||
requested for both of them, the Control Relay Client MUST offer only RELAY_UDP_ | ||||
HIP service in the REG_RESPONSE parameter and include a REG_FAILED parameter in | ||||
the same message, with RENDEZVOUS as the Registration Type and [TBD by IANA: 9] | ||||
as the Failure Type.</t> | ||||
</list></t> | ||||
<t>As a further measure against cross-protocol attacks, | ||||
Control Relay Client MUST drop any HIP message that includes an | ||||
RVS_HMAC parameter when it originates from successfully | ||||
registered Control Relay Server. Upon such an (unintended) event, the Con | ||||
trol Relay Client | ||||
MUST send a NOTIFY message with RVS_HMAC_PROHIBITED_WITH_RELAY as the Not | ||||
ify Message Type to the Control Relay Server. | ||||
</t> | ||||
</section> <!-- Cross-Protocol Attacks --> | ||||
</section> <!-- security considerations --> | ||||
<!-- ***************************************************************** --> | ||||
<section title="IANA Considerations" anchor="sec:iana"> | ||||
<t> This section is to be interpreted according to <xref | <t> This section is to be interpreted according to <xref | |||
target="RFC8126"/>. </t> | target="RFC8126" format="default"/>. </t> | |||
<!-- | ||||
This document should also update the IANA port registry to add a | ||||
reference to this RFC-to-be to the existing entry for port 10500 | ||||
(eventually even with note that this RFC-to-be discusses how to | ||||
distinguish the services using NAT_TRAVERSAL_MODE) --> | ||||
<t>This document reuses the same default UDP port number 10500 | ||||
as specified by Legacy ICE-HIP <xref target="RFC5770"/> for | ||||
tunneling both HIP control plane and data plane traffic. | ||||
The port was was registered separately for RFC5770 to co-author Ari Kerane | ||||
n but should now be re-assigned for IESG | ||||
control. With the permission of Ari Keranen, the new assignee is IESG and | ||||
contact "chair@ietf.org". | ||||
In addition, IANA is requested to add a reference to this document in the | ||||
entry for UDP port 10500 in the Transport Protocol Port Number Registry. | ||||
The selection between Legacy ICE-HIP and Native ICE-HIP mode is negotiated | ||||
using NAT_TRAVERSAL_MODE parameter during the base exchange. | ||||
By default, hosts listen this port for incoming UDP datagrams and can use | ||||
it also for | ||||
sending UDP datagrams. Other emphemeral port numbers are negotiated and ut | ||||
ilized dynamically.</t> | ||||
<t> This document updates the IANA Registry for HIP Parameter Types <xref | ||||
target="RFC7401"/> by assigning new HIP Parameter Type | ||||
values for the new HIP Parameters: RELAYED_ADDRESS (length 20), MAPPED_ADD | ||||
RESS | ||||
(length 20, defined in <xref target="sec:relayed_address"/>), PEER_PERMISS | ||||
ION | ||||
(length 48, defined in <xref target="sec:peer_permission"/>), | ||||
CANDIDATE_PRIORITY (length 4, defined in <xref target="sec:con-check"/>) | ||||
and NOMINATE (length 4, defined in <xref target="sec:nominate"/>).</t> | ||||
<t> This document updates the IANA Registry for HIP NAT | ||||
traversal modes specified in Legacy ICE-HIP <xref target="RFC5770"/> by as | ||||
signing value for | ||||
the NAT traversal mode ICE-HIP-UDP (defined in <xref | ||||
target="sec:nat_tm-param"/>).</t> | ||||
<t>This document updates the IANA Registry for HIP Notify Message Types: | ||||
type field NAT_KEEPALIVE in <xref target="sec:keepalive"/>, a new error ty | ||||
pe | ||||
SERVER_REFLEXIVE_CANDIDATE_ALLOCATION_FAILED | ||||
and RVS_HMAC_PROHIBITED_WITH_RELAY in <xref target="sec:notify-types"/>. | ||||
.</t> | ||||
<t> This document defines additional registration types for the HIP | ||||
Registration Extension <xref target="RFC8003"/> that | ||||
allow registering with a Data Relay Server for ESP relaying service: | ||||
RELAY_UDP_ESP (defined in <xref target="sec:reg-types"/>, and performing | ||||
server reflexive candidate discovery: CANDIDATE_DISCOVERY (defined in | ||||
<xref target="sec:gathering"/>).</t> | ||||
<t>This document defines an additional Registration Failure | ||||
Type as defined in <xref target="sec:cross_protocol" />. The value is [TBD | ||||
by IANA: 9] and the Registration Failure | ||||
Type is "Simultaneous Rendezvous and Control Relay Service usage prohibite | ||||
d".</t> | ||||
<t>ICE specification <xref target="RFC8445" /> discusses "Unilateral Self- | ||||
Address Fixing" | ||||
in section 18. This | ||||
protocol is based on ICE, and thus the same considerations apply | ||||
also here. <!-- with one exception: this protocol does not hide binary | ||||
IP addresses from application-level gateways. (xx fix: assuming that we sw | ||||
itch to encrypted addresses) --></t> | ||||
</section> <!-- IANA --> | ||||
<!-- ***************************************************************** --> | ||||
<section title="Contributors"> | ||||
<!-- <t> This RFC is a product of a design team that also included Marcelo | ||||
Bagnulo and Philip Matthews, who both have made major contributions to | ||||
this document. </t> --> | ||||
<t> | ||||
Marcelo Bagnulo, Philip Matthews and Hannes Tschofenig have contributed | ||||
to <xref target="RFC5770" />. This document leans heavily on the work in t | ||||
he RFC. | ||||
</t> | ||||
</section> | <t>This document reuses the same default UDP port number 10500 as | |||
specified by Legacy ICE-HIP <xref target="RFC5770" format="default"/> | ||||
for tunneling both HIP control and data plane traffic. The port was | ||||
registered separately for <xref target="RFC5770" format="default"/> to | ||||
coauthor <contact fullname="Ari Keränen"/> originally, but it has been | ||||
reassigned for IESG control. With the permission of <contact | ||||
fullname="Ari Keränen"/>, the new assignee is the IESG and the contact | ||||
is <chair@ietf.org>. In addition, IANA has added a reference to | ||||
this document in the entry for UDP port 10500 in the "Service Name and | ||||
Transport Protocol Port Number Registry". The selection between Legacy | ||||
ICE-HIP and Native ICE-HIP mode is negotiated using the | ||||
NAT_TRAVERSAL_MODE parameter during the base exchange. By default, hosts | ||||
listen to this port for incoming UDP datagrams and can also use it for | ||||
sending UDP datagrams. Other ephemeral port numbers are negotiated and | ||||
utilized dynamically.</t> | ||||
<!-- contributors --> | <t>IANA has assigned the following values in the HIP "Parameter Types" reg | |||
istry | ||||
<xref target="RFC7401" format="default"/>: | ||||
4650 for RELAYED_ADDRESS (length 20), | ||||
4660 for MAPPED_ADDRESS (length 20; defined in <xref target="sec_relayed_a | ||||
ddress" | ||||
format="default"/>), | ||||
4680 for PEER_PERMISSION (length 48; defined in <xref | ||||
target="sec_peer_permission" format="default"/>), | ||||
4700 for CANDIDATE_PRIORITY | ||||
(length 4; defined in <xref target="sec_con-check" format="default"/>), an | ||||
d | ||||
4710 for NOMINATE (length 4; defined in <xref target="sec_nominate" | ||||
format="default"/>).</t> | ||||
<!-- *************************************************************** --> | <t>IANA has assigned the following value in the "HIP NAT Traversal Modes" | |||
registry specified in Legacy ICE-HIP <xref target="RFC5770" format="defaul | ||||
t"/>: | ||||
3 for ICE-HIP-UDP (defined in <xref | ||||
target="sec_nat_tm-param" format="default"/>).</t> | ||||
<section title="Acknowledgments"> | <t>IANA has assigned the following values in the HIP "Notify Message Types | |||
" registry: | ||||
16385 for NAT_KEEPALIVE in <xref target="sec_keepalive" | ||||
format="default"/>, 63 for | ||||
SERVER_REFLEXIVE_CANDIDATE_ALLOCATION_FAILED in <xref target="sec_notify-t | ||||
ypes" | ||||
format="default"/>, and 64 for | ||||
RVS_HMAC_PROHIBITED_WITH_RELAY in <xref target="sec_notify-types" | ||||
format="default"/>.</t> | ||||
<t>Thanks to Jonathan Rosenberg, Christer Holmberg and the rest of the MMU | <t> IANA has assigned the following values in the "Registration Types" reg | |||
SIC WG folks for | istry for the HIP | |||
the excellent work on ICE. The authors would like to thank also | Registration Extension <xref target="RFC8003" format="default"/>: | |||
Andrei Gurtov, Simon Schuetz, Martin Stiemerling, Lars Eggert, Vivien | 3 for RELAY_UDP_ESP (defined in <xref target="sec_reg-types" | |||
Schmitt, and Abhinav Pathak for their contributions and Tobias Heer, Teemu | format="default"/>) for allowing registration with a Data Relay Server for | |||
Koponen, Juhana Mattila, Jeffrey M. Ahrenholz, Kristian Slavov, Janne | ESP-relaying service, and | |||
Lindqvist, Pekka Nikander, Lauri Silvennoinen, Jukka Ylitalo, Juha | 4 for CANDIDATE_DISCOVERY (defined in <xref target="sec_gathering" | |||
Heinanen, Joakim Koskela, Samu Varjonen, Dan Wing, Tom Henderson, Alex Els | format="default"/>) for performing server-reflexive candidate discovery.</ | |||
ayed, Jani Hautakorpi, Tero Kauppinen and Timo Simanainen for | t> | |||
their comments to <xref target="RFC5770" /> and this document. | ||||
Thanks for Eric Vyncke, Alvaro Retana, Adam Roach, Ben Campbell, Eric Resc | ||||
orla, Mirja Kuhlewind, Spencer Dawkins, Derek Fawcus, | ||||
Tianran Zhou, Amanda Barber, Colin Perkins, Roni Even, Alissa Cooper, Carl | ||||
Wallace, Martin Duke and Benjamin Kaduk for reviewing this document. | ||||
</t> | ||||
<t>This work has been partially funded by CyberTrust programme | <t>IANA has assigned one value in the "Registration Failure Types" registr | |||
by Digile/Tekes in Finland.</t> | y as | |||
defined in <xref target="sec_cross_protocol" format="default"/>. The | ||||
value is 9, and the Registration Failure Type is | ||||
"Simultaneous Rendezvous and Control Relay Service usage | ||||
prohibited".</t> | ||||
</section> | </section> | |||
<!-- Acknowlegements --> | ||||
<!-- *************************************************************** --> | ||||
</middle> | </middle> | |||
<back> | <back> | |||
<displayreference target="I-D.rosenberg-mmusic-ice-nonsip" to="ICE-NONSIP"/> | ||||
<displayreference target="I-D.heer-hip-middle-auth" to="HIP-MIDDLEBOXES"/> | ||||
<references title="Normative References"> | <references> | |||
<name>References</name> | ||||
<?rfc include="reference.RFC.2119" ?> | <references> | |||
<?rfc include="reference.RFC.8174" ?> | <name>Normative References</name> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
<?rfc include="reference.RFC.7401" ?> | FC.2119.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
<?rfc include="reference.RFC.8003" ?> | FC.8174.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
<?rfc include="reference.RFC.8004" ?> | FC.7401.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
<?rfc include="reference.RFC.8046" ?> | FC.8003.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
<?rfc include="reference.RFC.8047" ?> | FC.8004.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
<!-- <?rfc include="reference.I-D.ietf-mmusic-ice" ?> --> | FC.8046.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
<!-- XX FIXME: update these references when the individual RFCs are published -- | FC.8047.xml"/> | |||
> | ||||
<!-- <?rfc include="reference.I-D.ietf-behave-turn" ?> --> | ||||
<!-- XX FIXME: move RFC5770 to informative references? --> | ||||
<?rfc include="reference.RFC.5389" ?> | ||||
<?rfc include="reference.RFC.7402" ?> | ||||
<?rfc include="reference.RFC.4291" ?> | ||||
<?rfc include="reference.RFC.8126" ?> | ||||
<?rfc include="reference.RFC.8445" ?> <!-- former reference.I-D.ietf-ice-r | ||||
fc5245bis --> | ||||
<?rfc include="reference.RFC.7050" ?> | ||||
<?rfc include="reference.RFC.8005" ?> | ||||
<?rfc include="reference.RFC.1063" ?> | ||||
<?rfc include="reference.RFC.8201" ?> | ||||
<?rfc include="reference.RFC.5770" ?> | ||||
<?rfc include="reference.I-D.ietf-tcpm-rto-consider.xml" ?> | ||||
</references> | ||||
<references title="Informative References"> | ||||
<!--<?rfc include="reference.RFC.4423" ?> --> | ||||
<?rfc include="reference.I-D.ietf-hip-rfc4423-bis.xml"?> | ||||
<?rfc include="reference.RFC.2475" ?> | ||||
<?rfc include="reference.RFC.5207" ?> | ||||
<!-- <?rfc include="reference.RFC.6336" ?> --> | ||||
<?rfc include="reference.I-D.rosenberg-mmusic-ice-nonsip" ?> | ||||
<?rfc include="reference.RFC.6538" ?> | ||||
<!-- | ||||
<reference anchor='MMUSIC-ICE'> | ||||
<front> | ||||
<title>Guidelines for Usage of Interactive Connectivity Establishment (ICE) by n | ||||
on Session Initiation Protocol (SIP) Protocols</title> | ||||
<author initials='J' surname='Rosenberg' fullname='Jonathan Rosenberg'> | ||||
<organization /> | ||||
</author> | ||||
<date month='July' day='14' year='2008' /> | ||||
<abstract><t>Interactive Connectivity Establishment (ICE) has been specified as | ||||
a NAT traversal mechanism for protocols based on the offer/answer exchange model | ||||
. In practice, only the Session Initiation Protocol (SIP) has used ICE. This d | ||||
ocument provides guidance on how other protocols can make use of ICE.</t></abstr | ||||
act> | ||||
</front> | ||||
<seriesInfo name='Work in' value='Progress' /> | ||||
</reference> | ||||
<!-- <?rfc include="reference.RFC.4787" ?> --> | ||||
<?rfc include="reference.RFC.5128" ?> | ||||
<?rfc include="reference.I-D.heer-hip-middle-auth" ?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | |||
<!-- | C.8489.xml"/> | |||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.7402.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.4291.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8126.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8445.xml"/> | ||||
<reference anchor='HIP-MIDDLE'> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | |||
<front> | .7050.xml"/> | |||
<title>End-Host Authentication for HIP Middleboxes</title> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
FC.8005.xml"/> | ||||
<author initials='T' surname='Heer' fullname='Tobias Heer'> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
<organization /> | FC.1191.xml"/> | |||
</author> | ||||
<author initials='K' surname='Wehrle' fullname='Klaus Wehrle'> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
<organization /> | FC.8201.xml"/> | |||
</author> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
FC.5770.xml"/> | ||||
<author initials='M' surname='Komu' fullname='Miika Komu'> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RF | |||
<organization /> | C.8961.xml"/> | |||
</author> | ||||
<date month='February' day='27' year='2009' /> | </references> | |||
<references> | ||||
<name>Informative References</name> | ||||
<abstract><t>The Host Identity Protocol [RFC7401] is a signaling protocol for se | <!-- reference.I-D.ietf-hip-rfc4423-bis.xml --> | |||
cure communication, mobility, and multihoming that introduces a cryptographic na | <reference anchor="RFC9068" target="https://www.rfc-editor.org/info/rfc9068"> | |||
mespace. This document specifies an extension for HIP that enables middleboxes | ||||
to unambiguously verify the identities of hosts that communicate across them. T | ||||
his extension allows middleboxes to verify the liveness and freshness of a HIP a | ||||
ssociation and, thus, to secure access control in middleboxes.</t></abstract> | ||||
</front> | <front> | |||
<title>Host Identity Protocol Architecture</title> | ||||
<seriesInfo name='Work in' value='Progress' /> | <author initials="R." surname="Moskowitz" fullname="Robert Moskowitz" rol | |||
e="editor"> | ||||
<organization /> | ||||
</author> | ||||
<author initials="M." surname="Komu" fullname="Miika Komu"> | ||||
<organization /> | ||||
</author> | ||||
</reference> | <date month="June" year="2021" /> | |||
</front> | ||||
<seriesInfo name="RFC" value="9063" /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC9068"/> | ||||
<?rfc include="reference.RFC.3948" ?> | </reference> | |||
<?rfc include="reference.RFC.3264" ?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
FC.2475.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.5207.xml"/> | ||||
<?rfc include="reference.RFC.5245" ?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R FC.5245.xml"/> | |||
<?rfc include="reference.RFC.8750" ?> | <xi:include href="https://datatracker.ietf.org/doc/bibxml3/reference.I-D.r | |||
osenberg-mmusic-ice-nonsip.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.6538.xml"/> | ||||
<?rfc include="reference.I-D.ietf-tsvwg-datagram-plpmtud.xml"?> | <xi:include | |||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5128.xml | ||||
"/> | ||||
<?rfc include="reference.RFC.5766" ?> | <xi:include href="https://datatracker.ietf.org/doc/bibxml3/reference.I-D .heer-hip-middle-auth.xml"/> | |||
<?rfc include="reference.RFC.6146" ?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC | |||
.3948.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.3264.xml"/> | ||||
<?rfc include="reference.RFC.6147" ?> | <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | |||
FC.8750.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8899.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.8656.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.6146.xml"/> | ||||
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R | ||||
FC.6147.xml"/> | ||||
</references> | ||||
</references> | </references> | |||
<!-- ***************************************************************** --> | <section anchor="sec_selecting_pacing_value" numbered="true" toc="default"> | |||
<name>Selecting a Value for Check Pacing</name> | ||||
<section anchor="sec:selecting_pacing_value" | ||||
title="Selecting a Value for Check Pacing"> | ||||
<t> Selecting a suitable value for the connectivity check transaction | <t> Selecting a suitable value for the connectivity check transaction | |||
pacing is essential for the performance of connectivity check-based NAT | pacing is essential for the performance of connectivity check-based NAT | |||
traversal. The value should not be so small that the checks cause network | traversal. The value should not be so small that the checks cause | |||
congestion or overwhelm the NATs. On the other hand, a pacing value that | network congestion or overwhelm the NATs. On the other hand, a pacing | |||
is too high makes the checks last for a long time, thus increasing the | value that is too high makes the checks last for a long time, thus | |||
connection setup delay. </t> | increasing the connection setup delay. </t> | |||
<t> The Ta value may be configured by the user in environments where the | <t> The Ta value may be configured by the user in environments where the | |||
network characteristics are known beforehand. However, if the | network characteristics are known beforehand. However, if the | |||
characteristics are not known, it is recommended that the value is | characteristics are not known, it is recommended that the value is | |||
adjusted dynamically. In this case, it is recommended that the hosts | adjusted dynamically. In this case, it is recommended that the hosts | |||
estimate the round-trip time (RTT) between them and SHOULD set the minimum | estimate the round-trip time (RTT) between them, and they | |||
Ta | <bcp14>SHOULD</bcp14> set the minimum Ta value so that at most a single | |||
value so that at most a single connectivity check message is sent on every | connectivity check message is sent on every RTT. </t> | |||
RTT. </t> | ||||
<t> One way to estimate the RTT is to use the time that it takes for the | <t> One way to estimate the RTT is to use the time that it takes for the | |||
Control Relay Server registration exchange to complete; this would give an | Control Relay Server registration exchange to complete; this would give | |||
estimate on the registering host's access link's RTT. Also, the I1/R1 | an estimate on the registering host's access link's RTT. Also, the I1/R1 | |||
exchange could be used for estimating the RTT, but since the R1 can be | exchange could be used for estimating the RTT, but since the R1 can be | |||
cached in the network, or the relaying service can increase the delay | cached in the network, or the relaying service can increase the delay | |||
notably, this is not recommended. | notably, this is not recommended. In general, estimating RTT can be | |||
In general, estimating RTT can be difficult and error prone, thus | difficult and error prone; thus, the guidelines for choosing a Ta value | |||
the guidelines for choosing a Ta value in <xref target="sec:check_pacing_n | in <xref target="sec_check_pacing_neg" format="default"/> | |||
eg" /> | <bcp14>MUST</bcp14> be followed. </t> | |||
MUST be followed. | ||||
</t> | ||||
</section> | </section> | |||
<!-- | <section anchor="sec_ice_diff" numbered="true" toc="default"> | |||
<name>Differences with Respect to ICE</name> | ||||
<section title="Base Exchange through a Rendezvous Server"> | <t>Legacy ICE-HIP reuses the ICE/STUN/TURN protocol stack as it is. The | |||
benefits of such as an approach include the reuse of STUN/TURN | ||||
<t> When the Initiator looks up the information of the Responder from | infrastructure and possibly the reuse of existing software libraries, | |||
DNS, it is possible that it discovers a rendezvous server (RVS) record | but there are also drawbacks with the approach. For example, ICE is | |||
<xref target="RFC8004" />. In this case, if the Initiator uses NAT | meant for application-layer protocols, whereas HIP operates at layer 3.5 | |||
traversal methods described in this document, it MAY use its own HIP | between transport and network layers. This is particularly problematic | |||
Relay Server to forward HIP traffic to the rendezvous server. The | because the implementations employ kernel-space IPsec ESP as their data | |||
Initiator will send the I1 packet using its Control Relay Server server, w | plane: demultiplexing of incoming ESP, HIP, and TURN messages required | |||
hich will | the capturing of all UDP packets destined to port 10500 to the userspace | |||
then forward it to the RVS server of the Responder. In this case, the | (due to different, incompatible markers in ESP and STUN), thus causing | |||
value of the protocol field in the RELAY_TO parameter MUST be IP since | additional software complexity and an unnecessary latency/throughput | |||
RVS does not support UDP-encapsulated base exchange packets. The | bottleneck for the dataplane performance. It is also worth noting that | |||
Responder will send the R1 packet directly to the Initiator's Control Rela | the demultiplexing of STUN packets in the kernel would also incur a | |||
y Server | performance impact (albeit smaller than with userspace demultiplexing), | |||
server and the following I2 and R2 packets are also sent directly using | and secure verification of STUN messages would require communication | |||
the relay. </t> | between the kernel-space STUN detector and HIP daemon typically residing | |||
in the userspace (thus again increasing the performance overhead).</t> | ||||
<t> In case the Initiator is not able to distinguish which records are | <t>Legacy ICE-HIP also involves some other complexities when compared to | |||
RVS address records and which are Responder's address records (e.g., if | the approach taken in this document. The relaying of ESP packets via | |||
the DNS server did not support HIP extensions), the Initiator SHOULD | TURN relays was not considered that simple because TURN relays require | |||
first try to contact the Responder directly, without using a Control Relay | adding and removing extra TURN framing for the relayed packets. Finally, | |||
Server | the developers of the two Legacy ICE-HIP implementations concluded that | |||
server. If none of the addresses are reachable, it MAY try them out using | ||||
its own Control Relay Server server as described above. </t> | ||||
</section> --> <!-- Base Exchange through a Rendezvous Server --> | ||||
<section anchor="sec:ice_diff" title="Differences with respect to ICE"> | ||||
<t>Legacy ICE-HIP reuses ICE/STUN/TURN protocol stack as it | effort needed for integrating an ICE library into a HIP implementation turned | |||
is. The benefits of such as an approach include the reuse of | out to be quite a bit higher than initially estimated. Also, the amount of | |||
STUN/TURN infrastructure and possibly the reuse of existing | extra code (some 10 kLoC) needed for all the new parsers, state machines, | |||
software libraries, but there are also drawbacks with the | etc., was quite high and by reusing the HIP code, one should be able to do | |||
approach. For example, ICE is meant for application-layer | with much less. This should result in smaller binary size, less bugs, and | |||
protocols, whereas HIP operates at layer 3.5 between transport | easier debugging. | |||
and network layers. This is particularly problematic because the | ||||
implementations employ kernelspace IPsec ESP as their data plane: | ||||
demultiplexing of incoming ESP, HIP and TURN messages required | ||||
capturing of all UDP packets destined to port 10500 to the | ||||
userspace (due to different, incompatible markers in ESP and STUN), thus c | ||||
ausing additional software complexity and an | ||||
unnecessary latency/throughput bottleneck for the dataplane | ||||
performance. It is also worth noting that demultiplexing of STUN packets | ||||
in the kernel would incur an also a performance impact (albeit | ||||
smaller than with userspace demultiplexing), and secure verification of | ||||
STUN messages would require communication between the kernelspace STUN det | ||||
ector | ||||
and HIP daemon typically residing in the userspace (thus, again increasing | ||||
the performance overhead). | ||||
</t> | ||||
<t>Legacy ICE-HIP involves also some other complexities when compared to t | </t> | |||
he approach | <t> Consequently, the HIP working group decided to follow ICE | |||
taken in this document. | methodology but reuse HIP messaging format to achieve the same | |||
Relaying of ESP packets via TURN relays was not considered that simple bec | functionality as ICE; the result of that is this document, which | |||
ause | specifies the Native ICE-HIP protocol. | |||
TURN relays require adding and removing extra TURN framing for the | ||||
relayed packets. Finally, the developers of the two Legacy ICE-HIP | ||||
implementations concluded that "effort needed for integrating an ICE | ||||
library into a HIP implementation turned out to be quite a bit | ||||
higher that initially estimated. Also, the amount of extra code | ||||
(some 10 kLoC) needed for all the new parsers, state machines, | ||||
etc., is quite high and by re-using the HIP code one should be | ||||
able to do with much less. This should result in smaller binary | ||||
size, less bugs, and easier debugging.". Consequently, the HIP | ||||
working group decided to follow ICE methodology but reuse HIP | ||||
messaging format to achieve the same functionality as ICE, and | ||||
consequently the result is this document that specifies the Native ICE-HIP | ||||
protocol. | ||||
</t> | </t> | |||
<t>The Native ICE-HIP protocol specified in this document follows the sema ntics | <t>The Native ICE-HIP protocol specified in this document follows the sema ntics | |||
of ICE as close as possible, and most of the differences are | of ICE as close as possible, and most of the differences are | |||
syntactical due to the use of a different protocol. In this | syntactical due to the use of a different protocol. In this | |||
section, we describe the differences to the ICE protocol.</t> | section, we describe the differences to the ICE protocol.</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li>ICE operates at the application layer, whereas this | |||
<t>ICE operates at the application layer, whereas this | ||||
protocol operates between transport and network layers, thus | protocol operates between transport and network layers, thus | |||
hiding the protocol details from the application.</t> | hiding the protocol details from the application.</li> | |||
<li>The STUN protocol is not employed. Instead, Native ICE-HIP | ||||
<t>The STUN protocol is not employed. Instead, native ICE-HIP | reuses the HIP control plane format in order to simplify | |||
reuses the HIP control plane format in order simplify | the demultiplexing of different protocols. For example, the STUN | |||
demultiplexing of different protocols. For example, the STUN | ||||
binding response is replaced with a HIP UPDATE message | binding response is replaced with a HIP UPDATE message | |||
containing an ECHO_REQUEST_SIGNED parameter and the STUN | containing an ECHO_REQUEST_SIGNED parameter and the STUN | |||
binding response with a HIP UPDATE message containing an | binding response with a HIP UPDATE message containing an | |||
ECHO_RESPONSE_SIGNED parameter as defined in <xref | ECHO_RESPONSE_SIGNED parameter as defined in <xref | |||
target="sec:conn_checks" />. It is worth noting that a | target="sec_conn_checks" format="default"/>. It is worth noting that | |||
a | ||||
drawback of not employing STUN is that discovery of the address | drawback of not employing STUN is that discovery of the address | |||
candidates requires creating (using HIP base exchange) and | candidates requires creating (using HIP base exchange) and | |||
maintaining (using HIP UPDATE procedures) state at the Control Relay Clie nt and | maintaining (using HIP UPDATE procedures) state at the Control Relay Clie nt and | |||
Control Relay Server. Future extensions to this document may define | Control Relay Server. Future extensions to this document may define | |||
a stateless, HIP-specific mechanism for an end-host to discover its addre | a stateless, HIP-specific mechanism for an end host to discover its addre | |||
ss candidates. | ss candidates. | |||
</t> | </li> | |||
<li>The TURN protocol is not utilized. Instead, Native ICE-HIP reuses | ||||
<t>The TURN protocol is not utilized. Instead, native ICE-HIP reuses | Control Relay Servers for the same purpose.</li> | |||
Control Relay Servers for the same purpose.</t> | <li>ICMP errors may be used in ICE to signal failure. In the Native ICE- | |||
HIP | ||||
<t>ICMP errors may be used in ICE to signal failure. In Native ICE-HIP | protocol, HIP NOTIFY messages are used instead.</li> | |||
protocol, HIP NOTIFY messages are used instead.</t> | <li>Instead of the ICE username fragment and password mechanism for | |||
credentials, Native ICE-HIP uses the HIT, derived from a public key, | ||||
<t>Instead of the ICE username fragment and password mechanism | for the same purpose. The username fragments are "transient host | |||
for credentials, native ICE-HIP uses the HIT, derived from a public key, | identifiers, bound to a particular session established as part of the | |||
for the same purpose. The username fragments are "transient | candidate exchange" <xref target="RFC8445" | |||
host identifiers, bound to a particular session established as | format="default"/>. Generally in HIP, a local public key and the | |||
part of the candidate exchange" <xref | derived HIT are considered long-term identifiers and invariant across | |||
target="RFC8445" />. Generally in HIP, a local public | different host associations and different transport-layer flows.</li> | |||
key and the derived HIT are considered long-term identifiers, | <li>In ICE, the conflict when two communicating endpoints take the | |||
and invariant across different host associations and different | same controlling role is solved using random values (a so-called | |||
transport-layer flows.</t> | tie-breaker value). In the Native ICE-HIP protocol, the conflict is solv | |||
ed | ||||
<t>In ICE, the conflict when two communicating end-points take | by the standard HIP base exchange procedure, where the host with the | |||
the same controlling role is solved using | "larger" HIT switches to the Responder role, thus also changing to | |||
random values (so called tie-breaker value). In Native ICE-HIP protocol, | the controlled role.</li> | |||
the conflict is solved by the | <li>The ICE-CONTROLLED and ICE-CONTROLLING attributes are not | |||
standard HIP base exchange procedure, where the host with the | ||||
"larger" HIT switches to Responder role, thus changing also to | ||||
controlled role.</t> | ||||
<t>The ICE-CONTROLLED and ICE-CONTROLLING attributes are not | ||||
included in the connectivity checks. | included in the connectivity checks. | |||
<!-- The attributes make it | ||||
easier to build gateways between different protocols using | ||||
ICE. -rosenberg-mmusic-ice-nonsip --></t> | ||||
<t>The foundation concept is unnecessary in native ICE-HIP | </li> | |||
<li>The foundation concept is unnecessary in Native ICE-HIP | ||||
because only a single UDP flow for the IPsec tunnel will be | because only a single UDP flow for the IPsec tunnel will be | |||
negotiated.</t> | negotiated.</li> | |||
<li>Frozen candidates are omitted for the same reason the | ||||
<t>Frozen candidates are omitted for the same reason as | foundation concept is excluded.</li> | |||
foundation concept is excluded.</t> | <li>Components are omitted for the same reason the | |||
foundation concept is excluded.</li> | ||||
<t>Components are omitted for the same reason as | ||||
foundation concept is excluded.</t> | ||||
<!-- XX FIXME: no lite mode anymore in ICE --> | ||||
<t>Native ICE-HIP supports only "full ICE" where the two | ||||
communicating hosts participate actively to the connectivity | ||||
checks, and the "lite" mode is not supported. This design | ||||
decision follows the guidelines of ICE which recommends full | ||||
ICE implementations. However, it should be noted that a | ||||
publicly reachable Responder may refuse to negotiate the ICE | ||||
mode as described in <xref target="sec:no_relay" />. This | ||||
would result in a <xref target="RFC7401" /> based HIP base | ||||
exchange tunneled over UDP followed ESP traffic over the same | ||||
tunnel, without the connectivity check procedures defined in | ||||
this document (in some sense, this mode corresponds to the | ||||
case where two ICE lite implementations connect since no | ||||
connectivity checks are sent).</t> | ||||
<t>As the "ICE lite" is not adopted here and both sides are | <li>Native ICE-HIP supports only "full ICE" where the two | |||
communicating hosts participate actively to the connectivity checks, | ||||
and the "lite" mode is not supported. This design decision follows | ||||
the guidelines of ICE, which recommends full ICE implementations. | ||||
However, it should be noted that a publicly reachable Responder may | ||||
refuse to negotiate the ICE mode as described in <xref | ||||
target="sec_no_relay" format="default"/>. This would result in a HIP | ||||
base exchange (as per <xref target="RFC7401" format="default"/>) | ||||
tunneled over UDP, followed by ESP traffic over the same tunnel, without | ||||
the connectivity check procedures defined in this document (in some | ||||
sense, this mode corresponds to the case where two ICE lite | ||||
implementations connect since no connectivity checks are sent).</li> | ||||
<li>As the "ICE lite" is not adopted here and both sides are | ||||
capable of ICE-HIP-UDP mode (negotiated during the base | capable of ICE-HIP-UDP mode (negotiated during the base | |||
exchange), default candidates are not employed in Native ICE-HIP.</t> | exchange), default candidates are not employed in Native ICE-HIP.</li> | |||
<li> If the agent is using Diffserv Codepoint markings <xref | ||||
<t> If the agent is using Diffserv Codepoint markings | target="RFC2475" format="default"/> in its media packets, it | |||
<xref target="RFC2475" /> in its media packets, it SHOULD apply those sam | <bcp14>SHOULD</bcp14> apply those same markings to its connectivity | |||
e | checks.</li> | |||
markings to its connectivity checks.</t> | ||||
<!-- <t>Unlike in ICE, the addresses are not XOR-ed in Native ICE-HIP | ||||
protocol in order to avoid middlebox tampering.</t> --> | ||||
<t>Unlike in ICE, the addresses are not XOR-ed in Native ICE-HIP | ||||
protocol but rather encrypted to avoid middlebox tampering.</t> | ||||
<t>Native ICE-HIP protocol does not employ the ICE related address and | ||||
related port attributes (that are used for diagnostic or SIP purposes).</ | ||||
t> | ||||
<t>Minimum RTO is 500 ms in ICE but 1000 ms in Native ICE-HIP protocol in | ||||
favor of <xref target="I-D.ietf-tcpm-rto-consider"/></t> | ||||
</list></t> | ||||
</section> <!-- ice diff --> | ||||
<section anchor="sec:hip_diff" title="Differences to Base Exchange and UPDAT | ||||
E procedures"> | ||||
<t>This section gives some design guidance for implementers how the extens | ||||
ions in | ||||
this protocol extend and differ from <xref target="RFC7401" /> and <xref | ||||
target="RFC8046" />.</t> | ||||
<t><list style="symbols"> | ||||
<t>Both control and data plane are operated on top of UDP, not directly o | <li>Unlike in ICE, the addresses are not XORed in the Native ICE-HIP | |||
n IP.</t> | protocol but rather encrypted to avoid middlebox tampering.</li> | |||
<t>A minimal implementation would conform only to <xref | <li>ICE defines Related Address and Port attributes used for diagnostic/SIP | |||
target="sec:minimal" /> or <xref target="sec:no_relay" />, | purposes, but the Native ICE-HIP protocol does not employ these attributes. | |||
thus merely tunneling HIP control and data traffic over | </li> | |||
UDP. The drawback here is that it works only in the limited | ||||
cases where the Responder has a public address.</t> | ||||
<t>It is worth noting that while a rendezvous server <xref | <li>The minimum RTO is 500 ms in ICE but 1000 ms in the Native ICE-HIP | |||
target="RFC8004" /> has not been designed to be | protocol in favor of <xref target="RFC8961" format="default"/>.</li> | |||
used in NATted scenarios because it just relays the first I1 | </ul> | |||
packet and does not employ UDP encapsulation, the Control Relay Server | </section> | |||
forwards all control traffic and, hence, is more suitable in | ||||
NATted environments. Further, the Data Relay Server | ||||
guarantees forwarding of data plane traffic also in the cases | ||||
when the NAT traversal procedures fail.</t> | ||||
<t>Registration procedures with a Control/Data Relay Server are similar a | <section anchor="sec_hip_diff" numbered="true" toc="default"> | |||
s | <name>Differences to Base Exchange and UPDATE Procedures</name> | |||
with rendezvous server. However, a Control/Data Relay Server has differen | <t>This section gives some design guidance for implementers on how the | |||
t | extensions in this protocol extend and differ from <xref | |||
registration parameters than rendezvous because it offers a | target="RFC7401" format="default"/> and <xref target="RFC8046" | |||
different service. Also, the Control/Data Relay Server includes also a RE | format="default"/>.</t> | |||
G_FROM | <ul spacing="normal"> | |||
parameter that informs the Control/Data Relay Client about its server ref | <li>Both the control and data plane are operated on top of UDP, not dire | |||
lexive | ctly on IP.</li> | |||
address. A Data Relay Server includes also a | <li>A minimal implementation would conform only to Sections <xref | |||
RELAYED_ADDRESS containing the relayed address for the | target="sec_minimal" format="counter"/> or <xref target="sec_no_relay" | |||
Data Relay Client.</t> | format="counter"/>, thus merely tunneling HIP control and data traffic | |||
over UDP. The drawback here is that it works only in the limited cases | ||||
where the Responder has a public address.</li> | ||||
<li>It is worth noting that while a Rendezvous Server <xref | ||||
target="RFC8004" format="default"/> has not been designed to be used | ||||
in NATed scenarios because it just relays the first I1 packet and does | ||||
not employ UDP encapsulation, the Control Relay Server forwards all | ||||
control traffic and, hence, is more suitable in NATed | ||||
environments. Further, the Data Relay Server guarantees forwarding of | ||||
data plane traffic also in cases where the NAT traversal procedures | ||||
fail.</li> | ||||
<t>In <xref target="RFC7401" />, the Initiator and Responder | <li>Registration procedures with a Control/Data Relay Server are | |||
similar as with a Rendezvous Server. However, a Control/Data Relay | ||||
Server has different registration parameters than a Rendezvous Server | ||||
because it offers a different service. Also, the Control/Data Relay | ||||
Server also includes a REG_FROM parameter that informs the | ||||
Control/Data Relay Client about its server-reflexive address. A Data | ||||
Relay Server also includes a RELAYED_ADDRESS containing the relayed | ||||
address for the Data Relay Client.</li> | ||||
<li>In <xref target="RFC7401" format="default"/>, the Initiator and Resp | ||||
onder | ||||
can start to exchange application payload immediately after | can start to exchange application payload immediately after | |||
the base exchange. While exchanging data immediately after a | the base exchange. While exchanging data immediately after a | |||
base exchange via a Data Control Relay would be possible also here, we | base exchange via a Data Control Relay would also be possible here, we | |||
follow the ICE methodology to establish a direct path between | follow the ICE methodology to establish a direct path between | |||
two hosts using connectivity checks. This means that there | two hosts using connectivity checks. This means that there | |||
will be some additional delay after the base exchange before | will be some additional delay after the base exchange before | |||
application payload can be transmitted. The same applies for | application payload can be transmitted. The same applies for | |||
the UPDATE procedure as the connectivity checks introduce some | the UPDATE procedure as the connectivity checks introduce some | |||
additional delay.</t> | additional delay.</li> | |||
<li>In HIP without any NAT traversal support, the base exchange | ||||
<t>In HIP without any NAT traversal support, the base exchange | ||||
acts as an implicit connectivity check, and the mobility and | acts as an implicit connectivity check, and the mobility and | |||
multihoming extensions support explicit connectivity | multihoming extensions support explicit connectivity | |||
checks. After a base exchange or UPDATE based connectivity | checks. After a base exchange or UPDATE-based connectivity | |||
checks, a host can use the associated address pair for | checks, a host can use the associated address pair for | |||
transmitting application payload. In this Native ICE-HIP extension, we fo llow | transmitting application payload. In this Native ICE-HIP extension, we fo llow | |||
the ICE methodology, where one end-point acting in the | the ICE methodology where one endpoint acting in the | |||
controlled role chooses the used address pair also on behalf | controlled role chooses the used address pair also on behalf | |||
of the other end-point acting in controlled role, which is | of the other endpoint acting in the controlled role, which is | |||
different from HIP without NAT traversal support. Another | different from HIP without NAT traversal support. Another | |||
difference is that the process of choosing an address pair is | difference is that the process of choosing an address pair is | |||
explicitly signaled using the nomination packets. The | explicitly signaled using the nomination packets. The | |||
nomination process in this protocol supports only single | nomination process in this protocol supports only a single | |||
address pair, and multihoming extensions are left for further | address pair, and multihoming extensions are left for further | |||
study.</t> | study.</li> | |||
<li>The UPDATE procedure resembles the mobility extensions | ||||
<t>The UPDATE procedure resembles the mobility extensions | defined in <xref target="RFC8046" format="default"/>. The | |||
defined in <xref target="RFC8046" />. The | ||||
first UPDATE message from the mobile host is exactly the same | first UPDATE message from the mobile host is exactly the same | |||
as in the mobility extensions. The second UPDATE message from | as in the mobility extensions. The second UPDATE message from | |||
the peer host and third from the mobile host are different in | the peer host and third from the mobile host are different in | |||
the sense that they merely acknowledge and conclude the | the sense that they merely acknowledge and conclude the | |||
reception of the candidates through the Control Relay Server. In other wo rds, | reception of the candidates through the Control Relay Server. In other wo rds, | |||
they do not yet test for connectivity (besides reachability | they do not yet test for connectivity (besides reachability | |||
through the Control Relay Server) unlike in the mobility extensions. The | through the Control Relay Server) unlike in the mobility extensions. The | |||
idea is that connectivity check procedure follows the ICE | idea is that the connectivity check procedure follows the ICE | |||
specification, which is somewhat different from the HIP | specification, which is somewhat different from the HIP | |||
mobility extensions.</t> | mobility extensions.</li> | |||
<li>The connectivity checks as defined in the mobility | ||||
<t>The connectivity checks as defined in the mobility | extensions <xref target="RFC8046" format="default"/> are | |||
extensions <xref target="RFC8046" /> are | ||||
triggered only by the peer of the mobile host. Since | triggered only by the peer of the mobile host. Since | |||
successful NAT traversal requires that both end-points test | successful NAT traversal requires that both endpoints test | |||
connectivity, both the mobile host and its peer host have to | connectivity, both the mobile host and its peer host have to | |||
test for connectivity. In addition, this protocol | test for connectivity. In addition, this protocol | |||
validates also the UDP ports; the ports in the connectivity | also validates the UDP ports; the ports in the connectivity | |||
check must match with the response, as required by ICE.</t> | check must match with the response, as required by ICE.</li> | |||
<li>In HIP mobility extensions <xref target="RFC8046" | ||||
<t>In HIP mobility extensions <xref | format="default"/>, an outbound locator has some associated state: | |||
target="RFC8046" />, an outbound locator has | UNVERIFIED means that the locator has not been tested for | |||
some associated state: UNVERIFIED mean that the locator has | reachability, ACTIVE means that the address has been verified for | |||
not been tested for reachability, ACTIVE means that the | reachability and is being used actively, and DEPRECATED means that the | |||
address has been verified for reachability and is being used | locator lifetime has expired. In the subset of ICE specifications used | |||
actively, and DEPRECATED means that the locator lifetime has | by this protocol, an individual address candidate has only two | |||
expired. In the subset of ICE specifications used by this | properties: type and priority. Instead, the actual state in ICE is | |||
protocol, an individual address candidate has only two | associated with candidate pairs rather than individual addresses. The | |||
properties: type and priority. Instead, the actual state in | subset of ICE specifications utilized by this protocol require the | |||
ICE is associated with candidate pairs rather than individual | following attributes for a candidate pair: valid bit, nominated bit, | |||
addresses. The subset of ICE specifications utilized by this | base, and the state of the connectivity check. The connectivity checks | |||
protocol require the following attributes for a candidate | have the following states: Waiting, In-progress, Succeeded, and | |||
pair: valid bit, nominated bit, base and the state of | Failed. Handling of this state attribute requires some additional | |||
connectivity check. The connectivity checks have the following | logic when compared to the mobility extensions, since the state is | |||
states: Waiting, In-progress, Succeeded and Failed. Handling | associated with a local-remote address pair rather than just a remote | |||
of this state attribute requires some additional logic when | address; thus, the mobility and ICE states do not have an unambiguous | |||
compared to the mobility extensions since the state is | one-to-one mapping. | |||
associated with a local-remote address pair rather just a | </li> | |||
remote address, and, thus, the mobility and ICE states | <li>Credit-based authorization as defined in <xref target="RFC8046" form | |||
do not have an unambiguous one-to-one mapping. | at="default"/> could be used before | |||
</t> | ||||
<t>Credit-based authorization as defined in <xref | ||||
target="RFC8046" /> could be used before | ||||
candidate nomination has been concluded upon discovering | candidate nomination has been concluded upon discovering | |||
working candidate pairs. However, this may result in the use | working candidate pairs. However, this may result in the use | |||
of asymmetric paths for a short time period in the beginning | of asymmetric paths for a short time period in the beginning | |||
of communications. Thus, support of credit-based authorization is left | of communications. Thus, support of credit-based authorization is left | |||
for further study.</t> | for further study.</li> | |||
</ul> | ||||
</list></t> | </section> | |||
</section> <!-- hip diff --> | ||||
<section anchor="sec:multihoming" title="Multihoming Considerations"> | ||||
<t>This document allows a host to collect address candidates | ||||
from multiple interfaces, but does not support activation and | ||||
the simultaneous use of multiple address candidates. While | ||||
multihoming extensions to support <xref target="RFC8047" /> like | ||||
functionality are left for further study and experimentation, we | ||||
envision here some potential compatibility improvements to | ||||
support multihoming:</t> | ||||
<t><list style="symbols"> | <section anchor="sec_multihoming" numbered="true" toc="default"> | |||
<name>Multihoming Considerations</name> | ||||
<t>This document allows a host to collect address candidates from | ||||
multiple interfaces but does not support activation and the simultaneous | ||||
use of multiple address candidates. While multihoming extensions to | ||||
support functionality similar to that found in <xref target="RFC8047" | ||||
format="default"/> are left for further study and experimentation, we | ||||
envision here some potential compatibility improvements to support | ||||
multihoming:</t> | ||||
<t>Data Relay Registration: a Data Relay Client acting as an | <dl newline="false" spacing="normal"> | |||
<dt>Data Relay Registration:</dt> | ||||
<dd>a Data Relay Client acting as an | ||||
Initiator with another peer host should register a new | Initiator with another peer host should register a new | |||
server reflexive candidate for each local transport address candidate. A | server-reflexive candidate for each local transport address candidate. A | |||
Data Relay Client acting as an Responder should register a new | Data Relay Client acting as a Responder should register a new | |||
server reflexive candidate for each { local transport address candidate, | server-reflexive candidate for each {local transport address candidate, | |||
new peer host} pair for the reasons described in <xref | new peer host} pair for the reasons described in <xref | |||
target="sec:conflicting" />. In both cases, the Data Relay Client should | target="sec_conflicting" format="default"/>. In both cases, the Data | |||
request the additional server reflexive candidates by sending UPDATE | Relay Client should | |||
request the additional server-reflexive candidates by sending UPDATE | ||||
messages originating from each of the local address candidates as | messages originating from each of the local address candidates as | |||
described in <xref target="sec:registration" />. As the | described in <xref target="sec_registration" format="default"/>. As the | |||
UPDATE messages are originating from an unknown location from the viewpo | UPDATE messages are originating from an unknown location from the | |||
int of the Data Relay Server, | viewpoint of the Data Relay Server, | |||
it must include also a ECHO_REQUEST_SIGNED in the response in order to t | it must also include an ECHO_REQUEST_SIGNED in the response in order to | |||
est for return routability. | test for return routability. </dd> | |||
</t> | <dt>Data Relay unregistration:</dt> | |||
<dd>This follows the procedure in <xref target="sec_protocol" | ||||
<t>Data Relay unregistration: this follows the procedure in | format="default"/>, but the Data Relay Client should unregister using | |||
<xref target="sec:protocol" /> but the Data Relay Client should unregiste | the particular transport address to be unregistered. All transport | |||
r | address pair registrations can be unregistered when no RELAYED_ADDRESS | |||
using the particular transport address to be unregistered. | parameter is included.</dd> | |||
All transport address pair registrations can be | <dt>PEER_PERMISSION parameter:</dt> | |||
unregistered when no RELAYED_ADDRESS parameter is | <dd>This needs to be extended or | |||
included.</t> | ||||
<t>PEER_PERMISSION parameter: this needs to be extended or | ||||
an additional parameter is needed to declare the specific local | an additional parameter is needed to declare the specific local | |||
candidate of the Data Relay Client. Alternatively, the use of | candidate of the Data Relay Client. Alternatively, the use of | |||
the PEER_PERMISSION could be used as a wild card to open permissions for | the PEER_PERMISSION could be used as a wild card to open permissions | |||
a specific peer to all | for a specific peer to all | |||
of the candidates of the Data Relay Client.</t> | of the candidates of the Data Relay Client.</dd> | |||
<dt>Connectivity checks:</dt> | ||||
<t>Connectivity checks: the controlling host should be able to | <dd>The controlling host should be able to | |||
nominate multiple candidates (by repeating step 7 in <xref | nominate multiple candidates (by repeating step 7 in <xref | |||
target="fig:cc1" /> in <xref target="sec:conn_checks" /> using the additi | target="fig_cc1" format="default"/> in <xref target="sec_conn_checks" | |||
onal candidate pairs).</t> | format="default"/> using the additional candidate pairs).</dd> | |||
<dt>Keepalives:</dt> | ||||
<t>Keepalives should be sent for all the nominated candidate | <dd>These should be sent for all the nominated candidate | |||
pairs. Similarly, the Control/Data Relay Client should send keepalives fr | pairs. Similarly, the Control/Data Relay Client should send keepalives | |||
om its local candidates | from its local candidates to its Control/Data Relay Server transport | |||
to its Control/Data Relay Server transport addresses.</t> | addresses.</dd> | |||
</dl> | ||||
</list></t> | </section> | |||
<section anchor="sec_dns" numbered="true" toc="default"> | ||||
</section> | <name>DNS Considerations</name> | |||
<t>This section updates <xref target="RFC5770" sectionFormat="of" | ||||
<section anchor="sec:dns" title="DNS Considerations"> | section="B"/>, which will be replaced with the mechanism described in | |||
this section.</t> | ||||
<t>This section updates <xref target="RFC5770" /> Appendix B | <t><xref target="RFC5770" format="default"/> did not specify how an | |||
which will be replaced with the mechanism described in this section.</t> | end host can look up another end host via DNS and initiate a UDP-based | |||
HIP base exchange with it, so this section makes an attempt to fill this | ||||
<t><xref target="RFC5770" /> did not specify how an end-host can | gap.</t> | |||
look up another end-host via DNS and initiate an UDP-based HIP | ||||
base exchange with it, so this section makes an attempt to | ||||
fill this gap. | ||||
</t> | ||||
<t><xref target="RFC8005" /> specifies how a HIP end-host and | <t><xref target="RFC8005" format="default"/> specifies how a HIP end | |||
its Rendezvous server is registered to DNS. Essentially, the | host and its Rendezvous Server is registered to DNS. Essentially, the | |||
public key of the end-host is stored as HI record and its | public key of the end host is stored as a HI record and its Rendezvous | |||
Rendezvous Server as A or AAAA record. This way, the Rendezvous | Server as an A or AAAA record. This way, the Rendezvous Server can act | |||
Server can act as an intermediary for the end-host and forward | as an intermediary for the end host and forward packets to it based on | |||
packets to it based on the DNS configuration. | the DNS configuration. The Control Relay Server offers similar | |||
Control Relay Server offers similar functionality as Rendezvous Server, wi | functionality to the Rendezvous Server, with the difference being that the | |||
th | Control Relay Server forwards all control messages, not just the first | |||
the difference that the Control Relay Server forwards all control messages | I1 message. | |||
, not just the first I1 message. | ||||
<!-- | ||||
The end-host has registered as a Rendezvous Client to the | ||||
Rendezvous server, so they share a Host Association with each | ||||
other and the end-host updates its locators to the Rendezvous | ||||
Server when it moves. This way, a new HIP base exchange destined | ||||
to the end-host is always delivered to the correct location | ||||
since the Rendezvous Server has always the up-to-date location | ||||
of the end-host. As an alternative the Rendezvous Server, the | ||||
DNS could be configured with actual IP addresses the end-host in | ||||
A and AAAA records. This works with static hosts, and in the | ||||
case of a mobile host, it can update its location using Dynamic | ||||
DNS <xref target="I-D.ietf-hip-rfc4423-bis" />. | ||||
--> | ||||
</t> | </t> | |||
<t> | <t> | |||
Prior to this document, the A and AAAA records in the DNS | Prior to this document, the A and AAAA records in the DNS | |||
refer either to the HIP end-host itself or a Rendezvous Server <xref targe t="RFC8005" />, | refer either to the HIP end host itself or a Rendezvous Server <xref targe t="RFC8005" format="default"/>, | |||
and control and data plane communication with the associated | and control and data plane communication with the associated | |||
host has been assumed to occur directly over IPv4 or | host has been assumed to occur directly over IPv4 or | |||
IPv6. However, this specification extends the records to be used for | IPv6. However, this specification extends the records to be used for | |||
UDP-based communications.</t> | UDP-based communications.</t> | |||
<t>Let us consider the case of a HIP Initiator with the default policy | ||||
to employ UDP encapsulation and the extensions defined in this document. | ||||
The Initiator looks up the Fully Qualified Domain Name (FQDN) of a | ||||
Responder, and retrieves its HI, A, and AAAA records. Since the default | ||||
policy is to use UDP encapsulation, the Initiator <bcp14>MUST</bcp14> | ||||
send the I1 message over UDP to destination port 10500 (either over IPv4 | ||||
in the case of an A record or over IPv6 in the case of an AAAA | ||||
record). It <bcp14>MAY</bcp14> send an I1 message both with and without | ||||
UDP encapsulation in parallel. | ||||
<t>Let us consider the case of a HIP Initiator with the default | In the case in which the Initiator receives R1 messages both with and with | |||
policy to employ UDP encapsulation and the extensions defined in this docu | out UDP | |||
ment. | encapsulation from the Responder, the Initiator <bcp14>SHOULD</bcp14> | |||
The Initiator looks up | ignore the R1 messages without UDP encapsulation. | |||
the FQDN of a Responder, and retrieves its HI, A and AAAA records. | ||||
Since the default policy is to use UDP encapsulation, the Initiator MUST s | ||||
end the I1 message over UDP to destination port 10500 | ||||
(either over IPv4 in the case of a A record or over IPv6 in the case of | ||||
a AAAA record). It MAY send an I1 message both with and without UDP encaps | ||||
ulation in parallel. | ||||
<!-- but, when | ||||
sending multiple I1 message, the Initiator SHOULD | ||||
wait for a small amount of time (a reasonable time may be | ||||
2 * expected RTT) after the first R1 reception to allow possibly | ||||
multiple R1s to arrive as described in section 4.1.4 in <xref target="RFC7 | ||||
401" />. --> | ||||
In the case the Initiator receives R1 messages both with and without UDP e | ||||
ncapsulation from the Responder, the Initiator SHOULD ignore the R1 messages wit | ||||
hout | ||||
UDP encapsulation. | ||||
<!-- | ||||
In the other case, the host sends the I1 directly over IPv4 in the case of | ||||
a | ||||
A-record or directly over IPv6 in the case of an AAAA-record as | ||||
specified in <xref target="RFC8005" />.--> | ||||
</t> | ||||
<t>The UDP encapsulated I1 packet could be received by three different | ||||
types of hosts: | ||||
</t> | </t> | |||
<t><list style="numbers"> | <t>The UDP-encapsulated I1 packet could be received by four different | |||
<t>HIP Control Relay Server: in this case the A/AAAA records refers to a | types of hosts: | |||
Control Relay Server, | ||||
and it will forward the packet to the corresponding Control Relay Client | ||||
based on the destination HIT in the I1 packet.</t> | ||||
<t>HIP Responder supporting UDP encapsulation: in this case, the A/AAAA r | ||||
ecords refers to the end-host. Assuming the destination HIT belongs to the Respo | ||||
nder, it receives and processes it according to the negotiated NAT traversal mec | ||||
hanism. The support for the protocol defined in this | ||||
document vs <xref target="RFC5770" /> is dynamically negotiated during the | ||||
base exchange. The details are specified in <xref target="sec:nat_traversa | ||||
l_mode"/>.</t> | ||||
<t>HIP Rendezvous Server: this entity is not listening to UDP port 10500, | ||||
so it will drop the I1 message.</t> | ||||
<t>HIP Responder not supporting UDP encapsulation: the targeted end-host | ||||
is not listening to UDP port 10500, so it will drop the I1 message.</t> | ||||
</list></t> | ||||
<t>The A/AAAA-record MUST NOT be configured to refer to a Data Relay Serve | ||||
r unless the host in question supports also Control Relay Server functionality. | ||||
</t> | </t> | |||
<dl newline="false" spacing="normal"> | ||||
<dt>HIP Control Relay Server:</dt> | ||||
<dd>In this case, the A/AAAA records refer to a Control Relay Server, | ||||
which will forward the packet to the corresponding Control Relay | ||||
Client based on the destination HIT in the I1 packet.</dd> | ||||
<dt>HIP Responder supporting UDP encapsulation:</dt> | ||||
<!-- | <dd>In this case, the A/AAAA records refer to the end host. Assuming | |||
<t>It is also worth mentioning that the Control Relay Server specification | the destination HIT belongs to the Responder, the Responder receives | |||
in this document and <xref target="RFC5770" /> | and processes the I1 packet according to the negotiated NAT traversal | |||
are compatible with each other. | mechanism. The support for the protocol defined in this document, as | |||
</t>--> | opposed to the support defined in <xref target="RFC5770" | |||
format="default"/>, is dynamically negotiated during the base | ||||
exchange. The details are specified in <xref | ||||
target="sec_nat_traversal_mode" format="default"/>.</dd> | ||||
<dt>HIP Rendezvous Server:</dt> | ||||
<dd>This entity is not listening to UDP port 10500, so it will drop | ||||
the I1 message.</dd> | ||||
<dt>HIP Responder not supporting UDP encapsulation:</dt> | ||||
<dd>The targeted end host is not listening to UDP port 10500, so it | ||||
will drop the I1 message.</dd> | ||||
</dl> | ||||
<t>The A/AAAA record <bcp14>MUST NOT</bcp14> be configured to refer to a | ||||
Data Relay Server unless the host in question also supports Control | ||||
Relay Server functionality.</t> | ||||
<t>It also worth noting that SRV records are not employed in this | <t>It is also worth noting that SRV records are not employed in this | |||
specification. While they could be used for more flexible UDP | specification. While they could be used for more flexible UDP | |||
port selection, they are not suitable for end-host discovery but | port selection, they are not suitable for end-host discovery but | |||
rather would be more suitable for the discovery of HIP-specific infrastruc ture. Further | rather would be more suitable for the discovery of HIP-specific infrastruc ture. Further | |||
extensions to this document may define SRV records for Control | extensions to this document may define SRV records for Control | |||
and Data Relay Server discovery within a DNS domain. | and Data Relay Server discovery within a DNS domain. | |||
</t> | </t> | |||
</section> | ||||
<section numbered="false" toc="default"> | ||||
<name>Acknowledgments</name> | ||||
<t>Thanks to <contact fullname="Jonathan Rosenberg"/>, <contact | ||||
fullname="Christer Holmberg"/>, and the rest of the MMUSIC WG folks for | ||||
the excellent work on ICE. The authors would also like to thank <contact | ||||
fullname="Andrei Gurtov"/>, <contact fullname="Simon Schuetz"/>, | ||||
<contact fullname="Martin Stiemerling"/>, <contact fullname="Lars | ||||
Eggert"/>, <contact fullname="Vivien Schmitt"/>, and <contact | ||||
fullname="Abhinav Pathak"/> for their contributions, and <contact | ||||
fullname="Tobias Heer"/>, <contact fullname="Teemu Koponen"/>, <contact | ||||
fullname="Juhana Mattila"/>, <contact fullname="Jeffrey M. Ahrenholz"/>, | ||||
<contact fullname="Kristian Slavov"/>, <contact fullname="Janne | ||||
Lindqvist"/>, <contact fullname="Pekka Nikander"/>, <contact | ||||
fullname="Lauri Silvennoinen"/>, <contact fullname="Jukka Ylitalo"/>, | ||||
<contact fullname="Juha Heinanen"/>, <contact fullname="Joakim | ||||
Koskela"/>, <contact fullname="Samu Varjonen"/>, <contact fullname="Dan | ||||
Wing"/>, <contact fullname="Tom Henderson"/>, <contact fullname="Alex | ||||
Elsayed"/>, <contact fullname="Jani Hautakorpi"/>, <contact | ||||
fullname="Tero Kauppinen"/>, and <contact fullname="Timo Simanainen"/> | ||||
for their comments to <xref target="RFC5770" format="default"/> and this | ||||
document. Thanks to <contact fullname="Éric Vyncke"/>, <contact | ||||
fullname="Alvaro Retana"/>, <contact fullname="Adam Roach"/>, <contact | ||||
fullname="Ben Campbell"/>, <contact fullname="Eric Rescorla"/>, <contact | ||||
fullname="Mirja Kühlewind"/>, <contact fullname="Spencer Dawkins"/>, | ||||
<contact fullname="Derek Fawcus"/>, <contact fullname="Tianran Zhou"/>, | ||||
<contact fullname="Amanda Barber"/>, <contact fullname="Colin | ||||
Perkins"/>, <contact fullname="Roni Even"/>, <contact fullname="Alissa | ||||
Cooper"/>, <contact fullname="Carl Wallace"/>, <contact fullname="Martin | ||||
Duke"/>, and <contact fullname="Benjamin Kaduk"/> for reviewing this | ||||
document. | ||||
</t> | ||||
<t>This work has been partially funded by the Cyber Trust Program | ||||
by Digile/Tekes in Finland.</t> | ||||
</section> | </section> | |||
<!-- ***************************************************************** --> | <section numbered="false" toc="default"> | |||
<name>Contributors</name> | ||||
<t><contact fullname="Marcelo Bagnulo"/>, <contact fullname="Philip | ||||
Matthews"/>, and <contact fullname="Hannes Tschofenig"/> have | ||||
contributed to <xref target="RFC5770" format="default"/>. This document | ||||
leans heavily on the work in that RFC.</t> | ||||
</section> | ||||
</back> | </back> | |||
</rfc> | </rfc> | |||
<!-- LocalWords: xref CDATA --> | ||||
End of changes. 379 change blocks. | ||||
3067 lines changed or deleted | 2518 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |