在网络中ping是一个十分强大的TCP/IP工具。它的作用主要为:
(1)用来检测网络的连通情况和分析网络速度;
(2)根据域名得到服务器IP;
(3)根据ping返回的TTL值来判断对方所使用的操作系统及数据包经过路由器数量。
我们通常会用它来直接ping IP地址,来测试网络的连通情况。
ping 命令是基于 ICMP 协议来工作的,「 ICMP 」全称为 Internet 控制报文协议(Internet Control Message Protocol)。ping 命令会发送一份ICMP回显请求报文给目标主机,并等待目标主机返回ICMP回显应答。因为ICMP协议会要求目标主机在收到消息之后,必须返回ICMP应答消息给源主机,如果源主机在一定时间内收到了目标主机的应答,则表明两台主机之间网络是可达的。
举一个例子来描述「ping」命令的工作过程:
1)假设有两个主机,主机A(192.168.0.1)和主机B(192.168.0.2),现在我们要监测主机A和主机B之间网络是否可达,那么我们在主机A上输入命令:ping 192.168.0.2;
2)此时,ping命令会在主机A上构建一个 ICMP的请求数据包(数据包里的内容后面再详述),然后 ICMP协议会将这个数据包以及目标IP(192.168.0.2)等信息一同交给IP层协议;
3)IP层协议得到这些信息后,将源地址(即本机IP)、目标地址(即目标IP:192.168.0.2)、再加上一些其它的控制信息,构建成一个IP数据包;
4)IP数据包构建完成后,还不够,还需要加上MAC地址,因此,还需要通过ARP映射表找出目标IP所对应的MAC地址。当拿到了目标主机的MAC地址和本机MAC后,一并交给数据链路层,组装成一个数据帧,依据以太网的介质访问规则,将它们传送出出去;
5)当主机B收到这个数据帧之后,会首先检查它的目标MAC地址是不是本机,如果是就接收下来处理,接收之后会检查这个数据帧,将数据帧中的IP数据包取出来,交给本机的IP层协议,然后IP层协议检查完之后,再将ICMP数据包取出来交给ICMP协议处理,当这一步也处理完成之后,就会构建一个ICMP应答数据包,回发给主机A;
6)在一定的时间内,如果主机A收到了应答包,则说明它与主机B之间网络可达,如果没有收到,则说明网络不可达。除了监测是否可达以外,还可以利用应答时间和发起时间之间的差值,计算出数据包的延迟耗时。
ping的一个最常见的应用就是用来计算网络游戏中的实时延迟。游戏玩家可以通过查看自己的ping值来判断实时网络情况。
那我们如何计算客户端与服务器之间的时间延迟呢?这里有一个比较简单的方法,那就是通过发数据包测量。
首先,我们先来梳理下数据包发送的整个流程:
1)客户端A先记录自己的本地时间TA1,然后给服务器发B发送一个报文。
2)服务器B收到报文之后,记录自己的本地时间TB,然后把TB放入报文里发送给客户端A。
3)客户端A收到信息之后,记录下收到报文的时间TA2.
由于报文往返的时间是相等的,所以客户端发送给服务器的时间延迟P = (TA2 - TA1)/ 2
一般,P只计算一次是不够精确的。我们可以让客户端A定时的给服务器B发送测量信息,然后计算P的平均值。
这个平均值就是我们想要获取的时间延迟了。
另外如果我们想要知道客户端和服务器的本地时间差,可以怎么获取呢?
这个也是可以通过公式计算出来的
我们可以先假设A和B的本地时钟是一样的(当然这个假设明显不成立),那么
TB = TA1 + P ,把上面的P套入公式,整理后可以得TB = (TA1 + TB2) / 2
可是实际上A和B之间是有时间差X的,于是 TB + X = (TA1 + TB2)/ 2
整理后可得X = (TA1 + TB2)/ 2 - TB
原文地址:https://www.cnblogs.com/csuflower/p/11951822.html