第 11 章 RHEL for Real Time 中的套接字选项
实时套接字是同一系统上两个进程(如 UNIX 域和环回设备)或不同系统上(如网络套接字)之间的两种数据传输机制。
传输控制协议(TCP)是最常见的传输协议,通常用于为需要恒定通信的服务实现一致的低延迟,或在低优先级限制环境中的套接字合并。
随着新应用、硬件功能和内核架构优化,TCP 必须引入新方法来有效地处理更改。新方法可能会导致不稳定的程序行为。因为程序的行为因底层操作系统组件的变化而改变,因此必须谨慎处理。
TCP 中这种行为的一个示例是发送小缓冲区的延迟。这允许将它们作为网络数据包发送。将小的写入缓冲到 TCP,并一次性全部发送,但也可以创建延迟。对于实时应用程序,TCP_NODELAY 套接字选项会禁用延迟,并在就绪后马上发送小写入。
数据传输的相关套接字选项为 TCP_NODELAY 和 TCP_CORK。
11.1. TCP_NODELAY 套接字选项 复制链接链接已复制到粘贴板!
TCP_NODELAY 套接字选项禁用 Nagle 的算法。使用 setsockopt socket API 功能配置 TCP_NODELAY 会在单个数据包就绪后立即发送多个小缓冲区写入。
在发送前,通过构建连续数据包,将多个逻辑上相关的缓冲区作为单一数据包发送,从而获得更高的延迟和性能。或者,如果内存缓冲区在逻辑上相关,但不是连续的,您可以创建一个 I/O 向量,并在启用了 TCP_NODELAY 的套接字上使用 writev 传递给内核。
以下示例演示了通过 setsockopt socket API 启用 TCP_NODELAY。
int one = 1;
setsockopt(descriptor, SOL_TCP, TCP_NODELAY, &one, sizeof(one));
要有效地使用 TCP_NODELAY,请避免在逻辑上相关的缓冲区写入。使用 TCP_NODELAY 时,小写入会导致 TCP 发送多个缓冲区作为单独的数据包,这可能会导致整体性能不佳。