python|python 脚本检测dns时延

由于实验原因需要查询各地的dns时延,所以我参考了网上的各类代码,写了一个dns时延检测的脚本,希望朋友们指导。

-*- coding:utf-8 -*- from timeit import timeit import time import socket global msg def send(): q = msg sock_recv = 0 sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) sock.sendto(q, ('8.8.8.8', 53)) sock_recv = sock.recv(4096) while sock_recv != 0: breakfor num in range(10): msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x05baidu\x03com\x00\x00\x01\x00\x01' #msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x02qq\x03com\x00\x00\x01\x00\x01' t = timeit('send()', 'from __main__ import send', number=1) print t


使用了python中的socket库,这个库中可以实现发包的功能,这里面我们是将包发送的谷歌的dns服务器8.8.8.8的53端口,然后通过一个计时器函数来判断这个函数是否结束,即是否收到了返回的包,来计算dns时延,这种检测方法,要比通过wireshark抓包有更大的延迟,在我的机器上测试延迟是几毫秒,所以就忽略掉了。


msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x05baidu\x03com\x00\x00\x01\x00\x01'

msg的内容就是我们要发送的内容,可以任意更换地址,但是要注意
x03www\x05baidu\x03com\

简单的说,就是前面数是代表了后面包含几个字母,其他各个位置都可以通过wireshark抓包来分析。
之后为了便于运行,我会从记事本中读取url,然后将结果输出在一个文件中。
# -*- coding:utf-8 -*- import socket import csv import sys from timeit import timeit class Logger(object): def __init__(self, fileN="Default.log"): self.terminal = sys.stdout self.log = open(fileN, "a")def write(self, message): self.terminal.write(message) self.log.write(message)def flush(self): pass def send(): sock_recv = 0 sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) sock.sendto(msg, ('114.114.114.114', 53)) sock_recv = sock.recv(4096) while sock_recv != 0: breakdef getlineNum(): f = open(u"website.txt", 'r') content = csv.reader(f) lineNum = 0 for line in content: lineNum += 1 f.close() return (lineNum)# lineNum就是你要的文件行数 def creatXC(): f = open(u"website.txt", 'r') for i in range(0,10): line = f.readline() print(line) split1(line)def split1(line): global msg st1 = line.split('.') num = len(st1[1]) if num == 2: msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03%s\x02%s\x03com\x00\x00\x01\x00\x01' % (st1[0], st1[1]) for i in range(11): t = timeit('send()', 'from __main__ import send', number=1) print(t) if num == 3: msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03%s\x03%s\x03com\x00\x00\x01\x00\x01' % ( st1[0], st1[1]) for i in range(11): t = timeit('send()', 'from __main__ import send', number=1) print(t) if num == 4: msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03%s\x04%s\x03com\x00\x00\x01\x00\x01' % ( st1[0], st1[1]) for i in range(11): t = timeit('send()', 'from __main__ import send', number=1) print(t) if num == 5: msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03%s\x05%s\x03com\x00\x00\x01\x00\x01' % ( st1[0], st1[1],) for i in range(11): t = timeit('send()', 'from __main__ import send', number=1) print(t) if num == 6: msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03%s\x06%s\x03com\x00\x00\x01\x00\x01' % ( st1[0], st1[1]) for i in range(11): t = timeit('send()', 'from __main__ import send', number=1) print(t) if num == 7: msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03%s\x07%s\x03com\x00\x00\x01\x00\x01' % ( st1[0], st1[1]) for i in range(11): t = timeit('send()', 'from __main__ import send', number=1) print(t) if num == 8: msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03%s\x08%s\x03com\x00\x00\x01\x00\x01' % ( st1[0], st1[1]) for i in range(11): t = timeit('send()', 'from __main__ import send', number=1) print(t)sys.stdout = Logger(u"output.txt") creatXC()


Github代码链接
【python|python 脚本检测dns时延】https://github.com/Promise123/dns/tree/master/dns

    推荐阅读