O WireShark assumirá que os pacotes são DUP ou retransmitidos?

8

Eu tenho um SPAN em duas portas de switch diferentes que estão indo para o mesmo sniffer. A porta de conexão do host A é SPANed e a porta de conexão do host B também é SPANed. Por ser um roteador em uma configuração de tipo stick, eu esperava que, durante um período em que as falhas de comunicação sejam relatadas nos logs do aplicativo, eu possa procurar um pacote específico nos dois lados. Vejo no meu rastro que há uma enorme quantidade de retransmissões e estou curioso se a lógica do Wireshark marca algo como retransmissão, se a vir duas vezes?

Alguém tem alguma dica de quando está rastreando algo assim?

obrigado

LIK
fonte

Respostas:

8

O Wireshark armazena o número de sequência para um determinado fluxo TCP. Se o novo pacote não avançar o número de sequência, ele será marcado como uma retransmissão.

Este é o códigoepan/dissectors/packet-tcp.c real do Wireshark (incluído em linha abaixo).

Por favor, observe a tcp_analyze_sequence_number()função, mais especificamente o bloco que começa na linha 822.


Linha 822 de epan/dissectors/packet-tcp.c(Revisão 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
fonte
11
Resposta impressionante, obrigado por verificar o código fonte.
Mike Pennington #
11
Mike, obrigado por editar a resposta! Aprecie a entrada.
precisa saber é o seguinte