WireShark supposera-t-il que les paquets sont DUP ou retransmis?

8

J'ai un SPAN sur deux ports de commutation différents qui vont au même renifleur. Le port de connexion de l'hôte A est SPANed, et le port de connexion de l'hôte B est également SPANed. Parce que c'est un routeur sur une configuration de type bâton, j'espérais que pendant un temps où les échecs de communication sont signalés à partir des journaux d'application, je peux rechercher un paquet particulier des deux côtés. Je vois dans ma trace qu'il y a une quantité massive de retransmissions, et je suis curieux de savoir si la logique de Wireshark marque quelque chose comme une retransmission s'il la voit deux fois?

Quelqu'un a-t-il des conseils pour tracer quelque chose comme ça?

Merci

LIK
la source

Réponses:

8

Wireshark stocke le numéro de séquence pour un flux TCP donné. Si le nouveau paquet n'avance pas le numéro de séquence, il le marque comme une retransmission.

Il s'agit du code Wiresharkepan/dissectors/packet-tcp.c réel (inclus en ligne ci-dessous).

Veuillez regarder la tcp_analyze_sequence_number()fonction, plus précisément le bloc commençant à la ligne 822.


Ligne 822 de epan/dissectors/packet-tcp.c(révision 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
la source
1
Réponse impressionnante, merci de vérifier le code source.
Mike Pennington
1
Mike, merci d'avoir édité la réponse! Appréciez l'entrée.
Manoj Pandey