9.3. 使用套接字选项的程序示例
TCP_NODELAY 和 TCP_CORK 套接字选项可显著影响网络连接的行为。TCP_NODELAY 在应用程序上禁用 Nagle 的算法,该算法在应用程序就绪后马上发送数据包。使用 TCP_CORK,您可以同时传输多个数据数据包,而在它们之间没有延迟。
要启用套接字选项,如 TCP_NODELAY,请使用以下代码构建它,然后设置适当的选项。
gcc tcp_nodelay_client.c -o tcp_nodelay_client -lrt
当您运行没有任何参数的 tcp_nodelay_server 和 tcp_nodelay_client 程序时,客户端会使用默认套接字选项。有关 tcp_nodelay_server 和 tcp_nodelay_client 程序的更多信息,请参阅红帽知识库解决方案 TCP 更改会在使用小缓冲区时造成延迟性能。
示例程序提供有关这些套接字选项对应用程序的性能影响的信息。
对客户端的性能影响
您可以在不使用 TCP_NODELAY 和 TCP_CORK 套接字选项的情况下,向客户端发送小的缓冲区写入。当不带任何参数运行 时,客户端使用默认套接字选项。
要启动数据传输,请定义服务器 TCP 端口:
$ ./tcp_nodelay_server 5001代码发送 15 个数据包,每个字节均为两字节,并等待来自该服务器的响应。它在这里采用默认 TCP 行为
对回环接口的性能影响
要启用 socket 选项,请使用 gcc tcp_nodelay_client.c -o tcp_nodelay_client -lrt 来构建它,然后设置适当的选项。
以下示例使用回环接口来演示三种变体:
要立即发送缓冲区写入,请在配置了
TCP_NODELAY的套接字上设置no_delay选项。$ ./tcp_nodelay_client localhost --port=5001 --nr_logical_packets=10000 --no_delay --verbose 10000 packets (100 buffers) sent in 4079.655518 ms: 490.237457 bytes/ms using TCP_NODELAYTCP 会正确发送缓冲区,禁用组合小数据包的算法。这提高了性能,但可能会导致每个逻辑数据包发送大量小数据包。
要收集多个数据包并通过一个系统调用发送它们,请配置
TCP_CORK套接字选项。$ /tcp_nodelay_client localhost --port=5001 --nr_logical_packets=10000 --cork --verbose 10000 packets (100 buffers) sent in 669.514221 ms: 2987.240479 bytes/ms using TCP_CORK使用 cork 技术可显著减少发送数据包所需的时间,因为它将完整逻辑数据包合并到其缓冲区中,并发送较少的整个网络数据包。您必须确保在适当的时间删除
cork。在开发程序时,如果必须从文件发送批量数据,请考虑使用带有
sendfile ()选项的TCP_CORK。在不使用套接字选项的情况下测量性能。
$ ./tcp_nodelay_client localhost --port=5001 --nr_logical_packets=10000 --verbose 10000 packets (100 buffers) sent in 410403.718750 ms: 4.873250 bytes/ms这是当 TCP 组合缓冲区写入并等待检查网络数据包的最佳数据时的基准措施。