One document matched: draft-ietf-v6ops-happy-eyeballs-01.xml
<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY rfc2119 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY I-D.tuexen-sctp-udp-encaps SYSTEM "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.tuexen-sctp-udp-encaps.xml">
<!ENTITY rfc4960 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4960.xml">
<!ENTITY rfc1671 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.1671.xml">
<!ENTITY rfc2766 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2766.xml">
<!ENTITY rfc2782 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2782.xml">
<!ENTITY rfc3484 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3484.xml">
<!ENTITY rfc4966 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4966.xml">
<!ENTITY rfc4074 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4074.xml">
<!ENTITY rfc5245 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5245.xml">
<!ENTITY I-D.natarajan-http-over-sctp SYSTEM "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.natarajan-http-over-sctp.xml">
<!ENTITY I-D.chen-mif-happy-eyeballs-extension SYSTEM "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.chen-mif-happy-eyeballs-extension.xml">
]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<?rfc toc="yes" ?>
<?rfc rfcprocack="yes" ?>
<?rfc symrefs="yes" ?>
<?rfc iprnotified="no" ?>
<?rfc strict="yes" ?>
<?rfc compact="yes" ?>
<?rfc subcompact="no" ?>
<?rfc sortrefs="yes" ?>
<?rfc colonspace='yes' ?>
<?rfc tocindent='yes' ?>
<rfc category="std" docName="draft-ietf-v6ops-happy-eyeballs-01" ipr="trust200902">
<front>
<title abbrev="Happy Eyeballs Dual Stack">Happy Eyeballs:
Trending Towards Success with Dual-Stack Hosts</title>
<author fullname="Dan Wing" initials="D." surname="Wing">
<organization abbrev="Cisco">Cisco Systems, Inc.</organization>
<address>
<postal>
<street>170 West Tasman Drive</street>
<city>San Jose</city>
<region>CA</region>
<code>95134</code>
<country>USA</country>
</postal>
<email>dwing@cisco.com</email>
</address>
</author>
<author fullname="Andrew Yourtchenko" initials="A." surname="Yourtchenko">
<organization abbrev="Cisco">Cisco Systems, Inc.</organization>
<address>
<postal>
<street>De Kleetlaan, 7</street>
<city>San Jose</city>
<region>Diegem</region>
<code>B-1831</code>
<country>Belgium</country>
</postal>
<email>ayourtch@cisco.com</email>
</address>
</author>
<date year="2011" />
<workgroup>v6ops</workgroup>
<abstract>
<t>This document describes how a dual-stack client can determine the
functioning path to a dual-stack server. This provides a seamless
user experience during initial deployment of dual-stack networks and
during outages of IPv4 or outages of IPv6.</t>
</abstract>
</front>
<middle>
<section title="Introduction">
<t>In order to use HTTP successfully over IPv6, it is necessary
that the user enjoys nearly identical performance as compared to
IPv4. A combination of today's applications, IPv6 tunneling and
IPv6 service providers, and some of today's content providers
all cause the user experience to suffer
(<xref target="problem_statement"></xref>). For IPv6, a content
provider may ensure a positive user experience by using a DNS white list of
IPv6 service providers who peer directly with
them, e.g. <xref target="whitelist"></xref>. However, this is not
scalable to all service providers worldwide, nor is it scalable
for other content providers to operate their own DNS white
list.</t>
<t>Instead, this document suggests a mechanism for applications
to quickly determine if IPv6 or IPv4 is the most optimal to
connect to a server. The suggestions in this document provide a
user experience which is superior to connecting to ordered IP
addresses which is helpful during the IPv6/IPv4 transition with
dual stack hosts.</t>
<t>This problem is described also in <xref target="RFC1671"></xref>:
"The dual-stack code may get two addresses back from DNS; which does
it use? During the many years of transition the Internet will
contain black holes. For example, somewhere on the way from IPng host
A to IPng host B there will sometimes (unpredictably) be IPv4-only
routers which discard IPng packets. Also, the state of the DNS does
not necessarily correspond to reality. A host for which DNS claims to
know an IPng address may in fact not be running IPng at a particular
moment; thus an IPng packet to that host will be discarded on
delivery. Knowing that a host has both IPv4 and IPng addresses gives
no information about black holes. A solution to this must be proposed
and it must not depend on manually maintained information. (If this
is not solved, the dual stack approach is no better than the packet
translation approach.)"</t>
<t>Following the procedures in this document, once a certain address
family is successful, the application trends towards preferring that address
family. Thus, repeated use of the application DOES NOT cause repeated
probes over both address families.</t>
<t>While the application recommendations in this document are
described in the context of HTTP clients ("web browsers"), it is also
useful and applicable to other interactive applications.</t>
<t>Code which implements some of the ideas described in this document
has been made available <xref target="Perreault"/>
<xref target="Andrews"/>.</t>
</section>
<section title="Notational Conventions">
<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"></xref>.</t>
</section>
<section anchor="problem_statement" title="Problem Statement">
<t>As discussed in more detail in <xref target="problem_uris"></xref>,
it is important that the same URI and hostname be used for IPv4 and IPv6.
Using separate namespaces causes namespace fragmentation
and reduces the ability for users to share URIs and hostnames, and
complicates printed material that includes the URI or hostname.</t>
<t>As discussed in more detail
in <xref target="problem_ipv6"></xref>, IPv6 connectivity is
sometimes broken entirely or slower than native IPv4
connectivity.</t>
<section anchor="problem_uris" title="URIs and hostnames">
<t>URIs are often used between users to exchange pointers to
content -- such as on social networks, email, instant messaging, or
other systems. Thus, production URIs and production hostnames
containing references to IPv4 or IPv6 will only function if
the other party is also using an application, OS, and a network that
can access the URI or the hostname.</t>
</section>
<section anchor="problem_ipv6" title="IPv6 connectivity">
<t>When IPv6 connectivity is impaired, today's IPv6-capable
web browsers incur many seconds of delay before falling back
to IPv4. This harms the user's experience with IPv6, which
will slow the acceptance of IPv6, because IPv6 is frequently
disabled in its entirety on the end systems to improve the
user experience.</t>
<t>Reasons for such failure include no connection to the IPv6
Internet, broken 6to4 or Teredo tunnels, and broken IPv6
peering.</t>
<figure anchor="diagram_message_flow"
title="Existing behavior message flow">
<artwork align="center"><![CDATA[
DNS Server Client Server
| | |
1. |<--www.example.com A?-----| |
2. |<--www.example.com AAAA?--| |
3. |---192.0.2.1------------->| |
4. |---2001:db8::1----------->| |
5. | | |
6. | |--TCP SYN, IPv6--->X |
7. | |--TCP SYN, IPv6--->X |
8. | |--TCP SYN, IPv6--->X |
9. | | |
10. | |--TCP SYN, IPv4------->|
11. | |<-TCP SYN+ACK, IPv4----|
12. | |--TCP ACK, IPv4------->|
]]></artwork>
</figure>
<t>The client obtains the IPv4 and IPv6 records for the server (1-4).
The client attempts to connect using IPv6 to the server, but the IPv6
path is broken (6-8), which consumes several seconds of time.
Eventually, the client attempts to connect using IPv4 (10) which
succeeds.</t>
</section>
</section>
<section title="Client Recommendations">
<t>To provide fast connections for users, clients should make
connections quickly over various technologies, automatically tune itself
to avoid flooding the network with unnecessary connections (i.e., for
technologies that have not made successful connections), and
occasionally flush its self-tuning.</t>
<section anchor="client_v6" title="Dualstack behavior">
<t>If a TCP client supports IPv6 and IPv4 and is connected
to IPv4 and IPv6 networks, it can perform the procedures described
in this section.</t>
<figure anchor="diagram_message_flow_happy_1"
title="Happy Eyeballs flow 1, IPv6 broken">
<artwork align="center"><![CDATA[
DNS Server Client Server
| | |
1. |<--www.example.com A?-----| |
2. |<--www.example.com AAAA?--| |
3. |---192.0.2.1------------->| |
4. |---2001:db8::1----------->| |
5. | | |
6. | |==TCP SYN, IPv6===>X |
7. | |--TCP SYN, IPv4------->|
8. | |<-TCP SYN+ACK, IPv4----|
9. | |--TCP ACK, IPv4------->|
10. | |==TCP SYN, IPv6===>X |
]]></artwork>
</figure>
<t>In the diagram above, the client sends two TCP SYNs at the same time
over IPv6 (6) and IPv4 (7). In the diagram, the IPv6 path is broken
but has little impact to the user because there is no long delay
before using IPv4. The IPv6 path is retried until the application
gives up (10).</t>
<figure anchor="diagram_message_flow_happy_2"
title="Happy Eyeballs flow 2, IPv6 working">
<artwork align="center"><![CDATA[
DNS Server Client Server
| | |
1. |<--www.example.com A?-----| |
2. |<--www.example.com AAAA?--| |
3. |---192.0.2.1------------->| |
4. |---2001:db8::1----------->| |
5. | | |
6. | |==TCP SYN, IPv6=======>|
7. | |--TCP SYN, IPv4------->|
8. | |<=TCP SYN+ACK, IPv6====|
9. | |<-TCP SYN+ACK, IPv4----|
10. | |==TCP ACK, IPv6=======>|
11. | |--TCP ACK, IPv4------->|
12. | |--TCP RST, IPv4------->|
]]></artwork>
</figure>
<t>The diagram above shows a case where both IPv6 and IPv4 are
working, and IPv4 is abandoned (12).</t>
</section>
<section anchor="client_v6_details" title="Implementation details">
<section anchor="client_with_address_records" title="Applications that use address records">
<t>This section details how to provide robust dual stack service for
both IPv6 and IPv4, so that the user perceives very fast application
response.</t>
<t>The TCP client application is configured with one
application-wide value of P. A positive value indicates a preference for IPv6 and a
negative value indicates a preference for IPv4. A value of 0
indicates equal weight, which means the A and AAAA queries and
associated connection attempts will be sent as quickly as
possible. The absolute value of P is the measure of a delay
before initiating a DNS lookup and a connection attempt on the other address
family. There are two P values maintained: one is
application-wide and the other is specific per each
destination (hostname and port).</t>
<t>The algorithm attempts to delay the DNS query until it expects that
address family will be necessary; that is, if the preference is
towards IPv6, then AAAA will be queried immediately and the A query
will be delayed.</t>
<t>The TCP client application starts two concurrent execution flows (they will be referred
to as "threads" but this reference does not imply the implementation detail of using
the threading library, merely the property of mutual concurrency) in order to
minimize the user-noticeable delay ("dead time") during the
connection attempts:<list style="hanging">
<t hangText="thread 1: (IPv6)"><list style="symbols">
<t>If P<0, wait for absolute value of p*10 milliseconds</t>
<t>send DNS query for AAAA</t>
<t>wait until DNS response is received</t>
<t>Attempt to connect over IPv6 using TCP</t>
</list></t>
<t hangText="thread 2: (IPv4)"><list style="symbols">
<t>if P>0, wait for p*10 milliseconds</t>
<t>send DNS query for A</t>
<t>wait until DNS response is received</t>
<t>Attempt to connect over IPv4 using TCP</t>
</list></t>
</list></t>
<t>The first thread that succeeds returns the completed connection to
the parent code and aborts the other thread (<xref
target="abandon"></xref>).</t>
<t>After a connection is successful, we want to adjust the
application-wide preference and the per-destination preference. The
value of P is incremented (decremented) each time an IPv6 (IPv4)
connection wins the race.. When a connection using the
less-preferred address family is successful, it indicates the wrong
address family was used and the value of P is halved:<list style="symbols">
<t>If P>0 (indicating IPv6 is preferred over IPv4) and the
first thread to finish was the IPv6 thread it indicates the IPv6
preference is correct and we need to re-enforce this by increasing
the application-wide P value by 1. However, if the first thread to
finish was the IPv4 thread it indicates an IPv6 connection problem
occurred and we need to aggressively prefer IPv4 more by halving P
and rounding towards 0.</t>
<t>If P<0 (indicating IPv4 is preferred over IPv6) and the
first thread to finish was the IPv4 thread it indicates the
preference is correct and we need to re-enforce this gently by
decreasing the application-wide P value by 1. However, if the
first thread to finish was the IPv6 thread it indicates an IPv4
connection problem and we need to aggressively avoid IPv4 by
halving P and rounding towards 0.</t>
<t>If P=0 (indicating equal preference), P is incremented by one if the
first thread to complete was the IPv6 thread, or decremented by one if
the first thread to complete was the IPv4 thread.</t>
</list>After adjusting P, the resulting delay should never be larger than 4 seconds
-- which is similar to the value used by many IPv6-capable TCP
client applications to switch to an alternate A or AAAA record.</t>
<t><list style="empty">
<t>Editor's Note 01: Proof of concept tests on fast networks show that even
smaller value (around 0.5 seconds) may be practical. More extensive
testing would be useful to find the best upper boundary that still
ensures a good user experience.</t>
<t>Editor's Note 02: A strict implementation of the above steps results in
"P" being adjusted if there are no AAAA records or are
no A records. This is undesirable. Thus, a future version
of this specification is expected to recommend that "P"
only be adjusted if there was both an A and AAAA record.
</t>
</list></t>
<!--
<t>An implementation of the IPv6/IPv4 Happy Eyeballs algorithm in the
Links web browser <xref target="links"></xref> is available at <xref
target="64-impl"></xref>.</t>
-->
</section>
<section anchor="srv_clients" title="Applications that use the SRV records">
<t>
For the purposes of this section, "client" is defined as the entity
initiating the connection.
</t>
<t>
For protocols which support DNS SRV <xref target="RFC2782"></xref>, the client performs the IN
SRV query (e.g. IN SRV _xmpp-client._tcp.example.com) as normal. The
client MUST perform the following steps:
</t>
<t>
<list style="numbers">
<t>Sort all SRV records according to priority (lowest priority first)
</t>
<t>
Process all of the SRV targets of the same priority with a weight
greater than 0:
<list style="letters">
<t>Perform A/AAAA queries for each SRV target in parallel, as
described in <xref target="client_with_address_records"></xref></t>
<t>Connect to the IPv4/IPv6 addresses</t>
<t>If at least one connection succeeds, stop processing SRV
records</t>
</list>
</t>
<t>If there is no connection, process all of the SRV targets of the
same priority with a weight of 0, as per steps 2.1 through 2.3 above
</t>
<t>Repeat steps 2.1 through 2.3 for the next priority, until a
connection is established or all SRV records have been exhausted
</t>
<t>If there is still no connection, fallback to using the domain (e.g.
example.com), following steps 2.1 through 2.3 above
</t>
</list>
</t>
<t>
It is RECOMMENDED, but not required, for the client to cache the
winning connection's address information and reuse it on subsequent
connections. If a significant network event occurs (e.g. network
interface is activated/deactivated, IP address changes), the client
MUST forget the cached address information and perform all of the steps
from above. The definition of "significant network event" is
intentionally vague.
</t>
</section>
</section>
</section>
<section title="Additional Considerations">
<t>This section discusses considerations and requirements that are
common to new technology deployment.</t>
<section title="Additional Network and Host Traffic">
<t>Additional network traffic and additional server load is
created due to these recommendations and mitigated by
application-wide and per-destination timer adjustments. The
procedures described in this document retain a quality user
experience while transitioning from IPv4-only to dual stack.
The quality user experience benefits the user but to the
detriment of the network and server that are serving the
user.</t>
</section>
<section anchor="abandon" title="Abandon Non-Winning Connections">
<t>It is RECOMMENDED that the non-winning connections be abandoned,
even though they could be used to download content. This is because
some web sites provide HTTP clients with cookies (after logging in)
that incorporate the client's IP address, or use IP addresses to
identify users. If some connections from the same HTTP client are
arriving from different IP addresses, such HTTP applications will
break. It's also important to abandon connections to avoid
consuming server or middlebox (e.g., NAT) resources (file descriptors, memory, TCP control
blocks) and avoid sending TCP or application-level keepalives on
otherwise unused connections.</t>
<!--
<t><list style="empty"><t>[[Editor's Note 04: The "race to success" stops
when the first successful connection is made. However, it may be
prudent to keep the non-winning connection open for the scenario where
the application can detect a problem, such as Path MTU Discovery
blackholes <xref target="RFC2923"></xref>. The algorithm then can
take care by the application-level issues by reusing the second
connection in case the requests are idempotent (e.g., GET requests).
This needs more analysis.]]</t>
</list></t>
-->
</section>
<section title="Flush or Expire Cache">
<t>Because every network has different characteristics (e.g.,
working or broken IPv6 connectivity) the IPv6/IPv4 preference
value (P) SHOULD be reset to its default whenever the host is
connected to a new network
(<xref target="cx-osx"></xref>, <xref target="cx-win"></xref>).
However, in some instances the application and the host are
unaware the network connectivity has changed so it is
RECOMMENDED that per-destination values expire after 10
minutes of inactivity.</t>
</section>
<section title="Determining Address Type">
<t>For some transitional technologies such as a dual-stack host, it is
easy for the application to recognize the native IPv6 address (learned
via a AAAA query) and the native IPv4 address (learned via an A
query). For other transitional technologies <xref
target="RFC2766"></xref> it is impossible for the host to
differentiate a transitional technology IPv6 address from a native
IPv6 address (see Section 4.1 of <xref target="RFC4966"></xref>).
Replacement transitional technologies are attempting to bridge this
gap. It is necessary for applications to distinguish between native
and transitional addresses in order to provide the most seamless user
experience.</t>
<t>Application awareness of transitional technologies, if implemented,
SHOULD provide a facility to give the preference only to native IPv6 addresses.
</t>
</section>
<section title="Debugging and Troubleshooting">
<t>This mechanism is aimed at ensuring a reliable user experience
regardless of connectivity problems affecting any single transport.
However, this naturally means that applications employing these
techniques are by default less useful for diagnosing issues with any
particular transport. To
assist in that regard, the applications implementing the proposal in this
document SHOULD also provide a mechanism to revert the behavior
to that of a default provided by the operating system - the <xref
target="RFC3484"></xref>.</t>
<t><list style="empty">
<t>[[[ To be discussed. </t>
<t>Some sites may wish to be informed when the the hosts adjust their "P" value,
in order to troubleshoot the underlying cause. To help these sites,
a strawman proposal is to send a syslog message or other notification
to an address that may be configured
by a site administrator in a centralized fashion.
(The exact method TBD - DHCP option, domain name, etc.)
This syslog message should be sent only first N times that the host
expects to prefer IPv6 but has to use IPv4. I.e. the first N times it decreases
the value of P. N - TBD.</t>
<t>]]]</t>
</list></t>
</section>
<section anchor="dns_behavior" title="DNS Behavior">
<t>Unique to DNS AAAA queries are the problems described in <xref
target="RFC4074"></xref> which, if they still persist, require
applications to perform an A query before the AAAA query. <list>
<t>[[Editor's Note 03: It is believed these defective DNS servers
have long since been upgraded. If so, we can remove this
section.]]</t>
</list></t>
</section>
<section title="Middlebox Issues">
<t>Some devices are known to exhibit what amounts to a bug, when the A
and AAAA requests are sent back-to-back over the same 4-tuple, and
drop one of the requests or replies <xref
target="DNS-middlebox"></xref>. However, in some cases fixing this
behaviour may not be possible either due to the architectural
limitations or due to the administrative constraints (location of the
faulty device is unknown to the end hosts or not controlled by the end
hosts). The algorithm described in this draft, in the case of this
erroneous behaviour will eventually pace the queries such that this
issue is will be avoided. The algorithm described in this draft also
avoids calling the operating system's getaddrinfo() with "any", which
should prevent the operating system from sending the A and AAAA
queries on the same port.</t>
<t>For the large part, these issues are believed to be fixed,
in which case the getaddrinfo() with AF_UNSPEC as the address family
in its hints.</t>
</section>
<section title="Multiple Interfaces">
<t>Interaction of the suggestions in this document with
multiple interfaces, and interaction with the MIF working
group, is for further study (<xref target="I-D.chen-mif-happy-eyeballs-extension"></xref> is devoted to this).</t>
</section>
</section>
<section title="Content Provider Recommendations">
<t>Content providers SHOULD provide both AAAA and A records for servers
using the same DNS name for both IPv4 and IPv6.</t>
</section>
<section anchor="security_considerations" title="Security Considerations">
<t>[[Placeholder.]]</t>
<t>See <xref target="abandon"></xref>.</t>
</section>
<section title="Acknowledgements">
<t>The mechanism described in this paper was inspired by Stuart
Cheshire's discussion at the IAB Plenary at IETF72, the author's
understanding of Safari's operation with SRV records, Interactive
Connectivity Establishment (<xref
target="RFC5245">ICE</xref>), and the current IPv4/IPv6
behavior of SMTP mail transfer agents.</t>
<t>Thanks to Fred Baker, Jeff Kinzli, Christian Kuhtz, and
Iljitsch van Beijnum for fostering the creation of this
document.</t>
<t>Thanks to Scott Brim, Rick Jones, Stig Venaas, Erik Kline, Bjoern Zeeb, Matt Miller for
providing feedback on the document.</t>
<t>Thanks to Javier Ubillos, Simon Perreault and Mark Andrews for
the active feedback and the experimental work on the
independent practical implementations that they created.</t>
<t>Also the authors would like to thank the following individuals who
participated in various email discussions on this topic:
Mohacsi Janos, Pekka Savola, Ted Lemon, Carlos Martinez-Cagnazzo,
Simon Perreault, Jack Bates, Jeroen Massar, Fred Baker, Javier Ubillos,
Teemu Savolainen,
Scott Brim, Erik Kline, Cameron Byrne, Daniel Roesen, Guillaume Leclanche,
Cameron Byrne, Mark Smith, Gert Doering, Martin Millnert, Tim Durack, Matthew Palmer.
</t>
</section>
<section title="IANA Considerations">
<t>This document has no IANA actions.</t>
</section>
</middle>
<back>
<references title="Normative References">
&rfc2119;
&rfc3484;
&rfc2782;
</references>
<references title="Informational References">
&rfc1671;
&rfc2766;
&rfc4966;
&rfc4074;
&rfc5245;
&I-D.chen-mif-happy-eyeballs-extension;
<reference anchor="whitelist"
target="http://www.google.com/intl/en/ipv6">
<front>
<title>Google IPv6 DNS Whitelist</title>
<author fullname="Google" surname="Google">
<organization></organization>
</author>
<date month="January" year="2009" />
</front>
</reference>
<reference anchor="DNS-middlebox"
target="https://bugzilla.redhat.com/show_bug.cgi?id=505105">
<front>
<title>DNS middlebox behavior with multiple queries over same source
port</title>
<author fullname="Various" surname="Various">
<organization></organization>
</author>
<date month="June" year="2009" />
</front>
</reference>
<reference anchor="cx-osx"
target="https://bugzilla.redhat.com/show_bug.cgi?id=505105">
<front>
<title>AIHostReachabilityMonitor</title>
<author fullname="Adium" surname="Adium">
<organization></organization>
</author>
<date month="June" year="2009" />
</front>
</reference>
<reference anchor="cx-win"
target="http://msdn.microsoft.com/en-us/library/system.net.networkinformation.networkchange.networkavailabilitychanged.aspx">
<front>
<title>NetworkChange.NetworkAvailabilityChanged Event</title>
<author fullname="Microsoft" surname="Microsoft">
<organization></organization>
</author>
<date month="June" year="2009" />
</front>
</reference>
<reference anchor="Perreault"
target="http://www.viagenie.ca/news/index.html#happy_eyeballs_erlang">
<front>
<title>Happy Eyeballs in Erlang</title>
<author fullname="Simon Perreault"
surname="Perreault" initials="S">
<organization>Viagenie</organization>
</author>
<date month="February" year="2011" />
</front>
</reference>
<reference anchor="Andrews" target="http://www.isc.org/community/blog/201101/how-to-connect-to-a-multi-h
omed-server-over-tcp">
<front>
<title>How to connect to a multi-homed server over TCP</title>
<author fullname="Mark Andrews"
surname="Andrews" initials="M">
<organization>ISC</organization>
</author>
<date month="January" year="2011" />
</front>
</reference>
<!--
<reference anchor="64-impl"
target="http://www.employees.org/~andin/happy-eyeballs">
<front>
<title>Implementation of Happy Eyeballs Algorithm in Links</title>
<author fullname="Andrew Yourtchenko" initials="A." surname="Yourtchenko">
<organization></organization>
</author>
<date month="July" year="2009" />
</front>
</reference>
<reference anchor="links"
target="http://links.sourceforge.net/">
<front>
<title>Links. The WWW Text Browser</title>
<author fullname="Sourceforge" surname="Sourceforge">
<organization></organization>
</author>
<date month="July" year="2009" />
</front>
</reference>
-->
</references>
</back>
</rfc>
<!---
-->
| PAFTECH AB 2003-2026 | 2026-04-24 03:17:30 |