我的编程空间,编程开发者的网络收藏夹
学习永远不晚

在Android应用中集成使用traceroute工具

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

在Android应用中集成使用traceroute工具

背景知识

traceroute是一个常用于Linux系统的网络工具,它可显示数据包在IP网络中所经过路由的IP地址,理想状态下可探测本机和目标地址之间的所有路由节点。

其他操作系统中也有类似的替代品,实现都大同小异。一般用法如下:

终端输入:~ traceroute -I baidu.com输出:traceroute to baidu.com (39.156.66.10), 30 hops max, 60 byte packets 1  9.102.191.130 (9.102.191.130)  0.638 ms  0.797 ms * 2  * 9.102.250.222 (9.102.250.222)  0.745 ms  0.943 ms 3  * * * 4  10.200.46.253 (10.200.46.253)  1.332 ms  1.333 ms  1.332 ms 5  * * * 6  39.156.0.85 (39.156.0.85)  4.384 ms  4.184 ms  3.936 ms 7  111.13.188.38 (111.13.188.38)  8.991 ms  9.029 ms  9.065 ms 8  39.156.27.1 (39.156.27.1)  4.281 ms  4.366 ms  4.377 ms 9  39.156.67.1 (39.156.67.1)  3.550 ms  3.561 ms  3.568 ms10  * * *11  * * *12  * * *13  * * *14  39.156.66.10 (39.156.66.10)  3.973 ms  3.957 ms  4.015 ms

上面例子一共有14行输出结果,我们可称之为14跳,说明数据包途径了14个节点就到达了目标机器。每一跳会发送3个数据包,所以有3个对应的时间。

具体的实现原理可以直接参考Wikipedia,主要是通过不断改变TTL值来发包实现的:

程序是利用增加存活时间(TTL)值来实现其功能的。每当数据包经过一个路由器,其存活时间就会减1。当其存活时间是0时,主机便取消数据包,并发送一个ICMP TTL数据包给原数据包的发出者。
程序发出的首3个数据包TTL值是1,之后3个是2,如此类推,它便得到一连串数据包路径。注意IP不保证每个数据包走的路径都一样。

集成到Android应用

Linux实现版本的源码在此:Traceroute for Linux,可以看到居然2023年还有一次更新。既然是Linux上的程序,有没有办法在Android上运行呢?或者直接集成到App的模块中?

因为Android系统本身没有预装traceroute命令工具(就算是在Linux上,大多发行版也是需要自己额外安装的),所以不能直接通过执行命令的方式来调用。通过NDK编译traceroute源码到App中才是比较靠谱的办法。

总的来说还是比较简单的,集成上述的Linux版本源码并添加相应的mk文件,就可以编译成库了。其实已经有开源网友实现了,GitHub上也有不少例子,这个traceroute-for-android较为完美,其中的library模块可以直接参考使用,甚至可以替换其中的traceroute源码为2023年最新版,也是没有问题的。

一些问题

为什么同一跳会出现不同的IP地址

在这里插入图片描述

在如图这个例子中,第4跳出现了一个不同的IP,很多人会比较疑惑。这是因为网络环境是不断变化的,发包过程中会选择更好的路由,可以参考这个链接中的解释:

Line 8 shows that some probes take different paths at the same step: the first and third probes go through 96.112.146.26, while the second probe goes through 96.112.146.22. This is because network conditions are constantly changing, which affects the routing tables. Here, the router 96.112.146.22 was a better choice for a brief period of time, so the previous one chose it in the second probe.

为什么要用“-I”参数

实际使用中我们会发现,很多主流的域名都无法成功trace到最终目标,最后几跳往往以星号结束,表示节点机器没有回应。这是为什么呢?

因为traceroute工具默认是发送UDP包来探测的,在当今这个复杂的互联网环境下,很多服务器都会因为安全机制拦截过滤掉UDP包,发送方得不到任何返回信息。所以在文章开头,你可以注意到我使用了“-I”参数,而不是默认无参。

Traceroute for Linux源码文档中可以得知,此工具有多种发包方式,除了默认的UDP外,还可以用TCP、ICMP发包,后两者分别对应“-T”和“-I”参数,效果会比UDP好很多。

那么为什么我不使用更不容易被过滤的TCP发包呢?因为在非ROOT权限下,执行“-T”参数会有如下报错:

You do not have enough privileges to use this traceroute method.
socket: Operation not permitted

加sudo执行才不会报错。因为traceroute在使用TCP模式发包时会创建原始套接字,参考其源码:

static int tcp_init (const sockaddr_any *dest,    unsigned int port_seq, size_t *packet_len_p) {  ...raw_sk = socket (af, SOCK_RAW, IPPROTO_TCP);if (raw_sk < 0)error_or_perm ("socket");  ...}

参考自从学会原始套接字之后,我感觉掌握了整个世界,原始套接字必须有ROOT权限才能使用:

因为网络级IP数据包没有”端口“的概念,所以可以读取网络设备传入的所有数据包,这意味着什么?意味着安全性,使用了原始套接字的应用程序可以读取所有进入系统的网络数据包,也就是我们可以捕获其他应用程序的数据包,所以为了防止这种情况的发生,Linux要求所有访问原始套接字的程序都必须以root身份运行。

我们把traceroute编译到Android的App中,运行环境就在应用层,默认是没有ROOT权限的,所以“-T”参数自然也就用不了。

低版本Android系统连“-I”也用不了

经过一些兼容性测试(覆盖了6.0及以上的所有大版本),我发现在Android 9.0及以下的系统中即便是“-I”参数也会执行失败,错误信息包含“socket bind”之类的,也就是说不同Android版本的socket函数库可能实现不同,才导致了低版本连ICMP发包都不行。

解决办法有两种:

  1. 判断Android系统版本,在9.0及以下使用默认无参的traceroute,降级到UDP发包;10.0及以后使用“-I”参数。
  2. 通过ping命令工具来模拟traceroute,因为ping工具是Android系统默认就预装了的,可以直接在Java层通过调用命令的方式执行,其次ping本身也有参数项来设置TTL值,且默认就用ICMP发包。为此我也做了一个简单的实现,可参考:TraceRouteByPing

来源地址:https://blog.csdn.net/ysy950803/article/details/130510672

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

在Android应用中集成使用traceroute工具

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

在Android应用中集成使用traceroute工具

背景知识 traceroute是一个常用于Linux系统的网络工具,它可显示数据包在IP网络中所经过路由的IP地址,理想状态下可探测本机和目标地址之间的所有路由节点。 其他操作系统中也有类似的替代品,实现都大同小异。一般用法如下: 终端输入
2023-08-23

如何使用持续集成工具TeamCity 7

本篇文章给大家分享的是有关如何使用持续集成工具TeamCity 7,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。TeamCity是一款功能强大的持续集成(Continue In
2023-06-17

Android中如何使用日志工具

这篇文章将为大家详细讲解有关Android中如何使用日志工具,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。使用Android的日志工具Log方法:  Android中的日志工具类为Log,这
2023-05-30

Android中MediaPlayer工具类怎么使用

在Android中,MediaPlayer是一个用于播放音频和视频的工具类。下面是一些使用MediaPlayer的基本步骤:创建一个MediaPlayer对象:使用MediaPlayer mediaPlayer = new MediaPla
2023-10-21

Android应用中如何集成地图服务

要在Android应用中集成地图服务,可以使用Google Maps API或者其他地图服务提供商的API。以下是集成地图服务的一般步骤:获取API密钥:首先,注册一个开发者账号并获取地图服务提供商的API密钥。对于Google Maps
Android应用中如何集成地图服务
2024-04-03

SpringBoot下集成缓存工具类CacheManager怎么使用

这篇文章主要介绍了SpringBoot下集成缓存工具类CacheManager怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot下集成缓存工具类CacheManager怎么使用文章都会有
2023-07-05

Android串口使用3之使用CMake工具完成android-serialport-api库的移植

君问归期未有期,巴山夜雨涨秋池。 对于Android串口的使用,基本已经被写烂了,网上一搜一大堆教程,还有很多大佬也已经封装成库了,可以在项目中直接添加依赖进行使用。用别人造的轮子不好吗?非要自己动手再造轮子?这是在弄啥嘞? emm。。。。
2022-06-06

怎么在Android应用添加一个下载工具

这篇文章给大家介绍怎么在Android应用添加一个下载工具,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首先如果服务器文件支持断点续传,则我们需要实现的主要功能点如下:多线程、断点续传下载下载管理:开始、暂停、继续、取
2023-05-31

LayoutInflater怎么在Android 应用中使用

今天就跟大家聊聊有关LayoutInflater怎么在Android 应用中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。LayoutInflater解析前言:在Android中
2023-05-31

layoutAnimation如何在Android应用中使用

今天就跟大家聊聊有关 layoutAnimation如何在Android应用中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先新建一个anim文件夹在里面新建两个xml
2023-05-31

ViewDragHelper如何在Android 应用中使用

ViewDragHelper如何在Android 应用中使用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、概述在自定义ViewGroup中,很多效果都包含用
2023-05-31

Banner如何在Android应用中使用

这期内容当中小编将会给大家带来有关Banner如何在Android应用中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先倒入一个依赖: compile com.youth.banner:banner
2023-05-31

Notification如何在Android应用中使用

Notification如何在Android应用中使用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Android Notification使用详解Notif
2023-05-31

ImageView如何在Android应用中使用

这期内容当中小编将会给大家带来有关ImageView如何在Android应用中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。MatrixImageView类改改代码了:public class Mat
2023-05-31

WebView如何在Android应用中使用

这期内容当中小编将会给大家带来有关WebView如何在Android应用中使用 ,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。WebView基本使用 WebView是View的一个子类,可以让你在acti
2023-05-31

Popupwindow怎么在Android应用中使用

这期内容当中小编将会给大家带来有关Popupwindow怎么在Android应用中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。第一步:private PopupWindow mPopupWindow
2023-05-31

Messenger如何在Android应用中使用

今天就跟大家聊聊有关Messenger如何在Android应用中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Messenger其实就是Binder通信的包装器,是一种基于消息传
2023-05-31

RecyclerView如何在Android应用中使用

本篇文章给大家分享的是有关RecyclerView如何在Android应用中使用 ,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。什么是RecyclerView关于Recycle
2023-05-31

Java static 在工具类中的应用技巧有哪些?(java static在工具类中的应用技巧)

在Java编程中,工具类是一种非常常用的设计模式,它通常包含一些静态方法,用于执行各种通用的操作。而static关键字在工具类中起着至关重要的作用,它允许我们直接通过类名访问这些静态方法,而无需创建类的实例。本文将详细介绍Javastatic在工具类中的应用技巧。
Java static 在工具类中的应用技巧有哪些?(java static在工具类中的应用技巧)
Java2024-12-19

企业在2023年应该使用的35种生成式人工智能工具

本文将从视觉、音频、文本生成器和代码生成器的形式来了解35个生成式人工智能工具,它们将彻底改变人工智能行业,并帮助企业和个人用户将这一辅助技术提升到更高的水平。

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录