【Happy Eyeballs算法】Happy Eyeballs算法及curl支持--happy-eyeballs-timeout-ms或者代码实现

news2024/11/15 8:07:14

参考链接

IPV6 && Happy Eyeballs - 腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1561091

Happy Eyeballs算法

Happy Eyeballs是一个应用于网络双栈环境的算法,于2011年被提出。

Happy Eyeballs有两个主要目标:

  1. 从 ipv4 和 ipv6 中为用户选择一个最快的链接;
  2. 避免同时对两地址发起请求,造成网络破坏。

访问一个 Ipv6 的网站的过程是这样的:

通过 DNS 的 AAAA 解析获取到了域名对应的 Ipv6 的地址,然后就会通过 Ipv6 的地址访问网站,如果访问不通,业务就会挂掉,导致用户访问失败。

如果这个网址只支持 Ipv6 ,那就是这种现象。如果网址本身支持双栈,即同时支持 Ipv4 和 Ipv6 ,那么在某些环境下,会启用 Happy Eyeballs 算法,进行快速回退,使用 Ipv4 进行访问。

这样避免让大家担心使用 Ipv6 后如果网络不通,用户流失。

Happy Eyeballs 可以理解为对 ipv6 请求失败时的降级方案。

Happy Eyeballs具体原理

对于支持双栈的网络环境下,当访问一个网站时,会同时发起 AAAA 和 A 的 DNS 查询请求,并对获取的结果进行排列,优先 Ipv6 ,然后进行 Ipv6 的链接尝试,在大概 200ms 后如果链接不通,立即启用下一个 ip 的链接请求,一般就是 Ipv4 了。

在这种场景下,就不要担心由于 Ipv6 的网络连通性比较差而导致站点无法访问了,即使在当前国内各运营商 Ipv6 连通性比较差的情况下,多的就是一个大概 200ms 的延迟,跟拒绝服务比起来,还算能接受。

两种访问场景如下,参考RFC 6555:

curl支持配置--happy-eyeballs-timeout-ms

--happy-eyeballs-timeout-ms: 当一个域名有 ipv4 和 ipv6 双栈地址当时候,curl 或者浏览器是怎么访问的?happy-eyeballs 算法是一个解决这个问题的简单方法:即优先用 ipv6,等几百 ms 后发现不行,再试 ipv4 地址,这个参数就是用来控制等待时间的

curl代码实现happy-eyeballs

Name

CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS - head start for IPv6 for happy eyeballs

Synopsis

#include <curl/curl.h>
 
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS,
                          long timeout);

Description

Happy eyeballs is an algorithm that attempts to connect to both IPv4 and IPv6 addresses for dual-stack hosts, preferring IPv6 first for timeout milliseconds. If the IPv6 address cannot be connected to within that time then a connection attempt is made to the IPv4 address in parallel. The first connection to be established is the one that is used.

The range of suggested useful values for timeout is limited. Happy Eyeballs RFC 6555 says "It is RECOMMENDED that connection attempts be paced 150-250 ms apart to balance human factors against network load." libcurl currently defaults to 200 ms. Firefox and Chrome currently default to 300 ms.

Default

CURL_HET_DEFAULT (currently defined as 200L)

Protocols

All except FILE

Example

CURL *curl = curl_easy_init();
if(curl) {
  curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");
  curl_easy_setopt(curl, CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS, 300L);
 
  curl_easy_perform(curl);
 
  /* always cleanup */
  curl_easy_cleanup(curl);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/452824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言实现杨辉三角

目录 1. 发现杨辉三角的规律 2. 实现杨辉三角&#xff08;无格式控制&#xff09; 3. 输出带格式控制的杨辉三角 1. 发现杨辉三角的规律 # 每一行的第一个元素是1 ## 每一行的最后一个元素是1 ### 上一行的两个数相加等于下一行的某个数值 2. 实现杨辉三角&#x…

Linux服务器Anaconda版本安装JupyterLab

1、场景 在Linux服务器上安装JupyterLab并可在远程访问&#xff01; 2、Anaconda版本 本次安装的Anaconda 版本&#xff1a;Anaconda3-5.2.0-Linux-x86_64.sh 下载地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 3、安装 3.1 关闭防火墙 # 查看防火…

使用状态机实现幂等性

文章目录 背景幂等概念适用场景示例代码上述代码状态流转 背景 在某些场景下&#xff0c;可以使用状态机来实现幂等性。将业务流程抽象为一个状态机&#xff0c;定义各个状态之间的转换规则。当收到一个请求时&#xff0c;根据当前状态和请求类型来判断是否允许执行操作&#x…

MySQL高级篇——存储引擎和索引

导航&#xff1a; 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线牛客面试题_java黑马笔记 目录 一、存储引擎 1.1、查看、设置存储引擎的命令 1.2、InnoDB引擎 1.2.1、特点 1.2.2、优势 1.2.3、InnoDB事务的ACID特…

[读书笔记] 从问题和公式角度理解 Diffusion Model

[小全读书笔记] 从问题和公式角度理解 Diffusion Model 1. Diffusion Model的结构1.1 定义与限制1.2 定义与限制的数学体现 2. Diffusion Model的模型训练2.1 似然函数转换成ELBO2.2 拆解ELBO2.3 求解关键&#xff1a; q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt−1…

垃圾回收概述

什么是垃圾 垃圾收集&#xff0c;不是Java语言的伴生产物。早在1960年&#xff0c;第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。 关于垃圾收集有三个经典问题&#xff1a; 哪些内存需要回收&#xff1f;什么时候回收&#xff1f;如何回收&#xff1f; 垃圾收…

在线审片工具是什么,安捷秀如何在线审片?

当影视内容完成拍摄后&#xff0c;即进入漫长、繁复的后期制作过程&#xff0c;审片就是后期制作过程中一个非常重要的环节。传统的审片需要专门的场地、音画设备&#xff0c;召集人员在特定时间进行&#xff0c;人财物的成本都非常高&#xff0c;在此情况下&#xff0c;在线审…

GeoServer使用MySQL数据库出现“Error decoding wkb”错误的一种情况

错误 请看一下GeoServer官方文档的警告 Warning:Currently the MySQL extension is unmaintained and carries unsupported status. While still usable, do not expect the same reliability as with other extensions. 没事不要特立独行使用MySQL当GeoServer的空间数据库&am…

文件和用户管理

Linux基础 提示&#xff1a;个人学习总结&#xff0c;仅供参考。 一、Linux系统部署 二、服务器初始化 三、文件和用户管理 提示&#xff1a;文档陆续更新整理 文件和用户管理 Linux基础一、Linux目录结构二、文件管理1.文件类型2.文件管理命令 三、用户管理1. 用户/组基本概…

MySQL隐式类型转换

当运算符与不同类型的操作数一起使用时&#xff0c;会发生类型转换以使操作数兼容。有些转换是隐式发生的。例如&#xff0c;MySQL会根据需要自动将字符串转换为数字&#xff0c;反之亦然。 转换规则 如果一个或两个参数都为NULL&#xff0c;则比较结果为NULL 。但是相等比较…

Android Wifi 扫描

今天拿了个新需求&#xff0c;要求为工厂开发一个扫地机模组检测功能的App&#xff0c;需求逻辑&#xff1a; 1.可以选择机器支持的WBR3 模组和WR3 模组&#xff1b; 2.可以选择机器热点名称的前缀&#xff1a;Thamtu 和 SmartLife&#xff0c;还有自定义输入前缀&#xff1b…

Java概述

Java语言简史&#xff1a; 是SUN(Stanford University Network&#xff0c;斯坦福大学网络公司 ) 1995年推出的一门高级编程语言。 是一种面向Internet的编程语言。Java一开始富有吸引力是因为Java程序可以在Web浏览器中运行。这些Java程序被称为Java小程序&#xff08;applet&…

foldersync使用感受

foldersync简介 ​ FolderSync pro是一款功能非常强大的设备本地存储(包括SD卡)文件/文件夹与云存储同步应用。它可以将手机中的文件自动同步到云端空间&#xff0c;支持包括 FTP、WebDAV、Dropbox、 Google Docs 在内的众多空间。 FolderSync Pro 支持各种不同的云服务商和文件…

CTA策略趋势类

趋势策略 趋势策略日内策略Hilbert 策略R-Braker 策略Dual Thrust 策略菲阿里四价策略空中花园策略 日间策略移动平均线MACD 策略Aberration 策略ATR 策略动量策略肯特纳通道自动识别趋势的追涨交易策略 趋势策略 市场只有两种状态&#xff1a;震荡和单边。 而两种市场状态只…

springboot项目:瑞吉外卖 前后端详细分析 part4

part 1 part 2 part 3 part 4 本页 文章目录 5 套餐管理5.1 新增套餐5.1.1 整体分析5.1.2 前端分析5.1.3 后端分析 持续更新中 5 套餐管理 5.1 新增套餐 5.2 套餐信息分页查询 5.3 删除套餐 其他小功能都比较简单且类似&#xff0c;不再赘述 5.1 新增套餐 5.1.1 整体分析 套…

jmeter取样器javaRequest脚本8

1,创建一个maven工程2,通过maven编译打包生成一个jar包3,重启jmeter&#xff0c;新建java request请求4,开始执行脚本本文永久更新地址: 1,创建一个maven工程 在pom.xml文件中添加 maven下载地址&#xff1a;https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMe…

【MySQL】关于 SQL 语句执行分析的二三事

一、为什么要发生这件事 确实&#xff0c; 平时我们增删改查写的好好的&#xff0c; 各种业务代码&#xff0c;各种小接口写的不亦乐乎&#xff0c;正常是没时间干这个的&#xff0c;但是但是&#xff0c;这不是还有点技术追求嘛&#xff0c;假如我们平时测一个小接口&#xf…

【LeetCode】199.二叉树的右视图

1.问题 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 示例 2: 输入: [1,null,3] 输出: [1,3] 示例 3: 输入: [] 输出: []…

类加载过程

基本说明 反射机制是Java实现动态语言的关键&#xff0c;也就是通过反射实现类动态加载。 静态加载&#xff1a;编译时加载相关的类&#xff0c;如果没有则报错&#xff0c;依赖性太强动态加载&#xff1a;运行时加载需要的类&#xff0c;如果运行时不用该类&#xff0c;即使…

C++关于线程的一些操作

线程创建和接收 std::this_thread::get_id()获取当前线程的线程ID std::this_thread::yield()让步结束当前线程的时间片 int main() {vector<thread> threads(2);threads[0] thread([]() {cout << this_thread::get_id() << endl;});threads[1] thread([](…