【问题标题】:Internal connection management in libcurl and DNS ttllibcurl 和 DNS ttl 中的内部连接管理
【发布时间】:2018-10-23 02:10:34
【问题描述】:

libcurl 缓存连接并将它们重用于连续的请求。 假设我有 4 个到 example.com 的连接正在进行,我需要进行第 5 个连接。 Libcurl 将尝试与example.com 建立新的第五个连接。 如果在为example.com DNS 结果创建第 5 个连接时 TTL 过期,会发生什么情况?我想 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.1 ip,该怎么办?

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

【问题讨论】:

    标签: c++ c libcurl


    【解决方案1】:

    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

    DoH

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

    注意事项

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      相关资源
      最近更新 更多