gpt4 book ai didi

Python - 测量 DNS 和往返时间

转载 作者:太空宇宙 更新时间:2023-11-04 03:10:31 25 4
gpt4 key购买 nike

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

我采取的做法如下

  1. 首先使用套接字模块测量 DNS 查找时间。我们称此函数为 A
  2. 使用 subprocess 模块中的 ping 命令测量网络服务器的响应。我们称这个函数为 B

我在代码中先调用函数 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()

谢谢

最佳答案

DNS lookup is being called twice (once in function A & then in function B).

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

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

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 响应 header 所需的时间,但通常还包括远程服务器生成HTTP 响应正文。

关于Python - 测量 DNS 和往返时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38174877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com