在Node.js中,一个SSL连接的内存开销大约是多少?

3
我正在使用Node版本v0.8.16。 它捆绑了openssl 1.0.0f,并包含SSL_OP_NO_COMPRESSIONSSL_MODE_RELEASE_BUFFERS
我的测试ssl服务器只会在收到https请求后回显“Hello World”并保持连接开放。 通过我的测试,每个ssl连接的内存开销约为150k。
在Node中,SSL连接的大致内存开销是多少? 在这种情况下,我如何减少SSL的内存使用?
2个回答

8

SSL需要每个连接的空间包括:

  • 套接字FD
  • 接收缓冲区,大约16K用于最大可能的SSL记录大小,这会随着加密套件略有变化
  • 输出缓冲区,也可能是约16k
  • 计算每条消息的MAC所需的空间
  • 握手状态、连接状态、握手MAC等
  • 指向SSL会话的指针,可以在连接到相同目标的多个连接之间共享,并且必须包含加密套件、协议、预主密钥、共享密钥、会话ID、对等证书链、超时变量等
  • 其他我没有想到的。

此外,TCP连接将占用内核空间,例如用于套接字发送和接收缓冲区。


很棒的列表!此外,我必须补充说,由于大多数实现与“消费者”(应用程序代码)没有紧密联系,消费者不知道或关心SSL / tLS内部,因此还存在解码数据(接收后)和发送前数据的缓冲区。这些缓冲区占用的空间甚至比其他东西还要多。这些缓冲区在特定情况下可以进行优化,但并非总是如此。 - Eugene Mayevski 'Callback
@EugeneMayevski'EldoSCorp 通常需要一个明文接收缓冲区,但实际上不需要明文发送缓冲区:通过适当的API设计,您不需要它们中的任何一个。例如,JSSE SSLEngine依赖于应用程序提供所有四个缓冲区。 - user207421
没错,它“依赖于应用程序”,这意味着缓冲区仍然存在 ;) - Eugene Mayevski 'Callback
@EugeneMayevski'EldoSCorp,我会说你不能真正把应用程序(明文)发送缓冲区作为SSL连接成本的一部分来计算。它无论如何都会在应用程序中存在。如果应用程序提供了应用程序接收缓冲区,则同样适用。 - user207421
@EugeneMayevski'EldoSCorp 这就是我的观点。必须有一个明文发送缓冲区,在应用程序空间中,这样你就不能将其视为 SSL 特有的每个连接成本。 - user207421
显示剩余2条评论

3

SSL需要大约128K或更多(取决于实现)的内存缓冲区来处理每个连接,因此您可能无法减少使用的内存量。


我正在使用带有OpenSSL 1.0.0f的Node。你能为此指点我一些文档吗?是否可以减小内存缓冲区的大小? - haijin
1
@haijin,你在问什么文件?这是SSL的工作方式。作为SSL/TLS引擎的实现者,我们知道这一点,但我怀疑你会找到任何声明“SSL需要128 Kb”的文件。正如我所写的,没有办法减小缓冲区大小,因为在这种情况下SSL引擎将无法工作。 - Eugene Mayevski 'Callback
是的,我知道openssl文档很烂,而且我刚接触ssl,所以我想知道是否有一组常量或结构定义了SSL连接的内存缓冲区大小。我在openssl crypto/bio/bf_buff.c中发现,bio ibuf/obuf的默认大小为4096,文档说不能将其减少到4k以下。这只是一个bio缓冲器ctx。我认为那只是你提到的内存缓冲区的一部分。我正在尝试查找有关内存使用情况以及服务器端SSL连接的详细内存分配的文档。 - haijin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接