当前位置: 首页 > news >正文

偷流量、端口占用、网络负载高、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 -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/netdebug"prepare_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,是考虑可能系统没相关组件,某些命令敲了没结果。

3,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。

六,其他

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_retries=2
net.ipv4.tcp_synack_retries=2

#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为300秒
net.ipv4.tcp_keepalive_time=1200
net.ipv4.tcp_orphan_retries=3

#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
net.ipv4.tcp_fin_timeout=30

#表示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_probes=5

#优化网络设备接收队列
net.core.netdev_max_backlog=3000

#表示系统同时保持 TIME_WAIT 的最大值,如果超过这个值,TIME_WAIT 会被立刻清除并打印警告信息。
net.ipv4.tcp_max_tw_buckets=2500

#表示用于向外连接的端口范围。默认情况是32768 61000。注意不要将最低值设得太低,否则可能会占用正常的端口。
net.ipv4.ip_local_port_range=10000 65000

4, android运行在QNX中

如果android运行在QNX中,QNX的网络状况也要拿来做参考:
cat vm/images/linux-la.config
arp -a
netstat -r
route show
netstat -as
netstat -im
sysctl -a

tracelogger -r -s3 -b1024 -k4096 -w -f/xxx.kev
slog2info -b io_pkt_v6_hc -b iopkt -W >/iopkt_slog.log
tcpdump -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-pkt
dumper -p <pid of io-pkt>

相关文章:

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

一&#xff0c;背景 通常一些偷流量、端口占用、网络负载高、socket创建释放异常等Android网络相关问题&#xff0c;可以通过使用tcpdump抓tcp/ip报文&#xff0c;来定位。但是tcpdump无进程信息&#xff0c;也没有APK包名信息&#xff0c;无法确认异常的报文来自哪些Apk或者n…...

《人人都能用英语》学习笔记

https://github.com/xiaolai/everyone-can-use-english 核心&#xff1a; 用 What──它究竟是什么&#xff1f;Why──为什么它是那个样子&#xff1f;How──要掌握它、应用它&#xff0c;必须得遵循什么样的步骤&#xff1f; 在运行程序之前&#xff0c;要反复浏览代码&a…...

NFC与ZigBee技术在智慧农业物联网监测系统中的应用

近年来&#xff0c;我国农业物联网技术飞速发展&#xff0c;基于物联网技术的智能农业监测系统有望得到较大规模的推广应用。但传统的物联网农业监测系统其网络结构层次单一&#xff0c;多采用基于有线或无线结构的节点-上位机数据采集模式&#xff0c;节点数据访问模式缺乏灵活…...

k8s-cni网络 10

Flannel vxlan模式跨主机通信原理 在同一个节点上的pod 流量通过cni网桥可以直接进行转发&#xff1b; 在需要跨主机访问时&#xff0c;数据包通过flannel(隧道) 知道另一边的mac地址&#xff0c;就可以拿到另一边的ip地址&#xff0c;然后构建常规的以太网数据包&#xff0c;…...

听GPT 讲Rust源代码--src/tools(27)

File: rust/src/tools/clippy/clippy_lints/src/methods/suspicious_to_owned.rs 文件rust/src/tools/clippy/clippy_lints/src/methods/suspicious_to_owned.rs的作用是实施Clippy lint规则&#xff0c;检测产生潜在性能问题的字符转换代码&#xff0c;并给出相关建议。 在Rus…...

经济危机下,我们普通人如何翻身?2024创业新风口,适合普通人的创业项目

明年的商业环境会比今年更残酷&#xff0c;不是贩卖危机。旅游行业还在刺激性消费&#xff0c;再过几个月大家就没钱了&#xff0c;估计慢慢也消停。中小微企业资金链断裂&#xff0c;大部分公司倒闭&#xff0c;大批人失业&#xff0c;所以经济恢复需要一个周期。 30年河东&am…...

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复

深入浅出图解C#堆与栈 C# Heaping VS Stacking 第五节 引用类型复制问题及用克隆接口ICloneable修复 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节…...

python中基本元素的pop函数

python中基本元素的pop函数 一、列表List二、元组Tuple三、字典dict四、集合set 一、列表List pop() 根据索引删除并返回被删除的元素&#xff0c;索引默认为-1 a [1, 2, 3, 2, 5] b a.pop() # b5&#xff0c;默认返回最后一个值 print(b) b a.pop(2) # b3,返回a[2] pri…...

MPLS动态协议LDP配置示例

一、预习&#xff1a; MPLS是一种根据报文中携带的标签来转发数据的技术&#xff0c;两台LSR必须在它们之间转的数据 的标签使用上“达成共识”。LSR之间可以运行LDP来告知其他LSR本设备上的标签绑定信息&#xff0c;从而实现标签报文的正确转发。 LSR&#xff1a;Label Switch…...

JS调用栈:为何会栈溢出

JS调用栈&#xff1a;为何会栈溢出 JS调用栈什么是函数调用什么是栈在开发中利用调用栈栈溢出 JS调用栈 JavaScript 经常会出现一个函数中调用另外一个函数的情况&#xff0c;调用栈就是用来管理函数调用关系的一种数据结构&#xff0c;首先你要先弄明白函数调用和栈结构 什么…...

代码随想Day52 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

300.最长递增子序列 这道题目的重点在于动态数组的定义 dp[i]&#xff1a;以nums[i]为结尾的最长递增子序列&#xff0c;因为这样定义可以进行递推&#xff1b; 递推&#xff1a;j从0-i进行对比&#xff0c;如果nums[i]大于nums[j]&#xff0c;dp[i]dp[j]1&#xff1b; 初始化…...

使用 pytest 相关特性重构 appium_helloworld

一、前置说明 在 pytest 基础讲解 章节,介绍了 pytest 的特性和基本用法,现在我们可以使用 pytest 的一些机制,来重构 appium_helloworld 。 appium_helloworld 链接: 编写第一个APP自动化脚本 appium_helloworld ,将脚本跑起来 代码目录结构: pytest.ini 设置: [pyt…...

猪目标检测数据集VOC格式600张

猪是一种常见的哺乳动物&#xff0c;通常被人们认为是肉食动物&#xff0c;但实际上猪是杂食性动物&#xff0c;以植物性食物为主&#xff0c;也有偶尔食肉的习性。猪的体型较大&#xff0c;圆胖的体型和圆润的脸庞使其显得憨态可掬。它们主要通过嗅觉来感知周围环境&#xff0…...

Pandas中concat的用法

Pandas中concat的用法 ​ pd.concat 是 pandas 库中的一个函数&#xff0c;用于将多个 pandas 对象&#xff08;如 Series、DataFrame&#xff09;沿指定轴进行合并连接。 pd.concat(objs, axis0, joinouter, ignore_indexFalse, keysNone, levelsNone, namesNone, verify_in…...

【C++】引用详解

前言 在学习C语言时&#xff0c;我们通常会遇到两个数交换的问题&#xff0c;为了实现这一功能&#xff0c;我们会编写一个经典的Swap函数&#xff0c;如下所示&#xff1a; void Swap(int *a, int *b) {int tmp *a;*a *b;*b tmp; } 然而&#xff0c;这个Swap函数看起来可…...

平时的一些思考内容

文章目录 阶乘位运算求概率 阶乘 阶乘是一很迷人的&#xff0c;刚开始的的变化还不是很大&#xff0c;到后面变化类似于直线上升的&#xff0c;不知道现实中哪些实例来表示阶乘。19的阶乘就已经超过了long了&#xff0c;在竞赛或者其他中要求2023或者很大数字的阶乘就需要考虑…...

AIGC时代下,结合ChatGPT谈谈儿童教育

引言 都2024年了&#xff0c;谈到儿童教育&#xff0c;各位有什么新奇的想法嘛 我觉得第一要务&#xff0c;要注重习惯养成&#xff0c;我觉得聊习惯养成这件事情范围有点太大了&#xff0c;我想把习惯归纳于底层逻辑&#xff0c;我们大家都知道&#xff0c;在中国式教育下&a…...

Java中的锁(一)

一、前言 在Java中&#xff0c;锁是用于多线程同步的重要概念。它可以保护共享资源&#xff0c;确保多个线程在访问共享资源时的数据一致性。 共享资源指的是多个线程同时对同一份资源进行访问 (读写操作)&#xff0c;被多个线程访问的资源就称为共享资源。 如何保证多个线程访…...

CSS-SVG-环形进度条

线上代码地址 <div class"circular-progress-bar"><svg><circle class"circle-bg" /><circle class"circle-progress" style"stroke-dasharray: calc(2 * 3.1415 * var(--r) * (var(--percent) / 100)), 1000" …...

英语中修饰头发的形容词顺序是怎么样的(加补充)

一、英语描述发型 :漂亮长短形状颜色头发。 例如她有一头美丽的黑色的直发。She has beautiful long straight black hair.二、多个形容词修饰同一名词时的顺序是固定的&#xff0c;其顺序为&#xff1a;①冠词、指示代词、不定代词、物主代词②序数词基数词③一般性描绘形容词…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...