HappyEyeballs算法是IPv6大规模推广使用的重要算法。Mark下。

转载于:

http://www.ricearth.com.cn/article/5090355261504750

一、背景

随着物联网的兴起,在万物互联的远景目标下,传统IPv4网络显得有些捉襟见肘。Internet的创始人之一文特.瑟夫曾说:“我觉得有点脸红,因为决定采用32位地址,并认为这足够满足Internet实验需求的那个家伙正式在下。我唯一想替自己做的辩解是,做出那个决定的时间是1977年,当时我以为那只不过是一场实验,可问题是这场试验根本就停不下来。”

IPv6网络的普及势不可挡,而从IPv4切换到IPv6,“就如同给一架正在飞行的飞机更换发动机”。IPv4和IPv6的并存必然是很长一段时间的状态。

那么问题来了,当IPv4和IPv6网络同时存在时,应用程序如何选择。假如优先选择其中一个,当所选的出现问题连接不上时,又该怎么办,有什么方法可以实现快速切换?在HappyEyeballs算法提出之前,传统的双栈交互方式如下:

图1

客户端优先发起IPv6请求,当未收到IPv6应答后,再发起IPv4的请求。可以看到,在等待IPv6的数据包返回期间(第8-10歩之间),会有一个延时,当IPv6连接超时后,才会执行第10歩的IPv4连接请求。这个延时会影响用户的体验。

同时我们可以看到,客户端在获取到域名的A和AAAA记录后,优先访问IPv6地址。这是由于IPv6是下一代互联网协议,为确保更大范围的推广,双栈环境优选IPv6,这样能最大限度的将IPv4流量向IPv6迁移。

双栈切换的延时问题不解决,用户对IPv6的体验将大打折扣,内容商和运营商都没有动力去推动IPv6的规模部署。为解决这一问题,2012年Cisco公司提出第一版HappyEyeballs算法【RFC6555】,2017年Apple公司提出第二版HappyEyeballs算法【RFC8305】。

二、第一版HappyEyeballs算法【RFC6555

1、算法简介

  1. 发送DNS请求A和AAAA记录,同时发起IPv6和IPv4连接请求。
  2. 如果都有返回,优先选择使用IPv6进行连接,同时关闭IPv4的连接。

图2

  1. 如果IPv6无返回,使用IPv4进行连接。

图3

2、存在的问题

以上算法能很好的解决双栈切换的延时问题。但是引入另一个问题:当大多数应用都支持IPv6时,并行发出的IPv4请求显得有些多余,在整个运营商大网内引入了非必要的IPv4流量,IPv4的流量不能大规模的降低。由于运营商投入的成本总体来说是一定的,如果IPv4的流量不能大规模减少,也就无法缩减IPv4的网络基础设施的投入,那也意味着无法投入更多成本到IPv6。

3、进一步优化

HappyEyeballs算法的本质是用更多带宽资源来确保双栈切换的延时足够低。如果在花费带宽资源和降低延时之间做到平衡是优化的主要思路。那就是在发送IPv6请求时,不同时发送IPv4请求,而是增加一个延时(上图第6-7歩之间)。在IPv6确实不可达后,才发送IPv4请求。根据用户对延时的直观感受,以及网络延时的经验,算法推荐的延时是150-250ms。应用终端在实现算法的时候,和这个值可能有些不同,如Firefox和Chrome浏览器使用的延时是300ms。

4、需要注意的几点

1)记录状态

在初始化某个TCP连接的时候,需要记录IPv6和IPv4地址的可用性并缓存。在缓存超时时间内,有访问相同的连接时,直接通过缓存的IP可用性来选择,不用重新按HappyEyeballs算法执行一遍。但如果缓存超时了,则需要重新执行一遍算法。推荐的缓存时间是10分钟。

2)网络重置

当网络重置时,比如Wifi热点更换、网卡重启等等,HappyEyeballs算法需要重新初始化一次。

三、第二版HappyEyeballs算法【RFC8305

2012年第一版HappyEyeballs算法发布以后,经过几年有一定范围的应用。RFC8305是在第一版的基础上,进一步优化提升可靠性和通用性。算法主要分为DNS请求、地址排序和连接建立3个部分。

1DNS请求

1)发送A和AAAA记录请求后,不能等2个解析应答全都到齐后再执行后面的连接操作。终端需要支持异步DNS API。如果不支持异步,需要用2个线程分别发送A和AAAA记录请求:

2)如果AAAA应答先到,则不等A应答,先执行IPv6的请求连接;

3)如果A应答先到,则等待一段时间(Resolution Delay),等AAAA应答到来。推荐的等待时间是50ms;

4)如果等待时间内,有效的AAAA应答到来,则客户端立即执行IPv6的请求连接;

5)如果在等待时间内收到无效的AAAA应答,或者没有收到应答,则客户端执行地址排序(sorting addresses),以及使用解析到的IPv4地址进行交错请求连接;

6)如果在连接建立阶段,但还未建立成功时,有效的AAAA应答到来,则解析到的IPv6地址会加入到可用地址列表中用于发起连接;

  1. 同时存在IPv6和IPv4 DNS服务器的情况
  2. 优先向IPv6 DNS服务器发送DNS请求
  3. 如果没有收到IPv6 DNS服务器的应答,则将该DNS服务器设置低优先级,而向IPv4的DNS服务器发送请求。

2、地址排序

地址排序包含2部分:本协议簇地址排序、地址合并,最终生成地址列表。

1)本协议簇地址排序

A)在发起连接请求之前,先执行地址排序,将所有解析到的IPv6和IPv4地址加入到可用地址列表中并进行排序(包括多个A记录或者多个AAAA记录),之后按照一定的算法向这些地址发起连接请求(“连接建立”部分)。

B)如果客户端能记录连接状态,并且知道某个IP的历史连接平均响应时间,则选择选择时间更小的地址去建立连接。

C)如果客户端能记录曾经使用过的IP地址,则优先选择已经使用过的,而非未使用过的地址。这是因为保持相同地址的连接对应用交互更有利,不会经常改变连接的地址。

D)当网络状态发生变化时,如终端4G变Wifi等,客户端之前存储的历史信息和记录不能再使用,需要全部清掉。

  1. 2)地址合并

A)协议簇交替方式:地址列表的顺序使用IPv6和IPv4协议簇交替的方式。如列表的第一个地址使用IPv6的第一个地址,那第二个地址则使用IPv4的第二个地址,这样交替排序。

  1. 协议簇优先方式:将所有IPv6地址优先排在IPv4地址前面,即优先使用IPv6协议。

C)算法推荐使用第1种交替方式。他可避免当IPv6通道失效时,仍然反复的向多个IPv6地址发起连接,需要等待多个连接超时才改用IPv4连接,降低了延时。

D)考虑到有些应用可能选择第2种方式,所以算法推荐设定可配置的参数“优先协议簇地址数量”(First Address Family Count)。如count=1,则是第一种交替方式,count=2,则先排2个IPv6地址,再排2个IPv4地址,再排另外2个IPv6地址,以此类推。当count的数量较大时,多余每个协议簇包含的地址,则为第二种方式。

  1. 3、连接建立:
  2. 一次向一个地址发送连接请求,非并行,2个连接请求之间间隔一段时间。

2)一旦有连接建立(一般TCP三次握手建立),终止其他还未成功建立的连接,同样也不会发起未开始的连接。异步DNS请求也会终止,不会发送新的DNS请求。但是连接建立后一段时间之内(推荐1s)返回的DNS应答还是会去做解析,解析的结果可以用于以后使用。

3)地址列表中2个连接请求之间的间隔时间,推荐250ms。如果有历史响应时间的记录,此间隔时间可以微调。但间隔时间需要有最小值和最大值。最小值不应小于10ms,推荐100ms,以防在高丢包率网络下的数据包拥塞。最大值不应超过2s。

4)如果在建立连接的过程中,DNS解析结果和已经生成的地址列表有差异,则连接动作会有相应的调整:

A)如果已经向IP1发起了连接,但此时最新的DNS解析结果不包含IP1,则发起的连接会继续下去,不终止。

B)如果还未向IP1发起连接,但此时最新的DNS解析结果不包含IP1,则IP1会从地址列表删除

C)如果最新的DNS解析结果增加了IP2,则会将IP2添加到地址列表中。

四、两个版本的简单对比

 

 

第一版

第二版

提出者

Cisco

Apple

提出时间

2012

2017

解决的问题

1、双栈终端同时解析到A和AAAA记录,如何发起请求

1、双栈终端如何做DNS解析
 2、解析到多个A和AAAA记录,如何处理,如何发起请求
 3、在发起请求的过程中,如果DNS解析结果有新的变化,应该如何处理

优缺点

关注点单一,只关注如何发起请求,而未考虑DNS解析、以及解析到多个地址的情况。

更为全面和细化,从DNS解析到应用连接全流程均考虑进来,对特殊情况更为细化的处理。

IPv6的HappyEyeballs算法相关推荐

  1. 计算机网络课程路由表,计算机网络之探赜索隐

    课程概述 <计算机网络>系列课程分为:<计算机网络之网尽其用>.<计算机网络之探赜索隐>和<计算机网络之危机四伏>. <计算机网络之探赜索隐> ...

  2. 淘宝 APP 网络架构演进与弱网破障实践

    作者:沈良炜 阿里大淘宝终端体验平台团队 面对移动互联网络下复杂多变的网络环境,如何提供更稳定可靠的请求性能,保障用户的加载浏览体验?本文将为大家分享淘宝APP统一网络库的演进. 一.引言 自2013 ...

  3. android查询ip的算法,客户端IPV6迁移适配——连接竞速算法Happy Eyeballs探索实践(一)...

    本文来自OPPO互联网技术团队,转载请注名作者.同时欢迎关注我们的公众号:OPPO_tech,与你分享OPPO前沿互联网技术及活动. 1. 背景 IPv6推广已久,基础体系建设也日趋完善.加之工信部的 ...

  4. 【计算机网络】网络层 : 总结 ( 功能 | 数据交换 | IP 数据报 | IPv4 地址 | IPv6 地址 | 路由选择协议 | 路由算法 )★★★

    文章目录 一.网络层功能 二.数据交换方式 ★ 三.IP 数据报 ★ 四. IPv4 地址 ★★ 1 . IP 地址 发展 : 2 . 分类 IP 地址 3 . NAT 转换 4 . 子网划分 5 . ...

  5. ipv4转ipv6的算法

    IPV4的格式为: xxx.xxx.xxx.xxx   共4组 十进制.如 192.168.1.1 IPV6的格式为:xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx 共 ...

  6. ipv4和ipv6的 udp/tcp CRC校验和算法

    IPheader.length是总长度(占16比特包括 IP头 和 后续的数据) UDPHeader.Length:长度字段:占16比特.标明UDP头部和UDP数据的总长度字节. IPv4层 1.fc ...

  7. 防火墙产品原理与应用:防火墙产品的技术及实现关于IPV6【寒假】

    感觉有必要,虽然冷.但是,觉得IPV6比较重要就记录一下吧.防火墙里讲述的IPV6,应该有针对性吧. 权当做参考啦! IPV6技术: 128位的IPV6协议是网络层协议的第二代标准协议,也被称为IPn ...

  8. 漫话:全球 IPv4 地址正式耗尽?是时候说说到底什么是IPv4和IPv6了!

    2019年11月25日,负责英国.欧洲.中东和部分中亚地区互联网资源分配的欧洲网络协调中心(RIPE NCC)宣布,其最后的 IPv4 地址空间储备池在 11 月 25 日 UTC + 1 15:35 ...

  9. 算法题:实现一个IP白名单过滤器

    最近看到一则招聘的JD,附了一个算法题的链接,原题如下: 请实现一个IP白名单过滤算法,实现以下接口boolean addWhiteIpAddress(String ip);boolean isWhi ...

最新文章

  1. 逻辑回归阈值_逻辑回归or线性回归,傻傻分不清楚
  2. ACM模板--邻接矩阵 无向图 搜索算法
  3. Linear Algebra lecture6 note
  4. ROS-Solidworks转URDF
  5. HBuilder 打包流程
  6. windows安装python3步骤_Windows下python3和python2安装与一起使用
  7. SVN Could not open the requested SVN filesystem解决办法
  8. 线性代数拾遗(四):线性方程组的应用
  9. python itemgetter函数用法_Python中的sorted函数以及operator.itemgetter函数
  10. 据说,上次获奖的同学拿了奖金泡了班花还get到了2个offer
  11. c语言从入门到精通真垃圾,从入门到精通的C语言(吐血量)
  12. vs2003无法打开sal.h
  13. linux patch 给文件打补丁,Linux补丁工具patch生成使用补丁用法示例
  14. 基于照片的3D建模软件
  15. 电脑三种方式连接打印机
  16. 链家爬取深圳租房代码(java)
  17. 解决home end pgup pgdn没有独立,需要键盘映射的问题
  18. 磕磕碰碰中用Visual Studio编译出了64位静态x264和ffmpeg
  19. U盘启动制作Ventoy v1.0.87
  20. top期刊,顶级期刊,顶级期刊,jcr分区和中科院分区

热门文章

  1. CentOS7.2(单网卡iptables)做DNAT访问弹性IP地址端口转发到后端无公网IP的服务器不同端口
  2. 图像的二值化之python+opencv
  3. git push提交成功后如何撤销回退
  4. Arduino mega2560蓝牙遥控小车简介
  5. 【2023最新】32个web前端实战项目,练完即可就业,从入门到进阶,基础到框架,你想要的全都有,建议码住!
  6. 域名如何绑定到服务器ip
  7. word 表格内容不能自动延续到下一页
  8. 2016中国高校计算机大赛——大数据挑战赛极客奖:COM团队
  9. Ajax实现异步请求步骤
  10. flowable-bpmn2添加自定义节点属性