上海广告公司薪资,济南网站优化小黑,it网站模板,站长工具seo查询一#xff0c;背景
通常一些偷流量、端口占用、网络负载高、socket创建释放异常等Android网络相关问题#xff0c;可以通过使用tcpdump抓tcp/ip报文#xff0c;来定位。但是tcpdump无进程信息#xff0c;也没有APK包名信息#xff0c;无法确认异常的报文来自哪些Apk或者n…一背景
通常一些偷流量、端口占用、网络负载高、socket创建释放异常等Android网络相关问题可以通过使用tcpdump抓tcp/ip报文来定位。但是tcpdump无进程信息也没有APK包名信息无法确认异常的报文来自哪些Apk或者native进程。本题解决tcpdump报文无法关联到哪个进程/APK的问题。
二tcpdump
tcpdump是该类问题基本的工具。在此仅作简单介绍。
tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.0.1/24 -C 60 -W 15 -w /data/....
tupdump使用参数说明
tcp
ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置用来过滤数据报的类型。如果都看则删掉这个字段。
-i eth1
只抓经过接口eth1的包。可以换成其他网卡比如rmnet0。有些手机产品可能传统数据在rmnet0, IMS数据在rmnet8(举例)。为避免遗漏可以 -i any 表示抓取所有网卡的tcpdump。
-t
不显示时间戳
-s 0
抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包。默认不要这个参数除非是为了导出完整应用层报文。
-c 100
只抓取100个数据包
dst port ! 22
不抓取目标端口是22的数据包
src net 192.168.0.1/24
数据包的源网络地址为192.168.0.1/24
-w /data/netdebug/tcpdump.pcap
保存到指定位置。注意位置的selinux权限注意不要放在/mnt等重启后会丢的位置。
-C 60 -W 15 -C 表示count。 tcpdump将在接受到count个数据包后退出。-W与-C 选项配合使用, 这将限制可打开的文件数目, 并且当文件数据超过这里设置的限制时, 依次循环替代之前的文件, 这相当于一个拥有filecount 个文件的文件缓冲池. 同时, 该选项会使得每个文件名的开头会出现足够多并用来占位的0, 这可以方便这些文件被正确的排序。
其他可以参考
tcpdump详解及抓取安卓数据包使用介绍 - Curtain_dusk - 博客园 (cnblogs.com) 三strace
strace命令可以用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界进程不能直接访问硬件设备当进程需要访问硬件设备(比如读取磁盘文件接收网络数据等等)时必须由用户态模式切换至内核态模式通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数返回值执行消耗的时间。
针对网络问题开机阶段在adb shell中敲如下命令
adb root
adb shell
#mkdir /data/netdebug
#strace -p pidof zygote64 -f -tt -e tracenetwork -o /data/netdebug/strace.txt 由于zygote是所有的java世界APP的父进程参数
-p pidof zygote64 -f
用来跟踪所有zygote孵化出来的应用的系统调用信息。
-tt
用来打印时间戳 -e tracenetwork
用来筛选network相关的打印避免打印太多。
抓到的trace.txt可以通过关键字筛选你需要的LOG如
4895 10:59:30.755422 sendto(71, \32\34 \0056\r2.18.24.01971\v\t\237\17XL\\, 28, 0, {sa_familyAF_INET, sin_porthtons(8003), sin_addrinet_addr(221.181.97.233)}, 16) 28
4895 10:59:33.788692 sendto(71, \32\34 \0056\r2.18.24.01971\v\t\237\17XL\\, 28, 0, {sa_familyAF_INET, sin_porthtons(8003), sin_addrinet_addr(221.181.97.233)}, 16) 28
4895 10:59:34.803777 sendto(71, \32\34 \0056\r2.18.24.01971\v\t\237\17XL\\, 28, 0, {sa_familyAF_INET, sin_porthtons(8003), sin_addrinet_addr(221.181.97.233)}, 16) 28
4905 10:59:34.830972 recvfrom(71, \32\34 \0066\0\v,6\016223.160.207.64B\0\0\357K, 4096, 0, {sa_familyAF_INET, sin_porthtons(8003), sin_addrinet_addr(221.181.97.233)}, [16]) 29
4895 10:59:36.833750 sendto(71, \32\34 \0056\r2.18.24.01971\v\t\237\17XL\\, 28, 0, {sa_familyAF_INET, sin_porthtons(8003), sin_addrinet_addr(221.181.97.233)}, 16) 28
4895 10:59:38.611536 sendto(71, \0\0\1\1\0\0\0\0\0\0\0\0\0\0\n\2t\237\17X\21\351\246,0\1LR\0\\..., 295, 0, {sa_familyAF_INET, sin_porthtons(30013), sin_addrinet_addr(112.53.47.99)}, 16) 295
4905 10:59:38.700206 recvfrom(71, \0\0\1\20\1\0\351\246\0\0\0\0\0\0\0\n\f\21\351\246,0\1L\\b\0\7\367\357|..., 4096, 0, {sa_familyAF_INET, sin_porthtons(30013), sin_addrinet_addr(112.53.47.99)}, [16]) 272
4895 10:59:39.920103 sendto(71, \32\34 \0056\r2.18.24.01971\v\t\237\17XL\\, 28, 0, {sa_familyAF_INET, sin_porthtons(8003), sin_addrinet_addr(221.181.97.233)}, 16) 28
时间戳左边的是进程ID右边表示发送或接收、对方的端口以及对方的ip地址等信息。
更多关于strace的介绍参考下面
Linux strace命令 - ggjucheng - 博客园 (cnblogs.com) 四netstat
strace打印用来定位有两个缺点。一个是如果系统网络吞吐率比较高打印会比较多甚至爆掉。另一个就是看不到应用创建socket在本地的端口。对于有些短时间创建了大量socket却并未能正常联网导致端口被占用的问题定位不方便。strace的缺点可以通过使用netstat命令来弥补
adb root
adb shell
#netstat -tunpla
打印的信息如下
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program Name作为服务端
tcp 0 0 127.0.0.1:60001 0.0.0.0:* LISTEN 3805/com.fiill.app.map
tcp 0 0 193.18.2.101:60001 0.0.0.0:* LISTEN 491/name-server作为client
tcp 0 0 193.18.2.101:60207 193.18.2.100:60034 ESTABLISHED 2793/com.fiill.car.parking
tcp 0 0 193.18.2.101:58211 193.18.2.100:60027 ESTABLISHED 1521/com.android.car 端口、IP、包名、PID、当前进程状态都很清晰。缺点手动netstat才会有。 五trace脚本化
1通过周期性保存netstat打印
针对netstat不是周期性打印的缺陷可以通过新建脚本放到系统中运行解决。不多说直接上代码
netstat_dump.sh
#! /system/bin/sh#
#adb root
#adb shell mkdir -p /data/netdebug
#adb push netstat_dump.sh /data/
#adb shell chmod 777 /data/netstat_dump.sh
#./data/netstat_dump.sh
#global GPATH/data/netdebugprepare_path(){mkdir -p $GPATH
}prepare_pathwhile true
doDUMP_FILE$GPATH/netstat_tunpla_$(date %F-%H-%M-%S)echo ******BEGIN****** $DUMP_FILEdate %F-%H-%M-%S $DUMP_FILEnetstat -tunpla $DUMP_FILEdate %F-%H-%M-%S $DUMP_FILEecho ******END****** $DUMP_FILEsleep 30
done 上述脚本是每30秒执行一次netstat, 并保存在/data/netdebug/目录下以时间戳命令的文件中。 2其他相关命令
如果要确认一些系统配置其他网络相关的命令还有
sysctl -a
busybox arp -a
busybox ip route
busybox ifconfig
加上busybox是考虑可能系统没相关组件某些命令敲了没结果。 3strace创建开机运行脚本
类似地也可以给strace脚本编译到系统中通过init.rc启动实现自动化。
创建一个starce_network.sh脚本编译到/system/bin目录。
#! /system/bin/sh#
#adb root
#adb shell mkdir -p /data/netdebug
#global GPATH/data/netdebugprepare_path(){mkdir -p $GPATH
}prepare_pathstrace -p pidof zygote64 -f -tt -e tracenetwork -o /data/netdebug/strace.txt在init.rc里面声明
service starce_network /system/bin/starce_network.shclass late_startuser rootgroup rootdisabledoneshot 备注
1类似地可以增加更多的脚本比如开机启动tcpdump。不在冗述。
2针对native世界则 strace -p pidof zygote64 -f 覆盖不到。 可以创建多个实例通过如
-p pidof surfaceflinger
穷举的方式来dump。 六其他
1统计tcp连接情况
netstat -an|awk /tcp/ {print $6}|sort|uniq -c
结果 81 ESTABLISHED 14 LISTEN 1 SYN_SENT 2 TIME_WAIT 2查看系统配置
cat /etc/sysctl.conf
如果不符合预期则修改上述文件保存退出并
sysctl -p
使配置生效。主要如果linux没有该文件节点调查内核编译配置
CONFIG_DEBUG_FS
是否打开了。 3部分网络配置说明
#tcp 检查间隔tcp keepalive 探测包的发送默认75 tcp_keepalive_intvl #tcp 检查次数如果对方不予应答探测包的发送次数默认 9 tcp_keepalive_probes
#对于一个新建连接内核要发送多少个 SYN 连接请求才决定放弃,不应该大于255默认值是5对应于180秒左右时间 net.ipv4.tcp_syn_retries2 net.ipv4.tcp_synack_retries2
#表示当keepalive起用的时候TCP发送keepalive消息的频度。缺省是2小时改为300秒 net.ipv4.tcp_keepalive_time1200 net.ipv4.tcp_orphan_retries3
#表示如果套接字由本端要求关闭这个参数决定了它保持在FIN-WAIT-2状态的时间 net.ipv4.tcp_fin_timeout30
#表示SYN队列的长度默认为1024加大队列长度为8192可以容纳更多等待连接的网络连接数。 net.ipv4.tcp_max_syn_backlog 4096
#表示开启SYN Cookies。当出现SYN等待队列溢出时启用cookies来处理可防范少量SYN攻击默认为0表示关闭 net.ipv4.tcp_syncookies 1 #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接默认为0表示关闭 net.ipv4.tcp_tw_reuse 1
#表示开启TCP连接中TIME-WAIT sockets的快速回收默认为0表示关闭 net.ipv4.tcp_tw_recycle 1 ##减少超时前的探测次数 net.ipv4.tcp_keepalive_probes5
#优化网络设备接收队列 net.core.netdev_max_backlog3000
#表示系统同时保持 TIME_WAIT 的最大值如果超过这个值TIME_WAIT 会被立刻清除并打印警告信息。 net.ipv4.tcp_max_tw_buckets2500
#表示用于向外连接的端口范围。默认情况是32768 61000。注意不要将最低值设得太低否则可能会占用正常的端口。 net.ipv4.ip_local_port_range10000 65000 4, android运行在QNX中
如果android运行在QNX中QNX的网络状况也要拿来做参考cat vm/images/linux-la.configarp -anetstat -rroute shownetstat -asnetstat -imsysctl -a
tracelogger -r -s3 -b1024 -k4096 -w -f/xxx.kevslog2info -b io_pkt_v6_hc -b iopkt -W /iopkt_slog.logtcpdump -i vp0 -n -ee -vv -w /qnx.pcap -s 0
#For dumper to create a core file, you must start io-pkt with -S.
pidin | grep io-pktdumper -p pid of io-pkt