#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