通信协议——HTTP
协议版本
HTTP/0.9
HTTP的1991原型版本称为HTTP/0.9。此协议有很多严重的设计缺陷,只应与很老的客户端交互,只支持GET方法,不支持多媒体内容等。
HTTP/1.0
1.0是第一个得到广泛使用的HTTP版本。新增了版本号、各种HTTP头部、新的请求方法(POST、PUT等)以及对多媒体对象的处理。
HTTP/1.0+
在1.0的基础上增加了一些特性,包括持久的keep-alive链接、虚拟主机支持、代理连接支持等,非官方标准。
HTTP/1.1
1.1校正了HTTP设计中的结构性缺陷,明确语义,引入重要的性能优化措施,并删除一些不好的特性,是当前主流的版本。
HTTP/2.0
2.0是1.1的升级。它重点关注性能的大幅优化,以及更强的服务逻辑远程执行。目前谷歌的一些RPC框架(GRPC)就是基于2.0开发的,相信2.0会慢慢普及。
资源
MIME类型
HTTP给每种通过web传输的对象都打上名为MIME类型的数据格式标签。MIME(Multipurpose Internet Mail Extension,多用途因特网邮件扩展)最初是为了解决在不同电子邮件系统间搬移报文时存在的问题。HTTP用它来描述并标记多媒体内容。
浏览器从服务器取对象时,会查看MIME类型,看是否它知道如何处理这个对象。MIME类型表示一种主要的对象类型和一个特定的子类型,两者通过斜杠分隔。比如:text/html、text/plain、image/jpeg等。
URI
每个web服务器资源都有一个名字URI(Uniform Resource Identifier,统一资源标识符)。其中URI又分为URL(Uniform Resource Location,统一资源定位符)和URN(Uniform Resource Name,统一资源名)。
URL
URL是资源标识符最常见的形式。它明确说明从一个精确、固定位置获取资源。
http:// www.example.com /users/1
通信协议 主机地址 资源名称
URN
URI的第二种形式。URN作为特定内容的唯一名称,与资源所在地无关,可以将资源四处搬移。例如:urn:ietf:rfc:2141。不过URN仍处于试验阶段,期待以后大量的应用。
HTTP报文
请求方法
GET
GET是最常用的请求方法,用于请求服务器发送某个资源。
HEAD
HEAD与GET类似,但服务器在响应中只返回首部,不返回主体部分。HEAD允许在未获取实际资源的情况下,对资源首部进行分析,可以做到以下几点:
- 在不获取资源的情况下了解资源情况(如判断资源类型)
- 通过首部响应码判断资源是否存在
- 通过首部字段判断资源是否被修改
PUT
与GET从服务器读取资源相反,PUT会向服务器写入资源。
POST
POST一般用于表单提交,将数据推给服务器,然后由服务器进行数据处理。
TRACE
客户端发起的请求有可能会经过防火墙、代理、网关等,这其中每个节点都可能修改原始的HTTP请求,TRACE方法就允许客户端在最终将请求发送给服务器时,查看其状态。TRACE主要用来验证请求是否如愿穿过了请求响应链,查看代理和其他应用对用户请求所产生的效果 。
OPTIONS
OPTIONS方法请求web服务器告知其支持的各种功能,比如询问服务器支持的HTTP方法,或者对某些特殊资源支持哪些方法。
DELETE
DELETE用于请求服务器删除请求URL指定的资源。
扩展方法
HTTP被设计成字段可扩展的。下面是一些扩展的方法:
- LOCK:锁定资源
- MKCOL:创建资源
- COPY:复制资源
- MOVE:移动资源
状态码
HTTP状态码被分成了五个大类。下面一一介绍。
100~199
100~199属于信息性状态码。
状态码 描述短语 含义
100 Continue 表示收到了请求的初始部分,请客户端继续
101 Switching Protocols 表示服务器根据客户端指定将协议换成update首部协议
200~299
200~299属于成功性状态码。
状态码 描述短语 含义
200 OK 请求没问题,返回主体中包含了所请求的资源
201 Created 创建服务器对象的请求,如PUT
202 Accepted 请求已被接受,但服务器还未执行任何动作
203 Non-Authoritative Information 实体首部信息不是来源服务器,而是资源的副本
204 No Content 响应报文包含若干个首部和状态,但无实体部分
205 Reset Content 告知浏览器清除当前页面所有HTML表单元素
206 Partial Content 成功执行了一个部分或服务请求
300~399
300~399属于重定向状态码。重定向状态码要么告知客户端用替代位置访问他们感兴趣的资源,要么提供一个替代的响应而不是资源的内容。
状态码 描述短语 含义
300 Multiple Choices 客户端请求一个实际指向多个资源的URL
301 Moved Permanently 请求的URL已被移除使用,并返回新URL
302 Found 与301类似,返回临时URL,将来请求使用旧URL
303 See Other 告知客户端应用另一个URL来获取资源
304 Not Modified 表示资源最近未被修改
305 Use Proxy 说明必须通过代理访问资源
307 Temporary Redirect 与301类似
400~499
400~499属于客户端错误状态码。最常见的是请求一个不存在的URL。
状态码 描述短语 含义
400 Bad Request 用于告知客户端它发生了一个错误的请求
401 Unauthorized 未认证
402 Payment Required 目前未使用,备用
403 Forbidden 说明请求被服务器拒绝了
404 Not Found 说明服务器无法找到所请求的URL
405 Method Not Allowed 发起请求的方法不被服务器支持
406 Not Acceptable 说明服务器没有与客户端URL相匹配的资源
407 Proxy Authentication Required 与401类似,不过对象是代理服务器
408 Request Timeout 请求超时
409 Conflict 请求可能引发冲突
410 Cone 与404类似,不过表示服务器曾经有该资源
411 Length Required 服务器要求客户端请求报文包含Content-Length
412 Precondition Failed 客户端发起了条件请求,且其中一个条件失败了
413 Request Entity Too Large 请求的实体部分比服务器能够处理的大
414 Request URI Too Long 请求URI比服务能处理的长
415 Unsupported Media Type 服务器无法理解或支持客户端的Content-Type
416 Requested Range Not Satisfiable请求范围无效
417 Expectation Failed 请求的Expect包含一个期望,但服务器无法满足
500~599
500~599属于服务器错误状态码。客户端发起了有效请求,但服务器自身出错了。
状态码 描述短语 含义
500 Internal Server Error 服务器内部错误
501 Not Implemented 客户端发起的请求超出服务器能力范围
502 Bad Gateway 服务器代理出错
503 Service Unavailable 服务器现在无法为请求提供服务
504 Gateway Timeout 服务器网关超时
505 HTTP Version Not Supported 服务器收到了不支持HTTP协议的请求
头部
请求头和请求方法共同决定了客户端和服务器能做的事情。
通用头
客户端和服务器都可以使用的头部。比如Date头部,用于说明构建报文的时间和日期。
头部 描述
Connection 客户端与服务连接相关的设置
Date 说明报文是什么时间创建的
MIME-Version MIME版本
Trailer 报文采用分块传输编码方式,Trailer用于列出头部集合
Transfer-Encoding 报文的传输编码方式
Update 升级的版本或协议
Via 报文经过的中间节点(代理、网关等)
Cache-Control 报文传输的缓存指示
Pragma 另一种随报文传送指示的方式,但不专用于缓存
请求头
请求报文特有的头部。它们为服务器提供了一些额外信息,比如客户端希望接受什么类型的数据等。
头部 描述
Client-IP 客户端机器IP地址
From 客户端用户Email地址
Host 接受请求服务器的主机名和端口号
Referer 当前请求URL
UA-Color 与客户端显示器颜色相关的信息
UA-CPU 客户端CPU类型或制造商
UA-Disp 客户端显示器能力相关信息
UA-OS 客户端操作系统相关信息
UA-Pixels 客户端显示器像素信息
User-Agent 发起请求的应用程序名称
Accept 告诉服务器发送哪些媒体类型
Accept-Charset 告诉服务器能够发送哪些字符集
Accept-Encoding 告诉服务器能够发送哪些编码方式
Accept-Language 告诉服务器能够发送哪些语言
TE 告诉服务器可以使用哪些扩展传输编码
Expect 允许客户端列出某请求所要求的服务器行为
If-Match 如果实体标记与文档当前的实体标记匹配就获取
If-Modified-Since 获取的资源需要在指定的日期之后被修改过
If-None-Match 如果实体标记与当前文档实体标记不符,就获取
If-Range 允许对文档的某个范围进行条件请求
If-Unmodified-Since 获取的资源需要在指定的日期之后没有被修改过
Range 资源指定的范围
Authorization 包含了客户端供给服务端,以便对客户端进行认证的数据
Cookie 客户端发送给服务端的一个令牌
Cookie2 说明请求端支持的cookie版本
Max-Forward 通往服务器中,将请求转发给其他代理或网关的最大次数
Proxy-Authorization 代理认证
Proxy-Connection 代理连接方式
响应头
响应报文特有的头部。通常为客户端提供额外的信息。比如Server头部就用了告知客户端与什么服务器交互。
头部 描述
Age 响应持续时间
Public 服务器为其资源支持的请求方法列表
Retry-After 如果资源不可用,在此日期重试
Server 服务器应用程序软件的版本和名称
Title HTML文档的标题
Warning 详细的警告描述
Accept-Ranges 服务器可接受的范围类型
Vary 首部列表
Proxy-Authenticate 代理对客户端的质询列表
Set-Cookie 在客户端设置一个令牌,以便服务器对客户端标识
Set-Cookie2 与Set-Cookie类似
WWW-Authenticate 服务器对客户端的质询列表
实体头部
实体头部指的是用于实体主体的头部。比如用来说明实体主体部分的数据类型。
头部 描述
Allow 列出允许的请求方法
Location 告知客户端实体实际位置
Content-Base 解析实体中相对URL使用的基础URL
Content-Encoding 实体编码方式
Content-Language 实体报文语言
Content-Length 实体字节长度
Content-Location 资源实际位置
Content-MD5 实体的MD5摘要
Content-Range 实体字节范围
Content-Type 实体对象类型
ETag 实体标记
Expires 实体不再有效
Last-Modified 实体最后一次被修改日期和时间
扩展头部
扩展头部是非标准的头部,由开发者创建和处理。比如API认证等。