如何识别 Curl 使用的 tcp 连接?
How to identify tcp connection used by Curl?
我的目标是查明后续的 curl 请求是否使用与初始请求相同的 tcp 连接。我使用 pycurl 和 curl_easy_getinfo。
我可以看到有一个 LASTSOCKET in curl_easy_getinfo which is "the last socket used by this curl session". So I was thinking that the socket would change if there is a new tcp connection used or remain the same if connection has not changed. Also, according to CURLOPT_MAXAGE_CONN 连接缓存默认为 118 秒。所以我希望套接字在 2 分钟后无论如何都会改变。
但由于某种原因,套接字号始终是相同的“6”:
import pycurl
from datetime import datetime
import time
url = "some url"
def doit (url):
m = {}
c = pycurl.Curl()
c.setopt(c.URL, url)
c.setopt(pycurl.WRITEFUNCTION, lambda x: None)
now = datetime.now()
current_time = now.strftime("%H:%M:%S")
c.perform()
#times in milliseconds
m['timestamp'] = current_time
m['total_time'] = round(c.getinfo(pycurl.TOTAL_TIME) * 1000, 1)
m['namelookup_time'] = round(c.getinfo(pycurl.NAMELOOKUP_TIME) * 1000, 1)
m['connect_time'] = round(c.getinfo(pycurl.CONNECT_TIME) * 1000, 1)
m['appconnect_time'] = round(c.getinfo(pycurl.APPCONNECT_TIME) * 1000, 1)
download_speed = c.getinfo(pycurl.SPEED_DOWNLOAD)
m['download_speed'] = download_speed
activesocket = c.getinfo(pycurl.LASTSOCKET)
m['activesocket'] = activesocket
print(m)
c.close()
i = 0
itterations = 3
pause = 120
for i in range(0, itterations):
doit(url)
i += 1
i = 0
print ('Waiting:', pause, ' seconds')
time.sleep (pause)
for i in range(0, itterations):
doit(url)
i += 1
结果:
{'timestamp': '18:49:34', 'total_time': 389.1, 'namelookup_time': 43.4, 'connect_time': 49.0, 'appconnect_time': 80.1, 'download_speed': 146791.0, 'activesocket': 6}
{'timestamp': '18:49:35', 'total_time': 102.2, 'namelookup_time': 1.8, 'connect_time': 13.6, 'appconnect_time': 44.9, 'download_speed': 558842.0, 'activesocket': 6}
{'timestamp': '18:49:35', 'total_time': 70.6, 'namelookup_time': 1.8, 'connect_time': 13.8, 'appconnect_time': 34.1, 'download_speed': 809169.0, 'activesocket': 6}
Waiting: 120 seconds
{'timestamp': '18:51:35', 'total_time': 168.3, 'namelookup_time': 38.6, 'connect_time': 50.2, 'appconnect_time': 94.8, 'download_speed': 339384.0, 'activesocket': 6}
{'timestamp': '18:51:35', 'total_time': 56.3, 'namelookup_time': 1.8, 'connect_time': 8.2, 'appconnect_time': 28.7, 'download_speed': 1014765.0, 'activesocket': 6}
{'timestamp': '18:51:35', 'total_time': 193.0, 'namelookup_time': 1.8, 'connect_time': 6.4, 'appconnect_time': 30.5, 'download_speed': 295883.0, 'activesocket': 6}
我可以看到 'connect_time' 在后续请求中确实较少,这可能是由于连接重用。但是为什么套接字号没有改变呢?确定 Curl 是否重新使用了 tcp 连接以及连接是什么(为了验证)的正确方法是什么?
感谢任何帮助!谢谢。
But for some reason the socket number is always the same '6' ...
套接字号是文件描述符号。如果关闭文件描述符(如 TCP 连接关闭)并创建一个新的文件描述符(如创建新的 TCP 套接字),则以相同的数字结尾是很常见的。
更好的指标是使用socket.getpeername获取TCP连接的本地源端口号。新 TCP 连接的源端口或多或少是随机分配的,由于 TCP 的工作方式,不可能快速重用相同的源端口。因此,如果它是与以前相同的源端口,则可能是相同的 TCP 连接,不同的源端口是不同的连接。
我的目标是查明后续的 curl 请求是否使用与初始请求相同的 tcp 连接。我使用 pycurl 和 curl_easy_getinfo。 我可以看到有一个 LASTSOCKET in curl_easy_getinfo which is "the last socket used by this curl session". So I was thinking that the socket would change if there is a new tcp connection used or remain the same if connection has not changed. Also, according to CURLOPT_MAXAGE_CONN 连接缓存默认为 118 秒。所以我希望套接字在 2 分钟后无论如何都会改变。 但由于某种原因,套接字号始终是相同的“6”:
import pycurl
from datetime import datetime
import time
url = "some url"
def doit (url):
m = {}
c = pycurl.Curl()
c.setopt(c.URL, url)
c.setopt(pycurl.WRITEFUNCTION, lambda x: None)
now = datetime.now()
current_time = now.strftime("%H:%M:%S")
c.perform()
#times in milliseconds
m['timestamp'] = current_time
m['total_time'] = round(c.getinfo(pycurl.TOTAL_TIME) * 1000, 1)
m['namelookup_time'] = round(c.getinfo(pycurl.NAMELOOKUP_TIME) * 1000, 1)
m['connect_time'] = round(c.getinfo(pycurl.CONNECT_TIME) * 1000, 1)
m['appconnect_time'] = round(c.getinfo(pycurl.APPCONNECT_TIME) * 1000, 1)
download_speed = c.getinfo(pycurl.SPEED_DOWNLOAD)
m['download_speed'] = download_speed
activesocket = c.getinfo(pycurl.LASTSOCKET)
m['activesocket'] = activesocket
print(m)
c.close()
i = 0
itterations = 3
pause = 120
for i in range(0, itterations):
doit(url)
i += 1
i = 0
print ('Waiting:', pause, ' seconds')
time.sleep (pause)
for i in range(0, itterations):
doit(url)
i += 1
结果:
{'timestamp': '18:49:34', 'total_time': 389.1, 'namelookup_time': 43.4, 'connect_time': 49.0, 'appconnect_time': 80.1, 'download_speed': 146791.0, 'activesocket': 6}
{'timestamp': '18:49:35', 'total_time': 102.2, 'namelookup_time': 1.8, 'connect_time': 13.6, 'appconnect_time': 44.9, 'download_speed': 558842.0, 'activesocket': 6}
{'timestamp': '18:49:35', 'total_time': 70.6, 'namelookup_time': 1.8, 'connect_time': 13.8, 'appconnect_time': 34.1, 'download_speed': 809169.0, 'activesocket': 6}
Waiting: 120 seconds
{'timestamp': '18:51:35', 'total_time': 168.3, 'namelookup_time': 38.6, 'connect_time': 50.2, 'appconnect_time': 94.8, 'download_speed': 339384.0, 'activesocket': 6}
{'timestamp': '18:51:35', 'total_time': 56.3, 'namelookup_time': 1.8, 'connect_time': 8.2, 'appconnect_time': 28.7, 'download_speed': 1014765.0, 'activesocket': 6}
{'timestamp': '18:51:35', 'total_time': 193.0, 'namelookup_time': 1.8, 'connect_time': 6.4, 'appconnect_time': 30.5, 'download_speed': 295883.0, 'activesocket': 6}
我可以看到 'connect_time' 在后续请求中确实较少,这可能是由于连接重用。但是为什么套接字号没有改变呢?确定 Curl 是否重新使用了 tcp 连接以及连接是什么(为了验证)的正确方法是什么? 感谢任何帮助!谢谢。
But for some reason the socket number is always the same '6' ...
套接字号是文件描述符号。如果关闭文件描述符(如 TCP 连接关闭)并创建一个新的文件描述符(如创建新的 TCP 套接字),则以相同的数字结尾是很常见的。
更好的指标是使用socket.getpeername获取TCP连接的本地源端口号。新 TCP 连接的源端口或多或少是随机分配的,由于 TCP 的工作方式,不可能快速重用相同的源端口。因此,如果它是与以前相同的源端口,则可能是相同的 TCP 连接,不同的源端口是不同的连接。