在不使用TCP堆栈合并的情况下,在单独的TCP段中发送数据

Bas*_*orn 2 c++ linux networking network-programming tcp

在Linux上(Kernel 3.0.0.12; C++ with GCC 4.6.1)我想通过(POSIX)send-call在不久之后发送几个TCP数据包.

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

有没有办法告诉系统从send()自己的TCP数据包中的一个缓冲区发送数据?programmflow不应该在发送调用时阻塞.

jma*_*man 9

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

TCP堆栈不会无限期地缓冲.只要连接上有一些未确认的已发送数据,发送方就会继续缓冲.在下列情况下发送下一个数据包:

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

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

setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int));
Run Code Online (Sandbox Code Playgroud)