为什么Python sock.recv从两个不同的数据包接收数据



行为是随机的。我用wireshark和tcpdump制作了pcap。两者都能正确显示数据包长度。

当我执行sock.recv时,我随机接收来自两个连续数据包的数据。这种行为很少见。从aprx 100个数据包中,1-2个recv包含来自2个连续数据包的数据。

数据包发送得很快。有些在1ms以下接收。然而,这不是一个好的指示符,因为在类似的时间差中接收到的其他分组被正确读取。

套接字是AF_INET、SOCK_STREAM、非阻塞的,它是使用选择器实现的。

套接字是客户端

正如@jasonharper所说,TCP是一种为您提供字节流的协议。它不为您提供数据包。

如果您有一个在TCP上运行的协议,并且该协议具有单个数据包的概念,则不能保证在TCP套接字上传递的单个字节块将从更高级别数据包的开头开始,或者将在同一个更高级别包的结尾结束。分组可以在两个组块之间被分解,并且组块可以包括多于一个分组的比特。从TCP获得的唯一保证是,您获得的数据是按传输顺序接收的。

正如评论中所指出的,在TCP上运行的协议通常使用某种形式的终止符来标记数据包的末尾,或者在数据包的开头放一个字节计数来指示数据包中有多少字节。

最新更新