项目中使用curl与服务器进行https的通信,每次消息来回几乎都要超过200ms。这个时间太长,需要优化。
首先,就是定位问题出在哪儿。记录如下:
是服务器的问题吗?
用postMan和curl命令行,发送同样的消息到服务器,测试处理时间通常都在100ms以下,所以不是服务器的问题。
让curl输出更多信息
curl_easy_setopt(easyHandle, CURLOPT_VERBOSE, 2L);
哪一步花时间长?
通过curl_easy_getinfo接口,获取到每一步花费的时间。确认是tls握手时间太长。
curl_easy_getinfo( easyHandle, CURLINFO_TOTAL_TIME, &totaltime );
curl_easy_getinfo( easyHandle, CURLINFO_NAMELOOKUP_TIME, &namelooktime );
curl_easy_getinfo( easyHandle, CURLINFO_CONNECT_TIME, &connettime );
curl_easy_getinfo( easyHandle, CURLINFO_PRETRANSFER_TIME, &pretransfertime );
curl_easy_getinfo( easyHandle, CURLINFO_STARTTRANSFER_TIME, &starttransfertime );
curl_easy_getinfo( easyHandle, CURLINFO_APPCONNECT_TIME, &appconnecttime );
测试各种参数
没发现有什么参数有影响。
获取最新版本curl库
用同样的代码,换了个系统安装的curl库,发现速度提上来了,与命令行测试相当。系统的库版本号与SDK中不一样。以为是curl版本的问题。决定更新curl库。
最终的原因
然而,在后面的折腾中才发现并不是curl版本的原因。curl要支持https,需要用其他库。我们项目中使用的是axtls库。这是一个支持嵌入式的,非常简化的版本。而系统安装的curl库,使用的是openssl。差别在这里。
解决方案
还是决定替换一个比较新的curl版本,带openssl的。
本文分析了使用curl进行HTTPS通信时出现的高延迟问题,并详细记录了排查过程,最终确定了TLS握手耗时过长为主要原因。通过更换采用openssl的curl版本解决了此问题。

9552

被折叠的 条评论
为什么被折叠?



