Geof Houstons' blog about the Happy Eyeballs algorithms has a few godo
points about where they are good, bad or plain ugly. He proposes a
slightly non-standard algorithm which should operate better than all
attempts so far:
"
Rather than opening up a connection in the protocol that has the faster
DNS resolution, or a faster average RTT or even the first to return an
ACK packet, it would be better to try IPv6 first, and then open up an
IPv4 connection if the IPv6 connection has not completed within a
relatively short interval.
This looks a lot like the first version of the dual stack algorithm
described at the start of this article.
What's different?
The difference is the introduction of parallelism into the mix. When the
browser reverts to IPv4 and kicks off the IPv4 connection attempt, that
does not mean that it should immediately stop listening for a SYN/ACK
response from the earlier IPv6 connection attempt. Once the IPv4 SYN has
been sent, the browser should then be prepared to work with whichever
protocol first responds to the outstanding connection attempts. In other
words it still a transformation from a serial effort of "IPv6 first then
IPv4 second" to a parallel effort of trying both IPv4 and IPv6 in
parallel, and being ready to work with which responds first. But the key
aspect here is that while its a race to the first SYN+ACK, its now a
handicapped race, where IPv6 enjoys a slight lead at the outset of the
race. The lead need not be large - Chrome's 300ms delay interval would
be reasonable. Perhaps Safari's single RTT time is a little too
aggressive, but if this timer were to be backed off to a minimum of
300ms or twice the estimated RTT then again this would be a reasonable
balance between performance and easing the pressure on the IPv4 CGNs.
"
What I'm thinking when reading this is that we could implement something
like this easily using the FwdState destinations array and a timeout.
While it is true that our destinations array is N-protocol rather than
2-protocol, the same failover principles apply between any address
regardless of protocol family.
Right now we are still on the old serial sequence algorithm of 0-N timeouts
Say:
* start opening destination[0], create a timeout event of N ms
* when the timeout occurs if the connection has not completed, bump
the destination[0] entry off and try the next.
* when a connection succeeds,
- if serverConn is already set, push the new conn into idle pconn
immediately and stop.
- otherwise; set serverConn and *if* it is the destination[0] shift
that list. continue with the request in any event.
Possibly some modifications for the retries handling.
Other ideas?
Amos
Received on Sat Jul 07 2012 - 09:26:40 MDT
This archive was generated by hypermail 2.2.0 : Sat Jul 07 2012 - 12:00:02 MDT