【问题标题】:Is there any way to make the UDP packet loss be lower?有什么办法可以降低UDP丢包率?
【发布时间】:2015-09-04 07:38:51
【问题描述】:

我正在使用 UDP 客户端每秒发送大约 20k 个请求,每个请求的数据

public void startRecieve() throws IOException {
    udpSocket = new DatagramSocket(Constant.PORT);
    byte[] buffer = new byte[Constant.SIZE];
    udpPacket = new DatagramPacket(buffer, buffer.length);

    int len;
    while (true) {
        udpSocket.receive(udpPacket);
        len = udpPacket.getLength();
        if (len > 0) {
            // handing the data using other thread pool
        }
    }
}

有什么办法可以让UDP服务器丢包率更低?

谢谢。

【问题讨论】:

  • 安装光缆并对其进行绝缘以防止噪音,这应该会有所帮助。
  • @andy:你的(发送和接收)套接字缓冲区大小是多少?两边都调用了 setReceiveBufferSize 和 setSendBufferSize 函数吗?
  • 您应该使用现有的 UDP 服务器,处理器随时可用,而不是从头开始构建。其次,UDP不可靠,如果你想要可靠的东西,就选择TCP,想要实时的东西,就选择RTP。但是不要期望通过发布 10 行代码,您会期望用户帮助降低 UDP 错误率。另外,请检查 Rahul 提出的问题,该问题的答案是正确的。

标签: java sockets udp


【解决方案1】:

丢包在网络中,唯一的编程选项是

  • 发送更少的数据,例如压缩它或
  • 在丢失时重新发送数据,以减少丢失的数据。
  • 使用 TCP 为您处理数据包丢失。
  • 使用像 Aeron 这样的库,它使用 UDP 并为您处理数据包丢失。

最好的解决方案几乎总是首先修复网络以减少损失,但有一个接受一些损失的策略。

注意:由于 UDP 是有损协议,而 TCP 不是,因此许多路由器都经过优化,可以在 TCP 负载增加时丢弃 UDP 数据包(因为路由器希望任何丢弃的 TCP 数据包无论如何都会再次发送)

这可能意味着在负载下,UDP 的丢包率高于 TCP。

【讨论】:

    猜你喜欢
    • 2015-11-03
    • 2013-04-26
    • 2011-08-03
    • 2012-10-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    相关资源
    最近更新 更多