标签:
HTTP代理是HTTP客户端和HTTP服务器之间的中间节点,对于HTTP客户端来说,HTTP代理就是服务器,对于HTTP服务器来说HTTP代理就相当于客户端。 所以说HTTP代理即是服务器也是客户端.
常见的代理的作用分为下面几种
HTTP代理用来过滤一些内容,比如未成年人不适宜访问的网站,或者一些列入黑名单的网站
对不同的客户采用不同的访问控制,比如用户访问某个文档必须进行HTTP的鉴权认证
通过代理对常用的网页进行缓存,减少对外的出口流量,提高内部的访问效率(很多ISP会提供缓存代理来提供效率)
根据不同的用户的权限将用户的请求导向不同的服务器节点,实现负载均衡或者区别服务(很多此类代理是部署在服务器端的反向代理)
可以根据客户端的语言,客户端的种类(PC客户端,手机客户端)对结果进行转码使得适配客户端
检查来往的消息检测恶意的脚本或者代码甚至是发现病毒
传统意义上认为网关会涉及到协议栈的转换,比如将通过http消息传输的FTP的消息转化为ftp协议的消息,实际上二者并没有明显的区分
1. 可以修改客户端显示的提供代理
2. 可以修改网络在客户端不知道的情况下提供代理
3.修改DNS命名空间使得域名指向代理
4.修改服务器使得服务器发送一条HTTP重定向将客户端指向代理
如果是客户端显示配置了代理,那么发给代理的URI会是完整的格式包括方案,主机,端口,路径。而发送给服务器的URI是只包含路径的
发送给代理的消息:
GET http://www.baidu.com/ HTTP/1.0 User-Agent: Fiddler
发送给服务器的消息
GET / HTTP/1.0 User-Agent: Fiddler
这是由于以前的HTTP消息是不存在发给代理的只会发给服务器,并且服务器也没有虚拟主机这一说法(虚拟主机就是一个主机配置了很多host,主机自己不能判断自己的host是什么)
所以为了防止信息冗余,HTTP消息只需要发送路径就可以了,无需发送主机,端口还有方案
代理出现了之后,代理必须要知道主机名和端口才能转发消息,而网关代理必须要知道方案才能处理消息。所以针对发给代理的消息必须提供完整的URI,所以
1)如果在客户端显示的配置了代理,那么消息就会发送完整的URI
2)如果客户端没有显示的使用代理,那么消息就会只发送部分URI(主要是路径部分)
对于虚拟主机,解决的方案是要求在HTTP请求中添加HOST字段用于标示目的主机和端口
问题是如果网络中除了显示代理之外还存在一个不可见的隐藏代理,这样也会出现问题。所以制定了下面的规则:
1.代理收到一个请求,如果使用的是完整的URI,则使用完整的URI,否则
2.如果提供了相对的URI,并且请求中携带了HOST 这个head,则使用host去确定主机名称和端口
3.如果都没有的话代理需要通过其他方法确定目的HOST和端口,如果确定不了的话必须返回错误报文
很多浏览器提供了URI自动扩展功能,但是在显示配置了代理的情况下会有一些不一样:
1)用户在流量的地址栏中输入了 oreilly
2)浏览器通过DNS查找 oreilly 域名对应的地址,结果失败
3)浏览器进行自动扩展将 oreilly转化为 www.oreilly.com,继续去DNS查找,结果成功
4)浏览器尝试连接到3)中获得的地址上去
5)浏览器在建立好的连接上发送接收HTTP消息
1)用户在地址栏中输入了 oreilly
2)由于显示配置了代理,浏览器会首先获取代理的地址
3)浏览器连接代理
4)浏览器发送HTTP请求,请求中浏览器并不会尝试名称扩展,所以代理得到的不是完整的主机名
5)代理根据尝试扩展主机名
有拦截情况下有一些不一样
3)客户端通过DNS获取了服务器的地址(注:由于某种原因该地址已经失效)
4)客户端尝试通过IP地址与服务器建立TCP连接,代理拦截了客户端的请求,由于往往这个时候代理并不会真正和服务器建立连接,所以这时候客户端以为已经连接成功了而实际上服务器的这个地址根本是不可用的
客户端在该连接上发送HTTP请求,代理发起对该地址服务器的连接,由于地址已经失效所以连接失败,此时代理需要通过解析HOST首部的主机名或者通过反向解析IP地址获取服务器的域名,然后再查找正确的IP地址再建立连接。
HTTP协议提供了两种方法跟踪代理
via的语法最多包含四个域:一个可选的协议默认为HTTP,必选的协议版本,主机名称和可选的主机端口默认80
每一个沿途的代理会将自己的信息添加在Via这个head的最后面。
但是我尝试发送Via出去,结果都是失败的,可能代理做了安全方面的限制不让使用Via了
TRACE方法是HTTP/1.1提供的方法
当TRACE请求到的服务器的时候,服务器会把接收到的消息作为返回消息的body发送回去,客户端可以查看接收到消息的body中的via字段
TRACE可以结合Max-Forwards字段一起使用。当代理节点收到Max-Forwards之后会判断值是不是=0,如果不是则将值-1然后处理消息,如果=0 则将Trace报文返回
同样我试了一下,好像这边的代理也做了限制,没有能成功收到返回消息
标签:
原文地址:http://www.cnblogs.com/leon-zhu/p/4326499.html