# ping的原理是推送一个ICMP要求包,随后依据目地详细地址的应答包来分辨是不是可以和这一服务器开展通讯	。
# 大家应用python完成 ,借助于scapy来开展编写程序 。
# 导进scapy包。
from scapy.all import *
import time,struct,random
# 撰写ping一个包的涵数。
def ping_one(dst = '36.152.44.95',ttl_no = 64,id_no = 345,seq_no = 5):
start_time = time.time()
# 将时间转换为二进制编码序列 。
time_to_bytes = struct.pack('>d',start_time)
# 开展推送ICMP包,推送出来一个 ,取回来一个。
ping_one_result = sr1(IP(dst = dst,ttl = ttl_no)/ICMP(seq = seq_no,id = id_no)/time_to_bytes, timeout = 1, verbose=False)
# print(ping_one_result.show())
# 分辨取回来的包是否ICMP的应答包,和系列号是不是同样。
try:
if ping_one_result.getlayer('ICMP').type == 0 and ping_one_result.getlayer('ICMP').seq == seq_no:
# print('开展解析包')
# 获取IP头顶部中的源IP地址,也就是大家ping的IP地址 。
reply_src_IP = ping_one_result.getlayer('IP').src
# 获取系列号。
reply_icmp_seq = ping_one_result.getlayer('ICMP').seq
# 获取ttl
reply_icmp_ttl = ping_one_result.getlayer('IP').ttl
# 数据信息长短相当于 数据信息长短(Raw) 垫圈长短(Padding) 8字节(ICMP头顶部长短)
if ping_one_result.getlayer(Raw) != None:
Raw_length = len(ping_one_result.getlayer(Raw).load)
else:
Raw_length = 0
if ping_one_result.getlayer(Padding) != None:
Padding_length = len(ping_one_result.getlayer(Padding).load)
else:
Padding_length = 0
# 测算数据信息长短。
reply_data_length = Raw_length Padding_length 8
# 取下数据信息一部分 ,这儿的数据信息一部分是大家推送ICMP要求包的情况下填写的時间 。
reply_data = ping_one_result.getlayer(Raw).load
# 界定大家收包的時间。
end_time = time.time()
# 将数据信息时间部分开展变换。
reply_data_time = struct.unpack('>d',reply_data)
# 随后复印出变换后的种类 。
# print(type(reply_data_time))
# print(reply_data_time)
time_to_pass_ms = (end_time - reply_data_time[0]) * 1000
# (接受時间 - 推送時间) * 1000为ms数为耗费時间的ms数
# print(time_to_pass_ms)
return reply_data_length,reply_src_IP,reply_icmp_seq,reply_icmp_ttl,time_to_pass_ms
except Exception as e:
# 复印出不正确。
# print('e', e)
# 搭配不正确是不是为NoneType种类。
if re.match('.*NoneType.*', str(e)):
print('不正确了')
# 要是没有答复,就回到None
return None
def ping(dst = '36.152.44.95'):
# 这儿实际上能够取过程号的,可是大家用随机生成一个数字模拟一下 。
id_no = random.randint(0,65535)
# print(id_no)
# 随后开展推送五个数据文件 。
for i in range(1,6):
# 启用ping一个包涵数,入参为目地必须ping的IP地址。ttl ,id,和系列号。seq 。
ping_result = ping_one(dst,64,id_no,i)
if ping_result != None:
print('%d bytes from %s: icmp_seq=%d ttl=%d time=%4.2f ms' % (ping_result[0], ping_result[1], ping_result[2], ping_result[3], ping_result[4]))
else:
print('.',end = '',flush = True)
# 这儿大家中止一秒。
time.sleep(1)

if __name__ == "__main__":
ping('36.152.44.95')

但如今已经,大家的ping微信小程序就用python完成了 ,接下去就可以用wireshark专用工具抓包来看一下,开展ping百度搜索的详细地址。

 

 

 

 

文章来源于网络,如有侵权请联系站长QQ61910465删除
本文版权归趣快排www.sEoguruBlog.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系QQ✈61910465