SSL延迟有多大?

本文深入解析了HTTPs链接相较于HTTP链接的额外开销——SSL延迟,并通过命令行工具curl展示了如何测量TCP握手和SSL握手的具体耗时。文章进一步探讨了在不同场景下选择不同强度的数字证书的必要性,以平衡安全性与网页性能之间的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.ruanyifeng.com/blog/2014/09/ssl-latency.html

作者: 阮一峰

据说,Netscape公司当年设计SSL协议的时候,有人提过,将互联网所有链接都变成HTTPs开头的加密链接。

这个建议没有得到采纳,原因之一是HTTPs链接比不加密的HTTP链接慢很多。(另一个原因好像是,HTTPs链接默认不能缓存。)

自从我知道这个掌故以后,脑袋中就有一个观念:HTTPs链接很慢。但是,它到底有多慢,我并没有一个精确的概念。直到今天我从一篇文章中,学到了测量HTTPs链接耗时的方法。

slow connection

首先我解释一下,为什么HTTPs链接比较慢。

HTTPs链接和HTTP链接都建立在TCP协议之上。HTTP链接比较单纯,使用三个握手数据包建立连接之后,就可以发送内容数据了。

tcp handshake

上图中,客户端首先发送SYN数据包,然后服务器发送SYN+ACK数据包,最后客户端发送ACK数据包,接下来就可以发送内容了。这三个数据包的发送过程,叫做TCP握手。

再来看HTTPs链接,它也采用TCP协议发送数据,所以它也需要上面的这三步握手过程。而且,在这三步结束以后,它还有一个SSL握手

总结一下,就是下面这两个式子。

HTTP耗时 = TCP握手

HTTPs耗时 = TCP握手 + SSL握手

所以,HTTPs肯定比HTTP耗时,这就叫SSL延迟。

命令行工具curl有一个w参数,可以用来测量TCP握手和SSL握手的具体耗时,以访问支付宝为例。



$ curl -w "TCP handshake: %{time_connect}, SSL handshake: %{time_appconnect}\n" -so /dev/null https://www.alipay.com

TCP handshake: 0.022, SSL handshake: 0.064

上面命令中的w参数表示指定输出格式,time_connect变量表示TCP握手的耗时,time_appconnect变量表示SSL握手的耗时(更多变量请查看文档实例),s参数和o参数用来关闭标准输出。

从运行结果可以看到,SSL握手的耗时(64毫秒)大概是TCP握手(22毫秒)的三倍。也就是说,在建立连接的阶段,HTTPs链接比HTTP链接要长3倍的时间,具体数字取决于CPU的快慢和网络状况。

所以,如果是对安全性要求不高的场合,为了提高网页性能,建议不要采用保密强度很高的数字证书。一般场合下,1024位的证书已经足够了,2048位和4096位的证书将进一步延长SSL握手的耗时。

(完)


<think>我们正在讨论curl的SSL会话复用功能。根据引用内容,我们注意到引用[1]提到了curl_easy_setopt函数中设置CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST,但没有直接提到会话复用。然而,我们知道curl是支持SSL会话复用的,这可以通过设置CURLOPT_SSL_SESSIONID_CACHE选项来实现(默认是开启的)。此外,还可以使用CURLOPT_SSL_CTX_FUNCTION来管理SSL上下文,包括会话缓存。 SSL会话复用(Session Resumption)是一种优化技术,它允许客户端在后续连接中重用之前协商的SSL/TLS会话参数,从而跳过耗价的握手过程,减少延迟。 在curl中,SSL会话复用默认是启用的,但我们可以通过一些选项来配置或控制它。 具体配置方法: 1. 默认情况下,curl会尝试复用会话(如果服务器支持)。我们可以通过设置`CURLOPT_SSL_SESSIONID_CACHE`选项来控制是否使用会话ID缓存。这个选项默认是开启的(值为1),如果要禁用,可以设置为0: ```c curl_easy_setopt(curl, CURLOPT_SSL_SESSIONID_CACHE, 0L); // 禁用会话ID缓存 ``` 2. 另外,curl还提供了通过回调函数管理SSL上下文的能力,即`CURLOPT_SSL_CTX_FUNCTION`。我们可以通过这个回调函数来设置SSL上下文的参数,包括会话缓存的方式(例如设置会话缓存的小、超时时间等)。不过,这需要更深入的OpenSSL知识。 3. 为了验证会话复用是否发生,我们可以启用详细模式(使用`CURLOPT_VERBOSE`),然后查看输出中是否有类似“Re-using existing connection”或“SSL re-using session ID”的信息。 示例代码: ```c #include <curl/curl.h> int main(void) { CURL *curl = curl_easy_init(); if(curl) { // 设置URL curl_easy_setopt(curl, CURLOPT_URL, "https://example.com"); // 启用详细模式以便观察会话复用情况 curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); // 执行第一次请求(建立会话并缓存) curl_easy_perform(curl); // 再次执行请求(尝试复用会话) curl_easy_perform(curl); curl_easy_cleanup(curl); } return 0; } ``` 在详细模式的输出中,如果看到类似以下信息,说明会话复用成功: ``` * Re-using existing connection! (#0) with host example.com * Connected to example.com (93.184.216.34) port 443 (#0) * SSL re-using session ID ``` 注意:会话复用需要服务器支持。如果服务器不支持,那么即使客户端启用,也无法复用。 另外,引用[3]提到了HTTP/2和HTTP/3在连接复用方面的不同机制,但SSL会话复用是TLS层的一个特性,与HTTP版本无关。 总结: - curl默认支持SSL会话复用,通过`CURLOPT_SSL_SESSIONID_CACHE`控制(默认启用)。 - 可以通过详细输出(`CURLOPT_VERBOSE`)来观察会话复用情况。 - 会话复用需要服务器支持。 相关问题: 1. 如何验证curl是否成功复用了SSL会话? 2. 除了会话ID缓存,curl还支持哪些会话复用机制(如Session Ticket)? 3. 在HTTP/2和HTTP/3中,连接复用与SSL会话复用有什么关系?</think>### cURL 是否支持 SSL 会话复用? 是的,**cURL 完全支持 SSL/TLS 会话复用**(Session Resumption)。这是通过两种主要机制实现的: 1. **Session ID 缓存** 默认启用,cURL 会缓存 SSL 会话 ID,后续连接相同服务器时直接复用会话参数,跳过完整握手过程。 ```c // 默认启用(无需额外配置) CURL *curl = curl_easy_init(); ``` 2. **Session Ticket (RFC 5077)** 支持无状态会话恢复,服务器通过加密票据传递会话信息,客户端下次连接时提交票据即可恢复会话。 --- ### 如何配置会话复用? #### 1. 启用会话缓存(默认已启用) ```c CURL *curl = curl_easy_init(); if (curl) { // 启用 SSL 会话缓存(默认值为 1,通常无需显式设置) curl_easy_setopt(curl, CURLOPT_SSL_SESSIONID_CACHE, 1L); } ``` > **注意**:会话缓存默认开启,无需额外配置[^1]。 #### 2. 验证会话复用效果 通过 `CURLOPT_VERBOSE` 输出调试信息,观察日志中的 `SSL-Session:` 字段: ```c curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); // 启用详细日志 ``` 若日志出现 `Reused SSL session` 或 `SSL re-using session ID`,表明会话复用成功[^1]。 #### 3. 自定义会话缓存管理(高级) 通过回调函数手动管理会话缓存: ```c // 定义会话缓存回调 static size_t session_cb(CURL *curl, void *sessionid, size_t size) { // 自定义缓存读写逻辑 return size; } // 设置回调 curl_easy_setopt(curl, CURLOPT_SSL_SESSIONID_CACHE, 0L); // 禁用内置缓存 curl_easy_setopt(curl, CURLOPT_SSL_CTX_FUNCTION, session_cb); ``` #### 4. 关键配置选项 | 选项 | 作用 | |-----------------------------|----------------------------------------------------------------------| | `CURLOPT_SSL_SESSIONID_CACHE` | 启用/禁用会话ID缓存(默认:1启用) | | `CURLOPT_SSL_CTX_FUNCTION` | 自定义SSL上下文回调(用于手动管理会话) | | `CURLOPT_VERBOSE` | 输出详细日志(验证复用效果) | --- ### 注意事项 1. **服务器兼容性** 会话复用需服务器支持(如 Nginx/Apache 需开启 `ssl_session_cache` 和 `ssl_session_tickets`)。 2. **超时限制** 会话缓存有效期由服务器决定(通常 5-10 分钟),超时后自动重新协商。 3. **线程安全** 默认会话缓存不支持线程,需通过 `CURLOPT_SSL_CTX_FUNCTION` 实现线程安全管理。 > **调试建议**:始终启用 `CURLOPT_VERBOSE` 日志,通过输出中的 `SSL-Session` 字段确认复用状态[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值