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
。
something.com
IP的请求,该怎么办?如果有问题,我可以使用curl mutli接口。
答案 0 :(得分:2)
curl有自己的内部DNS缓存,默认情况下它将在其中缓存解析的地址60秒钟(您可以更改)。因此,具有相同名称的后续解析将在该时间范围内使用缓存的结果。
curl的连接缓存完全基于URL中使用的主机名,因此,如果缓存中已有与“ example.com”的可用连接,则该连接将用于对同一主机名的后续请求。 curl既不知道也不关心该名称的IP地址是什么,或者从连接开始以来它是否已更改。重用连接时,它将跳过整个名称解析阶段。
当传输完成并且连接仍处于活动状态时,该连接将放回到连接缓存中(如果由于达到限制而被视为“已满”,则将其关闭)。
由于连接重用是基于名称完成的,因此使用另一个名称来解析现有连接的相同IP不会使curl重复使用该连接。它将解析名称并为此创建一个新的连接。
除非连接被杀死以腾出空间或被重用,否则连接可以在连接缓存中保留无限的时间。如果它“死了”(由于它从另一端关闭了),那么当它被注意到时,它将最终从缓存中删除。
PING帧等不会(atm)用于连接缓存中的连接,这将导致它们很快被服务器杀死。 (libcurl 7.62.0添加了新的API,以允许应用程序也保持这种连接有效,请参见curl_easy_upkeep)
curl 7.62.0中引入了DoH(HTTP-over-HTTPS)支持后,DNS缓存将缓存TTL秒数的名称,而不仅仅是使用默认的60秒。
有一些局限性,条件和极端情况破坏了这里解释的内容,但这是基础。