Linux下如何利用ping获取时间戳 (linux ping获取时间戳)
Ping是我们常用的网络工具之一。常常用于测试网络是否通畅、服务器是否在线等等。但你知道吗,ping不仅可以测试网络通讯,还可以用来获取时间戳。
在Linux下,我们可以使用ping来获取目标主机所在时区的当前时间,以及ICMP报文的时间戳信息。这些时间戳信息包括:发包时间、收包时间、往返时间等。
下面着重介绍一下ping获取时间戳的方法。
1. 发送ICMP时间戳请求
在Linux下,我们可以使用ping命令的-t选项来发出时间戳请求。该选项将在ICMP包的数据部分中添加时间戳信息,并将此数据发送到目标主机。当目标主机收到发送的数据包后,会将时间戳信息回传到本机。
下面是使用-t选项进行时间戳请求的ping命令:
“`shell
$ ping -t
“`
该命令将会向目标主机发送时间戳请求,并一直进行ping操作直到手动中断。
2. 解析反馈的时间戳信息
当我们发送了时间戳请求之后,目标主机会返回ICMP包,其中包含有时间戳信息。我们需要对这些信息进行解析,才能得出目标主机的时间以及ICMP报文中的时间戳信息。
下面是一个ping的例子:
“`shell
$ ping -t 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.274 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.272 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.271 ms
64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=0.244 ms
^C
— 10.0.0.2 ping statistics —
4 packets tranitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 0.244/0.265/0.274/0.029 ms
“`
其中,“time”字段表示本机到目标主机的往返时间,即网络延迟。我们需要注意的是,“time”字段的单位为毫秒。
此外,我们还可以使用ping命令的选项进行更完整的时间戳信息显示:
“`shell
$ ping -t -D
“`
此时ping命令将在ICMP包中插入时间戳信息,然后在每次收到反馈时将此信息解析出来并显示,包括发包时间、对应数据包的ID、收包时间、往返时间等详细信息。
3. 利用时间戳信息计算目标主机的时间
一旦我们从ICMP报文中获取到了目标主机的时间戳信息,就可以开始计算出目标主机的时间了。具体方法是:
– 我们需要获取本机的时间戳(通常用1970-01-01 00:00:00 UTC至现在的秒数表示)。
– 然后,我们从ping所获取到的发包时间和收包时间中分别减去本机的时间戳,得到以秒为单位的时间差。
– 将得到的时间差加上服务器的时区偏移量,即可得到目标服务器的时间。
下面是一个简单的bash脚本,可以实现从ping反馈中获取时间戳并计算目标服务器的时间:
“`bash
#!/bin/bash
if [ $# -eq 0 ]; then
echo “Usage: $(basename $0) “
exit 1
fi
ping -t -D $1 |
while read -r line
do
# 匹配所有格式为:time= 的行
if [[ $line =~ time=([0-9\.]+) ]]; then
# 获取时间戳
now=$(date ‘+%s’)
# 计算时间差
offset=$(echo “${BASH_REMATCH[1]} * 1000” | bc)
# 输出服务器时间
echo $(expr $now + $offset / 1000)
fi
done
“`
使用该脚本时,只需要传入目标主机的IP地址即可,如下所示:
“`shell
$ ./pingtime.sh 10.0.0.2
1594605664
1594605664
1594605664
1594605664
“`
以上脚本中,我们采用了正则表达式来匹配ping反馈中的时间戳信息,然后再根据TCP协议中规定的计算方法,得出目标服务器的时间。