SCI Sockets 库:功能、实现与优化
1. 数据复制与接收缓冲
在数据传输过程中,接收方通常需要一个中间缓冲区。在传统的 TCP/IP 中,这个中间缓冲区位于内核空间;而在 SSLib 里,这个缓冲区是 RRB(Receive Ring Buffer)。避免额外复制数据的唯一情况是,接收方在数据到达之前就发起了接收调用并处于阻塞状态,这在相关文献中被称为接收预发布。但这种方式会使 SCI Sockets 的设计和实现变得复杂,并且每次接收调用都需要操作系统支持,这与低延迟的要求相悖。因此,数据总是通过 RRB 进行复制。
2. 连接建立
连接由 SSD(SCI Sockets Daemon)建立,需要区分 TCP 类和 UDP 类连接,即流套接字和数据报套接字。
- TCP 类连接 :两个节点上的应用程序分别调用 listen/accept 和 connect 函数。涉及的 SSLib 通知各自节点上的 SSD,SSD 通过预先建立的 DSM 段映射相互联系。每个 SSD 创建并导出一个 DSM 段(DSMS)来容纳用于数据接收的 RRB。交换一些信息(如创建的 DSMS 的 ID 和端口号)后,SSD 将信息传递给各自的应用程序(SSLib)。这些应用程序相互映射 DSMS,此时数据传输可以开始。早期的读写操作会推迟到这一步之后。整个过程仅基于 SCI 通信,不需要辅助的 TCP 连接。
以下是 TCP 连接建立的流程:
graph LR
A[Application i] -->|connect()|