【问题标题】:Asio streaming - slow speed with SSL/TLS encryptionAsio 流式传输 - SSL/TLS 加密速度慢
【发布时间】:2018-07-13 17:39:02
【问题描述】:

我使用 Asio(非 Boost)创建了一个简单的服务器客户端,并将其用于数据传输速度的简单测试。

服务器:

  • 创建缓冲区 (4 MB)
  • 当客户端连接时(来自async_accept的回调)
    1. 启动计时器
    2. 向客户端发送缓冲区 (async_write)
    3. 等待客户端响应(来自async_read的回调)
    4. 重复步骤 2-3 100 次
    5. 停止计时器
    6. 计算传输速度(100 * 缓冲区大小 * 8 / 次)

客户

  • 连接到服务器
    1. 等待来自服务器的数据(来自async_read的回调)
    2. 将单个字节发送回服务器 (async_write)
    3. 重复

我已经在使用和不使用 SSL/TLS 加密的情况下实现了这一点。非安全版本通过 localhost 可以达到大约 15.0 Gbps 的速度,但加密版本的速度会降低到大约 0.3 Gbps。

这是预期的吗?如果没有,有什么想法可能导致这种情况吗?

【问题讨论】:

    标签: ssl network-programming boost-asio tls1.2


    【解决方案1】:

    任务已受 CPU 限制。您可以使用任务管理器轻松验证。

    还可以与netcatopenssl s_server/s_client 进行比较,以查看相同的效果。例如。 data.bin 是 32MiB 的随机数据,我得到:

    $ for a in {1..100}; do cat data.bin; done | pv | openssl enc -e -kfile server.pem -pass test -out data.bin.crypt
    3,12GiB 0:00:08 [ 392MiB/s]
    

    这只是服务器端加密数据所需的时间。

    【讨论】:

    • 那么这是否意味着在需要加密数据时无法以 1 Gbps 的速度传输,因为 CPU 在发送数据之前需要很长时间来处理数据?
    • 我只能说,当使用openssl s_server 时,情况似乎就是这样。这些工具中可能存在 QoI 问题。但是我从他们那里得到的时间与我从我自己的 Asio 测试人员那里得到的时间相对应(使用 SSL 与不使用 SSL)
    • 我找不到启用 SSL 时使用的代码版本,但这是一个小修改:without SSL
    【解决方案2】:

    这是预期的吗?

    没有。在足够长的传输中,TLS 不小于明文速度的 1/3。我在十年或更长时间前对此进行了广泛的测试,从那时起计算机的速度已经快了很多。

    如果没有,有什么想法可能导致这种情况吗?

    您的应用程序和 TLS 层之间的缓冲可能不足。例如,如果你一次向 TLS 发送一个字节,这里可能会发生 45 次的数据爆炸。

    【讨论】:

    • 我一次发送 4 MB,如下所示:uint32_t size = 4 * 1024 *1024; uint8_t *buffer = new uint8_t[size]; asio::async_write(socket, asio::buffer(buffer, size), complete_callback);
    • @EJP 你能用我们可以重复的基准来支持它吗?我在写答案时这样做了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    相关资源
    最近更新 更多