【问题标题】:Python TCP Duplicate MessagePython TCP 重复消息
【发布时间】:2016-04-28 09:29:19
【问题描述】:

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

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

有没有可能 MessageA 没有完全发送到客户端,它超时,然后 TCP 重新发送它,然后原始消息发送它,客户端稍后收到?

我的问题是 TCP 是否可以这样工作,以及如果网络包含 20% 或更多的丢包率,这是否是一种可能的情况。

客户端和服务器如何发送/接收数据的基本原理...

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

【问题讨论】:

  • 假设您使用的是内置 TCP/IP 库并假设所有片段最终在连接超时之前到达,TCP 提供了您无需担心重复和重传的保证.这是您选择 TCP 而不是 UDP 的主要原因之一……这也是数据正确排序的保证。
  • 好的,谢谢。我只是想在开始寻找错误之前确定一下。
  • 也许您认为您的recv 调用将始终准确返回 1,024 个字节?缓冲区大小是将接收的最大字节数,而不是实际数量。向我们展示您的完整代码以接收消息。

标签: python sockets tcp


【解决方案1】:

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

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

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

【讨论】:

  • 很好的解释。
猜你喜欢
  • 1970-01-01
  • 2014-12-10
  • 2022-01-24
  • 2020-10-12
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 2011-12-09
相关资源
最近更新 更多