【问题标题】:event-drive TLS server事件驱动 TLS 服务器
【发布时间】:2017-11-16 21:15:52
【问题描述】:

我正在开发一个服务器端软件,该软件通过 TLS(通过 TCP)接收来自客户端的请求。为了获得更好的性能和用户体验,我想避免每次请求都完全握手。理想情况下,客户端可以只与服务器建立几个小时的 TLS 会话,尽管大部分时间会话可能是空闲的。同时也需要高吞吐量。

一种简单的方法是为每个会话指定一个线程并使用大线程池来提高吞吐量。但是这种方法的性能开销可能是巨大的,如果我想要 1 万个并发会话。

高吞吐量的要求导致我采用事件驱动模型。这个想法是当连接空闲时(即底层套接字上没有 IO 事件),TLS 服务器可以切换上下文以服务其他连接。挑战之一是在套接字空闲时冻结整个 TLS 会话上下文,并在套接字变为可读/可写时检索它。

我想知道 TLS 中是否已经支持这种功能?缓存和票证似乎都是相关的。另外,我想知道人们是否已经实现了这个想法。

【问题讨论】:

    标签: ssl event-driven


    【解决方案1】:

    您正在谈论 SSL 会话恢复,它已经在 OpenSSL 和 JSSE 中实现,毫无疑问您将使用的所有其他 SSL API。 SSL 会话已经存在连接。所以你不需要做任何事情来得到这个。

    关于“冻结 SSL 会话上下文”的部分完全没有意义。

    【讨论】:

    • 好吧,只是 OpenSSL 不是事件驱动的。这就是我编写自己的事件驱动 TLS 服务器的原因。如果你认为它很简单,也许你可以告诉我套接字接收字节时应该做什么?我想我需要查找与套接字关联的 SSL 会话并恢复会话上下文(例如通过SSL_set_session),然后正确处理数据。你是说这些都没有必要吗?
    • OpenSSL 可以与非阻塞 I/O 和select() 结合使用,这使其成为事件驱动的。正如我已经说过的,您提出的任何建议都不是必需的。
    • 你能给我指出一个示例程序吗?如果select() 显示多个客户端套接字是可读的,我仍然需要用相应的SSL* 读取它们中的每一个,所以我需要以某种方式维护一个到SSL* 映射的套接字,不是吗?我错过了一些基本的东西吗?
    • 是的,你当然需要 SSL 套接字,没有人说过任何不同的东西。我怀疑您确实缺少一些非常基本的东西。 openssl.org 有大量示例代码。
    • 准确回答什么问题?我已经给了你几个答案,我在这里看不到任何我尚未回答的问题。在我看来,您需要先学习如何编写服务器,这太宽泛了,然后学习 SSL API,这也太宽泛了.m 并在我给您的站点上学习示例,这是作业。
    猜你喜欢
    • 2023-03-29
    • 2020-04-30
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 2019-06-18
    • 1970-01-01
    相关资源
    最近更新 更多