TCP消息到达同一套接字

本文关键字:套接字 消息 TCP | 更新日期: 2023-09-27 17:59:57

我有两个服务,它们使用TCP套接字进行通信(启动连接的是C++Windows服务,接收器是C#TCP流)和(假设它们可能不会一直使用相同的TCP连接)。有时,我会在巨大的网络负载上收到一半的消息(字节数不知怎么计算错误)。

为了解决这个问题,我有几个问题:

  • 我能确定消息(而不是数据包…)必须一个接一个吗?例如,如果我发送消息1(作为一半接收),然后发送消息2,我能确保消息1的下一半不会在消息2之后吗?对于所有消息之间的相同TCP连接以及它们之间没有相同的TCP连接,请有单独的答案。

  • 发送者和接收者在同一个电台有什么区别吗?

TCP消息到达同一套接字

TCP是一种传输字节流的流协议。它不知道(或不关心)您的消息边界。

为了发送数据,TCP将数据流分解为任意大小的数据包。[这不是很武断,也很复杂。]并将这些可靠地发送到另一端。

当你从TCP套接字读取数据时,你会得到1)已经到达的数据,2)将适合你提供的缓冲区。

在接收端,您需要使用代码重新组装TCP流中的完整消息。您可能必须自己编写,或者您可能会发现它已经由用于与套接字交互的任何库(如果有的话)为您编写。

TCP是一个流式协议,它没有"消息"、"数据包"或其他边界。有时,当你收到数据时,你可能不会得到所有发送的数据,有时你可能会在收到的流中得到多条"消息"。

您必须对协议进行建模以处理这些事情,例如,通过包含特殊的消息终止符或包含包含数据大小的固定大小的标头。

如果你不能一次收到所有消息,那么你必须再次接收,甚至多次接收,才能获得所有发送的数据。

为了回答你的问题,你可以确保流是按照发送的顺序接收的,否则TCP层会给你一个错误。如果字节A是在字节B之前发送的,那么可以保证它们将按该顺序到达。如果发送方和接收方在同一个系统上,或者在不同的大陆上,也没有理论上的区别。