很多人第一次见到 Proxy-Connection 头,会以为它和 Connection 头是一回事,或者以为是某个代理IP软件独有的写法。其实它有一段自己的来历,是一个专门说给代理听的暗号。
先澄清:Proxy-Connection 不是标准协议里定义的头,而是早期浏览器扩展和代理IP软件之间为了连接复用而约定出来的非标准头。它专门说给代理IP听,浏览器用它对代理表示「这条连接我想保持」。
为什么需要这样一个暗号?对代理IP来说,连接要不要复用,直接关系到请求的快慢——复用能省掉反复握手的开销,不复用则每次请求都要重新建立连接。
这个暗号是怎么来的
早期 HTTP 版本普及之前,浏览器和代理之间的连接管理比较混乱。Connection 头在不同语境下含义不同,代理IP难以判断该不该保持连接,于是有人约定了一个专门的 Proxy-Connection 头,浏览器发给代理,代理看它来决定连接复用策略。
请求发出去时,浏览器会在请求头里带「Proxy-Connection: keep-alive」,代理IP收到后知道客户端希望复用这条连接,于是尽量不让连接立刻关闭,让后续请求可以接着用。
这个头只存在于浏览器到代理之间这一段。代理IP转发给目标站时,通常会把 Proxy-Connection 头处理掉,换用标准的方式表达连接语义,所以目标站一般看不到这个非标准头。
代理认不认,决定连接能不能复用
如果代理IP认识这个头,会按它的语义维持连接,同一客户端可以在这条连接上连续发多个请求,省去反复握手的开销;如果不认识,代理IP可能直接忽略,连接用一次就关,下一次请求重新建立,速度和稳定性都会打折扣。
判断代理IP是否支持,有个简单的现象:走代理后连续请求的响应时间稳定且偏短,说明连接在复用;如果每次请求都有明显的新建连接开销,多半是代理IP没有正确处理连接复用。这个现象在批量请求场景里特别明显。
还有一个现象可以辅助判断:连接能否复用还体现在请求的耗时分布上。复用正常时,前几次请求稍慢、后续请求明显变快;复用失效时,每次请求的耗时都差不多,找不到「先慢后快」的规律。把耗时分布和抓包里的头信息放在一起看,判断会更准确。
现在的主流浏览器和代理软件大多已经用标准方式处理连接复用,Proxy-Connection 头逐渐退到兼容场景里。但老软件、老配置里偶尔还能看到它,理解它的来历,依然能解释不少连接时快时慢的怪现象。
Proxy-Connection 是写给代理看的暗号:浏览器表意,代理执行,目标站基本无感。
连接复用看两头:一头是浏览器愿不愿意复用,一头是代理认不认这个头,两头都通才算数。
下次再遇到「走代理后请求忽快忽慢」的问题,可以先看看抓包里有没有这个头,再判断代理有没有正确响应。一个非标准头的存在与处理,往往就是连接复用好坏的直接原因。
一个头认识与不认识,决定了连接是一次性还是可持续——暗号对得上,代理IP协作才顺畅。
