您的位置:首页 > 理论基础 > 计算机网络

http协议学习笔记(二)

2016-05-01 20:43 211 查看
这篇文章紧接上篇文章,讨论http报文header中的各种字段的含义。

HTTP首部字段按照实际用途被分为通用首部字段(General Header Fields)、请求首部字段(Request Header Fields)、响应首部字段(Response Header Fields)和实体首部字段(Entity Header Fields)。

按照首部字段在有代理时的不同行为,首部字段又可以分为端到端首部(End-to-end Header)和逐跳首部(Hop-by-hop Header)。逐跳首部只对单次转发有效,经过缓存或代理后不再转发,HTTP/1.1和之后的版本中,要使用逐跳首部时需提供Connection首部字段。端到端首部则会一直发送给最终接收目标。

通用首部字段

通用信息性首部字段

Connection,两个作用:

1、控制不再转发给代理的首部字段(即逐跳首部)。应用程序会删除报文中所有在Connection首部中出现过的首部,如下示例:

# 客户端请求首部
GET / HTTP/1.1
Upgrade: HTTP/1.1
Connection: Upgrade
# 经过代理服务器后发送给Web服务器的首部
GET / HTTP/1.1


2、管理持久连接 

Connection: close HTTP/1.1默认都是持久连接,使用close后会明确断开连接

Connection: keep-alive HTTP/1.1之前的版本默认都是非持久连接,使用keep-alive可以维持持久连接

Date 创建HTTP报文的时间和日期
Trailer 说明在报文主体后记录了哪些首部字段
Transfer-Encoding 传输报文主体时采用的编码方式
Upgrade 用于检测HTTP协议及其他协议是否可使用更高的版本进行通信
通用缓存首部字段

1、Cache-Control 管理缓存信息,是HTTP/1.1引入的一个复杂首部。 

a、请求指令:

no-cache 客户端不接收缓存过的响应
no-store 不缓存响应或请求的任何内容
max-age = [秒] 告诉缓存服务器,如果缓存时间没超过指定时间,就返回缓存
max-stale( = [秒]) 即使缓存过期,只要小于该值,也照常接收
min-fresh = [秒]
no-transform 缓存不能改变实体主体的媒体类型
only-if-cached 只有缓存服务器有缓存指定资源时才返回,否则,返回504 Gateway Timeout
cache-extension
补充:Cache-Control: no-cache — 强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验。这对于需要确认认证的应用很有用(可以和public结合使用),或者严格要求使用最新数据 的应用(不惜牺牲使用缓存的所有好处) 
Pragma 当"no-cache"出现在请求消息中时,应用程序应当向原始服务器推送此请求,即使它已 经在上次请求时缓存了一份拷贝。这样将保证客户端能接收到最权威的回应。它也用来在客户端发现其缓存中拷贝不可用或过期时,对拷贝进行强制刷新。 
max-age>0 时 直接从游览器缓存中提取 
max-age<=0 时 向server 发送http请求,确认该资源是否有修改。有的话返回200,无的话返回304。

b、响应指令:

public 其他用户也可以使用该缓存
private 只有特定用户能使用该缓存
no-cache 缓存服务器可以缓存,但是每次提供给客户端前都必须与服务器确认有效期
no-store 不缓存响应或请求的任何内容
no-transform 缓存不能改变实体主体的媒体类型
must-revalidate 返回缓存时,必须再次验证。会使max-stale无效
proxy-revalidate 告知缓存服务器,客户端带有该指令时必须验证缓存有效性
max-age = [秒] 在指定时间内不需要像源服务器确认。HTTP/1.1优先处理max-age,HTTP/1.0优先处理Expiress-maxage = [秒] 与max-age功能相同,但s-maxage只适用于供多位用户使用的公共缓存服务器
cache-extension
2、Pragma HTTP/1.1以前的遗留字段Pargma: no-cache与Cache-Control: no-cache功能一致,只用在客户端发送请求时

请求首部字段

请求信息性首部字段

From 请求来自何方,格式是客户端用户的有效电子邮件地址
Host 服务器的主机名和端口号
Referer 这次请求的URL是从哪里获得的
User-Agent 客户端的浏览器或代理信息
Accept首部字段

Accept 客户端通过该首部字段告诉服务器自己可以接收哪些媒体类型,如text/html、image/、/*。此外,还有可以权重系数(q值)来表示媒体类型的优先级。
Accept-Charset 客户端可以接收哪些字符集,也可以有q值

Accept-Encoding 客户端支持的内容编码及内容编码的优先级顺序。

gzip 由文件压缩程序gzip生成的编码格式

compress 由UNIX文件压缩程序compress生成的编码格式

deflate 组合使用zlib格式及由deflate压缩算法生成的编码格

identify 不执行压缩或不会变化的默认编码格式

Accept-Language 客户端能够处理的自然语言集(中文、英文等)
TE 客户端能够处理的传输编码,还可以指定伴随trailer字段的分块传输编码方式
条件请求首部字段

Expect 客户端通过该首部字段告知服务器它们需求某种行为,现在该首部与响应码100 Continue紧密相关。如果服务器无法理解该首部的值,就应该返回417 Expectation Failed
If-Match 服务器会比对该字段的值和资源的ETag值,仅当两者一致时,才会执行请求,否则,返回412 Precondition Failed。该字段值为*时,会忽略ETag值
If-Modified-Since 该字段值应该是一个日期,如果服务器上资源的更新时间较该字段值新则处理该请求,否则,返回304 Not Modified
If-None-Match 与If-Match相反,该字段的值与请求资源的ETag不一致时,处理该请求
If-Range 该字段的值(ETag或时间)与资源的ETag或时间一致时,作为范围请求处理(参加首部字段Range)。否则,返回全体资源
If-Unmodified-Since 与If-Modified-Since相反,服务器上资源的更新时间早于该字段值时处理请求,否则,返回412 Precondition Failed
安全请求首部字段

Authorization 向服务器回应自己的身份验证信息。客户端收到来自服务器的401 Authentication Required响应后,要在其请求中包含这个首部
Cookie HTTP/1.1中没有定义,用于客户端识别和跟踪的扩展首部
代理请求首部字段

Max-Forwards 只能和TRACE方法一起使用,指定经过代理或其他中间节点的最大数目。每个收到带此首部的TRACE请求的应用程序,在请求转发之前都要将这个值减1;如果应用程序收到请求时,该首部值为0,则立即回应一条200 OK响应
Proxy-Authorization 与Authorization类似,用于客户端与代理服务器之间的身份验证
响应首部字段

响应信息性首部字段

Age 响应已经产生了多长时间。HTTP/1.1规定缓存服务器在创建响应时必须包含Age首部
Location 客户端应重定向到指定URI,基本配合3**响应出现
Retry-After 告诉客户端多久之后再次发送请求。主要配合503 Service Unavailable使用,或与3**响应一起使用
Server HTTP服务器的应用程序信息
Warning
协商首部字段

Accept-Ranges 服务器是否能处理范围请求,bytes表示能,none表示不能
Vary

通知客户端,服务器端的协商中会使用哪些来自客户端请求的首部

缓存控制:对某次请求,响应报文的Vary中会指定一些首部名称,客户端后续请求相同资源时,这些首部与缓存的那次请求完全一致时才会返回缓存的资源
安全响应首部字段

Proxy-Authorizate 与WWW-Authenticate类似,用于代理与客户端之间的认证,407 Proxy Authentication Required响应必须包含该首部
Set-Cookie 非HTTP/1.1标准首部
WWW-Authenticate 告诉客户端访问所请求资源的认证方案,401 Unauthorized响应中肯定有该首部
实体首部字段

实体首部字段是在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息

实体信息性首部字段

Allow 通知客户端可以对特定资源使用那些HTTP方法。405 Method Not Allowed响应中必须包含该首部
内容首部字段

Content-Encoding 告诉客户端实体的主体部分选用的内容编码方式。具体方式参见Accept-Encoding
Content-Language 告诉客户端实体主体使用的自然语言(中文、英文等)
Content-Length 表明实体主体部分的大小(单位:字节)。对实体主体进行内容编码传输时,不能再使用该首部字段
Content-Location 报文主体部分相对应的URI
Content-MD5 一串由MD5算法生成的值。对于检查在传输过程中数据是否被无意的修改非常有用,但不能用于安全目的,因为报文如果被有意的修改,该字段的值也可以计算后作相应修改
Content-Range 针对范围请求,提供了请求实体在原始实体内的位置(范围),还给出了整个实体的长度
Content-Type 响应报文中对象的媒体类型
实体缓存首部字段

ETag 实体标记,就是一种标识资源的方式
Expires 资源失效日期,当Cache-Control有指定max-age指令时,会优先处理max-age
Last-Modified 资源最终修改时间

http请求报文

Cache 头域

If-Modified-Since

  作用: 把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。

If-None-Match

  作用: If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag.  使用这样的机制将提高网站的性能

Pragma

  作用: 防止页面被缓存, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一样

  Pargma只有一个用法, 例如: Pragma: no-cache

  注意: 在HTTP/1.0版本中,只实现了Pragema:no-cache, 没有实现Cache-Control
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  http协议