如何识别 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 连接,不同的源端口是不同的连接。