TCP 消息到达同一个套接字
TCP messages arrival on the same socket
我有 2 个使用 TCP 套接字进行通信的服务(启动连接的是 C++ Windows 服务,接收方是 C# TCP 流)和(假设它们可能不要一直使用相同的 TCP 连接)。有时我在网络负载很大的情况下收到一半的消息(字节数以某种方式计算错误)。
为了解决这个问题,我有几个问题:
我可以确定消息(不是数据包...)必须一个接一个吗,例如,如果我发送消息 1(已收到一半),然后发送消息 2,我可以吗?确保消息 1 的下半部分不会在消息 2 之后?
对于所有消息之间的相同 TCP 连接以及它们之间没有相同的 TCP 连接,请单独回答。
发送和接收是否在同一个站有区别吗?
TCP 是一种传送字节流的流协议。它不知道(或不关心)您的消息边界。
为了发送数据,TCP 将流分成任意大小的数据包。 [这不是真正的任意,它真的很复杂。] 并将这些可靠地发送到另一端。
当您从 TCP 套接字读取数据时,您会得到任何数据 1) 已经到达,并且 2) 将适合您提供的缓冲区。
在接收端,您需要使用代码从 TCP 流中重组完整的消息。您可能必须自己编写它,或者您可能会发现它已经由您用来与套接字交互的任何库(如果有的话)为您编写。
TCP 是一个 streaming 协议,它没有 "messages" 或 "packets" 或其他边界。有时,当您收到数据时,您可能无法收到所有已发送的数据,有时您可能会在接收到的流中收到多个 "message"。
您必须对协议建模以处理这些事情,例如通过包含特殊的消息终止符或包含包含数据大小的 fixed-sized header。
如果您没有一次收到所有消息,那么您必须再次接收,甚至可能多次接收,以获取已发送的所有数据。
并且回答你的问题,你可以确定流是按照发送的顺序接收的,否则 TCP 层会给你一个错误。如果字节 A 在字节 B 之前发送,则可以保证它们将按该顺序到达。如果发送方和接收方在同一系统上,或者在不同大陆上,理论上也没有区别。
我有 2 个使用 TCP 套接字进行通信的服务(启动连接的是 C++ Windows 服务,接收方是 C# TCP 流)和(假设它们可能不要一直使用相同的 TCP 连接)。有时我在网络负载很大的情况下收到一半的消息(字节数以某种方式计算错误)。
为了解决这个问题,我有几个问题:
我可以确定消息(不是数据包...)必须一个接一个吗,例如,如果我发送消息 1(已收到一半),然后发送消息 2,我可以吗?确保消息 1 的下半部分不会在消息 2 之后? 对于所有消息之间的相同 TCP 连接以及它们之间没有相同的 TCP 连接,请单独回答。
发送和接收是否在同一个站有区别吗?
TCP 是一种传送字节流的流协议。它不知道(或不关心)您的消息边界。
为了发送数据,TCP 将流分成任意大小的数据包。 [这不是真正的任意,它真的很复杂。] 并将这些可靠地发送到另一端。
当您从 TCP 套接字读取数据时,您会得到任何数据 1) 已经到达,并且 2) 将适合您提供的缓冲区。
在接收端,您需要使用代码从 TCP 流中重组完整的消息。您可能必须自己编写它,或者您可能会发现它已经由您用来与套接字交互的任何库(如果有的话)为您编写。
TCP 是一个 streaming 协议,它没有 "messages" 或 "packets" 或其他边界。有时,当您收到数据时,您可能无法收到所有已发送的数据,有时您可能会在接收到的流中收到多个 "message"。
您必须对协议建模以处理这些事情,例如通过包含特殊的消息终止符或包含包含数据大小的 fixed-sized header。
如果您没有一次收到所有消息,那么您必须再次接收,甚至可能多次接收,以获取已发送的所有数据。
并且回答你的问题,你可以确定流是按照发送的顺序接收的,否则 TCP 层会给你一个错误。如果字节 A 在字节 B 之前发送,则可以保证它们将按该顺序到达。如果发送方和接收方在同一系统上,或者在不同大陆上,理论上也没有区别。