【发布时间】:2015-04-24 23:19:37
【问题描述】:
我知道如何在 C++ 中打开一个 UDP 套接字,我也知道如何通过它发送数据包。当我发送一个数据包时,我在另一端正确接收到它,一切正常。
编辑:我还建立了一个完整的确认系统:数据包被编号、校验和和确认,所以我随时知道我发送了多少个数据包,比如说,在最后一秒实际上是从另一个端点收到的。现在,我发送的数据只有在收到所有数据包时才可读,所以我真的不关心数据包的顺序:我只需要它们都到达,这样它们就可以随机序列到达,它仍然会没关系,因为按顺序排列它们仍然没有用。
现在,我必须传输一大块数据(比如 1 GB),我需要尽可能快地传输它。所以我将数据分成 512 字节的块并通过 UDP 套接字发送。
现在,由于 UDP 是无连接的,它显然不提供任何速度或传输效率诊断。因此,如果我只是尝试通过我的套接字发送大量数据包,我的套接字只会接受它们,然后它们将被一次性发送,我的路由器将发送第一对,然后开始丢弃它们。所以这不是完成这项工作的最有效方法。
我当时做的是制作一个循环:
- 睡一会儿
- 发送一堆数据包
- 再睡觉等等
我尝试进行一些校准,并获得了相当不错的传输速率,但是我有一个线程连续发送小束数据包,但我对间隔应该是什么以及数据包的大小只有一个实验性的想法应该是一堆。原则上,我可以想象,睡眠非常短的时间,然后一次只发送一个数据包将是路由器的最佳解决方案,但是在 CPU 性能方面完全不可行(我可能需要忙等待,因为两个连续数据包之间的时间会非常小)。
那么还有其他解决方案吗?任何被广泛接受的解决方案?我假设我的路由器有一个缓冲区或类似的东西,因此它可以一次接受一些数据包,然后需要一些时间来处理它们。缓冲区有多大?
我不是这方面的专家,所以任何解释都会很棒。
但是请注意,由于技术原因,根本没有办法我可以使用 TCP。
【问题讨论】:
-
开始使用iperf。看看你离 iperf 的速度还有多远。它是开源的,所以你可以看到他们做了什么。
-
嗯..也许你需要某种流控制协议。您可以将其基于对等方返回的 ACK 消息,以便在总体损失超过某个值时降低数据报发送速率。这么小的 512 字节的数据报似乎效率不高:(
-
你有没有想过让你的套接字
SOCK_SEQPACKET? -
@MartinJames 我也想过做这样的事情!我认为我可以做一个固定的时间步长(比如 0.01 秒),然后在每一步发送可变数量的数据包。但我不确定如何确定最佳步骤!
-
如果你不能使用 TCP,你仍然可以阅读 TCP 的流量控制功能是如何工作的,也许从中获得一些关于如何做类似事情的想法。
标签: c++ sockets networking udp