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

时间:2018-10-23 02:10:34

标签: c++ c libcurl

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

  • libcurl中的内部连接缓存会发生什么?
  • 当这四个请求完成时,libcurl是否会“丢弃”并关闭与1.1.1.1的连接?
  • 如果我也有对something.com IP的请求,该怎么办?

如果有问题,我可以使用curl mutli接口。

1 个答案:

答案 0 :(得分:2)

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(HTTP-over-HTTPS)支持后,DNS缓存将缓存TTL秒数的名称,而不仅仅是使用默认的60秒。

注意事项

有一些局限性,条件和极端情况破坏了这里解释的内容,但这是基础。