在单独的TCP段中发送数据,而不被TCP堆栈合并

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

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

有没有办法告诉系统从一个send()缓冲区发送数据到自己的TCP数据包中? 程序stream不应该阻塞在发送呼叫。

Solutions Collecting From Web of "在单独的TCP段中发送数据,而不被TCP堆栈合并"

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

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

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

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

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

如果您希望每个数据包都单独发送,请考虑使用UDP。 然而,你将不得不实现你自己的错误检测和丢弃数据包的重传等。

你可以关闭Nagle,但是最好停止与TCP堆栈对抗。 最好在协议中添加某种形式的帧,这样就不用担心传输单元是否被聚合和/或分割。

在发送方中,这通常意味着使用终止字符或给出长度。

在接收器中,这意味着知道如何读取某个终止字符,和/或知道如何使用接收到的传输单元的一部分或者从多个传输单元汇集完整的消息。

我喜欢用bufsock来做这件事,尽管这是一个Python技术。 但是你可能想要类似于C ++的东西: http : //stromberg.dnsalias.org/~strombrg/bufsock.html

“包”。

不,这就是拥有“ 网络堆栈 ”的关键 – 您的以太网帧可以独立于更高级别的TCP / IP协议栈进行传输和路由。 你完全不希望微管理这个!