【问题标题】:UDP Program Packet Loss Tracing [duplicate]UDP 程序丢包跟踪 [重复]
【发布时间】:2024-01-22 04:13:01
【问题描述】:

要获得可靠的连接,您必须使用 TCP。

但是,我想知道是否有办法修改我的代码,以便我可以检查 UDP 中丢失的数据包

 try {
        DatagramSocket socket = new DatagramSocket(5000);

        while(true) {
            byte[] buffer = new byte[50];
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
            socket.receive(packet);
            System.out.println("Text received is: " + new String(buffer, 0, packet.getLength()));

            String returnString = "echo: " + new String(buffer, 0, packet.getLength());
            byte[] buffer2 = returnString.getBytes();
            InetAddress address = packet.getAddress();
            int port = packet.getPort();
            packet = new DatagramPacket(buffer2, buffer2.length, address, port);
            socket.send(packet);
        }

    } catch(SocketException e) {
        System.out.println("SocketException: " + e.getMessage());
    } catch(IOException e) {
        System.out.println("IOException: " + e.getMessage());
    }
}

【问题讨论】:

  • 不。普遍接受的方法是等待接收方确认收到数据包,如果没有收到确认,则在超时后再次发送数据包。但这正是 TCP 所做的,那么为什么要重新发明*呢?只需使用 TCP。
  • 你需要实现一个应用层协议来做到这一点。您将有一个特定的数据报格式,其标题使用序列号之类的东西来确定数据报是否丢失。 TCP 和其他可靠协议就是这样做的。
  • 我已经把它作为一个 C# 问题的副本关闭了......因为任何编程语言的答案基本上都是相同的。

标签: java tcp network-programming udp


【解决方案1】:

由于传输协议不提供设施,因此应用程序协议需要这样做。

例如,您可以让发送者在每条消息中添加一个序列号,然后接收者就会知道数据报已丢失或(也可能)重复。

这可以让您检测到损失,但无法让您从中恢复。

当然,您需要在接收方跟踪每个发送方的预期序列号。

【讨论】:

  • 我忘了指出,当你在 16 号之后收到的消息编号为 18 时,你只知道(例如)消息 17 丢失了。这假设应该有一个“18 号”及时。如果在看到 17 号之前你什么都做不了,那就更复杂了。
  • 嗨。我现在才开始研究它,但我似乎遇到了一些问题。在第一个丢失的数据包之后,它开始将其他数据包添加为丢失。这是我的代码:pastie.org/p/3nQDJVlmy2ZNMQ8fZt2NDN