# 连接保持与轮换

HTTP 连接保持允许客户端通过同一个 TCP 连接发送多个请求。使用轮换代理时，出口在连接建立时选定，因此该连接上复用的所有请求都会从同一 IP 发出。使用连接池的客户端看到的 IP 变化次数会少于预期；强制每个请求建立新连接即可恢复按请求轮换。


## 表现

- 即使未设置会话 ID，IP 回显调用仍连续多次返回同一地址。
- 爬虫看似在“轮换”，实际却复用由十个连接组成的连接池，因此被按 IP 限速的目标封锁。


## 各客户端的解决方法

| 客户端 | 如何让每个请求建立新连接 |
| --- | --- |
| cURL | 每次调用本来就会建立新连接 |
| Python requests | 不使用 Session 调用 requests.get(...)，或设置 headers={"Connection": "close"} |
| Node.js fetch / undici | 每个请求新建 ProxyAgent，或设置 pipelining: 1 与 keepAliveTimeout: 0 |
| Go net/http | Transport.DisableKeepAlives = true |
| 浏览器 | 无法控制；改用粘性会话，并通过更改 -sid- 进行轮换 |


## 反过来的情况

如果你*希望*多个请求使用同一出口，连接保持可在同一连接上发挥作用，但不要只依赖它：请使用[粘性会话](https://proxshift.com/zh/glossary/sticky-session)，这样即使连接重置也能继续保持同一出口。


## 在 ProxShift 中的工作方式

ProxShift 网关会为每个新连接选择出口，并在该连接的生命周期内保持不变（空闲连接会在 60 秒后关闭）。-sid- 可明确指定这一选择，使其不受连接影响。

来源：https://proxshift.com/zh/glossary/keep-alive
