gpt4 book ai didi

c++ - 在不被 TCP 堆栈合并的情况下在单独的 TCP 段中发送数据

转载 作者:可可西里 更新时间:2023-11-01 02:34:51 25 4
gpt4 key购买 nike

在 Linux(内核 3.0.0.12;带有 GCC 4.6.1 的 C++)上,我想通过 (POSIX) send-call 彼此发送几个 TCP 数据包。

使用 Wireshark,我可以看到数据包不是在单独的 TCP 帧中发送的,而是两个或多个在一个数据包中一起发送的。

有什么方法可以告诉系统从一个 send() 缓冲区发送数据到自己的 TCP 数据包中?程序流不应在发送调用处阻塞。

最佳答案

您的 TCP 堆栈正在实现 Nagle 的算法,试图通过缓冲数据来提高效率。这是一个常见的优化,其目的是分摊 40+ 字节(TCP + IP) header 的成本。堆栈不是发送多个小数据包,而是缓冲数据并将它们组合成一个更大的数据包,从而减少 header 开销。

TCP 堆栈不会无限期缓冲。只要连接上有一些未确认的已发送数据,发送方就会继续缓冲。下一个数据包在以下时间发出:

  • 可以发送完整的数据包
  • 接收方确认所有先前发送的数据

您通常可以通过设置 TCP_NODELAY 套接字选项来禁用它。

setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int));

关于c++ - 在不被 TCP 堆栈合并的情况下在单独的 TCP 段中发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8421848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com