【问题标题】:Is there any way to flush the SSL write buffer有什么方法可以刷新 SSL 写缓冲区
【发布时间】:2023-03-03 04:43:01
【问题描述】:

我使用 OpenSSL API 编写了一个 SSL 客户端来与一个 SSL 服务器交互。在 OpenSSL 站点中,我了解到写入一些数据后需要刷新写入缓冲区。我在我的客户端程序中使用 SSL_Write 和 SSL_Read。正如 OpenSSL 网站建议的那样,我尝试使用 BIO_flush(BIO* ) 刷新数据,我在这里崩溃了。

我正在使用从this site 获得的 SSL 库

这里我不清楚BIO_flush是刷读缓冲区还是刷写缓冲区..:-( 所以我只是想知道是否有其他方法可以刷新 SSL 写入缓冲区...?

这是我的客户端程序的详细信息。

  1. 使用 SSL_new 创建 SSL 对象 (mSsl)
  2. 创建 TCP 套接字并与服务器建立连接
  3. 使用 BIO_new_socket(socket_id,BIO_NOCLOSE) 创建 BIO 对象(mBio)
  4. 使用 SSL_set_bio(mSsl,mBio,mBio) 将 BIO 对象设置为 SSL 对象;
  5. 使用 SSL_set_fd(mSsl,socket_id) 将套接字设置为 SSL 对象;
  6. 使用 SSL_Connect(mSsl) 与服务器建立 SSL 连接;

在上述步骤之后,我启动了两个单独的线程进行写入和读取。写入线程使用 SSL_write 将数据写入服务器,读取线程使用 SSL_Read 从服务器读取数据。

在使用 SSL_Write 写入每个数据包后的写入线程中,我正在调用 BIO_flush(mBio)。

在整个程序中,我只在这个地方直接使用 mBio 对象进行生物缓冲区刷新。

当我开始发送一些数据包时,程序在 BIO_flush 中崩溃......根据转储所说,它在 BIO_ctrl 函数中。我没有得到更多。

有没有人使用过我上面提供的链接并面临同样的问题..?如果是,请告诉我您是否知道解决方案。

是否有任何线程同步规则可以使用 BIO_flush()...?我的意思是对 BIO_flush SSL_Read 的调用不应该像那样同时发生......?

【问题讨论】:

    标签: openssl


    【解决方案1】:

    BIO_flush 用于刷新写入数据。

    BIO_flush 和 SSL_read/write 的混合和匹配存在问题,因为 BIO 结构不知道您的 SSL_read/write 调用。

    使用 BIO_read/write 会获得更好的结果。

    如果您绝对需要使用 SSL_read/write,则应避免使用 BIO。

    我认为您会通过本 OpenSSL 文档末尾的示例获得更深入的了解。

    Simple OpenSSL Client Example

    如果您在尝试该示例时仍然遇到崩溃,则您正在使用的特定库构建可能存在问题。

    【讨论】:

      【解决方案2】:

      您从哪里得知写入缓冲区需要在写入后刷新?

      我也在找一个flush函数,但是没找到。

      我认为它的工作原理是这样的:对 SSL_write 的每次调用都会产生至少一个 SSL 记录并将其发送到套接字,在那里,nagle 算法可能会在内核中将其缓冲片刻,然后迅速将其提交给外部。

      所以 SSL_write 中没有缓冲,因此没有刷新!

      我宁愿有一个刷新功能并将所有 SSL 记录填充到边缘,但据我所知,这不可用。我现在计划自己做缓冲,并尽可能多地调用 SSL_write。

      顺便说一句:我刚刚写了一个小测试程序:它通过一次写入发送一个缓冲区,然后我再次运行它,为每个字符调用 SSL_write。两次我都运行 tcpdump 并且在 Wireshark 中我可以看到第一次运行几乎没有大的应用程序数据记录,而第二次运行有很多小记录。所以我认为它得到了证实。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-04-18
        • 2013-02-09
        • 2011-01-03
        • 2011-08-26
        • 2022-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多