代码之家  ›  专栏  ›  技术社区  ›  Pavel P

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

  •  0
  • Pavel P  · 技术社区  · 6 年前

    libcurl缓存连接,并在连续请求中重用它们。 假设我有4个正在进行的连接 example.com 我要接5路。libcurl将尝试建立新的第5个连接 范例网站 . 如果在创建第5个连接的TTL时 范例网站 DNS结果过期?我想libcurl不缓存DNS结果,只查询OS解析器(我不使用ares),如果 范例网站 在缓存中过期,将发出新的DNS请求。 现在,假设最初的4个请求 范例网站 已按要求解决 1.1.1.1 第5个请求被解决为 5.5.5.5 .

    • libcurl中的内部连接缓存会发生什么情况?
    • 当这4个请求完成时,libcurl是否“丢弃”并关闭与1.1.1.1的连接?
    • 如果我也有要求 something.com 也决定 1.1.1.1 知识产权?

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   Daniel Stenberg    6 年前

    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。

    告诫

    有一些限制、条件和边缘情况打破了这里的解释,但这是基础。