Ping命令探讨
1. Ping命令的用途:
我们首先让Windows给我们一个启发
Cmd直接输入Ping
系统已经给了我们许多提示,ping命令的主要用途就是测试网络连接
包括:
- 测试到特定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捕获不到数据包。
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过程完全一致:
通过两个步骤
- Ping www.baidu.com(使用Kotlin实现)
fun main(args:Array){ 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完全的等价。