Что может вызвать отбрасывание пакетов UDP при отправке на localhost?

Я отправляю очень большие (64000 байт) дейтаграммы . Я понимаю, что MTU намного меньше 64000 байт (типичное значение составляет около 1500 байт, исходя из моих данных), но я подозреваю, что произойдет одно из двух: либо дейтаграммы не пройдут (все, что больше 1500 байт) будет автоматически отброшен или вызовет ошибку / исключение), или дейтаграммы размером 64000 байт будут разбиты примерно на 43 сообщения по 1500 байт и переданы прозрачно.

В течение длительного периода времени (2000+ 64000 байт дейтаграмм) отбрасывается около 1% (что кажется ненормально высоким даже для LAN) дейтаграмм. Я мог бы ожидать этого в сети, где дейтаграммы могут приходить не по порядку, отбрасываться, фильтроваться и т. Д. Однако я не ожидал этого при работе на локальном хосте.

Что вызывает невозможность отправлять / получать данные локально? Я понимаю, что UDP ненадежен, но я не ожидал, что он будет настолько ненадежным на localhost. Мне интересно, не связана ли это просто с синхронизацией, поскольку и отправляющий, и получающий компоненты находятся на одном компьютере.

Для полноты я включил код для отправки / получения дейтаграмм.

Отправка:

DatagramSocket socket = new DatagramSocket(senderPort);

int valueToSend = 0;

while (valueToSend < valuesToSend || valuesToSend == -1) {
    byte[] intBytes = intToBytes(valueToSend);

    byte[] buffer = new byte[bufferSize - 4];

     //this makes sure that the data is put into an array of the size we want to send
    byte[] bytesToSend = concatAll(intBytes, buffer);

    System.out.println("Sending " + valueToSend + " as " + bytesToSend.length + " bytes");

    DatagramPacket packet = new DatagramPacket(bytesToSend,
                        bufferSize, receiverAddress, receiverPort);

    socket.send(packet);

    Thread.sleep(delay);

    valueToSend++;
}

Получение:

DatagramSocket socket = new DatagramSocket(receiverPort);

while (true) {
    DatagramPacket packet = new DatagramPacket(
            new byte[bufferSize], bufferSize);

    System.out.println("Waiting for datagram...");
    socket.receive(packet);

    int receivedValue = bytesToInt(packet.getData(), 0);

    System.out.println("Received: " + receivedValue
            + ". Expected: " + expectedValue);

    if (receivedValue == expectedValue) {
        receivedDatagrams++;
        totalDatagrams++;
    }
    else {
        droppedDatagrams++;
        totalDatagrams++;
    }

    expectedValue = receivedValue + 1;
    System.out.println("Expected Datagrams: " + totalDatagrams);
    System.out.println("Received Datagrams: " + receivedDatagrams);
    System.out.println("Dropped Datagrams: " + droppedDatagrams);
    System.out.println("Received: "
            + ((double) receivedDatagrams / totalDatagrams));
    System.out.println("Dropped: "
            + ((double) droppedDatagrams / totalDatagrams));
    System.out.println();
}
21
задан Thomas Owens 1 November 2011 в 15:12
поделиться