41

如果我发送两条 TCP 消息,是否需要处理后者先于前者到达的情况?还是保证按照我发送的顺序到达?我认为这不是一个特定于 Twisted 的示例,因为它应该符合 TCP 标准,但是如果任何熟悉 Twisted 的人可以为我自己的安心提供一个特定于 Twisted 的答案,那将不胜感激:-)

4

4 回答 4

52

只要两条消息是在同一个 TCP 连接上发送的,就会保持顺序。如果在同一对进程之间打开了多个连接,您可能会遇到麻烦。

关于 Twisted 或任何其他异步事件系统:我希望您会dataReceived按照接收字节的顺序获取消息。但是,如果您开始将工作推到延迟调用上,您可以,呃...“扭曲”您的控制流,使其无法识别。

于 2009-11-06T23:19:18.847 回答
25

TCP 是面向连接的,并为其客户端提供按顺序交付。当然,这适用于连接级别:各个连接是独立的。

您应该注意,通常我们指的是“TCP 流”和“UDP 消息”。

无论您使用什么客户端库(例如 Twisted),底层 TCP 连接都独立于它。TCP 将按顺序将“协议消息”传递给您的客户端。我所说的“协议消息”当然是指您在 TCP 层上使用的协议。

进一步注意,I/O 操作本质上是异步的,并且非常依赖于系统负载 + 还会增加网络延迟和损失,您不能依赖TCP 连接之间的消息排序。

于 2009-11-06T23:21:52.223 回答
19

TCP“保证”接收者将接收到重构的字节流,因为它最初是由发送者发送的。然而,在 TCP 发送/接收端点(即物理网络)之间,数据可能被乱序接收,可能被分段,可能被破坏,甚至可能丢失。TCP 使用导致错误数据包重新传输的握手机制来解决这些问题。接收器上的 TCP 堆栈将这些数据包按传输顺序放置,这样当您从 TCP 套接字读取数据时,您会收到最初发送的数据。

When you call the doRead method in Twisted, the data is read from the socket up to the size of the buffer. This data may represent a single message, a partial message, or multiple messages. It is up to you to extract the messages from the buffer, but you are guaranteed that the bytes are in their transmitted order at this point.

Sorry for muddying the waters with my earlier post...

于 2009-11-06T23:26:56.247 回答
8

TCP是流,UDP是消息。你混淆了条款。对于 TCP,流确实会按照发送的顺序到达。TCP 中没有不同的消息,字节在到达时出现,将它们解释为消息取决于您。

于 2009-11-06T23:20:34.753 回答