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不应该在发送调用时阻塞.
您的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)