通过Tshark分析数据包延时,丢包,乱序,重复问题

一.通过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 "$@"

你可能感兴趣的:(linux,测试经验杂谈,网络知识)