Ping命令应用探究

在网络中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

时间: 2024-10-10 20:47:30

Ping命令应用探究的相关文章

docker run常用命令及 解决 ubuntu镜像无法识别 ifconfig ping 命令

docker run -it     docker 前端启动 container容器           -d             后端启动 container容器           -p             固定端口映射            -P             不固定端口映射           --name         给生成的容器起名字docker ps:默认显示正在运行的container       ps -a 显示所有的container容器docker r

Docker的ubuntu镜像安装的容器无ifconfig和ping命令的解决

Docker的Ubuntu镜像安装的容器无ifconfig命令和ping命令 解决: apt-get update apt install net-tools       # ifconfig apt install iputils-ping     # ping

[小菜随笔]python tkinter实现简单的ping命令

本文主要是介绍python图形界面上的按键与实际功能的对接,其实编程掌握了基础之后的学习应该都是靠自己去挖掘其他的 在网上发现多半教程都是2的,故本文使用的是python3.5,其实也没什么区别,就有一些支持库改变而已 首先我们使用python去编写一个简单的窗口程序,带一个按键,如下图 from tkinter import * #导入tk包 import os #导入os包,方便执行cmd命令,网上还有其他方法执行 test = Tk() #创建一个窗口程序 test.title('ping

Swift和C混合Socket编程实现简单的ping命令

这个是用Mac下的Network Utility工具实现ping命令,用Wireshark抓取的ICMP数据包: 发送ICMP数据包内容 接受ICMP数据包内容 一.icmp结构 要真正了解ping命令实现原理,就要了解ping命令所使用到的TCP/IP协议.ICMP(Internet Control Message,网际控制报文协议)是为网关和目标主机而提供的一种差错控制机制,使它们在遇到差错时能把错误报告给报文源发方.ICMP协议是IP层的 一个协议,但是由于差错报告在发送给报文源发方时可能

ping命令扫描局域网内的主机

linux: 禁ping vim /proc/sys/net/ipv4/icmp_echo_ignore_all 0 代表允许 1代表禁止 ping.sh #!/bin/bash for i in {2..5}; do   host=122.152.172.$i  ping -c2  $host  >/dev/null  if [ $? = 0 ]  then      echo "122.152.172.$i is connected"  else  echo "12

每天一个linux命令(54):ping命令

Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”.不能打开网页时会说“你先ping网关地址192.168.1.1试试”.它通过发送ICMP ECHO_REQUEST数据包到网络主机(send ICMP ECHO_REQUEST to network hosts),并显示响应情况,这样我们就可以根据它输出的信息来确定目标主机是否可访问(但这不是绝对的).有些服务器为了防止通过ping探测到,通过防火墙设置了禁止ping

C#中的Ping命令

1.Ping命令基础知识 在网络中Ping 命令是一个十分好用的TCP/IP工具,它主要的功能是用来检测网络的连通情况和分析网络速度.我们可以用ping来给网络上指定IP的计算机发送一个数据包,而对方就要返回一个同样大小的数据包,根据返回的数据包就可以判定对方机器的存在. 在命令提示符中输入Ping /?,可以看到ping的所有参数: ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r count] [-s count

Linux和Windows下ping命令详解

转:http://linux.chinaitlab.com/command/829332.html 一.Linux下的ping参数 用途 发送一个回送信号请求给网络主机. 语法 ping [ -d] [ -D ] [ -n ] [ -q ] [ -r] [ -v] [ \ -R ] [ -a addr_family ] [ -c Count ] [ -w timeout ] [ -f | -i \ Wait ] [ -l Preload ] [ -p Pattern ] [ -s PacketS

ssh命令、ping命令、traceroute 命令所使用的协议

在Node reboot or eviction: How to check if yourprivate interconnect CRS can transmit network heartbeats (文档 ID 1445075.1)中有这么一句话: The script in here performs the network connectivity check usingssh. This check complements ping or traceroute since ssh