¿WireShark asumirá que los paquetes son DUP o retransmitidos?

8

Tengo un SPAN en dos puertos de conmutador diferentes que van al mismo sniffer. El puerto de conexión del host A está SPAN, y el puerto de conexión del host B también está SPAN. Debido a que es un enrutador en un tipo de configuración de memoria, esperaba que durante un tiempo que se informan fallas de comunicación desde los registros de la aplicación, pueda buscar un paquete en particular en ambos lados. Veo en mi rastro que hay una gran cantidad de retransmisiones, y tengo curiosidad por saber si la lógica de Wireshark marca algo como una retransmisión si lo ve dos veces.

¿Alguien tiene algún consejo sobre cuándo están rastreando algo como esto?

Gracias

Me gusta
fuente

Respuestas:

8

Wireshark almacena el número de secuencia para un flujo TCP dado. Si el nuevo paquete no avanza el número de secuencia, entonces lo marca como una retransmisión.

Este es el códigoepan/dissectors/packet-tcp.c real de Wireshark en (incluido en línea a continuación).

Mire la tcp_analyze_sequence_number()función, más específicamente el bloque que comienza en la línea 822.


Línea 822 de epan/dissectors/packet-tcp.c(Revisión 33861) :

/* RETRANSMISSION/FAST RETRANSMISSION/OUT-OF-ORDER
 * If the segments contains data and if it does not advance
 * sequence number it must be either of these three.
 * Only test for this if we know what the seq number should be
 * (tcpd->fwd->nextseq)
 *
 * Note that a simple KeepAlive is not a retransmission
 */
if( seglen>0
&&  tcpd->fwd->nextseq
&&  (LT_SEQ(seq, tcpd->fwd->nextseq)) ){
    guint64 t;

    if(tcpd->ta && (tcpd->ta->flags&TCP_A_KEEP_ALIVE) ){
        goto finished_checking_retransmission_type;
    }

    /* If there were >=2 duplicate ACKs in the reverse direction
     * (there might be duplicate acks missing from the trace)
     * and if this sequence number matches those ACKs
     * and if the packet occurs within 20ms of the last
     * duplicate ack
     * then this is a fast retransmission
     */
    t=(pinfo->fd->abs_ts.secs-tcpd->rev->lastacktime.secs)*1000000000;
    t=t+(pinfo->fd->abs_ts.nsecs)-tcpd->rev->lastacktime.nsecs;


    if( tcpd->rev->dupacknum>=2
    &&  tcpd->rev->lastack==seq
    &&  t<20000000 ){
        if(!tcpd->ta){
            tcp_analyze_get_acked_struct(pinfo->fd->num, TRUE, tcpd);
        }
        tcpd->ta->flags|=TCP_A_FAST_RETRANSMISSION;
        goto finished_checking_retransmission_type;
    }

    /* If the segment came <3ms since the segment with the highest
     * seen sequence number, then it is an OUT-OF-ORDER segment.
     *   (3ms is an arbitrary number)
     */
    t=(pinfo->fd->abs_ts.secs-tcpd->fwd->nextseqtime.secs)*1000000000;
    t=t+(pinfo->fd->abs_ts.nsecs)-tcpd->fwd->nextseqtime.nsecs;
    if( t<3000000 ){
        if(!tcpd->ta){
            tcp_analyze_get_acked_struct(pinfo->fd->num, TRUE, tcpd);
        }
        tcpd->ta->flags|=TCP_A_OUT_OF_ORDER;
        goto finished_checking_retransmission_type;
    }

    /* Then it has to be a generic retransmission */
    if(!tcpd->ta){
        tcp_analyze_get_acked_struct(pinfo->fd->num, TRUE, tcpd);
    }
    tcpd->ta->flags|=TCP_A_RETRANSMISSION;
    nstime_delta(&tcpd->ta->rto_ts, &pinfo->fd->abs_ts, &tcpd->fwd->nextseqtime);
    tcpd->ta->rto_frame=tcpd->fwd->nextseqframe;
}
Manoj Pandey
fuente
1
Impresionante respuesta, gracias por consultar el código fuente.
Mike Pennington
1
Mike, gracias por editar la respuesta! Agradezco la entrada.
Manoj Pandey