如何避免';C';?

如何避免';C';?,c,tcp,C,Tcp,我正在通过网络发送许多TCP数据包,每个数据包大小为50字节。后来我发现TCP将几个50字节的数据包聚合为一个TCP数据包。我的问题是,有没有一种方法可以避免“C”程序中的TCP聚合?一种方法是在发送调用中使用TCP\u节点延迟标志。但是,这取决于TCP堆栈是否支持此功能。将多个发送的数据包打包到单个TCP数据包中使用称为的算法进行处理。要禁用它,请执行以下操作: 请注意,这会降低网络的效率,除非您确实需要立即发送每个数据包,否则应避免这种情况。TCP基本上不在应用层提供基于数据包的服务。使用T

我正在通过网络发送许多TCP数据包,每个数据包大小为50字节。后来我发现TCP将几个50字节的数据包聚合为一个TCP数据包。我的问题是,有没有一种方法可以避免“C”程序中的TCP聚合?

一种方法是在发送调用中使用TCP\u节点延迟标志。但是,这取决于TCP堆栈是否支持此功能。

将多个发送的数据包打包到单个TCP数据包中使用称为的算法进行处理。要禁用它,请执行以下操作:


请注意,这会降低网络的效率,除非您确实需要立即发送每个数据包,否则应避免这种情况。

TCP基本上不在应用层提供基于数据包的服务。使用TCP的应用程序需要的不仅仅是纯流,还必须提供自己的帧机制

虽然
TCP\u节点延迟
选项通常会导致每个应用程序级写入都在单独的帧中进行(除非它大于MTU),但无法保证。特别是,如果receive窗口已减少到零(在发送大容量数据的连接上很常见),则当receive窗口再次打开时,仍可以合并多个写入

此外,即使发送TCP未合并您的写入,也无法阻止接收方在从套接字读取的一个应用程序级别中呈现来自多个TCP帧的数据-这在接收应用程序未计划一段时间时尤其会发生,或者当连接上发生数据包丢失时


如果您的应用程序假定发送端上的每个应用程序级写入都将与接收端上的应用程序级读取完全配对,则您将自己设置为罕见且难以复制的错误。

根据定义,TCP不提供任何打包服务。TCP是一种面向字节流的协议。最好是在数据中插入自己的框架标记。然后,如果你的接收器至少能检测到坏帧(可能是聚合数据)并丢弃这些数据,那么你就可以到达你想要的位置


“尽快发送”方法(ala节点延迟)不能保证有效,因为您的接收器仍然可以聚合数据。如果任何tcp数据因任何原因而延迟,则更可能出现这种情况

您为什么要这样做?聚合难道不能使您的网络工作得更好吗?我不关心网络性能。我想通过网络将每个50字节作为单独的TCP数据包发送。我想知道怎么做。你还没有回答这个问题。你为什么要这样做?@EJP:接收者不想让数据包聚合。这是他们的要求,而不是我的要求。@user1960286仍然不能保证单个发送将被原子地接收,这似乎是您真正想要的。@EJP:那么,可靠的方法是什么呢?将帧添加到数据流中。(例如,在数据前面写一个帧的长度。)我不知道有任何TCP/IP实现不支持它。你是吗?
int flag = 1;
setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag));