libcurl 和 DNS ttl 中的内部连接管理
Internal connection management in libcurl and DNS ttl
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.1
ip,该怎么办?
如果重要,我使用 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。
警告
有一些限制、条件和边缘情况会破坏此处解释的内容,但这是基础知识。
- 将函数类成员映射到类本身内部
- 当套接字连接断开时检测C/C++Unix
- Boost Spirit,获取迭代器内部语义动作
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 内联函数中具有内部链接的全局变量
- 在函数内部的声明中初始化数组,并在外部使用它
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 卷曲bracers内部结构的声明
- 从函数角度看ID到文件路径的内部与外部映射
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 如何在pugixml中获取节点的内部XML
- 使用C链接在函数内部创建C++模板
- 无法在windows上使用mingw将sqlite3与c连接
- 指针没有更新它在void函数内部指向的值
- libcurl 和 DNS ttl 中的内部连接管理
- 套接字连接在主功能内部但不在功能内部
- Qt,C++:QListWidget内部拖放 - 如何连接到信号?
- 两个对象内部的共享指针相互连接
- Qt:连接内部构造函数-将槽在对象初始化之前被调用
- 如何使用OpenCV::ML管理ANN内部神经元的连接