HTTP-代理
web代理服务器是网络的中间实体,代理位于客户端和服务器之间,扮演者中间人的角色,在各端点之间来回传递http报文
web的中间实体
web上的代理服务器是代表客户端完成事务处理的中间人,如果没有web代理,http客户端直接和http服务器进行对话,有了代理,客户但就可以和代理进行对话,然后由代理代表客户端向服务器进行交流。客户端任然会完成对事务的处理。
私有和共享代理
代理服务器可以是某个客户端专用的,也可以是很多客户端共享的,单个客户端专用的代理称为私有代理,众多客户端共享的代理称为公共代理。
公共代理
大多数代理是公共的共享代理,集中式的代理成本效率更高,更容易管理,高速缓存代理服务器,会利用用户之间共同的请求,这样的话,汇入同一个代理服务器的用户越多,就越有用。
私有代理
专用的私有代理不常见,但是确实存在,尤其是直接运行在客户端计算机的时候,有的浏览器辅助产品,以及一些isp服务器,会在用户的pc上直接运行一些小型的代理,拓展浏览器的特性,提高性能。为免费的isp服务提供主机广告。
代理和网关的对比
代理连接的是两个或者多个使用相同协议的应用程序,而网关连接的是两个或者多个使用不同协议的端点。客户端和服务器使用的是不同的协议,客户端也可以通过它完成和服务器直接的事务处理。
代理和网关之间的区别很模糊,浏览器和服务器实现的是不同版本的http,代理也需要做一些协议转换工作,而商业化的代理服务器也会实现网关的功能来支持ssl安全协议,socks防火墙,ftp访问,以及基于web的应用程序
使用代理
代理服务器可以看到并接触到所有流过的http流量,所以代理可以监视流量并对其进行修改,以实现很多有用的增值web服务器。
-
儿童过滤器
小学在为教育站点提供无阻碍访问的同时,可以利用过滤器代理来阻止学生访问成人内容 -
文档访问限制
可以用代理服务器在大量的web服务器和web资源之间实现同一的访问控制策略,创建审核跟踪机制。
-
安全防火墙
网络工程师使用代理服务器来提高安全性,代理服务器会在网络中的歹意安全节点上限制应用层协议的数据可以流入或者流出一个组织,还可以提供来消除病毒的web和email代理使用的那种挂钩程序,以便对流量进行详细的检查
web缓存: 代理缓存了常用文档的本地副本,并将它们按需提供,减少缓慢而昂贵的互联网通信
反向代理:代理可以假扮web服务器,这些被称为替代物或者反向代理的代理接受发给web服务器的真实请求,但是和web服务器不同的是,可以发起对其他服务器的同行,以便可以按照需求定位所请求的内容。
可以使用这些反向代理来提高访问慢速web服务器上公共内容时的性能,这种配置中,通常将这些反向代理成为服务器加速器,还可以将替代物和内容路由功能配合使用,以创建按按需复制内容的分布式网络。
内容路由器: 代理服务器可以作为内容路由器使用,根据英特网的流量状况以及内容类型将请求导向特定的web服务器
内容路由器可以用来实现各种服务级的请求,如果用户或者内容提供者付费要求提供更高的性能,内容路由器可以将请求转发到附近的赋值缓存,如果用户申请了过滤服务,还可以通过过滤来转发http请求。
转码器: 代理服务器在将内容发送给服务器之前,可以修改内容的主体格式,在这些数据表示法之间进行的透明转码被称为转码
匿名者:匿名者会主动从HTTP报文中删除身份特征,比如客户端ip地址,from首部,referer首部,cookie,uri的会话id,从而提供高度私密性和匿名性
- 从user-agent首部删除用户计算机和os类型
- 删除from首部以保护用户的email地址
- 删除referer首部来掩盖用户访问过的其他站点
- 删除cookie首部提出概要信息和身份的数据。
代理去处
代理服务器的部署
出口代理
可以将代理固定在本地网络的出口点,方便控制本地网络和大型因特网之间的流量。
访问(入口)代理
代理常被放在isp访问点上,用来处理来自客户的去和请求,isp使用缓存代理来存储常用文档的副本,提高用户的下载速度,降低英特网的带宽耗费。
反向代理
代理通常会被部署在网络边缘,在web服务器之前,作为替代物使用,在这里可以处理所有传送给web服务器的请求,并不是旨在必要的时候向web服务器请求资源,替代物可以提高web服务器的安全特性,或者将快速的web服务器换缓存放在较慢的服务器之前,以提高性能,反向代理童话参观会直接冒用web服务器的名字和ip地址,这样所有的请求是发送给代理而不是服务器了。
网络交换代理
可以将具有足够的处理能力的代理放在网络之前的因特网对等交换点上,通过缓存来减轻英特网节点的拥塞,并对流量进行监视
代理的层次结构
可以通过代理层次结构将代理级联起来,在代理的层次结构中,会将报文从一个代理传给另一个代理,直到最终抵达原始服务器位置,然后通过代理传回给客户端
proxy层次结构中的代理服务器被赋予了父和子的关系,下一个入口代理(靠近服务器)被称为附带里,下一个出口代理靠近客户端被称为自带里,代理1是代理2的子代理,代理2是代理3的自代理,代理3是代理2的父代理
代理层次结构的内容路由
代理层次结构是静态的,代理1总是会将报文转发给代理2,代理2总是会将报文转发给代理3,但是层次不一定非得是静态的,代理服务器可以根据众多因素,将报文转发给一个不断变化的代理服务器和原始服务器集。
-
如果所请求的对象属于一个付费使用内容分发服务的web服务器,代理就会将请求发送给附近的一个缓存服务区,这个服务器会返回已缓存对象,或者如果它没有的话,会取回内容。
-
如果请求的是特定类型的图片,访问代理会将请求转发给一个特定的压缩代理,这个代理会获取图片,然后对其进行压缩,这样通过客户端的慢速modem下载,速度会更快。
-
负载均衡
自代理可能会根据当前父代理上的工作负载级别来决定如何选择一个附带里,以负载均衡 -
地理位置附近的路由
子代理可能会选择负责原始服务器所在的物理区域的代理 -
协议/类型路由
子代理可能可能会根据URI将报文转发到不同的附带里和原始服务器上去,某些特定类型的URI可能要通过一些特殊的代理服务器转发请求,以便进行特殊的协议处理。 -
基于订购的路由
如果发布者为高性能服务额外付费了,它们的URI就会被转发到大型缓存或者压缩引擎上去,以提高性能
代理是如何获得流量的
客户端通常会直接和web服务器进行同i选哪个,所以想要解释清楚HTTP流量怎样才能首先流向代理,有四种常见的方式可以使得客户端流向代理。
- 修改客户端
很多web客户端,有手动和自动的代理配置,如果将客户端配置为使用代理服务器,客户端就会将HTTP请求有意的直接发送给代理,而不是原始服务器。 - 修改网络
网络基础设施可以通过若干种技术手段,在客户端不知道,或者是没有参数的情况下,拦截网络流量并导入代理,这种拦截通常是监视HTTP流量的交换设备和路由设备,在客户端毫不知情的情况下,对其进行拦截,并将流量导入一个个代理, 这种代理称为拦截代理。 - 修改DNS的命名空间
放在web服务器之前的代理服务器-替代物,会直接假扮web服务器的名字和ip地址,这样,所有的请求就会发送给这些替代物,而不是服务器了,要实现这一点,可以手动编辑DNS名称列表,或者用特殊的动态DNS服务器根据需要来确定适当的代理和服务器,在安装过程中,真实服务器的ip地址和名称被修改了,替代物得到的是之前的地址和名称。 - 修改web服务器
也可以将某些web服务器配置为客户端发送一条HTTP重定向命令,将客户端请求重定向到一个代理上去,收到重定向命令之后,客户端会和代理进行通信。
客户端的代理设置
手工配置: 显示的设置要使用的代理
预先配置浏览器: 浏览器厂商或发行商会在将浏览器发送给其他客户之前预先对浏览器或者所有其他web客户端的代理设置进行手工配置。
代理的自动配置: 提供一个URI,指向一个JavaScript语言编写的代理自动配置文件,客户端会取回这个JavaScript文件,并运行它决定是否应该使用一个代理,如果是的话,应该使用哪个代理服务器。
WPAD的代理发现: 有些浏览器支持web代理自动发现协议,这个协议会自动检测处浏览器可以从那个配置服务器下载到一个自动配置文件。
手工配置
PAC文件
PAC文件是一个小型的JavaScript程序,可以在运行过程中计算代理设置,因此,是一种更加动态的代理配置解决方案。访问每个文档的时候,JavaScript函数都会选择恰当的代理服务器。
WPAD客户端代理配置
WPAD协议的算法会使用发现机制的逐级上升策略自动为浏览器查找合适的PAC文件,实现WPAD协议的客户端需要:
- 用WPAD找到PAC的URI
- 从指定的URI获取PAC文件
- 执行PAC文件来判定代理服务器
- 为请求使用代理服务器
WPAD会使用一系列的资源来发现技术判定适当的PAC文件,并不是组织所有能够使用的发现的技术,所以WPAD使用了很多发现技术,WPAD会一个接着一个的对每个技术进行尝试,直到成功为止。
- 动态主机配置协议
- 服务定位协议
- DNS知名主机名
- DNS SRV记录
- TXT记录中的DNS服务器URI
请求代理有关的问题
代理URI和服务器URI不同
客户端向服务器而不是代理发送请求的时候,HTTP请求报文的URI会有所不同
客户端向Web服务器发送请求的时候,请求行中只包含部分的URI
GET /index.html HTTP/1.0
User-Agent: SuperBrowser v1.3
当客户端向代理发送请求的时候,在请求行中包含完整的URI
GET http://www.marys-antiques.com/index.html HTTP/1.0
User-Agent: SuperBrowser v1.3
在原始的HTTP设计中,客户端会直接与单个服务器进行对话,不存在虚拟主机,也没有为大力制定什么规则,单个服务器都知道自己的主机名和端口,所以,为了避免发送冗余信息,客户端只发送部分URI即可,无需发送方案和主机
拦截代理是网络流量中的代理服务器,它会拦截从客户端发往服务器的请求,并提供一个缓存响应,或对其进行转发
代理既可以处理代理请求,也可以处理服务器请求
- 如果提供的是完整的URI,代理就应该使用这个完整的URI
- 如果提供的是部分URI,而且有Host首部,就应该使用Host首部来确定原始服务器的名字和端口号
- 如果提供的是部分 URI,而且没有 Host 首部,就要用其他方法来确定原始服务器
- 如果代理是代表原始服务器的替代物,可以用真实服务器的地址和端口号来配置代理;
- 如果流量被拦截了,而且拦截者也可以提供原始的IP地址和端口,代理就可以使用拦截技术提供的 IP 地址和端口号
- 如果所有方法都失败了,代理没有足够的信息来确定原始服务器,就必须返回一条错误报文(通常是建议用户升级到支持 Host 首部的现代浏览器)
没有代理的时候URI的解析
有显示代理时URI的解析
有拦截代理时URI的解析
- 用户在浏览器的 URI 地址窗口中输入 oreilly
- 浏览器通过 DNS 查找主机 oreilly,但DNS服务器失败了,并回送响应说明主机未知
- 浏览器进行了自动扩展,将 oreilly 转换成 www.oreilly.com
- 客户端已经成功解析了主机名,并有了一张 IP 地址列表。有些IP地址可能已经停用了,所以,通常客户端会尝试着连接每个 IP 地址,直到成功为止。对拦截代理来说,第一次连接请求就会被代理服务器拦截成功,不会连接到原始服务器上去。客户端认为它在与 Web 服务器进行成功的对话,但那个 Web 服务器可能甚至都不处于活跃状态
- 当代理最终准备与真正的原始服务器进行交互的时候,代理可能会发现那个ip地址实际上是一个停用的服务器,为了提供和浏览器相同级别的容错机制,代理可以通过解析host首部的主机名,也可以通过对ip地址的反向dns查找来尝试其他ip地址,将浏览器配置为显示代理的时候,会依赖代理的容错机制,对于拦截和响应的代理实现来说,在dns解析到已停用服务器的时候,提供容错机制是很重要的
追踪报文
将web请求从客户端传送到服务器的路径上,经过两个或者多个代理是非常常见的,很多公司会使用缓存代理服务器来访问互联网,而且大型的isp都会使用代理缓存来实现提高性能并实现各种特性,想到比例的web请求都是通过代理转发的。