【问题标题】:Pre-create connections in libcurl connection pool在 libcurl 连接池中预创建连接
【发布时间】:2019-03-28 05:02:46
【问题描述】:

在启动期间,我的应用程序会进行一些耗时的初始化,然后它会建立到多个域的 ssl 连接(到其中一些域的多个连接)。通过查看wireshak跟踪,建立ssl连接最多需要150-200ms。

我可以告诉 curl 提前建立一个到 abc.com 的 ssl 连接和到 xyz.com 的 3 个 ssl 连接吗? 我有什么选择?我可以向这些域发出一些虚假请求,但我宁愿避免这样做,以免虚假请求污染服务器。作为最后的手段,我可​​能会向这些域发出 http OPTIONS 请求。

【问题讨论】:

  • "150-200ms" - 考虑到 3 次握手,这听起来像是互联网范围内 TLS 连接的典型延迟。如果是这种情况,那么抢先创建与远程主机的 TLS 连接实际上可能不会节省您的时间,因为远程主机可能会在一段时间不活动后关闭不活动的连接,因此您需要重做该过程(无论如何需要 150-200 毫秒)一切从头再来。
  • 您想在下一个连接上恢复之前的 TLS 会话(会话重用)。这应该是您在 SSL 堆栈中启用的功能。
  • @Dai 就我而言,我在全球范围内拥有数百万个手机连接。 150-200 是最好的情况,最坏的情况可能在几秒钟内。我的启动时间可能是 500 毫秒左右,所以在启动期间我可以创建 TLS 这些连接,所以当我准备好使用它们时,它们已经被创建或正在创建中。
  • @jxh 在我的情况下,这是一个新进程,我没有以前的连接。我只想提前做好这些联系
  • 虽然 libcurl 可能不支持它,但您的 TLS 库应该有 API 允许您将会话 ID 缓存保存到文件中,并在下次启动时重新加载缓存。在预填充方面,你必须发送一个请求,但你可以发送一个HEAD 请求,这应该是低开销。

标签: c++ c libcurl


【解决方案1】:

由于已建立的连接在转移后会在 curl 的connection cache 中保留一段时间,我建议您只需执行一个简单的HEAD 请求(使用CURLOPT_NOBODY)或OPTIONS 一个,然后在启动时剩下的就是“真正的”请求并重用该连接。

【讨论】:

  • 选项请求呢?有什么反对的吗?
  • 为了处理可能的情况,即我可能在 HEAD/OPTIONS 完成之前开始我的实际 ssl 请求,我可能需要启用流水线以确保即使有未完成的请求,这些 ssl 连接也会被重用进展。
  • 这应该同样适用于连接目的。只是您需要使用 libcurl 的 API 设置一个字符串(“OPTIONS”),而不仅仅是一个布尔值。
猜你喜欢
  • 2015-01-09
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多