这篇 wiki 值得看看,很短:
HTTP tunnel当 http 服务器在代理 http 请求的时候,会涉及 http 包的拆包。搞前端的都知道,有一些 http 的 header,比如 cache-control 之类的。可以在里面定义一些值给代理服务器看,比如 must-revalidate 这类。
但是,http 服务器还有一种方式可以代理 http 请求。
大家有没有想过,为什么 https 也可以走 http 代理服务器,ssh 也可以走 http 服务器。是因为在这种情况下,http 代理服务器的作用就已经不再是 http 服务器了,而是成了一个 tcp 转发服务器。也就是说,任何流经这个服务器的请求,http 代理服务器都不进行干扰,只是单纯地转发 tcp 流量。
在请求 https 时,
首先客户端会发送一个 connect (与 get post put 一样的字段)请求到 http proxy,建立一个 tcp 连接。之后当 https 请求发出的时候,通过这个 tcp 连接通往目标网站。目标网站的 response 也同样是这么返回。
默认情况下,当 http proxy 在代理 http 请求时,走的是拆包的那种方式,不是 tunnel 的方式。
而我们实际上,也可以先与 http proxy 建立 tunnel,之后再通过这个 tunnel 转发 tcp 层面的数据来访问 http 协议的网站。这样就不会被 proxy 上的一些设置干扰了。
这是今天读 request/request · GitHub 的文档时候发现的。