Windows 下抓包分析:
使用抓包工具Wireshark抓包,打开wireshark,选择抓包的网卡,输入过滤条件,
常用过滤条件:
1、过滤IP, 例如:ip.addr == 192.168.21.45
2、过滤端口, 例如:tcp.port == 5060 || udp.port == 5060
3、根据消息协议过滤, 例如:sip,sip.Call-ID == "MTI2Y2YyMD", rtp, rtp.ssrc == 12345, http等
注:! && || 非且或3个符号linux/win通用,不喜欢写 not and or
抓本机发给本机的包:
本机发送到本机的数据包不会经过网卡,无法抓到包,需要设置路由,如下:
route add “本机ip“ mask 255.255.255.255 “网关ip”
如:route add 92.168.136.200 mask 255.255.255.255 192.168.128.1
使用完毕后用route delete 192.168.136.200 mask 255.255.255.255 192.168.128.1删除,否则所有本机报文都经过网卡出去走一圈回来很耗性能。
linux 下抓包分析:
需要安装tcpdump, 可以直接yum或apt-get install tcpdump 安装,不能连网的话下载rpm包安装,需要下载libpcap和tcpdump的rpm包,rpm -Uvh +rpm包安装即可,
常用抓包命令:
1、-i 指定网卡如eth0, ip addr 看下,如果安装了k8s虚拟网卡太多,可以 ip addr|grep 192.168 快速找到,可以不指定,设为any 即可。
2、host 指定ip, port 指定端口,可以加tcp或udp限定协议,-vn 打印, -w 输出到文件,再拷贝到win上用wireshark打开。
简单的看下信令,直接打印即可:
tcpdump -i any udp port 5060 -vn (打印5060端口抓到的包)
通常需要将抓到的包写到文件,下载到windows上使用Wireshark分析:
命令:tcpdump -i any udp port 5060 -vn -w sip.pcap
功能:抓发往5060端口的任意网卡的udp包,打印数量并写入 sip.pcap文件中,抓包文件在windows上是.pcap文件
命令:tcpdump -i any host 192.168.12.34 -vn -w sip.pcap
功能:抓关于192.168.12.34这个ip的所有数据包(包括发送和接收),写入sip.pcap文件。
加了-vn会提示抓到多少个包,ctrl +c 结束后拷贝sip.pcap 用wireshark打开分析。
wireshark分析抓包技巧:
1、分析sip会话流程(如invite流程)可过滤call-id, 见上面win过滤。
2、分析rtp流:如果没有显示数据为rtp包,可选中一个包,右键流跟踪一下过滤掉其它包,再右键选择“解码为”(倒数第二个选项),“当前“ 选择RTP(快速输入RTP会跳转过去)
点OK解码成rtp包后,选择 电话-->RTP-->流分析
确认后就可分析出流的丢包、乱序等问题
左边写了,丢包28个占2.25%,乱序1个,将流保存下来,把后缀名强行改为.ps 或.h264或.h265,即可播放,h264可以用eseye_u分析,
若ps 流打包有问题,可以看另一篇“最简单的h264/h265/svac和g711封装成ps流”具体分析,常见的问题是h265打包成了264。
保存时一定要选择为raw原始数据,保存后再改后缀。
附:国标接入或级联某些小厂家时可能会出现视频下半截放不出来,这种现象90%是发送方pes包没处理好,pes包最大65535(u_short)。
如果是下半截严重花屏,多半是发送方没有做流量峰值控制,接收方扩大缓冲区可以解决,但容易丢包。简单的峰值控制定时循环时设置最大发送rtp包数即可。
海康h265的ps流中有0x00 0x00 0x01 0xbd字段,不知道啥用,注意解ps流时去掉它附带的数据就行。