Ping命令探究

Ping命令探讨

1.     Ping命令的用途:

我们首先让Windows给我们一个启发

Cmd直接输入Ping

系统已经给了我们许多提示,ping命令的主要用途就是测试网络连接

包括:

  1. 测试到特定ip地址的连接

如果ping特定ip地址能够成功,显然说明能够正常通信

但值得注意的是,ping不通不等于不能够访问,典型的是github.com

即使是可以访问的时候也不能ping通

   2.测试到Internet的连接

我们经常使用ping www.baidu.com 测试网络连接状态,一般情况下,ping百度失败=网络异常

   3.测试网络协议是否正常工作

回环地址127.0.0.1代表本机,如果ping 127.0.0.1都不能成功说明网络协议不工作

2.     Ping www.baidu.com与Ping 127.0.0.1

我们使用wireshark拦截数据包先ping www.baidu.com

 

数据包

  

不管是从cmd输出还是从数据包中,均能看出Windows控制台的Ping命令是发送了四次ping请求并等待回应

Ping 127.0.0.1

这个情况稍微特殊

Cmd:

Wireshark

可以看到虽然连通良好但没有捕获报文,这是因为数据没有离开过本机,除非特殊设定否则wireshark捕获不到数据包。

3.     JAVA(Kotlin)与Ping

Java中,处理网络请求的原生类是

java.net.HttpURLConnection

但如果指定请求方式为Ping会抛出异常

httpURLConnection.setRequestMethod("PING");

,这是因为HttpURLConnection类不支持Ping方式

private static final String[] methods = new String[]{"GET", "POST", "HEAD","OPTIONS", "PUT", "DELETE", "TRACE"};

一般通过InetAddress类.isReachable (int timeout)方法来代替ping的作用,以验证可达性

我们研究这个过程是否和ping过程完全一致:

通过两个步骤

  1. Ping www.baidu.com(使用Kotlin实现)
fun main(args:Array<String>){

val address: InetAddress
try {
        address = InetAddress.getByName("www.baidu.com")
        println("Name:" + address.hostName)
        println("Addr:" + address.hostAddress)
        println("Reach:" + address.isReachable(3000))
        println(address.toString())
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

输出:

往返报文

从这个角度看,Java中的.isReachable似乎是通过Ping实现的,但第二次试验说明这两个过程并不完全相同

  2.这一次我们指定Ip地址而不是www.baidu.com

address = InetAddress.getByName("180.101.49.12")

输出

仍然可达,但捕获的报文有所区别:

可以看到多了三个NBNS报文

所以我们得出结论:Java中的InetAddress类的.isReachable方法可以起到和Ping相同的作用,有些时候和Ping相同,但不总和Ping完全的等价。

猜你喜欢

转载自www.cnblogs.com/Miliapus/p/11954116.html