我知道如何在C ++中打开UDP套接字,我也知道如何通过它发送数据包。当我发送数据包时,我在另一端正确接收它,一切正常。
编辑:我还构建了一个完全正常工作的确认系统:数据包已经过编号,校验和确认,因此我随时都知道在最后一秒内我发送了多少数据包实际上是从另一个端点收到的。现在,我发送的数据只有在收到所有数据包时才能读取,所以我真的不关心数据包排序:我只需要它们全部到达,这样它们就可以按随机顺序到达它仍然可以,因为按顺序排序仍然没用。
现在,我必须传输大量数据(例如1 GB),并且我需要尽快传输它。所以我将数据分成512个字节的块并通过UDP套接字发送它们。
现在,由于UDP是无连接的,因此它显然无法提供任何速度或传输效率诊断。因此,如果我只是尝试通过我的套接字发送大量数据包,我的套接字将接受它们,然后它们将立即发送,我的路由器将发送第一对,然后开始丢弃它们。所以这不是最有效的方法。
我所做的是制作一个循环:
我尝试做了一些校准,但是我实现了相当不错的传输速率,但是我有一个不断发送数据包的线程,但我只有一个实验性的想法,关于间隔应该是什么以及大小是多少一堆应该是。原则上,我可以想象睡眠时间非常短,然后一次发送一个数据包将是路由器的最佳解决方案,但是在CPU性能方面它完全不可行(我可能需要忙碌)等待,因为两个连续数据包之间的时间真的很小。)
还有其他解决方案吗?任何被广泛接受的方案我假设我的路由器有一个缓冲区或类似的东西,所以它可以同时接受所有的数据包,然后它需要一些时间来处理它们。缓冲区有多大?
我不是这方面的专家所以任何解释都会很棒。
但请注意,由于技术原因完全没有我可以使用TCP。
答案 0 :(得分:1)
正如其他一些评论所述,您所描述的是流量控制系统。维基百科文章很好地概述了这样做的各种方法:
http://en.wikipedia.org/wiki/Flow_control_%28data%29
您所拥有的解决方案(在数据包组之间的硬编码时段内休眠)原则上会起作用,但为了在实际系统中获得合理的性能,您需要能够对网络。这意味着实现某种反馈,您可以自动调整传出数据速率和数据包大小,以响应网络特性,例如吞吐量和数据包丢失。
这样做的一个简单方法是使用重新传输的数据包的数量作为流量控制系统的输入。基本的想法是,当您有大量重新传输的数据包时,您将减少数据包大小,降低数据速率,或两者兼而有之。如果您重新传输的数据包很少,则会增加数据包的大小和数量。数据速率,直到您看到重新传输的数据包增加。
这有点过于简单了,但我认为你明白了。