一、 HTTP 代理
HTTP 代理的实现很简单,和普通的 HTTP 请求差别不大,只要在请求行的 uri 路径中加上实际请求的 host 就可以了:
代理服务器收到这个请求后,会主动请求 uri 中的 host 地址 (不是请求头部的 Host 字段中的值),然后去掉这部分构造成一个普通的 HTTP 请求发送到服务端。服务端响应后的数据也直接发回到客户端。
过程图解:
长连接的场景
当连接是长连接的时候,后面的请求可以不用加上 http://ifeng.com
,直接和普通的 GET 请求一样就可以了。
二、 HTTPS 代理
HTTPS 相较于 HTTP 代理不同的是:HTTPS 代理是加密的,代理无法从 HTTP 请求行中获取到 host 。因此,执行 HTTPS 代理前,客户端要先主动发起一个 CONNECT
请求,表示要连接到的服务端。然后代理程序和服务端建立连接,把后续所有的客户端数据包都发往服务器。
以下是一个 HTTPS 代理请求的数据包:
过程分解:
- 客户端发起 CONNECT 连接,明确告诉代理程序,帮我连接
www.ifeng.com
的443
端口。 - 服务端发起对
www.ifeng.com:443
的连接,成功后给客户端返回HTTP 200
。 - 客户端开始建立 HTTPS 连接,执行 Clinet-Hello 过程。
图解:
整个代理过程中,除了多了个 CONNECT 流程以外,后面所有的请求交互过程和普通 HTTPS 连接是一样的。
评论