【发布时间】: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请求,这应该是低开销。