【libcurl】使用c-ares 异步DNS解析库的客户端如何处理所在主机的DNS变更?

libcurl 是一个很强大的开源网络处理库,主要功能就是用不同的协议连接和沟通不同的服务器。
目前支持 http、https、ftp、gopher、telnet、dict、file 和 ldap 等协议。
libcurl 同样支持 HTTPS 证书授权,HTTP POST、HTTP PUT、FTP 上传,HTTP 基本表单上传、代理、cookies 和用户认证等功能。Google Chrome 内核就用到了 libcurl 库。

image.png

c-ares是一个C语言实现的DNS非阻塞异步解析库,libcurl、 libevent、 gevent,、nodejs和 wireshark都使用了c-ares,因此在一般开发一些服务的客户端Client,在连接服务器Server时,需要做的工作的就是域名解析。

客户端使用c-ares作为DNS解析库,但是当电脑DN地址发生变更时客户端并没有感知到,依然使用变更前的DNS地址做目标域名的解析,会是什么原因?

可能是因为c-ares库缓存了之前的DNS解析结果,导致客户端仍然使用旧的DNS地址进行解析。
c-ares库会在解析DNS时使用缓存来提高解析速度,并且缓存的生命周期是有限的。
如果缓存的生命周期还没有结束,c-ares库就会使用缓存中的DNS地址进行解析。
可以尝试清除c-ares的缓存或者重新初始化c-ares库来解决这个问题。
另外,建议客户端定期更新DNS缓存或者使用DNS服务器提供的TTL机制来自动更新DNS缓存。

如何解决这个问题?

解决这个问题的方法有以下几种:

  1. 在使用c-ares的代码中添加对DNS地址变更的监听,当检测到DNS地址变更时,清空c-ares的缓存,并重新初始化c-ares。这样可以确保c-ares使用最新的DNS地址进行解析。

  2. 在客户端的网络配置中正确设置DNS地址,确保DNS地址变更后客户端可以正确地使用新的DNS地址进行解析。

  3. 客户端可以定期检查DNS地址是否发生变更,如果发生变更,则清空c-ares的缓存,并重新初始化c-ares。这样可以确保c-ares使用最新的DNS地址进行解析。

  4. 如果客户端无法及时获取DNS地址变更的通知,则可以在客户端代码中添加定时器,定期检查DNS地址是否发生变更,并更新c-ares的DNS地址。

通过上述方法,可以确保c-ares能够正确地使用最新的DNS地址进行解析,避免出现DNS解析错误的问题。

当电脑DNS地址发生变更时,客户端并没有感知到依然使用变更前的DNS地址做目标域名的解析,超时时间是多少?

c-ares库的DNS解析超时时间是可以配置的,一般默认为5秒。
如果在这个超时时间内没有收到DNS响应,c-ares库会返回一个错误码,表示DNS解析失败。
如果客户端依然使用旧的DNS地址进行解析,那么解析会一直等待,直到超时时间到达。
在超时时间内,如果DNS服务器没有响应,客户端会一直等待,直到超时时间到达。
如果超时时间到达,c-ares库会返回一个错误码,表示DNS解析失败。
在实际使用中,为了避免DNS解析错误和超时错误,可以通过调整超时时间和优化DNS解析缓存等方式来提高解析效率和可靠性。

为什么在mac电脑上超时时间高达30秒?

c-ares库的DNS解析超时时间是可以通过参数进行配置的,一般默认为5秒。
但是在macOS系统上,由于系统的默认DNS解析超时时间为30秒,因此c-ares库也会继承这个超时时间。
如果需要修改c-ares库的DNS解析超时时间,可以通过设置CARES_TIMEOUTMS_DEFAULT宏定义来修改默认的超时时间。
例如,将超时时间设置为10秒,可以在编译时添加如下宏定义:

-D CARES_TIMEOUTMS_DEFAULT=10000

这样就可以将c-ares库的默认DNS解析超时时间修改为10秒。

使用c-ares的客户端,当所在电脑主DNS挂了,多久会切到从DNS做解析?

使用c-ares的客户端在解析域名时,会按照操作系统的DNS解析规则进行解析。
一般情况下,操作系统会先尝试使用主DNS服务器进行解析,如果主DNS服务器无法响应或者响应超时,则会尝试使用备用DNS服务器进行解析。
在Windows系统中,DNS解析的默认超时时间为2秒,如果在这个时间内无法获得响应,则会尝试使用备用DNS服务器进行解析。
在Linux系统中,DNS解析的默认超时时间为5秒,如果在这个时间内无法获得响应,则会尝试使用备用DNS服务器进行解析。
因此,当主DNS服务器挂掉时,客户端会在一定的超时时间后尝试使用备用DNS服务器进行解析。
如果备用DNS服务器也无法响应,则会继续尝试其他备用DNS服务器,直到获得响应或者所有备用DNS服务器都无法响应为止。
在使用c-ares的客户端中,可以通过调整DNS解析超时时间和优化DNS解析缓存等方式来提高解析效率和可靠性。

用node内置dns模块,替代 libcurl 的c-ares 做DNS解析

你可以使用 Node.js 内置的 dns 模块来替代 libcurl 的 c-ares 库进行 DNS 解析。
Node.js 的 dns 模块提供了多个方法来进行 DNS 查询,包括 dns.lookup()dns.resolve()dns.reverse() 等,可以满足大部分的 DNS 解析需求。

与 c-ares 不同,Node.js 的 dns 模块是基于系统的 DNS 解析机制实现的,因此可以直接使用系统的 DNS 缓存和 DNS 配置,无需单独管理 DNS 缓存和 DNS 配置。同时,Node.js 的 dns 模块也支持异步查询和回调函数,可以满足高并发的网络请求需求。

以下是一个使用 Node.js dns 模块进行 DNS 解析的示例代码:

const dns = require('dns');

// 解析域名为 IP 地址
dns.lookup('www.example.com', (err, address, family) => {
  if (err) throw err;
  console.log(`IP 地址: ${address}`);
});

// 解析域名为 IPv4 地址
dns.resolve4('www.example.com', (err, addresses) => {
  if (err) throw err;
  console.log(`IPv4 地址: ${JSON.stringify(addresses)}`);
});

// 解析域名为 IPv6 地址
dns.resolve6('www.example.com', (err, addresses) => {
  if (err) throw err;
  console.log(`IPv6 地址: ${JSON.stringify(addresses)}`);
});

// 查询邮件交换器记录
dns.resolveMx('example.com', (err, records) => {
  if (err) throw err;
  console.log(`MX 记录: ${JSON.stringify(records)}`);
});

// 解析 IP 地址为域名
dns.reverse('8.8.8.8', (err, hostnames) => {
  if (err) throw err;
  console.log(`域名: ${JSON.stringify(hostnames)}`);
});

需要注意的是,Node.js dns 模块的查询结果可能与 c-ares 的查询结果不完全相同,因为它们使用的 DNS 解析机制不同。
如果需要完全替代 c-ares 进行 DNS 解析,可以使用第三方的 DNS 解析库,例如 dns.jsnative-dns 等。

参考

curl
https://curl.haxx.se

libcurl
https://curl.haxx.se/libcurl

libcurl官方教程
https://curl.haxx.se/libcurl/c/libcurl-tutorial.html

libcurl 使用教程
https://getiot.tech/zh/awesome/awesome-c/libcurl

curl的25年之旅(译)
https://juejin.cn/post/7238804998276137020

为什么我们经常遇到curl域名解析超时?
https://toutiao.io/posts/sevo1kc/preview

c-ares 一个C语言的异步DNS解析库
http://wangxuemin.github.io/2015/07/31/c-ares%20%E4%B8%80%E4%B8%AAC%E8%AF%AD%E8%A8%80%E7%9A%84%E5%BC%82%E6%AD%A5DNS%E8%A7%A3%E6%9E%90%E5%BA%93/

CURLOPT_DNS_CACHE_TIMEOUT explained
https://curl.se/libcurl/c/CURLOPT_DNS_CACHE_TIMEOUT.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容