Как iperf сообщает о потере пакетов в udp

Iperf — хорошо известный инструмент для расчета пропускной способности. Когда я попробовал пропускную способность udp с помощью iperf на своем linuxpc, он сообщил, что потеря пакетов составляет 10%.

В протоколе UDP датаграмма не получила никаких подтверждений. Но каким образом iperf сообщает или рассчитывает потерю пакетов? Как инструмент iperf узнает, получена ли переданная дейтаграмма или нет. Я задаюсь этим вопросом.


person Vijay Kalyanam    schedule 18.08.2018    source источник
comment
Интересный вопрос. Я предполагаю, что на другом порту может быть какое-то метасоединение, которое используется для сообщения о том, сколько пакетов было отправлено и получено. Возможно, этот вопрос лучше подходит для serverfault.com.   -  person Tobias K.    schedule 18.08.2018
comment
Iperf может просто включать порядковый номер пакета в каждую дейтаграмму. Затем можно обнаружить потерю пакетов, а также неупорядоченный прием.   -  person sawdust    schedule 19.08.2018


Ответы (1)


Поскольку iperf используется с обеих сторон, iperf уверен, что получать после каждого пакета.

По сути, инструмент Iperf проверяет, увеличивается ли порядковый номер в каждой полученной дейтаграмме. Если порядковый номер не увеличивается на 1 , происходит потеря дейтаграммы. Если мы получаем дейтаграмму с порядковым номером меньше, чем предыдущая последовательность, значит, iperf получил пакет с нарушением порядка.
Вы можете обратиться к исходному коду iperf для лучшего понимания. https://github.com/esnet/iperf/blob/master/src/iperf_udp.c

Из исходного кода iperf-

if (pcount >= sp->packet_count + 1) {

    /* Forward, but is there a gap in sequence numbers? */
    if (pcount > sp->packet_count + 1) {
    /* There's a gap so count that as a loss. */
    sp->cnt_error += (pcount - 1) - sp->packet_count;
    }
    /* Update the highest sequence number seen so far. */
    sp->packet_count = pcount;
} else {

    /* 
     * Sequence number went backward (or was stationary?!?).
     * This counts as an out-of-order packet.
     */
    sp->outoforder_packets++;

    /*
     * If we have lost packets, then the fact that we are now
     * seeing an out-of-order packet offsets a prior sequence
     * number gap that was counted as a loss.  So we can take
     * away a loss.
     */
    if (sp->cnt_error > 0)
    sp->cnt_error--;

    /* Log the out-of-order packet */
    if (sp->test->debug) 
    fprintf(stderr, "OUT OF ORDER - incoming packet sequence %" PRIu64 " but expected sequence %d on stream %d", pcount, sp->packet_count, sp->socket);
}
person Rilwan    schedule 24.09.2018