缓冲区中的TCP数据是否可以重叠

Can TCP data overlap in the buffer

本文关键字:重叠 是否 数据 TCP 缓冲区      更新时间:2023-10-16

如果我一直向接收器发送数据,发送的数据是否可能重叠,从而在缓冲区中累积,因此对缓冲区的下一次读取也会读取另一个发送数据的数据?

我使用Qt和readAll()来接收数据并解析它。这个数据中有一些结构,所以我可以知道数据是否已经完整,或者它是否是有效的数据,但我担心当我调用readAll()时,其他数据会与其他数据重叠,因此会使这个假设为有效数据的数据无效。

如果它可能发生,我该如何预防/控制它?或者这是OS/neneneba API所担心的吗?我之所以担心,部分原因是该方法的调用方式。lol

TCP是基于流的连接,而不是基于数据包的连接,因此您可能不会认为一次发送的内容也会在一次内接收。您仍然需要某种协议来打包流。

对于发送字符串,可以使用nul字符作为分隔符,也可以以包含魔术和长度的标头开头。

根据http://qt-project.org/doc/qt-4.8/qiodevice.html#readAll此函数捕获所有数据并将其作为数组返回。我看不出API是如何引起对重叠数据的关注的。数组是按值返回的,如果它表示整个流,那么它会与什么重叠呢?您是否担心返回的对象实际上具有引用语义(即,它只保存指向在对同一函数的其他调用中重复使用的存储的指针?)

如果在任何系统中发送和接收缓冲区重叠,那就是一个错误,除非特别注意使用是完全序列化的。(也就是说,缓冲区在某种程度上只用于发送和接收,而没有任何混淆。)

为什么不使用固定长度的标头,然后是可变长度的数据包,标头包含数据包的长度信息。

这样就可以避免对数据包边界的担忧。例如,不要只发送字符串,而是先发送字符串的长度,然后再发送字符串。在接收端总是读取长度,然后根据长度读取字符串。