【问题标题】:C++ UDP socket corrupts packet over a certain frequencyC ++ UDP套接字以一定的频率破坏数据包
【发布时间】:2014-06-23 18:58:49
【问题描述】:

我正在开发一个基于 UDP 的简单文件传输协议。 为了确保数据包被正确发送,我对它们进行校验和。在接收的那一刻,损坏的数据包被丢弃。我首先在我的家庭网络中测试我的协议。我已经看到它支持几 MB/s 的上传带宽到互联网,所以我希望它在连接到同一个 wifi 路由器的两台计算机上表现良好。

发生的情况是,当我达到每秒 10000 个数据包时(数据包只有几个字节!)数据包开始出现大量损坏(大约 40% 到 60%)损坏(校验和失败)。这个问题的原因可能是什么?任何帮助将不胜感激!

【问题讨论】:

  • 每个数据包有多大?你的路由器在什么无线模式下运行?信号有多强?
  • UDP 已经有校验和功能。您应该在两端启用它。你不需要自己实现。
  • 您能否提供有关您用于调试的工具的更多信息以及与问题相关的某种输出?我们目前不知道数据包是否由于校验和不匹配而在内核级别被丢弃(在堆栈中的某个位置..是 IP 校验和吗?UDP 校验和?),或者是您自己的校验和实现输出标记了数据包已损坏。
  • 我也建议你通过环回接口测试你的代码。
  • Wireshark 是否同意传入的数据包已损坏?在我看来,如果您的应用程序以更高的数据速率在有线 LAN 上运行,那么您的接入点可能很糟糕并且会损坏数据包。此外,您应该考虑大得多的有效载荷。每个数据包至少有 14+20+8=42 字节的标头,因此浪费了大约 2/3 的带宽,导致每秒数据包数 (PPS) 极低。

标签: c++ c sockets networking udp


【解决方案1】:

UDP 是一种面向无连接的协议 - 意思是,您可以随时发送 UDP 数据包 - 如果有人在监听,他们就会收到数据包。如果他们不这样做,他们就不会。数据包不保证会到达。

您不能像使用 TCP 一样发送 UDP 数据包。您必须将每个数据包视为自己的数据包。例如,使用套接字/TCP,您可以写入任意数量的数据,除非您溢出套接字本身,否则 TCP 会从那里获取数据。很靠谱。

UDP 不是。如果您发送 UDP 数据包并且它丢失了,它将永远丢失并且无法恢复 - 您必须自己在层之上的自己的协议中进行恢复。没有重新发送,这不是一个可靠的连接。

虽然有校验和,但它通常是可选的,通常不使用。

UDP 非常适合流式传输数据,例如音乐、语音等。在 UDP 层之上有 RTP 等语音恢复协议,可以恢复语音编码器本身中的数据。

我敢打赌,如果您在 UDP 数据包中放置一个计数器,您会注意到如果您超过某个带宽,其中一些不会到达,如果您通过交换机/网络连接它肯定会遇到这种情况。如果您在两台计算机之间进行直接连接,它可能会在非常高的带宽下工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 2014-11-11
    • 1970-01-01
    • 2010-11-13
    • 2011-12-05
    • 2012-12-12
    • 2020-11-29
    相关资源
    最近更新 更多