C ++ UDP套接字会破坏特定频率的数据包

时间:2014-05-07 00:57:17

标签: c++ c sockets networking udp

我正在开发一种基于UDP的简单文件传输协议。 为了确保正确发送数据包,我正在校验它们。在接收时,丢弃损坏的数据包。我开始在家庭网络中测试我家的协议。我已经看到它支持几个MB / s的上传带宽到互联网,所以我希望它与连接到同一个wifi路由器的两台电脑很好地运行。

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

1 个答案:

答案 0 :(得分:0)

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

您不能像使用TCP一样发送UDP数据包。您必须将每个数据包作为自己的数据包处理。例如,使用socket / TCP,您可以根据需要编写尽可能多的数据,TCP将在那里写入,除非您溢出套接字本身。这很可靠。

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

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

UDP非常适合流媒体数据,例如音乐,语音等。在UDP层之上有一些恢复协议,例如RTP,可以恢复语音编码器本身的数据。

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