如果我发送两条TCP消息,我是否需要处理后者到达之前的情况?还是保证按我发送的订单到达?我假设这不是Twisted特定的例子,因为它应该符合TCP标准,但是如果熟悉Twisted的人可以为我自己的安心提供特定于Twisted的答案,那将是值得赞赏的: - )< / p>
答案 0 :(得分:48)
只要在同一TCP连接上发送两条消息,就会保留订单。如果在同一对进程之间打开了多个连接,则可能会遇到麻烦。
关于Twisted或任何其他异步事件系统:我希望您按照接收字节的顺序获取dataReceived
个消息。但是,如果你开始将工作推迟到延期通话中,你可以,呃......“扭曲”你的控制流程而无法识别。
答案 1 :(得分:23)
TCP是面向连接的,并提供其客户按顺序交付。当然这适用于连接级别:各个连接是独立的。
您应该注意,通常我们会引用“TCP流”和“UDP消息”。
无论您使用哪种客户端库(例如Twisted),底层TCP连接都与其无关。 TCP将为您的客户提供“协议消息”。通过“协议消息”,我当然指的是您在TCP层上使用的协议。
进一步注意,I / O操作本质上是异步的,并且非常依赖于系统负载+复合网络延迟&amp;损失,你不能依赖消息排序 TCP连接。
答案 2 :(得分:17)
TCP“保证”接收方将接收重新发送的字节流,因为它最初是由发送方发送的。但是,在TCP发送/接收端点(即物理网络)之间,数据可能无序接收,可能被分段,可能被破坏,甚至可能丢失。 TCP使用握手机制解决了这些问题,这种机制会导致重新传输错误的数据包。接收器上的TCP堆栈按发送顺序放置这些数据包,这样当您从TCP套接字读取时,您将收到最初发送的数据。
当您在Twisted中调用doRead方法时,将从套接字读取数据,直至达到缓冲区的大小。该数据可以表示单个消息,部分消息或多个消息。您可以从缓冲区中提取消息,但保证在此时字节按其传输顺序。
抱歉我早先的帖子弄糊了水......
答案 3 :(得分:7)
TCP是一个流,UDP是一个消息。你混淆了条款。对于TCP,流确实以与发送时相同的顺序到达。 TCP中没有distict消息,字节在到达时出现,将消息解释为消息取决于您。