WireShark sẽ cho rằng các gói là DUP hoặc được truyền lại?


8

Tôi có một SPAN trên hai cổng chuyển đổi khác nhau sẽ đi đến cùng một sniffer. Cổng kết nối của máy chủ A được SPANed và cổng kết nối của máy chủ B cũng được SPANed. Bởi vì đó là một bộ định tuyến trên một loại cấu hình dính, tôi đã hy vọng rằng trong một thời gian các lỗi giao tiếp được báo cáo từ nhật ký ứng dụng, tôi có thể tìm kiếm một gói cụ thể ở cả hai bên. Tôi thấy trong dấu vết của mình rằng có một lượng lớn các lần truyền lại, và tôi tò mò liệu logic của Wireshark có đánh dấu bất cứ điều gì như là truyền lại nếu nó nhìn thấy nó hai lần không?

Có ai có bất cứ lời khuyên về khi họ đang truy tìm một cái gì đó như thế này?

Cảm ơn

Câu trả lời:


8

Wireshark lưu trữ số thứ tự cho một luồng TCP nhất định. Nếu gói mới không chuyển số thứ tự, thì nó đánh dấu nó là truyền lại.

Đây là mã Wiresharkepan/dissectors/packet-tcp.c thực tế trong (bao gồm nội tuyến bên dưới).

Vui lòng xem tcp_analyze_sequence_number()chức năng, cụ thể hơn là khối bắt đầu từ dòng 822.


Dòng 822 của epan/dissectors/packet-tcp.c(Bản sửa đổi 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
Câu trả lời ấn tượng, cảm ơn bạn đã kiểm tra mã nguồn.
Mike Pennington

1
Mike, cảm ơn bạn đã chỉnh sửa câu trả lời! Đánh giá cao đầu vào.
Manoj Pandey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.