广告
返回顶部
首页 > 资讯 > 精选 >在Android应用中集成使用traceroute工具
  • 815
分享到

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

androidlinux网络协议traceroute 2023-08-23 14:08:22 815人浏览 八月长安
摘要

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

背景知识

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

--结束END--

本文标题: 在Android应用中集成使用traceroute工具

本文链接: https://www.lsjlt.com/news/378680.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 在Android应用中集成使用traceroute工具
    背景知识 traceroute是一个常用于Linux系统的网络工具,它可显示数据包在IP网络中所经过路由的IP地址,理想状态下可探测本机和目标地址之间的所有路由节点。 其他操作系统中也有类似的替代品,实现都大同小异。一般用法如下: 终端输入...
    99+
    2023-08-23
    android linux 网络协议 traceroute
  • 如何使用持续集成工具TeamCity 7
    本篇文章给大家分享的是有关如何使用持续集成工具TeamCity 7,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。TeamCity是一款功能强大的持续集成(Continue In...
    99+
    2023-06-17
  • SpringBoot下集成缓存工具类CacheManager怎么使用
    这篇文章主要介绍了SpringBoot下集成缓存工具类CacheManager怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot下集成缓存工具类CacheManager怎么使用文章都会有...
    99+
    2023-07-05
  • 怎么在Android应用添加一个下载工具
    这篇文章给大家介绍怎么在Android应用添加一个下载工具,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首先如果服务器文件支持断点续传,则我们需要实现的主要功能点如下:多线程、断点续传下载下载管理:开始、暂停、继续、取...
    99+
    2023-05-31
    android roi
  • Android中MediaPlayer工具类怎么使用
    在Android中,MediaPlayer是一个用于播放音频和视频的工具类。下面是一些使用MediaPlayer的基本步骤: 创...
    99+
    2023-10-21
    Android MediaPlayer
  • Android中如何使用日志工具
    这篇文章将为大家详细讲解有关Android中如何使用日志工具,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。使用Android的日志工具Log方法:  Android中的日志工具类为Log,这...
    99+
    2023-05-30
    android
  • Android串口使用3之使用CMake工具完成android-serialport-api库的移植
    君问归期未有期,巴山夜雨涨秋池。 对于Android串口的使用,基本已经被写烂了,网上一搜一大堆教程,还有很多大佬也已经封装成库了,可以在项目中...
    99+
    2022-06-06
    android串口 serialport cmake api Android
  • Android OTA 相关工具(六) 使用 lpmake 打包生成 super.img
    我在 《Android 动态分区详解(二) 核心模块和相关工具介绍》 介绍过 lpmake 工具,这款工具用于将多个分区镜像打包生成一个 Android 专用的动态分区镜像,一般称为 super.im...
    99+
    2023-10-06
    Android A/B 系统 动态分区 OTA 工具 lpmake Android
  • Kotlin在Android工程中的应用详解
    Kotlin在Android工程中的应用原文链接简介Kotlin是由JetBrains设计的开放源码的编程语言,它正在Java开发者中变得越来越流行。Kotlin通常被吹捧为Java的继承者,相比较Java而言,Kotlin提供更为丰富的开...
    99+
    2023-05-31
    kotlin android roi
  • CSS中如何使用Sprites样式生成工具
    CSS中如何使用Sprites样式生成工具,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。CSS Sprites样式生成工具(图片定位坐标)首先...
    99+
    2022-10-19
  • 如何在 PHP 应用中集成二维码生成 API?
    随着移动互联网的发展,二维码已经成为我们生活中不可或缺的一部分。二维码具有快速、简单、便捷的特点,为我们的生活带来了极大的便利。在开发应用时,为了更好地体验和增加用户体验,我们需要将二维码集成到我们的应用中。 在 PHP 应用中,我们可以...
    99+
    2023-08-27
    二维码 npm api
  • 如何在Java中使用Semaphore工具类
    这篇文章将为大家详细讲解有关如何在Java中使用Semaphore工具类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、Semaphore的理解Semaphore属于java.util.c...
    99+
    2023-06-15
  • 如何在Java中使用Collections工具类
    本篇文章为大家展示了如何在Java中使用Collections工具类,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数...
    99+
    2023-06-14
  • 如何在java中使用 Arrays工具类
    如何在java中使用 Arrays工具类?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Arrays工具类属于java中常用的工具类public static&nb...
    99+
    2023-05-31
    java arrays ava
  • Google.Protobuf工具在C#中的使用方法
    protobuf是一个语言无关、平台无关的序列化协议,由谷歌开源提供。再加上其高性能、存储占用更小等特点,在云原生的应用中越来越广泛。 在C#中主要有两种方法来使用protobuf协...
    99+
    2022-11-12
  • 如何在Java中使用EasyExcel工具类
    今天就跟大家聊聊有关如何在Java中使用EasyExcel工具类,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。常用的java框架有哪些1.SpringMVC,Spring Web M...
    99+
    2023-06-14
  • 如何在Springboot中使用RedisUtils工具类
    如何在Springboot中使用RedisUtils工具类?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。SpringBoot整合Redis引入Redis依赖 &l...
    99+
    2023-06-15
  • Apache和NumPy:如何在Java应用程序中使用这两个工具?
    Apache和NumPy都是非常流行的开源工具,分别用于Java和Python的数学计算和数据处理。这两个工具都非常有用,可以帮助开发人员更轻松地完成各种任务。但是,如果您需要在Java应用程序中使用NumPy,您将需要一些额外的工作。在...
    99+
    2023-11-14
    apache numy load
  • Android Studio应用开发集成百度语音合成使用方法实例讲解
    首先,语音合成是指将文本信息转换成声音。意思就是将文本转化为声音,让你的应用开口说话。国内在业内比较有名的第三方语音合成平台有百度语音和科大讯飞。 本文集成的是百度语音合成,其...
    99+
    2022-06-06
    Android Studio 百度语音合成 studio 语音合成 方法 Android
  • Android中使用achartengine生成图表的具体方法
    今天在做项目的时候用到了图表功能,记录下来 achartengine是google的一个开源项目,可以在https://code.google.com/p/achartengi...
    99+
    2022-06-06
    achartengine 方法 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作