偷流量、端口占用、网络负载高、socket创建释放异常等Android高阶TCP/IP网络问题定位思路

一,背景

通常一些偷流量、端口占用、网络负载高、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 trace=network -o /data/netdebug/strace.txt

 由于zygote是所有的java世界APP的父进程,参数:

-p `pidof zygote64` -f

用来跟踪所有zygote孵化出来的应用的系统调用信息。

-tt 

用来打印时间戳

 -e trace=network

用来筛选network相关的打印,避免打印太多。

抓到的trace.txt,可以通过关键字筛选你需要的LOG,如:

4895  10:59:30.755422 sendto(71, "\32\34 \0056\r2.18.24.01971\v\"t\237\17X<L\\", 28, 0, {sa_family=AF_INET, sin_port=htons(8003), sin_addr=inet_addr("221.181.97.233")}, 16) = 28
4895  10:59:33.788692 sendto(71, "\32\34 \0056\r2.18.24.01971\v\"t\237\17X<L\\", 28, 0, {sa_family=AF_INET, sin_port=htons(8003), sin_addr=inet_addr("221.181.97.233")}, 16) = 28
4895  10:59:34.803777 sendto(71, "\32\34 \0056\r2.18.24.01971\v\"t\237\17X<L\\", 28, 0, {sa_family=AF_INET, sin_port=htons(8003), sin_addr=inet_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_family=AF_INET, sin_port=htons(8003), sin_addr=inet_addr("221.181.97.233")}, [16]) = 29
4895  10:59:36.833750 sendto(71, "\32\34 \0056\r2.18.24.01971\v\"t\237\17X<L\\", 28, 0, {sa_family=AF_INET, sin_port=htons(8003), sin_addr=inet_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_family=AF_INET, sin_port=htons(30013), sin_addr=inet_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_family=AF_INET, sin_port=htons(30013), sin_addr=inet_addr("112.53.47.99")}, [16]) = 272
4895  10:59:39.920103 sendto(71, "\32\34 \0056\r2.18.24.01971\v\"t\237\17X<L\\", 28, 0, {sa_family=AF_INET, sin_port=htons(8003), sin_addr=inet_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 -atpln

打印的信息如下:

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/netdebug"prepare_path(){mkdir -p $GPATH
}prepare_pathwhile true
doDUMP_FILE=$GPATH/netstat_atpln_$(date '+%F-%H-%M-%S')echo "******BEGIN******" >> $DUMP_FILEdate '+%F-%H-%M-%S' >> $DUMP_FILEnetstat -atpln >> $DUMP_FILEdate '+%F-%H-%M-%S' >> $DUMP_FILEecho "******END******" >> $DUMP_FILEsleep 30
done

 上述脚本是每30秒执行一次netstat, 并保存在/data/netdebug/目录下以时间戳命令的文件中。

2,strace创建开机运行脚本

类似地,也可以给strace脚本编译到系统中,通过init.rc启动,实现自动化。

创建一个starce_network.sh脚本,编译到/system/bin目录。

#! /system/bin/sh#
#adb root
#adb shell "mkdir -p /data/netdebug"
#global GPATH="/data/netdebug"prepare_path(){mkdir -p $GPATH
}prepare_pathstrace -p `pidof zygote64` -f -tt -e trace=network -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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/579921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32F4系列单片机库函数模板工程创建

目录 一、工程配置 1、新建工程 2、芯片选择 3、工程子文件夹创建 &#xff08;1&#xff09;FWLIB文件夹添加文件 &#xff08;2&#xff09;CORE文件夹添加文件 &#xff08;3&#xff09;USER文件夹添加文件 4、工程设置 &#xff08;1&#xff09;工程中添加文件夹…

【前端技术】Vite vs Webpack

✨专栏介绍 在当今数字化时代&#xff0c;Web应用程序已经成为了人们生活和工作中不可或缺的一部分。而要构建出令人印象深刻且功能强大的Web应用程序&#xff0c;就需要掌握一系列前端技术。前端技术涵盖了HTML、CSS和JavaScript等核心技术&#xff0c;以及各种框架、库和工具…

Banana Pi BPI-M4 Berry 全志H618开发板快速使用手册

介绍 BPI-M4 Berry 开发板是一款功能强大的单板计算机 (SBC)&#xff0c;利用 Allwinner H618 片上系统 (SoC) 的功能为开发人员提供令人印象深刻的性能和丰富的功能。与 Raspberry Pi 4b 类似&#xff0c;BPI-M4 Berry 拥有可比的 CPU 性能、LPDDR4 内存支持、集成 WiFi 和蓝…

人机验证码生成与验证:提升系统安全性

一、前言 为了防止机器人或脚本程序自动化攻击和滥用系统资源&#xff0c;很多网站和应用程序需要使用验证码来判断用户是否为真人。 一般登录都要求用户手动输入以验证身份的安全措施。验证码是一种通过生成包含随机字符的图像或文本&#xff0c;通常包含了不同大小写字母、数…

内网穿透的应用-Ubuntu安装XRDP远程桌面结合内网穿透实现远程桌面Ubuntu

文章目录 一、 同个局域网内远程桌面Ubuntu二、使用Windows远程桌面连接三、公网环境系统远程桌面Ubuntu1. 注册cpolar账号并安装2. 创建隧道&#xff0c;映射3389端口3. Windows远程桌面Ubuntu 四、 配置固定公网地址远程Ubuntu1. 保留固定TCP地址2. 配置固定的TCP地址3. 使用…

HTML中的6种空格标记

HTML HTML中的6种空格标记 HTML提供了5种空格实体&#xff08;space entity&#xff09;&#xff0c;它们拥有不同的宽度&#xff0c;非断行空格&#xff08;&nbsp ;&#xff09;是常规空格的宽度&#xff0c;可运行于所有主流浏览器。其他几种空格&#xff08;&ensp…

为什么与 MOSFET 栅极并联的 ZENER 二极管可能会引发振荡,要将其连接到栅极串阻的外侧???

在MOSFET驱动电路中,并联在栅极上的齐纳二极管(Zener diode)通常用来限制栅极电压,防止过压损坏MOSFET。然而,如果齐纳二极管直接并联在栅极上,而没有串联一个电阻,这可能会导致电路中产生振荡。对电路主要影响有以下几点: 寄生电容和电感:MOSFET的栅极具有寄…

工业4.0、 工业互联网、智能制造与设备通信协议 Modbus OPC MQTT

工业4.0是指第四次工业革命的核心概念&#xff0c;它代表了制造业的一种转型趋势&#xff0c;即通过深度整合数字化、互联和智能化技术&#xff0c;实现生产方式的革新。以下是对工业4.0主要特点的概述&#xff1a; 数字化&#xff1a;将物理世界与虚拟世界紧密连接&#xff0c…

ros2+gazebo+urdf:ros2机器人使用gazebo的urdf文件中的<gazebo>部分官网资料

原文链接SDFormat extensions to URDF (the gazebo tag) — Documentation 注意了ros2的gazebo部分已经跟ros1的gazebo部分不一样了&#xff1a; Toggle navigation SpecificationAPIDocumentationDownload Back Edit Version: 1.6 Table of C…

多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测

多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测 目录 多维时序 | Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 Matlab实现PSO-GCNN粒子群优化分组卷积神经网络多…

DFS算法查找所有路径详解

DFS算法查找所有路径详解 算法介绍 深度优先搜索&#xff08;Depth-First Search&#xff0c;DFS&#xff09;是一种图遍历算法&#xff0c;它从起始节点开始&#xff0c;沿着一条路径尽可能深入&#xff0c;直到达到最深的节点&#xff0c;然后回溯到前一节点&#xff0c;继…

Qt/C++音视频开发61-多屏渲染/一个解码渲染到多个窗口/画面实时同步

一、前言 多屏渲染就是一个解码线程对应多个渲染界面&#xff0c;通过addrender这种方式添加多个绘制窗体&#xff0c;我们经常可以在展会或者卖电视机的地方可以看到很多电视播放的同一个画面&#xff0c;原理应该类似&#xff0c;一个地方负责打开解码播放&#xff0c;将画面…

谷歌 SGE 和生成式 AI 在搜索中:2024 年会发生什么

2024 年&#xff0c;Google 的搜索生成体验将如何影响营销&#xff1f;探索 AI 驱动的搜索趋势、SERP 中的 SGE、自然流量影响等。 最初&#xff0c;Labs 中的 Google 搜索生成体验 &#xff08;SGE&#xff09; 实验预计将于 2023 年 12 月“结束”。但随着谷歌实验室网站的最…

nodejs+vue+微信小程序+python+PHP的勤工俭学系统-计算机毕业设计推荐

微信小程序端 &#xff08;1&#xff09;首页。顶部展示公告&#xff0c;下方展示兼职信息详情&#xff0c;按时间倒序&#xff0c;求职者可以根据兼职内容信息和行业进行模糊筛选用人单位的招聘信息&#xff0c;点击某条信息可查看其信息内容和用人单位的信息&#xff08;包括…

vue3中安装并使用CSS预处理器Sass的方法介绍

Sass&#xff08;Syntactically Awesome Style Sheets&#xff09;是一种CSS预处理器&#xff0c;它扩展了CSS的功能&#xff0c;提供了更高级的语法和特性&#xff0c;例如变量、嵌套、混合、继承和颜色功能等&#xff0c;这些特性可以帮助开发者更高效地管理和维护样式表。Sa…

用C语言找最大值最小值极值问题---------(C每日一编程)

一&#xff0c;输入十个数&#xff0c;输出其中的最大值 采用打擂台的方法 void main() {int i, max, a[10];for (i 0; i < 10; i)scanf("%d", &a[i]);max a[0];for (i 1; i < 10; i)if (a[i] > max)max a[i];printf("%d\n", max); } 二…

蓝牙物联网在汽车领域的应用

I、蓝牙的技术特点 ​ 1998 年 5 月&#xff0c;瑞典爱立信、芬兰诺基亚、日本东芝、美国IBM 和英特尔公司五家著名厂商&#xff0c;在联合拓展短离线通信技术的标准化活动时提出了蓝牙技术的概念。蓝牙工作在无需许可的 2.4GHz 工业频段 (SIM)之上(我国的频段范围为2400.0~248…

Text-to-SQL小白入门(十)RLHF在Text2SQL领域的探索实践

本文内容主要基于以下开源项目探索实践&#xff0c; Awesome-Text2SQL:GitHub - eosphoros-ai/Awesome-Text2SQL: Curated tutorials and resources for Large Language Models, Text2SQL, Text2DSL、Text2API、Text2Vis and more.DB-GPT-Hub&#xff1a;GitHub - eosphoros-ai…

关于“Python”的核心知识点整理大全41

目录 scoreboard.py game_functions.py game_functions.py 14.3.8 显示等级 game_stats.py scoreboard.py scoreboard.py scoreboard.py game_functions.py game_functions.py alien_invasion.py 14.3.9 显示余下的飞船数 ship.py scoreboard.py 我们将最高得分圆整…

PyTorch深度学习实战(28)——对抗攻击(Adversarial Attack)

PyTorch深度学习实战&#xff08;28&#xff09;——对抗攻击 0. 前言1. 对抗攻击2. 对抗攻击模型分析3. 使用 PyTorch 实现对抗攻击小结系列链接 0. 前言 近年来&#xff0c;深度学习在图像分类、目标检测、图像分割等诸多领域取得了突破性进展&#xff0c;深度学习模型已经能…