“轮换住宅代理”是这个领域里人人都用的一个说法,但它背后的机制却很少被讲清楚。IP 从哪儿来?为什么你的出口 IP 有时会在你没要求的情况下变?“轮换”到底控制什么,而一个”粘性” IP 为什么又从不完全永久?把这套管路弄明白,就回答了这一切——而这正是”跟你代理的行为较劲”和”有意地去用它”之间的差别。
这就是粘性 vs 轮换那个选择、以及一个住宅 IP 的解剖之下的机制。下面是真正发生的事。
你连接的是一个 gateway,而不是一堆 IP
第一件要弄明白的事:你从不连接到单个的住宅 IP,你也从不管理一份它们的列表。你连接到一个单一的 gateway 端点 p.shifter.io:443,而 gateway 把你的请求经由池里数以百万计的住宅 IP 之一路由出去。关于”你会拿到哪个 IP”的一切,都表达在你用来认证的那个用户名里:
customer-USERNAME-country-us-sid-abc123-ttl-600gateway 读这个用户名,把池过滤到与你定位相匹配的那些 IP(这里是美国),挑一个,并把你的请求经它送出去。你跟一个地址说话;池坐在它后面。这就是为什么轮换感觉毫不费力:gateway 做分配,而你只是描述你想要什么。
池是活的,所以轮换是默认
一个住宅池不是一份固定的列表。它由真实的家庭连接构成——随着设备一整天里上线、下线而来来去去——所以可用出口 IP 的集合在不断变化。当你打开一条连接、而不去要一个特定会话时,gateway 就简单地从当下可用的东西里分配一个新鲜的出口 IP。这就是”轮换”在其最基本形态上的意思:一条新连接拿到一个新 IP。
所以轮换不是一个你去打开的特殊模式。它是一个活池在”你没告诉 gateway 替你held住一个 IP”时的自然行为。省掉那些会话控制,每条新连接就都轮换。
你用一个会话令牌和一个 TTL 来控制轮换
用户名里有两个旋钮,决定你是轮换还是留在原地——而它们就是全部故事:
- 一个会话 id(
sid) 告诉 gateway”每当我出示这个令牌,就继续把我经同一个出口 IP 送出去”。那就是一个粘性会话。 - 一个 TTL(
ttl) 说明把那个 IP 保持多久,比如 600 秒。
两个都设,你就在那个窗口里得到一个稳定的 IP。省掉它们,你就在每条连接上轮换。关键地,这是一个你靠改用户名、按请求来做的选择,而不是一个不同的产品或端点——同一个 gateway 两件事都做。这正是为什么粘性 vs 轮换是一个你按工作单元去做的决定,而不是一个你去买的套餐。
为什么一个粘性 IP 从不真正永久:CGNAT 与设备来去
这就是数据中心代理不必去面对的那个诚实的部分。一个住宅出口 IP 属于一条你不控制的真实家庭连接,而家庭连接不像一台租来的服务器那样稳定。尤其有两股力量让它们不停地动。
如今大多数家庭连接都坐在 CGNAT(运营商级 NAT)之后——ISP 把一个公网 IPv4 地址在许多订户之间共享,并且能把它重新分配。一个订户的公网 IP,可能在一次租约续期或一次 NAT 重新分配时就变了,而你或 gateway 什么也没做。而设备本身也可能就下线了——有人合上一台笔记本、一部手机掉了 Wi-Fi,那条出口路径就没了。
这就是为什么一个粘性会话是尽力而为、而不是一个保证。gateway 在 TTL 之内尽它所能地held住你的 IP,但如果底层那条家庭连接变了或掉了,你就会在 TTL 到期之前拿到一个新 IP。换句话说,轮换一部分是一个特性、一部分是网络现实的映照:住宅 IP 会动,因为真实的家在动,而任何建立在它们之上的系统都得预期这一点。
为什么你的 IP 在你没要求时就变了
把这些拼在一起,那个”运行到一半神秘换 IP”就不再神秘了。它几乎总是下面之一:
- 没有会话令牌,所以每条连接按设计就轮换。对那些以为”一次运行一个 IP”的人来说,这是最常见的意外。
- 一个 TTL 已过期的粘性会话,所以 gateway 释放了那个 IP、并分配了一个新的。
- 一个底层家庭 IP 掉了的粘性会话(设备下线或 CGNAT 重新分配),在 TTL 之前,逼出一次提前的变更。
- 你的客户端打开了一条新连接,而不是复用一条保活的。如果你的 HTTP 客户端不复用它的连接,每个请求都可能看起来像一次新鲜的轮换事件——除非
sid把它钉住,而这正是各语言指南强调复用客户端的又一个原因。
这对你怎么抓取意味着什么
那些实用的要点,直接从机制里推出来。
把轮换匹配到任务。 当你想要匿名、并把负载分摊到许多 IP 上时,靠省掉会话来轮换。当某样东西必须看起来像一个连贯访客时——一段跨多页的分页序列、一个已登录会话、或任何多步流程——就用一个 sid 和 ttl 去粘。这样把工作映射到身份,就是负载均衡的模式。
为一个仍可能变的粘性 IP 而设计。 因为粘性是尽力而为,一段长会话应当能在它的出口 IP 中途变化时存活下来——如果发生就重建 cookie 或状态——而不是假定 IP 在整次运行里是固定的。
地理定位在一个子集里轮换。 当你定位一个国家、城市或 ASN 时,gateway 把池过滤到那个子集、并在其中轮换。“轮换的美国住宅”意味着每条连接一个新鲜的美国 IP;ASN 定位或城市级定位只是把它所轮换的那个子集收窄。
池的质量决定了轮换给你什么。 轮换只跟它背后的池一样好。一个又大又干净的池,意味着每个新鲜 IP 都是一个好 IP;一个又小又脏的池,意味着轮换只是让你在一堆被标记的地址里打转,而你的成功率会反映这一点。这就是为什么 IP 信誉和池的规模,比轮换机制本身更要紧。
底线
住宅代理轮换不是魔法,也不是谜。一个 gateway 从一个由真实家庭连接组成的活池里分配你的出口 IP,你用用户名里的一个会话令牌和一个 TTL 来控制它是轮换还是留粘,而整件事都被”家庭 IP 因 CGNAT 与设备来去而来来去去”这个现实所限。靠省掉会话来轮换;靠设一个 sid 和 ttl 来保持粘性,但把粘性当作尽力而为、并为 IP 有可能变化而设计。把选择匹配到任务,那么下游的一切——会话、登录、分页、地理——都会变得更容易。
真正让轮换有用的,是它下面的那个池。我们的住宅代理跑在一个又大又干净的池上,好让 gateway 递给你的每一个出口 IP——无论轮换还是粘性——都是一个值得用的 IP,而按 GB 计价意味着你为你所发的请求付费,而不是为你所打转过的 IP 数量付费。