保证TCP数据包大小

3
我们使用嵌入式设备通过串口发送数据包到串口转以太网转换器,再传输到服务器。我们使用的一个制造商Moxa,总是会按照构造方式发送数据包。也就是说,如果我们构造一个长度为255的数据包,它总是会以255的长度发送数据包。另一个制造商Tibbo,在我们发送长度为255的数据包时,如果大于128,它会将数据包分割成几个部分。这是我当时从Tibbo工程师那里得到的答案:
“根据我的理解和工程师们的说法,即使其他设备现在提供了正确的数据包大小,也不能保证在其他网络中实现相同的结果。这就是为什么我们认为基于数据包大小的TCP传输不可靠的原因,因为TCP并没有被设计成这样使用。”
我知道这可能不是TCP设计的使用方式,但是如果我创建一个255字节的数据包,并且TCP允许它,那么这与TCP的工作方式有何不同呢?我明白在某些情况下,数据包可能会被分割,但如果服务器期望特定的数据包大小,并且Moxa的设备没有像Tibbo设备一样的问题,那么是否可以保证合理的TCP数据包大小呢?
1个回答

11

不,TCP不是一种数据包协议,它是一种流协议。它保证发送的字节都将到达,并按正确顺序到达,但没有其他保证。特别是,TCP不提供任何消息或数据包边界。如果您需要这些内容,则需要通过协议在更高级别上实现。


这很奇怪,因为我们使用另一种产品多年来在许多不同的网络上都没有问题,并且数据包始终以相同的大小进入。从未出现任何问题。 - user195488
2
一个设备发送255字节的数据包,而另一个设备发送两个128字节的数据包这一事实是无关紧要的,只是设备功能的体现。这么小的数据包很少会被网络分段 - 实际上,有一个最小数据包大小,但我不能立刻想起它是多少。无论如何,服务器代码需要能够应对这种情况,因为它对TCP性质做出了错误的假设。 - dty
@Code Monkey:你的看法是错误的。你之前只是纯粹侥幸地使用它而已。正如你所看到的,一个完全符合规定的设备出现了,遵循所有规则,但是你的机制却出现了问题。 - David Schwartz
我正要问这个同样的问题,因为我有一份技术文件,其中写着“每个周期的所有数据将被发送在一个数据包中”,并暗示可以以同样的方式接收。显然,这并不完全正确。 - Mr. Boy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接