10个版本

0.2.12 2024年2月24日
0.2.11 2024年2月18日
0.2.4 2024年1月19日
0.1.0 2024年1月2日

#571 in 网络编程

Download history 5/week @ 2024-05-12 29/week @ 2024-05-19 26/week @ 2024-05-26 24/week @ 2024-06-02 19/week @ 2024-06-09 31/week @ 2024-06-16 22/week @ 2024-06-23 5/week @ 2024-06-30 4/week @ 2024-07-07 35/week @ 2024-07-14 23/week @ 2024-07-21

67 个月下载
10 个crate中使用 (直接使用4个)

自定义许可证

94KB
2K SLoC

动机

  • 项目的动机是简化网络通信领域的应用代码开发。注重性能和人体工程学。

它是如何简化的?

  • 传统上,网络API提供的方法暴露了访问非常低级的数据的权限,而应用层更愿意使用携带有关应用状态信息的struct

  • Rust的std::net模块并不是例外,它留给开发者的责任是通过执行一系列步骤来解释byte数组,从中提取一个字节帧,将其转换为所需的数据结构,同时跟踪剩余的字节并管理很多其他细节。这里的实现细节直接影响到应用性能和可靠性。

  • 即使这些细节已经得到解决,开发者仍然需要解决许多其他任务,例如:

    • 如何处理部分读取?
    • 能否在多个线程之间分割读取和写入?
    • 如果将读取分割到单独的线程中,是否可以使用单个线程来管理所有读取?
    • ...等等
  • 这个库解决了上述挑战,同时提供了一个高性能的网络代码,而不限制应用程序如何使用API。

请告诉我更多

  • 在非常高的层面上,主要概念基于以下两个structures:

    • Clt - 这是一个网络客户端,可以启动一个连接
    • Svc - 这是一个网络服务,它监听端口并为每个建立的连接创建一个Clt
    • 然后,CltSvc都提供和send以及recv方法,其签名大致如下:
      • Clt::send(msg: &T)Clt::recv() -> T - 其中 T 是在实例化 CltSvc 时指定的泛型类型
  • 本库有三种实现方式。点击以下链接获取更多详情

    • 非阻塞 - 此实现目前最为完整,其 send()/recv() 方法接受一个 timeout 参数。这允许应用程序开发者设置 io 等待限制。内部实现依赖于 spin 锁,并等待以提供最佳延迟性能,因为它不允许 OS 将运行中的线程挂起,这会产生显著的延迟惩罚。此实现推荐用于具有 低延迟 性能要求的场景。
    • 阻塞 - 此实现使用最简单,因为所有方法调用都是按顺序执行的,直到操作完成。易用性是以性能和可扩展性为代价的。此实现推荐用于典型的网络负载。
    • 异步 - 此实现基于 Rust 的 async/await tokio 框架,然而,在撰写本文时,Rust 的异步 API 仍在进行稳定化,且尚未在 stable 工具链上可用。

依赖项

~1–12MB
~86K SLoC