Python - 测量DNS和往返时间

时间:2016-07-03 22:29:24

标签: python dns response

我正在研究python脚本来衡量对DNS服务器的响应时间以及从Web服务器获取数据的响应时间。

我采取的方法如下

  1. 首先使用套接字模块测量DNS查找时间。让我们调用此函数A
  2. 使用子进程模块中的ping命令测量来自Web服务器的响应。让我们调用这个函数B
  3. 我首先调用函数A,然后在代码中调用函数B.

    解决方案运行正常,但我怀疑这是否是正确的方法。

    原因是,DNS查询被调用两次(一次在函数A&然后在函数B中)。因此,函数B中的DNS查找时间总是小于函数A中计算的时间。

    功能A代码

                    startTime = datetime.datetime.now()
                    ip = socket.gethostbyname(host)
                    endTime = datetime.datetime.now()
                    diff = (endTime - startTime).total_seconds() * 1000 
    

    功能B代码

        resp = subprocess.popen(['ping','-c 3','host.com'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
        out,err = resp.communicate()
    

    由于

1 个答案:

答案 0 :(得分:1)

  

DNS查询被调用两次(一次在函数A&然后在函数B中)。

您可以使用gethostbyname()为后续HTTP请求返回的IP地址来消除此问题。

如果您愿意,还可以将HTTP请求的时间分配为协议握手所需的时间,以及传输返回数据所需的时间。对于以下代码...

import socket
import time
import urllib2

hostname = 'stackoverflow.com'

dns_start = time.time()
ip_address = socket.gethostbyname(hostname)
dns_end = time.time()

url = 'https://%s/' % ip_address
req = urllib2.Request(url)
req.add_header('Host', hostname)

handshake_start = time.time()
stream = urllib2.urlopen(req)
handshake_end = time.time()

data_start = time.time()
data_length = len(stream.read())
data_end = time.time()

print 'DNS time            = %.2f ms' % ((dns_end - dns_start) * 1000)
print 'HTTP handshake time = %.2f ms' % ((handshake_end - handshake_start) * 1000)
print 'HTTP data time      = %.2f ms' % ((data_end - data_start) * 1000)
print 'Data received       = %d bytes' % data_length

......我明白了......

DNS time            = 1.77 ms
HTTP handshake time = 170.66 ms
HTTP data time      = 315.76 ms
Data received       = 242817 bytes

请注意,握手时间包括TCP握手,SSL握手(如果适用),HTTP请求和HTTP响应标头所需的时间,但通常还包括远程服务器生成HTTP响应正文。