由于隧道代理动态版底层的实现是只有在新建立连接的情况下,才能将请求转发给不同的代理服务器。如果使用代理的HTTP客户端在拿到响应后并没有直接关闭TCP连接,后续的HTTP请求可能会继续在这条TCP连接上发送,导致多个HTTP请求使用的是相同的代理IP。
那如何在请求结束后主动关闭连接呢?
在 HTTP/1.0 中,keep-alive 并 不 是 默 认 使 用 的。客 户 端 必 须 发 送 一 个Connection: Keep-Alive 请求首部来激活 keep-alive 连接。
而在HTTP/1.1中默认启用Keep-Alive, 默认情况下所在HTTP1.1中所有连接都被保持,除非在请求头或响应头中指明要在响应结束后关闭连接:Connection: Close 。
通常来说,只需要在请求头中加入Connection: Close,目标服务器识别后,在响应头中也会加入Connection: Close,并且在发送完响应后主动关闭连接。
所以如果你不能确定你所使用的HTTP客户端是否会在请求结束后关闭请求,是可以在发送请求的header中主动加上:Connection: Close
依旧是上述Python-Requests代码
# 使用隧道代理动态版发送请求headers = {"Connection": "close"}s = requests.session()for i in range(3):res = s.get(https://dev.kdlapi.com/testproxy, proxies=proxies, headers=headers)print(res.text)time.sleep(1)
sucess! client ip: **********sucess! client ip: **********sucess! client ip: **********
每次请求都更换了IP,再次查看Wireshark抓包数据,三次HTTP请求,每次都建立了新的TCP连接。
使用隧道代理动态版发现没有更换IP很有可能是HTTP客户端复用了之前建立的TCP连接,由此来加快网络请求。
大家购买隧道带动态版就是为了每次请求更换IP,复用了之前的TCP连接就无法达到更换IP的效果,只需要在请求头中加入Connection: Close,显式地指出本次连接传输完成就立即关闭即可。