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