libcurl 和 DNS ttl 中的内部连接管理

Internal connection management in libcurl and DNS ttl

本文关键字:内部 连接 连接管 管理 DNS ttl libcurl      更新时间:2023-10-16

libcurl 缓存连接并将其重用于连续的请求。 假设我有 4 个连接正在进行中example.com我需要建立第 5 个连接。Libcurl 将尝试与example.com建立新的第 5 个连接。 如果在为 DNS 结果创建第 5 个连接的 TTL 时example.com会发生什么情况?我想libcurl不会缓存DNS结果,而只是查询操作系统解析器(我不使用ares(,如果缓存中example.com过期,则会发出新的DNS请求。 现在,假设最初对example.com的请求 4 个请求被解析为对1.1.1.1的请求,第 5 个请求被解析为5.5.5.5个请求。

  • libcurl 中的内部连接缓存会发生什么变化?
  • 当这 4 个请求完成时,libcurl 是否会"丢弃"并关闭与 1.1.1.1 的连接?
  • 如果我也有something.com请求,但同时也决定1.1.1.1ip,该怎么办?

如果重要,我使用 curl mutli 接口。

curl 有自己的内部 DNS 缓存,默认情况下它将在其中缓存解析的地址 60 秒(您可以更改它(。因此,同名的后续解析将使用该时间范围内的缓存结果。

curl 的连接缓存完全基于 URL 中使用的主机名,因此,如果缓存中存在与"example.com"的现有可用连接,则该连接将用于对该相同主机名的后续请求。 curl 不知道也不关心该名称的 IP 地址是什么,或者自连接启动以来它是否发生了变化。重用连接时,它会跳过整个名称解析阶段。

当传输完成并且连接仍处于活动状态时,连接将放回连接缓存中(如果缓存由于达到限制而被视为"已满",则关闭(。

由于连接重用是基于名称完成的,因此使用另一个解析为现有连接的相同 IP 的名称不会使 curl 重用该连接。它将解析名称并为其创建一个新连接。

连接可以无限期地保留在连接缓存中,除非它被终止以腾出空间或被重用。如果它"死亡"(由于它从另一端关闭(,当它被注意到时,它最终将从缓存中删除。

HTTP/2

可以通过HTTP/2发送的PING帧等将不会(atm(处理连接缓存中的连接,这将导致它们很快被服务器杀死。(libcurl 7.62.0 添加了一个新的 API,允许应用程序也保持此类连接处于活动状态,请参阅curl_easy_upkeep(

卫生部

随着 curl 7.62.0 中引入 DoH(DNS-over-HTTPS(支持,DNS 缓存将缓存 TTL 秒数的名称,而不仅仅是使用时的默认 60。

警告

有一些限制、条件和边缘情况会破坏此处解释的内容,但这是基础知识。