行为是随机的。我用wireshark和tcpdump制作了pcap。两者都能正确显示数据包长度。
当我执行sock.recv时,我随机接收来自两个连续数据包的数据。这种行为很少见。从aprx 100个数据包中,1-2个recv包含来自2个连续数据包的数据。
数据包发送得很快。有些在1ms以下接收。然而,这不是一个好的指示符,因为在类似的时间差中接收到的其他分组被正确读取。
套接字是AF_INET、SOCK_STREAM、非阻塞的,它是使用选择器实现的。
套接字是客户端
如果您有一个在TCP上运行的协议,并且该协议具有单个数据包的概念,则不能保证在TCP套接字上传递的单个字节块将从更高级别数据包的开头开始,或者将在同一个更高级别包的结尾结束。分组可以在两个组块之间被分解,并且组块可以包括多于一个分组的比特。从TCP获得的唯一保证是,您获得的数据是按传输顺序接收的。
正如评论中所指出的,在TCP上运行的协议通常使用某种形式的终止符来标记数据包的末尾,或者在数据包的开头放一个字节计数来指示数据包中有多少字节。