两个TCP/IP套接字send()请求实际上是在一个TCP消息中处理的

Joe*_*aci 3 c sockets send

我在我的C程序中有两个send()s并查看wireshark,我意识到它们是作为一个TCP/IP消息发送出去的.我假设这是某种TCP/IP优化,确定它们足够小,可以一起发送.但是,我正在从头开始重建一个旧程序,我正在构建我的工具,基于它的TCP/IP流量:MTU限制,内部协议设计等.所以如果旧工具发出两个单独的消息,我需要发送两个单独的消息.

所以有人知道它在后台具体做了什么(除了简单的优化),如果有一个标志或需要启用/禁用的东西,以便我得到1比1的C send()和TCP/IP传输?现在我所能做的就是让它们分开就是在每次send()之后放一个sleep(1).

谢谢.

Sne*_*tel 7

您可以设置TCP_NODELAYsetsockopt禁用Nagle算法,以避免您的操作系统从小包结合.但是,重要的是要意识到TCP是一种面向流的协议,而且各个"数据包"并不是有意义地分开的.沿途的路由器可以自由组合或拆分TCP数据包(虽然这是不常见的,因为需要额外的处理),并且接收操作系统不一定只能读取每个发送的数据包recv().如果要在TCP中描述信息包,则需要使用标头结构来报告以下字节中有多少属于该数据包.