之前分析过一个问题,某终端产品直播节目的时候总是会偶尔出现马赛克、花屏、卡顿问题,点播节目可以正常播放。其他型号的终端产品,播放同一个直播节目是正常的。
上层通过日志分析,确认直播卡顿或者马赛克是因为出现了严重的丢包。这样就需要底层进行分析。
点播节目为什么不会丢包:
点播是tcp协议进行网络传输,tcp在协议层会做丢包重传,这样,物理层或者网卡驱动丢了几个包在tcp协议栈会触发重传,通过重传机制,掩盖了底层轻微的丢包导致的数据波动。只要不是那种极度严重(比如一两秒的时间没有来一个包)的网络数据丢失,都不会影响应用层的播放数据的完整性。
上层程序可以使用播放环境来测试丢包,对于底层来说,尽量找到问题的本质,然后使用简单的环境复现出问题。
就这个问题来说,直播的丢包,对于底层来说其实就是udp的丢包。那我们就可以模拟一个udp的环境来模拟对比测试是否是真的丢包。
我的测试方法:
网上找iperf二进制包,或者自己编译一个包,分别放在pc端和终端设备端。将PC机和终端设备通过网线直连:
udp rx丢包率的命令:
iperf -u -s #终端设备输入
iperf.exe -u -c 192.168.1.12 -t 100 -i 2 -b 100M #pc端输入,192.168.1.12是机顶盒的ip地址,测试100M就用100M,测试8M就把100M改成8M
通过pc端发包,然后终端设备查看iperf -u -s的输出结果,重点关注Lost/Total Datagrams这一列的百分百数据(表示丢包率),数字越大表示丢包越严重。
通过对比平台的丢包率数据来确定是否是底层的问题。
要确定是哪一层出现的丢包,可以借助tcpdump日志来分析。tcpdump抓日志的时候,要把tcpdump的打印输出信息也抓到:
dropped by kernel一般是表示内核socket不够大导致的协议层丢包,为0表示没有丢。
dropped by interface是指网卡驱动或者物理层触发的数据丢失,这部分出现丢包就需要检查网卡驱动或者网卡的物理层(硬件)来确定哪里存在问题。
最后,我们的终端产品是确定硬件的某个元器件导致的问题。和对比终端交互了元器件就不会丢包。