学习笔记 HTTP权威指南 第6章 代理

267 阅读8分钟

打开一个网站并不是直接访问的Web服务器,基本上都是通过代理进行访问的.所以这一章就介绍了代理种类,代理的工作方式,为何要使用代理,如何设置代理,代理存在的问题及如何追踪检测代理

6.1 代理是什么

代理是客户端和服务器之间的一个中间人,既是客户端也是服务器...

  • 代理分哪几类

    • 私有代理
    • 共享代理
  • 共享代理的应用

    • 调整缓存服务器(CDN)
  • 私有代理的应用

    • 扩展浏览器特性
    • 提高性能
    • 免费ISP的主机广告
  • 代理与网关的区别

    • 代理只是接收和转发HTTP请求
    • 网关接收HTTP请求,但可以转换成其他任何协议获取数据进行返回
    • 实质上,现代的代理也支持协议转换功能了

6.2 为什么使用代理

  • 儿童过滤器
  • 文档访问控制
    • 在大型企业和分布式机构中应用
    • 集中控制每台电脑的联网能力
  • 防火墙
    • 限制进出流量
    • 对进入报文扫描杀毒
  • Web缓存
    • CDN
  • 反向代理
    • 保障源服务器安全
    • 提升访问性能(着实不知道是怎么提升性能的...难道就是把处理请求和获取资源的运算分开这么简单?)
  • 内容路由器
    • 这个没看懂
  • 转码器
    • 压缩视频图片大小
    • 翻译英文到中文等
    • PC版转成WAP版
  • 匿名者
    • 删除客户端身份信息进行再向下转发

6.3 代理的工作方式

6.3.1 代理可以部署在什么地方

  • 出口代理: 放在本地网络的出口点
    • 控制本地网络和Internet之间的流量
    • 防火墙
    • 控制上传下载速度
    • 儿童过滤
  • 访问(入口)代理: 放在ISP访问点上
    • 处理客户端的聚合请求
    • CDN
  • 反向代理: 放在Web服务器之前
    • 提高服务器的安全和性能
  • 网络交换代理: 放在对等交换节点上
    • 可是对等交换节点是啥,难道是国与国之间的连接点么?

6.3.2 代理的层次结构

从客户端到服务器之间会有N个串联的代理.正常情况下,报文会按照串连顺序转发报文.

  • 靠近客户端的叫子代理

  • 靠近服务器的叫父代理

  • 动态选择父代理(而不是选中串联中的父代理)的几种情况

    • 如果请求的是CDN资源,就会直接转发到CDN服务器
    • 如果请求的是压缩图片,就会转发到压缩服务器,由压缩服务器请求到图片压缩后回传
    • 如果父代理很慢,转发到其他父代理
    • 如果有一个离服务器更近的父代理,则转发到那儿去
    • 协议/类型路由: 没看懂

6.3.3 代理是如何获取流量的

  • 修改客户端
    • 直接修改浏览器的代理设置,让流量从代理走
  • 修改网络
    • 拦截代理(如路由器,交换机等)直接把流量转发到其他代理身上
  • 修改DNS
    • 直接把IP解析到一个代理上(反向代理),而不是原来的服务器
  • 修改服务器
    • 服务器直接返回一个重定向到代理上

6.4 如何设置代理

  • 手动设置
    • 即在浏览器的代理设置里面手动添加
  • PAC文件自动配置
    • 就是把手动设置升级为JS代码管理,做个条件判断
    • 因为没有代理网址,所以无法测试,具体语法参考P149
  • WPAD协议
    • 相当于不用自己写PAC文件,而是自动搜索PAC文件
    • 这个感觉有点复杂,且生产中短时间用不到,所以不做笔记了

6.5 代理存在的问题

6.5.1 代理会影响请求URI

  • 请求中的URI有什么影响

    • 客户端默认会发送相对路径的请求连接
    • 显示代理会要求客户端发送完整路径的请求连接
  • 为什么要求发送完整的URI

    • HTTP设计之初没有代理,所以只发送相对路径也能找到资源
    • 但是代理出来后,还用相对路径的话,就会连不上服务器
    • 网关也无法定位资源

6.5.2 代理会要求HOST

  • 为什么需要HOST
    • HTTP设计之初,一台设备就是一个服务器
    • 虚拟主机出来后,请求了一个资源,不知道是定位到哪个服务器
    • 所以要用HOST来识别

6.5.3 代理会收到相对URI

  • 哪些情况下代理会收到相对URI请求
    • 客户端没有显示设置代理
    • 不知情的情况下连接到代理上了
      • 反向代理
      • 拦截代理
  • 代理接收到相对URI时怎么处理
    • 如果有HOST首部,则用HOST首部拼接相对URI再转发
    • 如果是反向代理,则用真实IP拼接相对URI映射资源
    • 如果是拦截代理且能获取真实IP,则用真实IP拼接相对URI再转发
    • 否则返回错误报文,要求浏览器升级到支持HOST的版本

6.5.4 修改URI导致访问失败

有些代理在转发的时候,会按照规范校准报文,期望是好的,但是经常导致访问失败

书上是这样讲的,反正我没见过~~~~~~

这里其实涉及到了一个为人处事的道理,和前面提到的一个严于律己,宽以待人的道理差不多.对别人提供的东西,不做强制要求,即使别人的不符合规范,因为可以他们那种形式能够正常工作,而你按照正确的规范去修改了,结果反而导致别人无法工作了.其中说到了一个名称,协议警察.这好像和说美国是世界警察一样的道理..

6.5.5 对URI自动扩展的影响

  • URI自动扩展的流程是什么

    • 用户输入一个单词
    • 用这个单词去DNS上解析,解析成功直接访问IP(IP会有多个,会访问到成功的那个为止)
    • 解析失败则添加www.开头和.com结尾
    • 再去DNS解析,解析成功直接访问IP
  • 为什么会对URI自动扩展有影响

    • 默认会自动扩展
    • 显示代理后就不会自动扩展了
    • 拦截代理可能导致连接失败
  • 为什么拦截代理可能会导致连接失败

    • 浏览器自动扩展出了IP地址
      • 然则DNS出来的IP地址是一个列表
      • 前面几个IP地址可能失效
      • 所以要一个一个试,试到正确为止
    • 结果请求被发到了拦截代理上
    • 这时浏览器认为连接成功
    • 但这时拦截代理与IP握手时才发现连接失败
  • 怎么解决拦截代理导致失败的可能

    • 拦截代理发现连接失败时
    • 要反查DNS获取IP列表再尝试连接
    • 或者采用其他容错机制

6.6 如何检测代理

6.6.1 Via首部

  • Via是什么
    • 列出了报文途径的每个中间节点的有关信息

其实如果我是一个中间节点,但是我不想留,你还不是拿我没办法.所以要打起战来这也是一个卵的功能

  • Via有什么用

    • 记录报文的转发
    • 诊断报文循环
    • 标志转发链路上参考者的协议能力
  • Via的语法

    • 由1到多个waypoint组成
    • waypoint = recieved-protocol协议版本 recieved-by主机名 [comment注释]
  • Via存在什么问题

    • 如果把防火墙后面的主机信息带出去,可能会被恶意利用
    • 比如基地组织可以猜到国防局里面有哪些部门:(...
  • 怎么解决这个问题

    • 代理(防火墙)转发时要隐藏真实名称
    • 然后维护一个真实虚假名称的对照表

6.6.2 Trace首部

  • 为什么要诊断代理网络

    • 报文可能会被代理修改,需要搞清楚谁改了
    • 实现代理的厂商越来越多,出现的问题越来越多,需要调试
  • Trace的作用

    • 观察报文经过了哪些代理
    • 代理对报文是怎样修改的
  • Trace如何工作的

    • Trace请求到达服务器后
    • 服务器会把收到的报文,原封不动的返回给客户端
  • Max-Forwards是什么

    • 是一个整数
    • 用于标注要经过几跳代理
  • Max-Forwards怎么工作

    • 客户端发出一个正整数
    • 每经过一个代理减1后再转发
    • 收到0的时候,不管是不是服务器,都要返回响应给客户端

6.7 代理认证

  • 为什么需要代理认证

    • 提供访问权限控制
    • 比如晚上只有老师才能访问网络
  • 代理认证怎么工作

    • 代理收到请求
    • 代理返回407 Proxy-Authorization
    • 客户端提供Proxy-Authorization首部
    • 代理认证首部,通过则转发
  • 代理认证存在的问题

    • 如果传输链路上有多个代理
    • 且每个代理都要求进行认证时,就比较麻烦了

6.8 代理的互操作性

  • 为什么会存在互操作性问题

    • 代理由不同的厂商实现,实现的标准不一样,所以之间沟通肯定会存在问题
    • 其实我都不知道互操作性是个啥玩意儿...咳,不追究了,反正就是容易出错的意思
  • 如何避免互操作性问题

    • 对于不认识的首部,直接转发
    • 维持同名首部的相对顺序

这里还介绍了OPTIONS方法和Allow首部,可是他们和互操作性有毛关系啊?