SSL带来多少额外负担?

172
我知道没有单一的硬性答案,但是在SSL和未加密的套接字通信之间,是否有一个通用的数量级估计来近似计算加密开销?我只谈论通信处理和传输时间,不考虑应用程序级别的处理。
更新
有一个关于HTTPS与HTTP的问题,但我对低层次的东西感兴趣。
(我替换了“数量级”这个短语,以避免混淆;我使用它作为非正式的行话,而不是在正式的计算机科学意义上使用。当然,如果我确实要正式地使用它,作为一个真正的极客,我会考虑二进制而不是十进制!;-)
更新
按照评论中的请求,假设我们谈论的是大型消息(范围在1k-10k),通过持久连接进行传输。因此,连接设置和数据包开销并不是重要问题。

你可以看一下这个类似的问题 - Darin Dimitrov
1
你能更详细地描述一下你的应用程序吗?例如,它是否建立了大量短暂的连接?在连接期间,单个消息通常有多大?(例如,您是否使用Telnet通过SSL隧道刷新每个按键,或者您是否复制1Tb的日志文件。) - erickson
证书链的初始检查在客户端方面会导致显著的延迟。 - Louis Somers
3个回答

182

数量级:零。

换句话说,当您添加TLS时,您不会看到吞吐量减半或其他任何影响。对于“重复”问题的答案主要关注应用程序性能及其与SSL开销的比较。而这个问题特别排除了应用程序处理,并且仅寻求非SSL和SSL之间的比较。在优化时考虑总体性能是有意义的,但这不是这个问题所问的。

SSL的主要开销在于握手。那是昂贵的非对称加密发生的地方。在协商之后,使用相对高效的对称密码。那就是为什么在HTTPS服务中启用SSL会非常有帮助,因为许多连接被建立。对于长期存在的连接,“结束效应”并不那么显着,而且会话没有那么有用。


这里有有趣的轶事。当Google将Gmail切换为使用HTTPS时,不需要额外的资源,也不需要网络硬件或新主机。它只增加了大约1%的CPU负载。


7
如何为您的 HTTPS 服务“启用 SSL 会话”?有哪些学习此方面知识的好资源? - Justin Vincent
7
使用Keep-alive会延长套接字(以及SSL连接)的开放时间,这样有帮助。但是SSL会话会使协商的加密参数从一个套接字“记忆”到另一个套接字。因此,对于加载单个网页及其引用内容,HTTP keep-alive很有用,但几秒钟后,该连接将关闭。例如,在三分钟后获取另一个页面时,SSL会话允许重新建立SSL连接,而无需重复完整的握手过程。特别是,可以跳过使用公钥密码进行的缓慢密钥交换。 - erickson
2
@Tony,你有没有一些现实世界的例子可以证明TLS增加了超过几个百分点的开销?我的回答与问题一般。如果你有不同的看法,请分享一下。 - erickson
3
@Tony,我曾看到在逐个字节写入时(最糟糕情况下),普通的套接字比 SSL 套接字在空间方面的性能高出 42 倍,但从未见过 250 倍。我进行了一项广泛的互联网实验,包括 1700 个数据点,在使用缓冲和刷新这种不太复杂的编程方式时,普通套接字的速度与 SSL 套接字相差不超过三倍。实验中可能使用的是 JSSE,根据日期来看可能是 Java 5。 - user207421
2
@Powerlord所引用的文章讨论了过时的算法,但我的回答并没有,我坚持其结论。加密一切。 - erickson
显示剩余7条评论

40

我同意@erickson的观点:单纯的数据传输速度惩罚可以忽略不计。现代CPU的加密/AES吞吐量达到几百兆比特/秒。因此,除非您在资源受限的系统上(移动电话),否则TLS/SSL足够快地处理数据。

但要记住,加密使缓存和负载平衡变得更加困难。这可能导致巨大的性能惩罚。

但是连接设置确实是许多应用程序的绊脚石。在带宽低、丢包率高、延迟高的连接(乡村地区的移动设备)上,TLS需要的附加往返可能会使某些东西变慢而无法使用。

例如,我们不得不放弃对一些内部Web应用程序的访问要求加密——如果从中国使用,它们几乎无法使用。


21
回顾四年后:中国也可能有意故意破坏了所有的SSL/TLS流量。 - max
3
中国审查互联网并试图嗅探每个人的流量并不是什么新闻。但回顾四年后,你会认为这是NSA在到达你的网站途中进行了中间人攻击。 - Evgeniy Berezovsky
有不稳定连接的关键是,设置加密一次,然后避免重新协商,除非真的必要,并且允许双方随时更改IP地址而不会出现问题。(OpenVPN支持此功能。)这有助于使分段成为可能,因为MTU可能非常不可靠甚至不诚实。 - anon

12

假设你不计算连接建立(正如你在更新中所指示的一样),其主要取决于所选择的密码。网络开销(以带宽为单位)将是可忽略的。CPU开销将被加密支配。在我的移动Core i5上,我可以使用单个核心在每秒加密大约250 MB的RC4。[(RC4是你应该选择的最佳性能.)]AES更慢,仅提供大约50 MB/s。因此,如果选择正确的密码,即使您拥有完全利用的1 Gbit线路,也无法使单个当前核心繁忙处理加密开销。

然而,连接建立是不同的。根据实现方式(例如支持TLS错误启动),它将添加往返,这可能会导致明显的延迟。此外,第一次连接建立时进行昂贵的加密操作(如果您愚蠢地使用了4096位密钥,则上述CPU每个核心每秒只能接受14个连接,如果您使用2048位密钥,则为100个)。在随后的连接中,通常会重用以前的会话,避免昂贵的加密。

所以,总结一下:

已建立连接的传输:

  • 延迟:几乎没有
  • CPU:可忽略
  • 带宽:可忽略

第一次连接建立:

  • 延迟:额外的往返
  • 带宽:几千字节(证书)
  • 客户端CPU:中等
  • 服务器CPU:高

随后的连接建立:

  • 延迟:额外的往返(不确定是一个还是多个,可能与实现有关)
  • 带宽:可忽略
  • CPU:几乎没有

重要提示:任何人都不应再使用RC4。该协议必须被视为已经破解,因此使用RC4传输至少应被视为等同于未加密传输,以保护免受间谍组织的侵扰。现在,像chacha20-poly1305这样的算法由于其独立性而被强烈推荐用于大量数据的加密。 - anon

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