Wird WireShark davon ausgehen, dass Pakete DUP sind oder erneut übertragen werden?


8

Ich habe ein SPAN an zwei verschiedenen Switch-Ports, die zum selben Sniffer gehen. Der Verbindungsport von Host A ist SPANED, und der Verbindungsport von Host B ist ebenfalls SPANed. Da es sich um einen Router mit einer Stick-Konfiguration handelt, hatte ich gehofft, dass ich während einer Zeit, in der Kommunikationsfehler aus Anwendungsprotokollen gemeldet werden, auf beiden Seiten nach einem bestimmten Paket suchen kann. Ich sehe in meiner Spur, dass es eine enorme Anzahl von Neuübertragungen gibt, und ich bin neugierig, ob Wiresharks Logik etwas als Neuübertragung markiert, wenn es zweimal angezeigt wird.

Hat jemand Tipps, wann er so etwas aufspürt?

Vielen Dank

Antworten:


8

Wireshark speichert die Sequenznummer für einen bestimmten TCP-Fluss. Wenn das neue Paket die Sequenznummer nicht weiterleitet, markiert es sie als erneute Übertragung.

Dies ist der tatsächliche Wireshark-Code inepan/dissectors/packet-tcp.c (unten inline enthalten).

Bitte schauen Sie sich die tcp_analyze_sequence_number()Funktion an, genauer gesagt den Block ab Zeile 822.


Zeile 822 von epan/dissectors/packet-tcp.c(Revision 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
Beeindruckende Antwort, danke, dass Sie den Quellcode überprüft haben.
Mike Pennington

1
Mike, danke, dass du die Antwort bearbeitet hast! Schätzen Sie die Eingabe.
Manoj Pandey
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.