TCP 消息到达同一个套接字

TCP messages arrival on the same socket

我有 2 个使用 TCP 套接字进行通信的服务(启动连接的是 C++ Windows 服务,接收方是 C# TCP 流)和(假设它们可能不要一直使用相同的 TCP 连接)。有时我在网络负载很大的情况下收到一半的消息(字节数以某种方式计算错误)。

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

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

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

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

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

TCP 是一个 streaming 协议,它没有 "messages" 或 "packets" 或其他边界。有时,当您收到数据时,您可能无法收到所有已发送的数据,有时您可能会在接收到的流中收到多个 "message"。

您必须对协议建模以处理这些事情,例如通过包含特殊的消息终止符或包含包含数据大小的 fixed-sized header。

如果您没有一次收到所有消息,那么您必须再次接收,甚至可能多次接收,以获取已发送的所有数据。

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