【问题标题】:Why is TLS slow?为什么 TLS 很慢?
【发布时间】:2023-04-03 21:45:02
【问题描述】:

我应该期望 SSL/TLS 增加多少开销?

我正在使用带有 OpenSSL 1.0.1f 和 Python 3.4.3 的 Ubuntu 14.04。

test.py

from datetime import datetime
import socket
import ssl

with socket.socket() as server:
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind(('', 8001))
    server.listen(1)
    while True:
        with server.accept()[0] as client:
            start = datetime.now()
            client = ssl.wrap_socket(client, 'key.pem', 'cert.pem', True)
            end = datetime.now()
            print('{:.0f}ms'.format((end - start).total_seconds() * 1000))
            client.send(b'hello')
            client.shutdown(socket.SHUT_RDWR)

启动服务器

$ openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
$ python3 test.py

然后连接

$ for i in $(seq 20); do openssl s_client -cert cert.pem -key key.pem -connect localhost:8001; done 
$ # output shows TLSv1.2 is being used

即使在同一主机上, TLS 协商也需要 15 毫秒。当我删除 TLS 时,我测量整个连接、传输和关闭的时间为

我在这里没有太多经验,但这似乎比我预期的要慢得多。那是数百万个时钟周期。从洛杉矶到纽约的速度比光还慢。

(1) 这种表现是否符合我的预期? (2) 造成这种性能的限制因素是什么? (3) 我可以更改此代码以使初始 TLS 协商更快吗?

【问题讨论】:

  • This page 声称由于网络延迟,通常为 250-500 毫秒。在同一台主机上 15 毫秒似乎很好(是的,它可能使用数百万个时钟周期,因为众所周知 DH 密钥交换是计算密集型的)。诀窍是让连接保持打开状态,因此您只需执行一次。

标签: python performance sockets ssl tls1.2


【解决方案1】:

在普通 TCP 的情况下,您有一个 TCP 握手 (1 RTT),它在操作系统内核中完全处理,以最大限度地减少延迟和资源使用。

而对于 TLS 和您的代码,您除此之外始终有一个完整的 TLS 握手,因为您的代码不进行会话重用。这意味着 2 RTT 仅用于握手和每次密钥交换的重加密(影响取决于密码)。在(内核内)TCP 关闭之上,还有一个额外的 RTT 用于有序的 TLS 关闭。此外,与 TCP 握手相比,传输的数据更多,并且 TLS 握手完全在用户空间中完成,这会导致调度、读取和写入数据的许多系统调用以及内核和用户空间之间的上下文切换和副本所涉及的额外延迟这些系统调用。此外,您每次都设置一个新的 SSL 上下文,包括加载证书等,这会增加更多不必要的开销。

所有这些开销都在同一系统上完成两次,因为您在同一系统上拥有客户端和服务器,并且您还使用客户端证书。 此外,您不会仅传输非常少的数据(远少于仅 TLS 握手所需的数据),因此您只需测量 TLS 握手所需的时间,即 TLS 中最昂贵的部分。而且,由于您有一个单线程客户端和一个单线程服务器,因此每一个都可能是速度限制。

换句话说:您的基准测试并未反映常见现实世界场景中 TLS 与 TCP 的实际开销。但它表明,如果以过于简单的方式使用 TLS 会产生明显的影响,即没有任何通常由执行大量 TLS 的应用程序完成的优化。

【讨论】:

  • 上下文切换以微秒为单位。是的,我将在同一个系统上进行此操作,但它是一个多核环境。是的,我没有传输数据;我对 TLS 为其他快速网络连接引入的延迟感兴趣。
【解决方案2】:
  • 因为 TLS 执行 7 次 TCP 行程来建立加密层
  • 因为涉及加密(RSA、DHE、...)

15ms 真的不算多。

【讨论】:

    猜你喜欢
    • 2019-10-02
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2020-01-17
    • 2015-12-18
    • 1970-01-01
    相关资源
    最近更新 更多