【发布时间】:2021-09-09 21:59:17
【问题描述】:
让我们假设有一个客户端和一个服务器,并且服务器发送一个 rekey 请求,或任何其他可能重要或可能不重要的非应用程序数据(这里一般说)。我想知道我是否绑定为 OpenSSL 发送和读取数据,以便我可以让我的生活和代码更简单。为了让你明白我的意思,我准备了这些例子:
假设我们成功地进行了 TLS 握手并且现在准备好交换数据。客户端向服务器发送一个 HTTP 请求,Connection 标头设置为close,这意味着它不会再发送任何请求。现在 OpenSSL 想在后台做一些事情,因此要求发送。也许我们做了shutdown(SHUT_WR) 但不能这样做,或者内核缓冲区永久满了。
假设一个游戏需要交换大量数据——服务器向客户端发送有关游戏的信息,客户端向服务器发送有关鼠标和键盘的信息。通常,在数据交换期间,OpenSSL 将有足够多的机会做它想做的任何事情,因此实际上不需要明确地监听它的 WANTS_something 请求。现在,如果客户端 AFK,它不会发送任何键盘和鼠标信息,但 OpenSSL 想要做一些需要我们发送一些东西的事情(如果可能有这样的事件)。
以上两种情况都有一个共同的想法。问题是:OpenSSL 能否在不发送/接收 TLS 数据的情况下继续发送/接收用户数据?还是要求应用程序满足 OpenSSL 的请求以保持健康的连接/加密?
如果需要它来满足它的请求,那么我在编码时可能会遇到另一个问题。假设它请求读取以处理非应用程序数据,但队列中的第一个实际上是应用程序数据。我总是希望仅在应用程序请求时才读取应用程序数据,否则毫无意义,因为我们缓冲了可能实际上不会使用的数据,并且对等方将继续发送数据,因为 TCP 拥塞窗口不会缩小(因为我们读取数据)。或者,OpenSSL 将在内部缓冲应用程序数据,这是相同的场景,因为最终我需要将数据从其中刷新以处理更多非应用程序数据。是否有任何标志或仅处理非应用程序数据的方法?还有其他很酷的解决方案吗?
是的,我明白在握手和关机期间发送非应用程序数据是必需的。
【问题讨论】:
-
当您使用 OpenSSL 时,每个请求(打开、关闭、关闭、发送接收和其他)都通过 OpenSSL。您不使用套接字 API 处理数据,而是使用 OpenSSL API。所以在我看来,你问的问题是无关紧要的。