TCP保证按顺序到达吗?

51 投票
4 回答
35144 浏览
提问于 2025-04-15 15:45

如果我发送了两个TCP消息,我需要处理后一个消息在前一个消息之前到达的情况吗?还是说它们会按照我发送的顺序到达?我认为这不是特定于Twisted的例子,因为它应该符合TCP的标准。不过,如果有熟悉Twisted的人能给我一个关于Twisted的具体回答,我会很感激的 :-)

4 个回答

22

TCP协议“保证”接收方会收到发送方原本发送的字节流。不过,在TCP的发送和接收端之间(也就是物理网络),数据可能会乱序到达,可能会被分割,可能会损坏,甚至可能会丢失。TCP通过一种叫做握手的机制来处理这些问题,这样可以让错误的数据包重新发送。接收方的TCP协议栈会把这些数据包按发送的顺序整理好,这样当你从TCP套接字读取数据时,就能收到原本发送的数据。

当你在Twisted中调用doRead方法时,数据会从套接字中读取,直到达到缓冲区的大小。这些数据可能代表一条完整的消息、一部分消息,或者多条消息。提取消息的工作就得靠你自己来做,但此时你可以放心,字节的顺序是正确的。

抱歉之前的帖子让事情变得复杂了……

25

TCP是一种面向连接的协议,它能确保客户之间的信息是按顺序发送的。当然,这种顺序是针对每个连接来说的:不同的连接之间是独立的。

通常我们会提到“TCP流”和“UDP消息”。

无论你使用什么客户端库(比如Twisted),底层的TCP连接都是独立于这些库的。TCP会把“协议消息”按顺序发送给你的客户端。这里的“协议消息”指的就是你在TCP层上使用的协议。

另外要注意,输入输出操作是异步的,这意味着它们的执行时间会受到系统负载的影响,同时也会受到网络延迟和丢包的影响。因此,你不能指望在不同的TCP连接之间保持消息的顺序。

56

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

关于Twisted或者其他异步事件系统:我预计你会按照字节接收的顺序收到dataReceived消息。不过,如果你开始把工作推到延迟调用上,你可能会把控制流程搞得一团糟。

撰写回答