安卓日常开发工作中,总会遇上些网络问题需要排查清楚。比如我遇上了,线上app网络状态是良好的,但是上传日志失败、接口404但公司网络能请求成功200、直播推流失败、耗流量大、MQTT连接异常…
了解网络通信的基础设备和其对应的OSI层次
网络的基本架构
需要注意:关注数据走向,必须先检测网络物理链路,设备的网卡,网线(检查水晶头、网线的连接、网线的质量),设备连接的交换机和路由器
网络命令有很多,这里只是提及Android7.12下的常用命令,如跟踪路由命令window的tracert和mac的traceroute,arp等命令不细说
ping 命令,太常见了!top1
ping 网关地址或局域网已知IP,是否有响应判断设备是否联通,否可以使用arp命令
ping 公网IP 如114.114.114.114,能通,能基本说明网络是没有问题的(考虑防火墙)
ifconfig命令用于显示或设置网络设备。windows的是ipconfig
arp 命令 是Address Resolution Protocol,地址解析协议,是通过解析网络层地址来找寻数据链路层地址的一个网络协议包中极其重要的网络传输协议。
busybox arp -a //android 需要安装busybox或使用termux,windows,mac,linux都自带
nslookup 查询DNS的记录,查看域名解析是否正常. 如果ping网站地址不通的话,就需要进行dns检查。
#安卓上没有
nslookup baidu.com 或nslookup交互方式
nslookup baidu.com 114.114.114.114 指定DNS服务器
关于DNS记录的type,A 地址记录(直接查询默认类型IPV4),AAAA 地址记录(IPV6),CNAME等
dig 也是查询DNS的流行神器
#安卓需要使用termux
dig @8.8.8.8 baidu.com
netstat命令用于显示各种网络相关信息
netstat
Display networking information.
-r Display routing table.
-a Display all sockets (Default: Connected).
-l Display listening server sockets.
-t Display TCP sockets.
-u Display UDP sockets.
-w Display Raw sockets.
-x Display Unix sockets.
-e Display other/more information.
-n Don't resolve names.
-W Wide Display.
-p Display PID/Program name for sockets.
iftop — 网络带宽监控
iftop
Display
Rx Tx
name MTU bytes packets errs drpd bytes packets errs drpd
lo 65536 131644 249 0 0 131644 249 0 0
eth0 1500 8016 107 0 0 124234 136 0 0
Android7.12系统, app 通过推流sdk发起直播,观看识别==推流失败,回捞日志sdk确实是推流时链接失败。
由于sdk只能提示链接失败,需要进一步排查
先排查设备的网络是否联通公网,是否能ping通推流地址,这里使用的是阿里云rtmp,默认端口1935,windows telnet
命令.或者在线网站检测端口是否开放。防火墙没问题!进行下一步
同一网络下直播推流工具对比:
安卓:sdk推流失败
安卓:FFmpeg推流失败,有具体的错误信息:RTMP handshake response 失败
PC:FFmpeg 推流直播成功;
PC:sdk 推流直播成功;
工具问题不大,同一网络下直播推流运营商对比:
安卓:sdk&FFmpeg推流阿里云失败
安卓:sdk&FFmpeg推流腾讯云成功
PC:sdk&FFmpeg推流阿里云成功;
PC:sdk&FFmpeg推流腾讯云成功
结论:TMD太奇怪了,让平台同事配置腾讯云的流地址来用
由于公司服务器禁止ping, 所以排查方式,先直接喊用户打开浏览器,输入域名官网web地址,结果也是404 , 排查了DNS设置无问题。找运维看,结果说服务器已经返回200,TMD。
由于没电脑,app运行智能终端上,那定位一下问题所在,解决问题吧。前面确定了设备的DNS,8.8.8.8,常用DNS服务器,访问其它网站是欧凯的。这里我猜测是DNS解析出了问题。我通过 IP/IPv6查询,服务器地址查询 得到IP地址,通过IP地址打开网站,发现是欧凯的,那就是域名DNS问题交给运维去解决。在解决问题的过程中我去了解JAVA、安卓的DNS底层实现。这里不具体展开,查看我的另一博文记录。Android DNS解析过程
要用抓包工具来分析,Wireshark工具,charles 工具,安卓上的抓包精灵,VNET 等工具。
结果分析, 平台业务数据有缺陷,img地址的文件是视频文件,导致图片框架加载失败,不断重试。
Wireshark工具,抓包发现, 握手(CONNACK) ,服务器并没有返回CONNACK消息作为响应,导致超时断连。
ipv6test
test-ipv6
一文看懂网络七层协议/OSI七层模型
cloudflare&DNS
diggui
windows & linux dig download
ping & net
MQTT心跳
mqtt