使用UDP时如何提高数据传输的传输速率?

时间:2019-04-23 14:29:30

标签: java performance udp

我已经开始从事我自己的项目,这很有趣。 我已经创建了一个使用UDP打孔的应用程序,然后将数据从一个设备A传输到第二个设备B,并且我试图找到可以优化传输速度的方式。

最初,在通过Internet和其他网络进行测试时,在接收器端启动数据传输和接收数据时遇到一些问题。经过研究,我最终将每个数据包的数据减少到504字节,以使数据包的有效载荷低于508 bytes which is the maximum safe UDP payload。这解决了很多我认为是由数据包丢失引起的问题,并且几乎所有使用此配置进行测试的时间都可以很好地工作(当重新传输丢失的数据包时)。

要传输的数据大小可能有所不同(从几KB到几百MB),当启动传输时,我获取原始数据,对其进行处理,然后将它们拆分为504字节的编号块,然后将其发射通过发件人的DatagramSocket。 我有一个循环,它循环遍历接收器尚未接收到的数据包,而发送方使该循环保持大量尝试或时间,直到成功完成传输或失败为止。同时,发送方侦听来自接收方的相同DatagramSocket的确认数据包。 另一端的接收器(经过某种握手后会收到有关将要发送多少个数据包的信息)会不断侦听传入的数据包,并且每当收到一个数据包时,就会立即发回一个确认数据包。

这可以很好地工作,但是根据每次传输的数据包丢失,它可能真的很慢(例如,对于5 MB文件,20分钟是有史以来最糟糕的时间之一,对于5 MB文件,则是30-40秒)。

下面您将看到一些伪代码,但其中包含实现的重要部分:

//Sender side:
packetsToSend = ArrayList<ByteArray>()
keepTransfering = true
while(packetsToSend.isNotEmpty() && keepTransfering) {
   packetsToSend.forEach { packet ->
      datagramSocket.send( DatagramPacketCreation(packet) )
      ackPacket = datagramSocket.receive(TIMEOUT=1) //1 millisecond timeout
      processAckPacket(ackPacket)
   }
}

有了上面的循环和数据包丢失,我设法达到了30-40秒的速度,大约为128 KB / s。

几周前,我想将收到确认的部分移到另一个线程,这样可以加快处理速度。在本地测试,工作正常。然后尝试通过Internet和apparently the router can't keep up with this because of an overload of the router's table对其进行测试。

在不增加路由器负载的情况下,我是否可以改进逻辑以提高速度?如果我有1毫秒的等待时间(即使没有收到数据包-假设我是在其他线程上执行的),速度仍将限制为488 KB / s(5000 Bytes / s)。我将如何达到2-3 MB / s的更高速度?

0 个答案:

没有答案