asynchronous - 由于无法在TLS连接中拆分流,我是否需要离开Tokio?

标签 asynchronous rust async-await rust-tokio

我使用Tokio创建普通的TCP套接字,调用tokio::io::split(),并将读/写半部分交给单独的线程。他们使用带有await的异步套接字读/写API来完成IO。我们的数据流在输入/输出方向上是相当隔离的,因此此模型在我们的情况下效果很好。到目前为止,一切都很好。

现在,我正在考虑在顶部添加TLS支持。某些TLS库出于各种原因不允许拆分流:

  • tokio-ruSTLs(用ruSTLs实现)允许拆分,但这是相对较新的
  • 我更喜欢使用tokio-openssl(由openssl实现),它已经存在了很长时间,但是使用了openssl does not support it。这可能是因为像TLS重新协商之类的事件需要传播到读/写部分(ruSTLs对其进行管理,因为它是 native Rust实现)。

  • 因此,同一线程需要执行读/写操作。这意味着套接字现在需要变为非阻塞状态:不能等待数据进入,因为可能需要立即发送数据(反之亦然)。

    如果我理解正确,那么Tokio/await范例对于非阻塞套接字是没有意义的。我的理解正确吗?

    在这种情况下的任何其他想法也欢迎。我希望到目前为止,我们已经付出了所有的努力,我们不需要放弃Tokio。

    最佳答案

    的确,启用了异步/等待的TLS库(例如 tokio-tls )要求未拆分提供的流,但是,一旦将流包装在TLS层中,就可以使用 tokio::io::split 拆分该包装的流。

    以这种方式使用流可以正确处理有关阻塞和非阻塞IO的所有详细信息。您不需要手动配置诸如O_NONBLOCK的标记,因为Tokio的 TcpStream tokio-tls TlsStream 会在后台为您处理这些详细信息。

    使用提供阻塞套接字的库自然与Tokio不兼容。这并不是什么新鲜事物,并且出于同样的原因,您不能在Tokio中使用 std::net::TcpStream ,因为它是阻塞流。为了避免这些问题,Tokio提供了备用的流类型。

    如果要使用未启用异步/等待的ssl crate ,则可以在内存缓冲区中执行加密,并使用Tokio的TcpStream手动写入加密数据。启用了async/await的ssl库均以这种方式起作用。

    关于asynchronous - 由于无法在TLS连接中拆分流,我是否需要离开Tokio?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61088639/

    相关文章:

    rust - 为什么 Rust 中的循环如此缓慢?

    javascript - 另一个 map 调用中的异步 Array.map()

    Javascript Promise 链接未按预期工作

    javascript - 异步循环

    python - 如何在 tornado python 中创建异步 RequestHandler

    c# - 在 RESTful WebApi 请求上运行后台线程

    rust - Rust 是否提供了一个包来执行任意值的黑盒测试?

    javascript - 在非异步函数中使用 "await"

    loops - 是否有展开或继续循环的快捷方式?

    javascript - 从类导出 Google 距离矩阵时,async-await 不起作用