11.3. 使用 socket 选项的程序示例


TCP_NODELAYTCP_CORK 套接字选项会影响网络连接的行为。TCP_NODELAY 在应用程序上禁用 Nagle 的算法,这些算法可以在数据数据包就绪后立即发送。使用 TCP_CORK,您可以同时传输多个数据数据包,它们之间没有延迟。

注意

要启用套接字选项,如 TCP_NODELAY,请使用以下代码构建它,然后设置适当的选项。

gcc tcp_nodelay_client.c -o tcp_nodelay_client -lrt
Copy to Clipboard

当您运行 tcp_nodelay_servertcp_nodelay_client 程序时,客户端会使用默认的套接字选项。有关 tcp_nodelay_servertcp_nodelay_client 程序的更多信息,请参阅红帽知识库解决方案 TCP 更改会在使用小缓冲区时造成延迟性能

示例程序提供有关这些套接字选项对应用程序影响的性能的信息。

对客户端的性能影响

您可以在不使用 TCP_NODELAYTCP_CORK 套接字选项的情况下,向客户端发送小缓冲区写入。当不带任何参数运行时,客户端使用默认的套接字选项。

  • 要启动数据传输,请定义服务器 TCP 端口:

    $ ./tcp_nodelay_server 5001
    Copy to Clipboard

    代码发送 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_NODELAY
    Copy to Clipboard

    TCP 正确发送缓冲区,从而禁用组合小数据包的算法。这提高了性能,但可能会导致为每个逻辑数据包发送小数据包。

  • 要收集多个数据包并通过一个系统调用发送它们,请配置 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
    Copy to Clipboard

    使用 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
    Copy to Clipboard

    这是 TCP 组合缓冲区写入并等待数据检查数据比优化在网络数据包中时的基准测量。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat