Proxy-Connection
Proxy-Connection, 这个字段是干什么的?
从字面上的意思看,这个字段表示和代理的连接。下面我们来具体看一下
首先我们看一下设置了浏览器代理之后HTTP的请求有哪些变化
GET / HTTP
/1
.1
Host: www.example.com
Connection: keep-alive
GET http:
//www
.example.com/ HTTP
/1
.1
Host: www.example.com
Proxy-Connection: keep-alive
我们看到有两个变化
1. 请求的资源URI变成了完整路径
2. Connection 头变为了 Proxy-Connection头
为什么需要完整路径
早期的HTTP设计中,浏览器直接和单个服务器对话,不存在虚拟主机。 所以单个服务器总知道自己的主机名和端口,这样浏览器发送请求只需要发送相对地址就可以了。如下
GET / HTTP /1.0 接受主机知道这是要访问我的/路径的东东
有了代理就麻烦了,代理不知道GET / HTTP /1.0 这个请求发给哪个主机,所以HTTP 1.0 又要求浏览器给代理发送的时候必须发送完整的路径名称
GET http:
//www
.example.com/ HTTP
/1
.0
HTTP 1.1 规定了必须包含Host主机名这个字段。所以 HTTP 1.1 可以是
GET / HTTP
/1
.1
Host: www.example.com
但是由于不清楚代理是1.0 还是1.1的 也许代理不认识Host这个头。 所以http 1.1 发给代理的最后格式就变为
GET http:
//www
.example.com/ HTTP
/1
.1
Host: www.example.com
说起来真是拗口啊
下面在说下Connection
GET / HTTP/1.1 Host: www.example.com Connection: my-header, close, my-connection My-Header: xxx
协议规定Connection可以定义其他只和本次Connection有关的head,比如 上面的my-header, my-connection
Http/1.1 默认是Keepalive的,所以如果Connection指明 close的话 表明消息发送完之后 会释放对应的TCP
由于代理会识别http消息中的Header并重写明白的Header,对于不能理解的Header会正常转发, 这样的目的就是为了软件功能比较方便,增加一个Header不需要升级代理。
假如Connection发给了代理,代理不认识进行了转发,最后到了服务器。
如果服务器认识Connection:keep-alive,但是代理不认识(1.0代理),问题就出现了
服务器发送完resonse之后会保持这个链接,而代理由于是1.0的默认是close的行为,所以会等待服务器释放链接。
客户端接受到服务器的response之后,由于response中的Connection也是keep-alive,所以客户端还会继续在连接上发送请求,但是代理却认为客户端不会继续发送了。
解决这个问题就出现了一个新的Header叫 Proxy-Connection用来协商浏览器和代理之间的链接
如果代理是1.1的,那么认识Proxy-Connection,完全没问题,代理会重写为Connection
如果代理是1.0的,那么不认识Proxy-Connection,那么会转发到服务器,服务器发现Proxy-Connection 并且Http的版本是1.0的,那么就会在response中添加Connection:close 也没有问题了。
但是如果最后一个代理和服务器之间还存在不可见代理的话,则还有问题.
代理服务器的作用
1. 过滤
比如过滤儿童不适宜的网站
2.控制
集中控制内部计算机访问外部网络以及外部网络发送回来的消息,并且可以经常变更策略
3.缓存
提供缓存给经常访问的页面
4.内容路由
可以根据内容把请求定位到特定的资源,注:迅雷的会员是否就是这样达到限制网速的?
5.转码
可以根据客户端的语言,甚至区分手机客户端还是PC客户端来对消息进行转码