十分钟了解Http(1)——HTTP的报文到底是什么?

一:HTTP的特性

1:HTTP的定义

HTTP 协议,用于客户端和服务器端之间的通信,请求从客户端发出,最后服务器端响应该请求并返回。
HTTP=请求+响应。
请求=请求方法+请求的资源对象URI+HTTP版本号+请求首部+内容实体。
响应=HTTP版本号+结果响应代码和原因+响应首部+资源实体。

2:HTTP的持久化(keep-alive)

HTTP 协议的初始版本中,每进行一次 HTTP 通信就要断开一次 TCP连接,如果请求的资源很多,势必会增大通信开销。后来,有人提出了持久化连接。它的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。从而大大减轻了服务器端的负载。

3:HTTP的管线化(pipelining)

持久连接使得多数请求以管线化(pipelining)方式发送成为可能。多个请求可以并发发送,不需要等待响应了。

4:HTTP的状态管理(Cookie)

使用 HTTP协议,每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。为了方便管理HTTP的状态,引入了Cookie技术。Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。
第一次请求之后:服务器端生成一个只属于该客户端的Cookie,把它和一个”Set-Cookie“的首部字段信息放入响应报文内并发给客户端,通知客户端保存 Cookie。
第二次连接时:服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一
个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。

二:HTTP的报文

1:报文的定义

用于 HTTP 协议交互的信息被称为 HTTP 报文,HTTP 报文本身是由多行(用 CR+LF 作换行符)数据构成的字符串文本,大致可分为报文首部和报文主体两块。

2:报文首部

报文首部有以下几个部分:

  • 请求行(请求):包含用于请求的方法,请求 URI 和 HTTP 版本。
  • 状态行(响应):包含表明响应结果的状态码,原因短语和 HTTP 版本。
  • 首部字段:包含请求和响应的各种条件和属性的各类首部。一般有 4 种首部,分别是:通用首部、请求首部、响应首部和实体首部。
(1):请求方法
  • GET:获取资源。用来请求访问已被 URI 识别的资源,指定的资源经服务器
    端解析后返回响应内容。
  • POST:传输实体主体。
  • PUT:传输文件,但是自身不带验证机制。
  • DELETE:删除文件,但是自身不带验证机制。
  • HEAD:获得报文首部。用于确认URI 的有效性及资源更新的日期时间等。
  • OPTIONS:询问支持的方法。
  • TRACE:追踪路径,让 Web 服务器端将之前的请求通信环回给客户端的方
    法。发送请求时,客户端在 Max-Forwards 首部字段中填入数值,每经过一个服
    务器端就将该数字减 1,当数值刚好减到 0 时,就停止继续传输,服务器发出响应。
  • CONNECT:用隧道协议连接代理服务器,可以加密通信内容。
(2):响应代码
类别 原因短语
1XX 信息 正在处理请求
2XX 成功 处理完毕
3XX 重定向 需要进行附加操作
4XX 客户端错误 服务器无法处理
5XX 服务器错误 服务器出错
  • 200:处理成功
  • 204:没有资源可以返回
  • 206:返回部分资源
  • 301:永久性重定向,记得更新书签
  • 302:临时性重定向
  • 303:临时性重定向,应该用GET方式访问资源
  • 304:与重定向无关,找到资源但是不满足请求
  • 400:请求有语法错误
  • 401:页面需要认证
  • 403:服务器拒绝访问
  • 404:服务器找不到资源或者拒绝访问
  • 500:服务器有bug
  • 503:服务器在维护
(3):首部字段

HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:” 分隔,可以有多个值。
1:根据用途分类
通用首部:

字段名 说明
Cache-Control 控制缓存的行为
Connection 逐跳首部、连接的管理
Date 创建报文的日期时间
Pragma 报文指令
Trailer 报文末端的首部一览 Transfer-Encoding 指定报文主体的传输编码方式
Upgrade 升级为其他协议
Via 代理服务器的相关信息
Warning 错误通知
Transfer-Encoding 指定报文主体的传输编码方式

请求首部:

字段名 说明
Accept 用户代理可处理的媒体类型
Accept-Charset 优先的字符集
Accept-Encoding 优先的内容编码
Accept-Language 优先的语言(自然语言)
Authorization Web 认证信息
Expect 期待服务器的特定行为
From 用户的电子邮箱地址
Host 请求资源所在服务器
If-Match 比较实体标记(ETag)
If-Modified-Since 比较资源的更新时间
If-None-Match 比较实体标记(与If-Match相反)
If-Range 资源未更新时发送实体Byte的范围请求
If-Unmodified-Since 比较资源的更新时间(与If-Modified-Since相反)
Max-Forwards 最大传输逐跳数
Proxy-Authorization 代理服务器要求客户端的认证信息
Range 实体的字节范围请求
Referer 对请求中URI的原始获取方
TE 传输编码的优先级
User-Agent HTTP 客户端程序的信息

响应首部:

字段名 说明
Accept-Ranges 是否接受字节范围请求
Age 推算资源创建经过时间
ETag 资源的匹配信息
Location 令客户端重定向至指定URI
Proxy-Authenticate 代理服务器对客户端的认证信息
Retry-After 对再次发起请求的时机要求
Server HTTP服务器的安装信息
Vary 代理服务器缓存的管理信息
WWW-Authenticate 服务器对客户端的认证信息

实体首部:

字段名 说明
Allow 资源可支持的HTTP方法
Content-Encoding 实体主体适用的编码方式
Content-Language 实体主体的自然语言
Content-Length 实体主体的大小(单位 :字节)
Content-Location 替代对应资源的URI
Content-MD5 实体主体的报文摘要
Content-Range 实体主体的位置范围
Content-Type 实体主体的媒体类型
Expires 实体主体过期的日期时间
Last-Modified 资源的最后修改日期时间

2:通过是否是缓存代理分类

  • 端到端首部:首部会转发给请求 / 响应对应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。
  • 逐跳首部:首部只对单次转发有效,会因通过缓存或代理而不再转发。

逐跳首部:

  • Connection
  • Keep-Alive
  • Proxy-Authenticate
  • Proxy-Authorization
  • Trailer
  • TE
  • Transfer-Encoding
  • Upgrade

其他首部为端到端首部

3:报文主体

HTTP 报文的主体用于传输请求或响应的实体主体。

内容编码——压缩实体主体:

如果实体主体的内容过大,可以通过 内容编码 指明应用在实体内容上的编码格式,并保持实体信息原样压缩。
常见的内容编码如下:

  • gzip
  • compress(UNIX系统标准)
  • deflate
  • identity(不进行编码)
分块传输编码——分割实体主体:

在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。 分块传输编码可以将实体主体分成多个部分(块)。每一块都会用十六进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标记。

多媒体——传输多种类型的实体

发送的一份报文主体内可含有多类型实体。通常是在图片或文本文件等上传时使用。这需要使用一种称为多部分对象集合(Multipart)的方法。
多部分对象集合可以包含以下对象:

  • multipart/form-data(表单文件上传)
  • multipart/byteranges(状态码 206的响应报文包含了多个范围的内容时使用)

多部分对象集合的报文首部包含以下字段:

  • Content-type:实体类型。
  • Content-range:实体范围。
  • boundary :划分多部分对象集合指明的各类实体。

多部分对象集合的每个部分类型中,都可以含有首部字段。另外,可以在某个部分中嵌套使用多部分对象集合,他们用”_ _“分隔开。

断点续传——指定范围的请求

执行范围请求时,会用到首部字段 Range 来指定报文主体的 byte 范围。

  • Ranges:bytes=a-b:指定a~b字节
  • Ranges:bytes=a-:指定从a开始及其之后的字节
  • Ranges:bytes=-a:指定从一开始到a的字节
  • Ranges:bytes=a-b,c-d:指定 a ~ b, c ~ d 的多重范围

针对范围请求,响应会返回状态码为 206 Partial Content 的响应报文。如果是多重范围的范围请求,响应会在首部字段 Content-Type 表明multipart/byteranges 后返回响应报文。
如果服务器端无法响应范围请求,则会返回状态码 200 OK 和完整的实体内容。

内容协商——返回适合的资源内容

内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。

  • ACCEPT-LANGUAGE:客户端支持的语言
  • ACCEPT-ENCODING:客户端支持的内容编码形式
  • ACCEPT-CHARSET:客户端支持的字符集
  • ACCEPT:客户端支持的数据类型,用户代理希望接收的媒体资源的MIME类型

猜你喜欢

转载自blog.csdn.net/weixin_36904568/article/details/88170411