一: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类型