2016-1-28 图解HTTP(03)

        6.2.5 非HTTP/1.1首部字段
        不限于RFC2616中定义的47种首部字段,还有Cookie、Set-Cookie和Content-Disposition等在其他RFC中首部字段
        RFC4229 HTTP Header Field Registrations中
        6.2.6 End-to-end首部和 Hop-by-hop首部
        HTTP首部字段将定义成缓存代理和非缓存代理
        端到端首部    End-to-end Header
            在此类别中的首部字段会转发给请求 响应对应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发
        逐跳首部 Hop-by-hop Header
             在此类别中的首部字段只对单次转发有效,会因通过缓存或代理而不再转发。HTTP/1.1 和之后版本中,如果想要使用hop-by-hop首部,需要提供Connection首部字段
             hop-by-hop header
            ●    Connection
            ● Keep-Alive
            ● Proxy-Authenticate
            ● Proxy-Authorization
            ● Trailer
            ● TE
            ● Transfer-Encoding
            ● Upgrade
    6.3 HTTP/1.1 通用首部字段
    6.3.1 Cache-Control
        通过指定该首部字段,就能操作缓存工作机制
        Cache-Control : public
            当指定使用public指令时,则明确表示其他用户也可以利用缓存
        Cache-Control : private
            当指定使用private时,响应只以特定的用户作为对象,这与public指令刚好相反
        缓存服务器会对该特定用户提供资源的缓存服务,对于其他用户发送过来的请求,代理服务器则不会返回缓存
        Cache-Control : no-cache
            使用no-cache指令的目的是防止从缓存中返回过期的资源。
            客户端发送的请求中如果包含no-cache指令,则客户端将不会接收缓存过的响应
        Cache-Control : no-cache=Location
            无参数值得首部字段可以使用缓存。
        控制可执行缓存的对象的指令
        Cache-Control : no-store
        当使用no-store指令时,暗示请求或响应中包含机密信息。因此,该指令规定缓存不能再本地存储请求或响应的一部分。
        
        指定缓存期限和认证的指令
        s-maxage指令
        Cache-Control :s-maxage=604800(单位:秒)
        s-maxage指令的功能和max-age指令相同。不同点是,s-maxage指令适用于供多位用户使用的公共缓存服务器。
            当使用s-maxage指令后,则直接忽略对Expires字段及max-age指令的处理。
        max-age指令
        Cache-Control : max-age=604800(单位:秒)
            当客户端发送请求中包含max-age指令时,如果判定缓存资源的缓存时间数值比指定时间的数值更小时,那么客户端就接收缓存的资源。
            当指定max-age的值为0,那么缓存服务器通常需要将请求转给源服务器。
            应用HTTP/1.1版本的缓存服务器遇到同事存在Expires首部字段的情况时,会优先处理max-age指令。 而在 HTTP/1.0版本却和1.1版本刚好相反
        min-fresh指令
        Cache-Control : min-fresh=60(单位:秒)
            要求缓存服务器返回至少还未过指定时间的缓存资源。
        max-stale指令
        Cache-Control : max-stale=3600(单位:秒)
            使用max-stale可指示缓存资源,即使过期也照常接收
            如果指令未指定参数值,那么无论过了多久,客户端都会接收响应;如果指定了具体数值,那么即使过期了,只要处于max-stale指定时间内,仍旧会被客户端接收
        only-if-cached指令
            表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回。换言之,该指令要求缓存服务器不重新加载响应,也不会再次确认资源的有效性。
                若发生请求缓存服务器的本地缓存无响应,则返回504 GateWay Timeout
        must-revalidate指令
            使用该指令,代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效。
            若代理无法连通源服务器再次获取有效资源的话,缓存必须给客户端发一条504状态码
            另外,使用must-revalidate请求会忽略max-stale指令,即使已经在首部使用了max-stale,也不会再有效果
        proxy-revalidate指令
            该指令要去所有的缓存服务器爱接收到客户端带有该指令的请求返回响应之前,必须先验证缓存的有效性
        no-transform指令 : 使用该指令规定,无论是在请求还是在响应,缓存都不能改变实体主体的媒体类型
            这样可以防止缓存或者代理压缩图片等类似操作
        Cache-Control扩展
        cache-extension token
        Cache-Control : private, community=“UCI”
            通过cache-extension标记(token),可以扩展Cache-Control首部字段内的指令
            例如,Cache-Control首部字段没有community指令,借助extension tokens实现了该指令的添加。如果缓存服务器不能理解,就会忽略该指令。
    6.3.2 Connection
        控制不在转发给代理的首部字段
            在客户端发送请求和服务器返回响应内,使用Connection首部字段,可控制不再转发给代理的首部字段。
        管理持久连接
            HTTP/1.1版本默认连接都是持久连接。为此,客户端会在持久连接上连续发送请求。
            当服务器端想明确断开连接时,则指定Connection首部字段的值为Close
            HTTP/1.1之前的版本默认都是非持久连接,要使用Keep-Alive指定为持久连接
    6.3.3 Date
        表明创建HTTP报文的日期和时间
        HTTP/1.1 协议使用在RFC1123中规定的日期时间格式,
        Date: Tue, 03 Jul 2013 04:20:59 GMT
        之前的HTTP版本使用RFC850中定义的格式
        Date: Tue, 03-Jul-12 04:40:59 GMT
        
        除此之外,还有一种和C标准库内asctime()函数的输出格式一样的
        Date: Tue Jul 03 04:40:59 2012
        
    6.3.4 Pragma
        Pragma是HTTP/1.1 之前版本的历史遗留字段,仅作为与HTTP/1.0向后兼容而定义
        所有的中间服务器如果都能以HTTP/1.1为基准,那直接采用Cache-Control:no-cache指定缓存的处理方式是最理想的,
            但是要整体掌握全部中间服务器使用的HTTP协议版本是不现实的,因此发送请求时会有以下两个首部字段
            Cache-Control:no-cache
            Pragma: no-cache
    6.3.5 Trailer
        该首部字段会事先说明在报文主体记录了哪些首部字段。该首部字段可应用在HTTP/1.1 版本分块传输编码时。
    6.3.6 Transfer-Encoding
        该字段规定了传输报文主体时采用的编码方式
            HTTP/1.1的传输编码方式仅对分块传输编码有效
    6.3.7 Upgrade
        该首部字段用于检测HTTP协议及其他协议是否可以使用更高的版本通信,其参数值可以用来指定一个完全不同的通信协议
    6.3.8 Via
        使用Via首部字段是为了追踪客户端与服务器之间的请求和响应报文的传输路径
            在报文经过代理或网关时,首先会在Via中附加该服务器的信息,然后再转发。这个做法和traceroute及电子邮件Received首部的工作机制类似
        还可以避免请求回环的发生    
        该首部是为了追踪传输路径,所以经常和TRACE方法一起使用。
    6.3.9 Warning
        该首部字段是从HTTP/1.0的响应首部(Retry-After)演变过来的该首部通常会告知用户一些关于缓存相关的问题警告
        Warning:[警告码][警告的主机:端口号] "[警告内容]" ([日期时间])
        警告码具备可扩展性,今后有可能追加新的警告码
            110 Response is stale(响应已过期) 代理返回已过期的资源
            111 Revalidation failed(再验证失败) 代理再验证资源有效性时失败(服务器无法到达等原因)
          112 Disconnection operation (断开连接操作)代理与互联网连接被故意切断
          113 Heuristic expiration(试探性过期) 响应的使用期超过24小时(有效缓存的设定时间大于24小时的情况下)
          199 Miscellaneous warning(杂项警告) 任意的警告内容
          214 Transformation applied(使用了转换) 代理对内容编码或媒体类型等执行了某些处理时
          299 Miscellaneous persistent warning(持久杂项警告)任意的警告内容
    6.4 请求首部字段
        该字段用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等。
    6.4.1 Accept
        通知服务器用户代理能够处理的媒体类型及媒体类型的相对优先级。可以使用type/subtype这种形式,一次指定多种媒体类型。
        文本文件 text/html , text/plain, text/css... application/xhtml+xml, application/xml...
        图片 image/jpeg, image/gif, image/png...
        视频文件 video/mpeg, video/quicktime
        应用程序的二进制文件 application/octet-stream, application/zip...
        若想要给显示媒体类型个增加优先级,则使用q= 来额外表示权重值,用分号(;)进行分割。权重值q的范围是 0 ~ 1 且1为最大值,不指定时,默认为q=1.0
    6.4.2 Accept-CharSet
        首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。另外,一次性可以指定多种字符集。
        与首部字段Accept相同的可用权重q值来表示相对优先级。
    6.4.3 Accept-Encoding
        该首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。一次可指定多种内容编码
            gzip 由文件压缩程序gzip生成的编码格式,
            compress    由Unix文件压缩程序compress生成的编码格式
            deflate        组合使用zlib格式及由deflate压缩算法生成的编码格式
            identity    不执行压缩或不会变化的默认编码格式
    6.4.4 Accept-Language
        用来告知服务器用户代理能够处理的自然语言集,以及自然语言集的相对优先级。可一次指定多种自然语言集。
        和Accept一样,用权重值q来表示相对优先级。
    6.4.6 Authorization
        该首部字段用来告知服务器,用户代理的认证信息(证书值)。通常,想要通过服务器认证的用户代理会在接收到返回的401状态码响应后,把首部字段Authorization加入请求中。
    6.4.6 Except
        客户端使用首部字段Except用来告知服务器,期望出现的某种特定行为。因服务器无法理解客户端的期望做出回应而发生错误时,会返回状态码417Expection Failed
        客户端可以利用该首部字段值,写明所期望的扩展。
    6.4.7 From
        用来告知服务器使用用户代理的用户的电子邮件地址。通常,就是为了显示搜索引擎等用户代理的负责人的电子邮件联系方式。
        使用代理时,尽可能包含Form首部字段。
    6.4.8 Host
        虚拟主机运行在同一个IP上,因此使用首部字段Host加以区分。
        首部字段host会告知服务器,请求的资源所在的互联网主机名和端口号。Host首部字段再HTTP/1.1 规范内是唯一一个必须被包含在请求内的首部字段。
        首部字段Host和以单台服务器分配多个域名的虚拟主机的工作机制有密切关联,这是首部字段Host必须存在的意义。
        请求被发送至服务器时,请求中的主机名会用IP地址直接替换解决。如果这时,相同的IP地址下部署运行着多个域名,那么服务器就会无法理解究竟是哪个域名对应的请求。这是就需要首部字段host来明确指出请求的主机名。
        若服务器未设定主机名,那么直接发送一个空值即可。 Host :
    6.4.9 If-Match
        形如If-XXX 这样样式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。
        首部字段If-Match,属附带条件之一,它会告知服务器匹配资源所用的实体标记(ETag)值。这时服务器无法使用ETag值
        服务器会对比If-Match的字段值和资源的ETag值,仅当两者一致时,才会执行请求。反之,返回412 Precondition Failed
    6.4.10 If-Modified-Since
        属附带条件之一,它会告知服务器若该字段值早于资源的更新时间,则希望能处理该请求。
        而在指定该字段日期后,如果请求的资源都没有过更新,则返回305 Not Modified的响应。
        该状态码用于确认代理或客户端拥有本地资源的有效性。获取资源的更新日期时间,可通过确认首部字段来确定。
    6.4.11 If-None-Match
        只有If-None-Match的字段值与ETag值不一致时,可处理该请求。与If-Match首部字段德请求相反。
        在GET或HEAD方法中使用首部字段If-None-Match可获得最新的资源。因此,这与使用首部字段If-Modified-Since时有些类似。
    6.4.12 If-Range
        If-Range字段值若是跟ETag值或更新的日期时间匹配一致,那么就作为范围请求处理。
        他告知服务器若指定的If-Range字段值(ETage值或者时间)和请求资源的ETage值或时间相一致时,则作为范围请求处理。反之,返回全体资源。
        如果不使用首部字段If-Range则需要进行两次处理。
        服务器端的资源如果更新,那客户端持有资源中的一部分也会随之无效,当然,范围请求作为前提是无效的。这时,服务器会暂且以状态码412Precondition Failed作为响应返回,
            其目的是催促客户端再次发送请求。这样一来,与使用首部字段If-Range比起来,就需要花费两倍的功夫。
    6.4.13 If-Unmodified-Since
        该首部字段和首部字段If-Modified-Since的作用相反。它的作用是告知服务器,指定的请求资源只有在字段内指定的日期时间之后,未发生更新的情况下,才能处理请求。
        如果在指定日期时间后发生了更新,则以状态码412 Precondition Failed作为响应返回。
    6.4.14 Max-Forwards
        通过TRACE方法或者OPTIONS方法,发送包含首部字段Max-Forwards请求时,该字段以十进制整数形式指定可经过的服务器最大的数目。服务器在往下一个服务器转发请求之前,Max-Forwards的值减1后重新赋值。
        当服务器接收到Max-Forwards值为0的请求时,则不进行转发,而是直接返回响应。
        使用HTTP协议通信时,请求可能会经过代理等多台服务器。途中,如果地阿里服务器由于某些原因导致请求转发失败,客户端也就等不到服务器返回的响应了。
    6.4.15 Proxy-Authorization
        接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization的请求,以便告知服务器认证所需要的信息。
    6.4.16 Range
        对于只需获取部分资源的范围请求,包含首部字段Range即可告知服务器资源的指定范围。
        接收到附带Range首部字段请求的服务器,会在处理请求之后返回状态码为206 Partial Content的响应。无法处理范围请求时,则会返回状态码 200 OK的响应及全部资源。
    6.4.17 Referer
        只要查看Referer就能知道请求URI是从哪个Web页面发起的
        该首部字段会告知服务器请求的原始资源的URI。
        客户端一般都会发送Referer给服务器。但当直接在浏览器的地址栏输入URI,或处于安全性的考虑时,也可以不发送该首部字段。
        因为原始资源的URI中查询字符串可能含有ID和密码等密保信息,要是写进Referer转发给其他服务器,则可能导致保密信息泄露。
        另外,Referer的正确拼写应该是Referrer,但不知为何大家一致用这个错误书写
    6.4.18 TE
        TE : gzip, deflate; q = 0.5
        TE会告知服务器客户端能够处理响应的传输编码方式及相对优先级。它和首部字段Accept-Encoding的功能很相像,但是用于传输编码。
        TE除指定传输编码之外,还可以指定伴随trailer子弹的分块传输编码的方式。应用后者时,只需把trailers赋值给该字段值。
    6.4.19 User-AgentS
         该字段User-Agent会将创建请求的浏览器和用户代理名称等信息传达给服务器。
         由网络爬虫发起请求时,可能会在字段内添加爬虫作者的电子邮件地址。此外,如果请求经过代理,那么中间也很可能被添加上代理服务器的名称。
    6.5 响应首部字段
        由服务器端向客户端返回响应报文中所使用的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加请求等信息。
    6.5.1 Accept-Ranges
        用来告知客户端服务器是否能处理范围请求,以指定获取服务器顿的某个部分的资源。
        可指定的字段值有两种,可处理范围请求时指定为bytes,反之则指定为none。
    6.5.2 Age
        Age能告知客户端,源服务器在多久前创建了响应。字段值的单位    为 second
        若创建该响应的服务器是缓存服务器,Age值是指缓存后的响应再次发起认证到认证完成的时间值。代理创建响应时必须加上首部字段Age
    6.5.3 ETage
        资源的URI虽没有改变,但是当资源更新后,ETag值会随只改变
        ETage能告知客户端实体标识。它是一种可将资源以字符串形式作为唯一标识的方式。服务器会为每份资源分配对应的ETag值。
        另外,当资源更新时,ETag值也需要更新。生成ETag值时,并没有统一的算法规则,而仅仅是由服务器来分配。
        但是要注意,资源的URI虽然相同,但中文版、英文版对应的资源是不同的。若在下载过程中,出现连接中断,在连接的情况,都会依照ETag值来指定资源。
        强ETag 和 弱ETag
            强ETag值,不论实体发生多么细微的变化都会改变其值。
                ETag: "usagi-1234"
            弱ETag值,只用于提示资源是否相同。只有资源发生了根本改变,产生了差异时,才会改变ETag值。这时,会在字段值最开始附加W/
                ETag: W/"usagi-1234"
    6.5.4 Location
        使用Location可以将响应接收方引导至某个与请求URI位置不同的资源。基本上,该字段会配合3XX,Redirection的响应,提供重定向的URI。
        几乎所有的浏览器在接收到包含首部字段Location的响应后,都会强制性地尝试对已提示的重定向资源的访问。
    6.5.5 Proxy-Authenticate
        该字段会把由代理服务器所要求的认证信息发送给客户端。
        它与客户端和服务器之间的HTTP访问认账的行为相似,不同之处在于其认证行为是在客户端与代理之间进行的。而客户端和服务器之间进行认证时,首部字段WWW-Authorization有着相同的作用。
    6.5.6 Retry-After
        Retry-After: 120
        首部字段Retry-After告知客户端应该在多久之后再次发送请求。主要配合状态码503 Service Unavailable响应,或 3xx Reditrect响应一起。
        字段值可以指定为具体的日期时间,也可以是创建响应后的秒数
    6.5.7 Server
        Server告知客户端与当前服务器安装的HTTP服务器应用程序的信息。不单单会标出服务器上的软件应用名称,还有可能包含版本号和安装时启用的可选项。
        Server: Apache/2.2.6 (Unix) PHP/5.2.5
    6.5.8 Vary
        Vary可对缓存进行控制,源服务器会向代理服务器传达关于本地缓存使用方法的命令。
        从代理服务器接收到源服务器返回包含Vary指定项的响应后,若再要进行缓存,仅对请求中含有相同Vary指定首部字段德请求返回缓存。即使对相同资源发起请求,但由于Vary指定的首部字段不相同,因此必须要从源服务器重新获取资源
    6.5.9 WWW-Authenticate
        用于HTTP访问认证。它会告知客户端适用于访问请求URI所指定资源的认证方案和带参数提示的质询。状态码41 Unauthorized响应中,坑定带有首部字段WWW-authenticate
    6.6 实体首部字段
    包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关信息。
    6.6.1 Allow
        Allow: GET, HEAD
        首部字段Allow用于通知客户端能够支持Request-URI指定资源的所有HTTP方法
        当服务器接收到不支持的HTTP方法时,会以状态码405 Method Not Allowed作为响应返回。与此同时,还会把所有能支持的HTTP方法写入首部字段Allow后返回。
    6.6.2 Content-Encoding
        告知客户端服务器对实体的主体部分选用内容编码方式。内容编码是指在不丢失实体信息的前提下所进行的压缩。
        采用的编码方式在6.4.3简绍的4种方式 gzip compress deflate identity
    6.6.3 Content-Language
        告知客户端,实体主体使用的自然语言
    6.6.4 Content-Length
        表明实体主体部分的大小,单位是字节。对实体主体进行内容编码传输时,不能再使用Content-Lenght首部字段。
    6.6.5 Content-Location
        给出了与报文主体部分相对应的URL。和首部Location不同,Content-Length表示的是报文主体返回资源对应的URI
    6.6.6 Content-MD5
        客户端会对接收的报文主体执行相同的MD5算法,然后与首部字段Content-MD5的字段值比较。
        首部字段Content-MD5是一串有MD5算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输达到。
        对报文主体执行MD5算法获得的128为二进制数,再通过Base64编码后将结果写入Content-MD5字段值。
        采用这种方法,对内容上的偶发性改变是无从查证的。也无法检测出恶意篡改。
    6.6.7 Content-Range
        返回响应时使用的首部字段Content-Range,能告知客户端作为响应返回的实体的哪个部分符合范围请求。
    6.6.8 Content-Type
        该首部字段说明了实体主体内对象的媒体类型。和首部字段Accept一样。
    6.6.9 Expires
        Expires会将资源失效的日期告知客户端。缓存服务器在接收到含有首部字段Expires的响应后,会以缓存来应答请求,在Expires字段指定的时间之前,响应的副本会一直被保存。 当超过指定时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。
        源服务器不希望缓存服务器对资源缓存时,最后在Expires字段内写入与首部字段Date相同的时间值。
        但当Cache-Control有指定max-age指令时,比起首部字段Expires,会优先处理max-age指令。
    6.6.10 Last-Modified
        指明资源的最后修改时间。一般来说,这个值就是Request-URI指定资源被修改的时间。
    6.7 为Cookie服务的首部字段
        管理服务器与客户端之间状态的Cookie,虽然没有被编入HTTP/1.1,但在Web网站方面取得了广泛的应用。
        Cookie的工作机制是用户识别及状态管理。Web网站为了管理用户的状态会通过Web浏览器,把一些数据临时写入用户的计算机内。接着当用户访问该Web网站时,可以通过通信方式取回之前发送的Cookie
        调用Cookie时,由于可校验Cookie的有效期,以及发送方的域、路径、协议等信息,所以正规发布的Cookie内的数据不会因来自其他Web站点或者攻击者的攻击而泄露。
        至2013年5月,cookie的规格标准文档有以下4中
        网景公司设计并开发了Cookie。目前最为普及的Cookie方式以此为基准。
    6.7.1 Set-Cookie
        当服务器准备开始管理客户端的状态时,会事先告知各种信息。
        NAME=VALUE 赋予Cookie的名称和其值(必须项)
        expires=DATE Cookie的有效期,若不明确,则默认为浏览器关闭前为止
        path=PATH 将服务器上的文件目录作为Cookie的使用对象
        domain=域名    作为Cookie适用对象
    6.7.2 Cookie
        首部字段 Cookie 会告知服务器,当客户端想获得 HTTP 状态管理支持时,就会在请求中包含从服务器接收到的 Cookie。接收到多个
        Cookie 时,同样可以以多个 Cookie 形式发送。
    6.8 其他首部字段
        ● X-Frame-Options
        首部字段 X-Frame-Options 属于 HTTP 响应首部,用于控制网站内
        容在其他 Web 网站的 Frame 标签内的显示问题。其主要目的是为了防
        止点击劫持(clickjacking)攻击。
        ● X-XSS-Protection
            首部字段 X-XSS-Protection 属于 HTTP 响应首部,它是针对跨站脚
            本攻击(XSS)的一种对策,用于控制浏览器 XSS 防护机制的开关。
            首部字段 X-XSS-Protection 可指定的字段值如下。
                ● 0 :将 XSS 过滤设置成无效状态
                ● 1 :将 XSS 过滤设置成有效状态
        ● DNT
        首部字段 DNT 属于 HTTP 请求首部,其中 DNT 是 Do Not Track
        的简称,意为拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。
        首部字段 DNT 可指定的字段值如下。
            ● 0 :同意被追踪
            ● 1 :拒绝被追踪
        ● P3P
        首部字段 P3P 属于 HTTP 相应首部,通过利用 P3P(The Platform
        for Privacy Preferences,在线隐私偏好平台)技术,可以让 Web 网站上
        的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。
        要进行 P3P 的设定,需按以下操作步骤进行。
            步骤 1: 创建 P3P 隐私
            步骤 2: 创建 P3P 隐私对照文件后,保存命名在 /w3c/p3p.xml
            步骤 3: 从 P3P 隐私中新建 Compact policies 后,输出到 HTTP 响应中

原文地址:https://www.cnblogs.com/ya-cpp/p/5167749.html