一.通过Tshark分析数据包之间延时,Tshark工具使用就不说了,自行学习。
步骤:
1.从抓取数据包中过滤出需要分析的一条流
tshark -r $server_packet_path -Y 'ip.src==${sip}&&ip.dst==${dip}&&${porto}.srcport==${sport}&&${porto}.dstport==${dport}' -w server_packet.pcap
2. 使用Tshark解析得到这条流数据包之间的延时
tshark -r /home/vyos/server_packet.pcap -t d "|awk '{print$2}'
二.通过Tshark分析丢包,乱序,重复
原理:
根据过滤数据流的ip.id进行判断,数据包在传输过程中ip.id是不会变化的(被代理的除外),可以抓取发送端和接收端的报文进行ip.id对比来判断数据包在传输过程中是否有丢包,乱序,或者重复
具体的实现用如下脚本操作:
#!/bin/bash
sip=""
dip=""
porto=""
sport=""
dport=""
delay=""
client_packet_path=""
server_packet_path=""
time=`date +%H%M%S`
function Usage(){
echo "说明:通过packet-analysis分析一条数据流延时,丢包,乱序,重复的工具,提供三种模式进行选择"
echo "用法1 : packet-analysis -m 1 -s /sos/tmp/test.pcap -d 0.1 -w 11.1.1.1 -x 22.1.1.1 -y 50617 -z 5201 -p udp"
echo "用法2 : packet-analysis -m 2 -s /sos/tmp/test.pcap -d 0.1 -w 11.1.1.1 -x 22.1.1.1 -y 50617 -z 5201 -p udp"
echo "用法3 : packet-analysis -m 3 -c /sos/tmp/test001.pcap -s /sos/tmp/test.pcap -d 0.1 -w 11.1.1.1 -x 22.1.1.1 -y 50617 -z 5201 -p udp"
echo "选项:"
echo " -m mode mode=1:根据匹配条件解析出该条流的ip.id,并进行服务端的丢包,乱序,重复报文检测"
echo " mode=2:判断服务端数据包间延时是否满足要求"
echo " mode=3:判断是否存在丢包,乱序,重复报文,服务端报文延时是否满足要求"
echo " -c client_packet_path 客户端报文路径"
echo " -s server_packet_path 服务端报文路径"
echo " -d delay 允许的数据包间延时"
echo " -w sip 过滤数据包的源IP"
echo " -x dip 过滤数据包的目的IP"
echo " -y sport 过滤数据包的源端口"
echo " -z dport 过滤数据包的目的端口"
echo " -p porto 过滤数据包的协议,仅支持UDP/TCP"
echo " -h help 帮助"
exit 1
}
function main()
{
#如果没有输入参数,提示帮助说明
if [ $# -lt 1 ];then
Usage
fi
while getopts :m:c:s:d:w:x:y:z:p:h: opt
do
case $opt in
m)
mode=$OPTARG
;;
c)
client_packet_path=$OPTARG
;;
s)
server_packet_path=$OPTARG
;;
d)
delay=$OPTARG
;;
w)
sip=$OPTARG
echo $sip |grep "^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$" > /dev/null || echo "源IP格式输入错误"
;;
x)
dip=$OPTARG
echo $dip |grep "^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$" > /dev/null || echo "目的IP格式输入错误"
;;
y)
sport=$OPTARG
;;
z)
dport=$OPTARG
;;
p)
porto=$OPTARG
;;
h)
Usage
;;
?)
Usage
;;
esac
done
filter_packet
if [ $mode -eq 1 ];then
analysis_ip_id
fi
if [ $mode -eq 2 ];then
compare_delay
fi
if [ $mode -eq 3 ];then
compare_delay
compare_ip_id
fi
}
#过滤出所需数据包
function filter_packet()
{
#数据包路径在/home/vyos/
if [ ! $server_packet_path ];then
echo "不存在服务端数据包"
else
su - vyos -c "/usr/bin/tshark -r $server_packet_path -Y 'ip.src==${sip}&&ip.dst==${dip}&&${porto}.srcport==${sport}&&${porto}.dstport==${dport}' -w server_packet.pcap"
echo "成功过滤服务端端数据包"
fi
if [ ! $client_packet_path ];then
echo "不存在客户端数据包"
else
su - vyos -c "/usr/bin/tshark -r $client_packet_path -Y 'ip.src==${sip}&&ip.dst==${dip}&&${porto}.srcport==${sport}&&${porto}.dstport==${dport}' -w client_packet.pcap"
echo "成功过滤客户端端数据包"
fi
}
#判断包间延时是否满足需求
function compare_delay()
{
interval_array=(`su - vyos -c "/usr/bin/tshark -r /home/vyos/server_packet.pcap -t d "|awk '{print$2}'`)
packet_all=`expr ${#interval_array[@]} - 1`
for ((i=0;i<$packet_all;i++))
do
a=`expr ${interval_array[i]} \< $delay`
if [ $a -ne 1 ];then
echo "第${i}个数据包延时超过${delay}"
fi
done
}
#判断数据包是否存在乱序,丢包,和重复
function compare_ip_id()
{
client_ip_id_array=(`su - vyos -c "/usr/bin/tshark -r /home/vyos/client_packet.pcap -T fields -e ip.id"`)
server_ip_id_array=(`su - vyos -c "/usr/bin/tshark -r /home/vyos/server_packet.pcap -T fields -e ip.id"`)
client_packet_all=`expr ${#client_ip_id_array[@]} - 1`
server_packet_all=`expr ${#server_ip_id_array[@]} - 1`
if [ $client_packet_all -eq $server_packet_all ];then
for ((i=0;i<$client_packet_all;i++ ))
do
ip_id_differences=`expr ${client_ip_id_array[i]} - ${server_ip_id_array[i]}`
if [ $ip_id_differences -ne 0 ];then
echo "数据包ID${server_ip_id_array[i]}存在乱序"
fi
done
elif [ $client_packet_all -gt $server_packet_all ];then
for ((i=0;i<$server_packet_all;i++ ))
do
ip_id_differences=`expr ${client_ip_id_array[i]} - ${server_ip_id_array[i]}`
if [ $ip_id_differences -lt 0 ];then
echo "数据包ID${server_ip_id_array[i]}存在丢包或者乱序"
fi
done
elif [ $client_packet_all -lt $server_packet_all ];then
for ((i=0;i<$client_packet_all;i++ ))
do
ip_id_differences=`expr ${client_ip_id_array[i]} - ${server_ip_id_array[i]}`
if [ $ip_id_differences -gt 0 ];then
echo "数据包ID${server_ip_id_array[i]}存在重复或者乱序"
fi
done
fi
}
function analysis_ip_id()
{
server_ip_id_array=(`su - vyos -c "/usr/bin/tshark -r /home/vyos/server_packet.pcap -T fields -e ip.id"`)
#echo "${server_ip_id_array[*]}"
packet_all=`expr ${#server_ip_id_array[@]} - 1`
for ((i=0;i<$packet_all;i++))
do
ip_id_interval=`expr ${server_ip_id_array[i+1]} - ${server_ip_id_array[i]}`
if [ $ip_id_interval -gt 1 ];then
echo "数据包ID${server_ip_id_array[i]}存在丢包"
elif [ $ip_id_interval -eq 0 ];then
echo "数据包ID${server_ip_id_array[i]}存在重复"
elif [ $ip_id_interval -lt 0 ];then
echo "数据包ID${server_ip_id_array[i]}存在乱序"
fi
done
}
main "$@"