WireShark supporrà che i pacchetti siano DUP o ritrasmessi?


8

Ho uno SPAN su due porte switch diverse che stanno andando allo stesso sniffer. La porta di connessione dell'host A è SPAN e anche la porta di connessione dell'host B è SPAN. Poiché si tratta di un router su un tipo di configurazione stick, speravo che durante un periodo in cui i registri dell'applicazione segnalassero errori di comunicazione, potessi cercare un pacchetto particolare su entrambi i lati. Vedo nella mia traccia che ci sono moltissime ritrasmissioni e sono curioso di sapere se la logica di Wireshark contrassegna qualcosa come ritrasmissione se la vede due volte?

Qualcuno ha qualche consiglio su quando stanno tracciando qualcosa del genere?

Grazie

Risposte:


8

Wireshark memorizza il numero di sequenza per un determinato flusso TCP. Se il nuovo pacchetto non anticipa il numero progressivo, lo contrassegna come ritrasmissione.

Questo è il codice Wiresharkepan/dissectors/packet-tcp.c attuale in (incluso in linea di seguito).

Si prega di guardare la tcp_analyze_sequence_number()funzione, più specificamente il blocco che inizia alla linea 822.


Linea 822 di epan/dissectors/packet-tcp.c(Revisione 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;
}

1
Risposta impressionante, grazie per aver controllato il codice sorgente.
Mike Pennington,

1
Mike, grazie per aver modificato la risposta! Apprezzo l'input.
Manoj Pandey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.