Wireshark/Tshark проверяет первый байт каждого пакета, чтобы увидеть, увеличивается ли он

#bash #wireshark #tshark

Вопрос:

Я тестирую сетевой интерфейс и получаю непрерывные UDP-пакеты на свой компьютер, у которых в первом байте поля данных есть счетчик переходов.

 packet0[0]=0
packet1[0]=1
...
packet255[0]=255
packet256[0]0
 

Я пытаюсь определить, потерял ли я какие-либо пакеты таким образом.

Я написал сценарий, чтобы проверить это из дампа текстового файла wireshark пакетов, но, как вы можете догадаться, он чрезвычайно медленный, неэффективный и использует тонну памяти. Я надеялся, что есть более эффективный способ (возможно, даже живой) использовать tshark/wireshark. У меня есть перекрестная проверка с приложением C, но на самом деле я просто хотел знать, можно ли это сделать с помощью этих сетевых инструментов.

Вот чем я сейчас занимаюсь,

 #!/bin/bash
# in wireshark save a capture (filtered appropriately with ip.dst) as
# file > export packet disections > as plain text file
# check,
#    packet summary lines
#    packet details : all expanded
file=$1
grep -o "Data: [0-f][0-f]" $file > tmp
data=0
dataPrev=0
nerrors=0
pkts=0
# get first line and offset data
line=$(head -n 1 tmp)
data=$(echo $line | awk '{print $2}')
data=$(echo $data | tr [:lower:] [:upper:])
data=$(echo "obase=10; ibase=16; $data" | bc)
data=$(($data-1))
echo "Start checking... (Ignoring DCERPC packet)"
while IFS= read -r line; do
    pkts=$(($pkts 1))
    dataPrev=$data
    data=$(echo $line | awk '{print $2}')
    data=$(echo $data | tr [:lower:] [:upper:])
    data=$(echo "obase=10; ibase=16; $data" | bc)
    if [ $dataPrev -eq 255 ]; then
        dt=0
    else
        dt=$(($dataPrev 1))
    fi
    data=$(($data 0))
    ## seeing issue with wireshark when data = 4 it is decoding it 
    # as a DCERPC packet which is causing the data field to not be present leading
    # to a bunch of false positives, ignoring these for now
    if [ $data -ne $dt ] amp;amp; [ $dt -ne 4 ]; then
        echo "packet $pkts[0]=$data != expected value $dt ... prev packet ($(($pkts-1))[0]=$dataPrev)"
        nerrors=$(($nerrors 1))
    fi
    if [ $(($pkts % 8000)) -eq 0 ]; then
        echo "$pkts"
    fi
    if [ $(($pkts % 100)) -eq 0 ]; then
        echo -n "."
    fi
done < tmp
echo ""
# rm -f tmp
echo "Found total of $nerrors / $pkts errors"

 

Пример созданного файла tmp, который анализируется,

 $ head -n 10 tmp
Data: fe
Data: ff
Data: 00
Data: 01
Data: 02
Data: 03
Data: 05
Data: 06
Data: 07
Data: 08
 

Выход,

 $ ./parse_wireshark.sh test18k 
Start checking... (Ignoring DCERPC packet)
...............................................................................8000
................................................................................16000
....................
Found total of 0 / 17936 errors