HTTP权威指南笔记(Http结构)

原创 wuzinong 随笔 学习笔记 370阅读 2017-12-15 17:10:08 举报

五:Web服务器

1.实际的Web服务器会做些什么
  1.1 建立连接:接受一个客户端连接,或者如果不希望与这个客户端建立连接,就将其关闭

   1.2 接受请求:从网络中读取一条HTTP请求报文   
        1.2.1 解析请求行,查找请求方法,指定资源标识符(URI)以及版本号。各项之间由一个空格分隔,并以一个回车换行(CRLF)序列作为行的结束
        1.2.1 读取以CRLF结尾的报文首部
        1.2.2 检测到以CRLF结尾的,标识符首部结束的空行(如果有的话)
        1.2.3 如果有的话(长度由Content-Length首部指定),读取请求主体

HTTP权威指南笔记(Http结构)

        报文的内部表示法:
        有些web服务器还会用便于进行报文操作的内部数据结构来存储请求报文。比如数据结构中可能包含有指向请求报文中各个片段的指针及其长度,这样就可以将

这些首部存放在一个款速查询表中,以便快速访问特定首部的具体指了

HTTP权威指南笔记(Http结构)

       因为请求可能会在任意时刻到达,所以Web服务器会不停地观察有无新的Web请求。不同的Web服务器结构会以不同的方式为请求服务

HTTP权威指南笔记(Http结构)

  1.3 处理请求:对请求报文进行解释,并采取行动。

  1.4 访问资源:访问报文中指定的资源

  1.5 构建响应:创建带有正确首部的HTTP响应报文

  1.6 发送响应:将响应回送给客户端

  1.7 记录事务处理过程:将与已完成事务有关的内容记录在一个日志文件中。

HTTP权威指南笔记(Http结构)

六:代理

  Web代理(proxy)服务是网络的中间实体。代理位于客户端和服务器之间,扮演"中间人"的角色,在各端点之间来回传送HTTP报文。
  代理与网关之间的区别:

HTTP权威指南笔记(Http结构)

  为什么使用代理?
  1.儿童过滤

  2.文档访问控制

HTTP权威指南笔记(Http结构)

  3.安全防火墙

HTTP权威指南笔记(Http结构)

  4.Web缓存

HTTP权威指南笔记(Http结构)

  5.反向代理

HTTP权威指南笔记(Http结构)

  6.内容路由器

HTTP权威指南笔记(Http结构)

  7.转码器

HTTP权威指南笔记(Http结构)

  8.匿名者

HTTP权威指南笔记(Http结构)

七:缓存

  1.带宽瓶颈
     很多网络为本地网络客户端提供的带宽比为远程服务器提供的带宽要宽。客户端会以路径上最慢的网速访问服务器。如果客户端从一个快速局域网

的缓存中得到了一哥副本,那边缓存就可以提高性能。尤其是要传输比较大的文件时。

  2.瞬时拥塞
     缓存在破坏瞬时拥塞(Flash Crowds)时显得非常重要。很多人几乎同时去访问一个Web文档时,就会出现瞬时拥塞

  3.距离时延
     每台网络路由器都会增加因特网流量的时延。即使客户端和服务器之间没有太多的路由器,光速自身也会造成显著的时延

HTTP权威指南笔记(Http结构)

  4.命中和未命中的
     缓存我发保存世界上每份文档的副本。可以用已有的副本为某些到达缓存的请求提供服务。这被称为缓存命中。其他一些到达缓存的网络请求可能会由于

没有副本可用,而被转发给原始服务器。这被称为缓存未命中(cache miss)
4.1 再验证
原始服务器的内容可能会发生变化,缓存要不时对其进行检测,看看他们保存的副本是否仍是服务器上最新的副本。为了有效地进行再验证,HTTP定义了
一些特殊的请求,不用从服务器上获取整个对象,就可以快速检测数内容是否是最新的。缓存可以在任意时刻,以任意的频率对副本进行在验证。但由于缓存中通常会
包含数百万的文档,而且网络带宽是很珍贵的,所以大部分缓存只有在客户端发起请求,并且副本旧得足以需要检测的时候,才会对副本进行在验证

HTTP权威指南笔记(Http结构)
缓存对缓存的副本进行在验证时,会向原始服务器发送一个小的再验证请求。如果内容没有变化,服务器会以一个小的304 Not Modified进行响应。只要缓存
知道副本仍然有效,就会再次将副本标识为暂时新鲜的,并将副本提供给客户端这被称作在验证命中(revalidate hit)或缓慢命中(slow hit)。这种方式确实要与原始
服务器进行核对,所以会比单纯的缓存命中要慢,但它没有从服务器中获取对象数据,所以要比缓存未命中快一些。
HTTP为我们提供了几个用来对已缓存对象进行再验证的工具,但最常用的是If-Modified-Since首部。将这个首部添加到GET请求中去,就可以高速服务器,只
有在缓存了对象的副本之后,又对其进行了修改的情况下,才发送此对象

          4.1.1 再验证命中
             如果服务器对象未被修改,服务器会向客户端发送一个小的HTTP 304 Not Modified响应 .

HTTP权威指南笔记(Http结构)

          4.1.2 再验证未命中
             如果服务器对象与已缓存副本不同,服务器向客户端发送一条普通的、带有完整内容的HTTP 200 OK响应

          4.1.3 如果服务器对象已经被删除了,服务器就会回送一个404 Not Found响应,缓存也会将其副本删除

    4.2 命中率
          由缓存提供服务的请求所占的比例被称为缓存命中率(cache hit rate)

    4.3 字节命中率
          字节命中率表示的是缓存提供的字节在船上的所有字节中所占的比例。通过这种度量方式,可以得知节省流量的程度。100%的字节命中率说明每个

字节都来自缓存,没有流量流到因特网上去。文档命中率和字节命中率对缓存性能的评估都是很有用的。文档命中率说明阻止了多少通往外部网络的Web事务。
事务有一个通常都很大的固定时间成分,提高文档命中率对降低整体延迟很有好处。字节命中率说明阻止了多少字节传像因特网,提高字节命中率对节省带宽
很有利。

    4.4 区分命中和未命中的情况
           HTTP没有为用户提供一种手段来区分响应式缓存命中的还是访问原始服务器得到的,在这两种情况下,响应码都是200 OK,说明响应有主体部分。有些

商业代理缓存会在Via首部附加一些额外信息,以描述缓存中发生的情况。
客户端有一种方法可以判断响应是否来自缓存,就是用Data首部,将响应中Data首部的值与当前时间进行比较,如果响应中的日期值比较早,客户端
通常就可以认为这是一条缓存的响应,客户端也可以通过Age首部来检测缓存的响应,通过这个首部可以分辨出这条响应的使用期

    4.5 缓存的拓扑结构
           缓存可以使单个用户专用的,也可以是数千名用户共享的。专用缓存被称为私有缓存,共享的缓存被称为共有缓存

HTTP权威指南笔记(Http结构)

           4.5.1 私有缓存不需要很大的动力或存储空间,大多数浏览器都会讲常用文档缓存在你个人电脑的硬盘和内存中,并且允许用户去配置缓存的大小

和各种设置

           4.5.2 公有缓存是特殊的共享代理服务器,被称为缓存代理服务器,或者更常见地被称为代理缓存。公有缓存会接受来自多个用户的访问,所以

通过它可以更好地减少冗余流量

           4.5.3 代理缓存的层次结构
                     在实际中,实现层次化的缓存是很有意义的,这种结构中,在较小缓存中未命中的请求会被导向交大的父缓存

HTTP权威指南笔记(Http结构)
我们希望大部分用户都能在附近的第一级缓存中命中,如果没有命中,较大的父缓存可能能够处理 他们的请求,在缓存层次结构很深
的情况下,请求可能要穿过很长一溜缓存,但每个拦截代理都会添加一些性能损耗,当代理链路变得很长的时候,这种性能损耗会变得非常明显

          4.5.4 网状缓存,内容路由已经对等缓存
                    有些网络结构会构建复杂的网状缓存(cache mesh)而不是简单的缓存层次结构,网状缓存中的代理缓存直接会以更加复杂的方式进行对话,做出

动态的缓存通信决策,决定与那个父缓存进行对话,或者决定彻底绕开缓存,直接连接原始服务器。这种代理缓存会决定选择何种路由对内容进行访问、管理和传送
因此可以将其称为内容路由器(content router)
网状缓存中为内容路由设计的缓存(除了其他任务之外)要完成下列所有功能:
1.根据URL在父缓存或原始服务器之间进行动态选择
2.根据URL动态地选择一个特定的父缓存
3.前往父缓存之前,在本地缓存中搜索已缓存的副本
4.允许其他缓存对其缓存的部分内容进行访问,但不允许因特网流量通过他们的缓存

    4.5 缓存的处理步骤
         1.接受:缓存从网络中读取抵达的请求报文。
         2.解析:缓存对报文进行解析,提取出URL和各种首部。
         3.查询:缓存查看是否有本地副本可用,如果没有,就获取一份副本(并将其保存在本地)
         4.新鲜度检测:缓存查看已缓存副本是否足够新鲜,如果不是,就查询服务器是否有任何更新
         5.创建响应:缓存会用新的首部和已缓存的主体来构建一条响应报文
         6.发送:缓存通过网络将响应发回给客户端
         7.日志:缓存可选地创建一个日志文件条目来描述这个事务

HTTP权威指南笔记(Http结构)

   4.5 保持副本的新鲜
         HTTP有一些简单的机制可以在不要求服务器记住有哪些缓存拥有其文档副本的情况下,保持已缓存数据与服务器数据之间充分一致。HTTP将

这些简单的机制称为文档过期(document expiration) 和服务器在验证(server revalidation)

HTTP权威指南笔记(Http结构)

   4.6 控制缓存的能力
         服务器可以通过HTTP定义的几种方式来指定在文档过期之前可以将其缓存多长时间。按照优先级递减的顺序,服务器可以:
         1.附加一个Cache-Control:no-store 首部到响应中去
         2.附加一个Cache-Control:no-cache 首部到响应中去
         3.附加一个Cache-Control:must-revalidate 首部到响应中去
         4.附加一个Cache-Control:max-age 首部到响应中去
         5.附加一个Expires日期首部到响应中去
         6.不附加过期信息,让缓存确定自己的过期日期

      4.6.1 no-Store 与no-Cache响应首部(可以防止缓存提供未经证实的已缓存对象)
           Pragma:no-cache
           Cache-Control:no-store
           Cache-Control:no-cache
           标识为no-store的响应会禁止缓存对响应进行复制。缓存通常会像非缓存代理服务器一样,想客户端转发一条no-store响应,然后删除对象
           标识为no-cache的响应实际上是可以存储在本地缓存区中的。只是在与原始服务器进行新鲜度在验证之前,缓存不能将其提供给客户端使用
           HTTP/1.1中提供Pragma:no-cache首部是为了兼容与HTTP/1.0+ 除了与只理解Pragma:no-cache的HTTP/1.0应用进行交互时,HTTP1.1应用
           程序都应该使用Cache-Control:no-cache

       4.6.1 max-age响应首部
           Cache-Control:max-age 首部表示的是从服务器将文档传来之时起,可以认为此文档处于新鲜状态的秒数,还有个s-maxage首部,其行为与

max-age类似,但仅适用于共享(公有)缓存
Cache-Control:max-age=3600
Cache-Control:s-maxage=3600
服务器可以请求缓存不要缓存文档,或者将最大使用期设置为零,从而在每次访问的时候都进行刷新
Cache-Contorl:max-age=0
Cache-Control:s-maxage=0

       4.6.2 Expires响应首部
             不推荐使用Expires首部,它指定的是实际的过期日期而不是秒数。由于很多服务器的时钟都不同步,或者不正确,所以最好还是用剩余秒数,而不是

绝对时间来表示过期时间。可以通过计算过期值和日期值之间的秒数差来计算类似的新鲜生存期

      4.6.3 must-revalidate响应首部
             可以配置缓存,使其提供一些陈旧(过期)的对象,以提高性能。如果原始服务器希望缓存严格遵守过期信息,可以在原始响应中附加一个Cache-Control:

must-revalidate首部。此首部告诉缓存,在实现没有跟原始服务器进行再验证的情况下,不能提供这个对象的陈旧副本。缓存仍然可以随意提供新鲜的副本。如果在
缓存进行must-revalidate新鲜度检查时,原始服务器不可用,缓存就必须返回一条504 Gateway Timeout错误

HTTP权威指南笔记(Http结构)

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复