我正在使用内部TCP服务器和TCP客户端。当丢包率为0%时,服务器和客户端工作正常。但是,当我有20%或更多的数据包丢失时,我看到重复的TCP消息。我收到这样的东西......
Client <-- MessageA -- Server
Client -- MessageB --> Server
Client <-- MessageCMessageA -- Server
MessageA是否可能没有完全发送到客户端,它超时,然后TCP重新发送它,然后原始消息使它在以后由客户端接收?
我的问题是TCP是否像这样工作,如果这可能是网络中包含20%或更多数据包丢失的情况。
客户端和服务器如何发送/接收数据的准确性......
socket.recv(1024)
socket.send(1024)
答案 0 :(得分:1)
不,这是不可能的。 TCP保证它将按照发送顺序提供一次数据,或者向应用程序发出错误信号。因此,您的代码中可能存在错误。最可能的是您的代码无法处理部分读取。
在TCP套接字上执行write
或send
时,TCP模块会将数据 分段为所需的数据包。在丢包的情况下,某些数据包可能已成功到达,但其他数据包必须重新发送。在这种情况下,相应的read
或recv
只会收到部分数据 - 其余数据将在后续read
或recv
中到达。换句话说,TCP不保留消息边界。
您的代码可能将此类拆分消息解释为多条消息。在尝试解析缓冲区之前,请确保在缓冲区中累积完整的消息。