Akankah WireShark menganggap paket DUP atau dikirim ulang?

8

Saya memiliki SPAN pada dua port switch berbeda yang akan pergi ke sniffer yang sama. Port penghubung Host A adalah SPAN, dan port penghubung host B juga SPAN. Karena ini adalah router dengan konfigurasi tipe stick, saya berharap bahwa pada saat kegagalan komunikasi dilaporkan dari log aplikasi, saya dapat mencari paket tertentu di kedua sisi. Saya melihat dalam jejak saya bahwa ada sejumlah besar transmisi ulang, dan saya ingin tahu apakah logika Wireshark menandai sesuatu sebagai transmisi ulang jika melihatnya dua kali?

Adakah yang punya tips tentang ketika mereka melacak sesuatu seperti ini?

Terima kasih

LIK
sumber

Jawaban:

8

Wireshark menyimpan nomor urut untuk aliran TCP yang diberikan. Jika paket baru tidak memajukan nomor urut, maka itu menandainya sebagai pengiriman ulang.

Ini adalah kode Wireshark yangepan/dissectors/packet-tcp.c sebenarnya (termasuk inline di bawah).

Silakan lihat tcp_analyze_sequence_number()fungsinya, lebih khusus lagi blok yang dimulai pada baris 822.


Baris 822 dari epan/dissectors/packet-tcp.c(Revisi 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
sumber
1
Jawaban yang mengesankan, terima kasih telah memeriksa kode sumber.
Mike Pennington
1
Mike, terima kasih telah mengedit jawabannya! Hargai input.
Manoj Pandey