Python TCP重复消息

时间:2016-04-27 21:12:10

标签: python sockets tcp

我正在使用内部TCP服务器和TCP客户端。当丢包率为0%时,服务器和客户端工作正常。但是,当我有20%或更多的数据包丢失时,我看到重复的TCP消息。我收到这样的东西......

Client <-- MessageA -- Server
Client -- MessageB --> Server
Client <-- MessageCMessageA -- Server

MessageA是否可能没有完全发送到客户端,它超时,然后TCP重新发送它,然后原始消息使它在以后由客户端接收?

我的问题是TCP是否像这样工作,如果这可能是网络中包含20%或更多数据包丢失的情况。

客户端和服务器如何发送/接收数据的准确性......

socket.recv(1024)
socket.send(1024)

1 个答案:

答案 0 :(得分:1)

不,这是不可能的。 TCP保证它将按照发送顺序提供一次数据,或者向应用程序发出错误信号。因此,您的代码中可能存在错误。最可能的是您的代码无法处理部分读取

在TCP套接字上执行writesend时,TCP模块会将数据 分段为所需的数据包。在丢包的情况下,某些数据包可能已成功到达,但其他数据包必须重新发送。在这种情况下,相应的readrecv只会收到部分数据 - 其余数据将在后续readrecv中到达。换句话说,TCP不保留消息边界。

您的代码可能将此类拆分消息解释为多条消息。在尝试解析缓冲区之前,请确保在缓冲区中累积完整的消息。