3

原文地址
博客积累地址

HTTP报文的作用

HTTP报文时是HTTP进行请求和响应时用来交换信息的,可以理解它为搬东西的包裹,来搬运交换的信息

报文流

  • HTTP报文在HTTP应用程序(客户端、服务器、代理)之间发送数据块,这些数据块以文本形式描述了报文的内容和含义。
  • 这些报文在客户端、服务器、代理之间流动,称之报文流,用流入、流出、上游和下游这些术语描述报文流动的方向

报文如何流动

报文是由客户端流入服务器的

由客户端流入源端服务器,服务器处理完之后,流回(流出)用户的Agent代理中

报文流入源端服务器示意图:
报文流入源端服务器示意图

所有报文都会向下游流动

所有报文的发送者都在接收者的上游
对于请求报文来说,客户端是发送者,对于响应报文来说,服务器端是发送者

报文向下游流动示意图:
报文向下游流动

报文的组成部分

报文语法

HTTP报文分为两类:

  • 请求报文:客户端向web服务器请求一个动作
  • 响应报文: 服务器将请求结果返回给客户端

请求和响应报文的基本报文结构相同,都是由三部分组成:

  1. 起始行:对报文进行描述
  2. 首部:一些属性
  3. 主体:数据【可选】

请求报文和响应报文只有起始行的语法不同

  • 请求报文结构
<method> <request-url> <version>
<header>

<entity-body>
  • 响应报文结构
<version> <status-code> <reason-phrase>
<header>

<entity-body>

下面是对各部分的简要说明:

字段名 描述
方法(method) HTTP请求方法
请求url (request-url) 请求资源的路径
版本(version) 使用的HTTP版本,格式为: HTTP/<主要版本号>.<次要版本号>
状态码(status-code) 数字HTTP状态码,用于描述请求过程的状态,比如成功、失败
原因短语(reason-phrase) 上面数字状态码的简短文本描述
首部(header) 可以有0或多个首部。格式为: <名字>:<值>,以空行结束
主体(entity-body) 包含由任意数据组成的数据块,并不是所有报文都有主体

请求和响应报文示例:
请求和响应报文示例

起始行

上面我们知道HTTP报文分为请求报文和响应报文两类,而且只有起始行不同

这里我们是请求报文的起始行为请求行,响应报文的起始行为响应行

HTTP报文-首部部分

HTTP报文的首部字段向请求和响应报文中添加一些附加信息,本质上来说,它们只是一些<名字>/<值>对的列表

首部分类

HTTP规范定义了几种首部字段,应用程序也可以随意发明自己所用的首部

  • 通用首部

既可以出现在请求报文中,也可以出现在响应报文中

字段 描述
Cache-Control 通过指定首部字段Cache-Control的指令,就能操作缓存的工作机制。
Connection 控制不在转发给代理的首部字段;管理持久连接。
Data 表明创建HTTP报文的时间和日期。
Pragma 只用在客户端发送的请求中,所有的中间服务器不返回缓存的资源。
Trailer 事先说明报文主体后记录了哪些首部字段。同样可以用在分块传输编码时。
Transfer-Encoding 规定了传输报文主体时采用的编码方式。
Upgrade 用于检测HTTP协议及其他协议是否可以使用更高的版本进行通信。
Via 为了追踪客户端与服务器之间的请求和响应报文的传输路径。
Warning 通常会告知用户一些与缓存相关的问题的警告
  • 请求首部

提供请求相关的信息

字段 描述
Accept 该字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。
Accept-Charset 用来通知服务器用户代理支持的字符集及字符集的相对优先顺序,可一次性指定多种字符集。
Accept-Encoding 用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。
Accept-Language 用来告知服务器用户代理嫩巩固处理的自然语言集(中文或英文等),以及自然语言集的相对优先级。
Authorization 用来告知服务器,用户代理的认证信息。
Expect 客户端使用首部字段Except来告知服务器,期望出现的某种指定行为。
From 用来告知服务器使用用户代理的用户的电子邮件地址。
Host 告知服务器,请求的资源所处的互联网主机名和端口号。Host首部字段在HTTP/1.1规范内是唯一一个必须包含在请求内的首部字段。
If-Match 类似于If-xxx这样的请求首部,可以称为条件请求。
If-Modified-Since 告知服务器若该字段值早于资源的更新时间,则希望能处理该请求。
If-None-Match 该字段值得实体标记值与请求资源的ETag不一致时,它就告知服务器处理该请求。
If-Range 它告知服务器若指定的If-Range字段值和请求资源的ETag值或时间相一致时,则作为范围请求处理。反之则返回全体资源。
If-Unmodified-Since 告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。
Max-Forwards 通过TRACE方法或OPTIONS方法,发送包含首部字段Max-Forwards的请求时,该字段以十进制整数形式指定可经过的服务器最大数目。当服务器接收到Max-Forwards值为0的请求时,则不再进行转发,而是直接返回响应。
Proxy-Authorization 客户端会发送包含首部字段Proxy-Authorization的请求,以告知服务器认证所需要的信息。
Range 告知服务器资源的指定范围。
TE 告知服务器客户端能够处理响应的传输编码方式及相对优先级。
User-Agent 将创建请求的浏览器用户代理名称等信息传达给服务器
  • 响应首部

提供响应相关的信息

字段 描述
Accept-Ranges 用来告知客户端服务器是否能够处理范围请求,以指定获取服务器端某个部分的资源。
Age 告知客户端,源服务器在多久前创建了响应。单位秒。
ETag 告知客户端实体标识,它是一种可将资源以字符串形式做唯一标识的方式。
Location 可以将响应接收方引导至某个与请求URI位置不同的资源。
Proxy-Authenticate 把由代理服务器所要求的认证信息发送给客户端。
Retry-After 告知客户端应该在多久之后再次发送请求。
Server 告知客户端当前服务器上安装的HTTP服务器应用程序的信息。
Vary 可对缓存进行控制,源服务器回向代理服务器传达关于本地缓存使用方法的命令。
WWW-Authenticate 用于HTTP访问认证
  • 实体首部

描述主体的长度和内容,或者资源自身

字段 描述
Allow 用于通知客户端能够支持Request-URI指定资源的所有HTTP方法。
Content-Encoding 告知客户端服务器对实体的主体部分选用的内容编码方式。(gzip/compress/deflate/identity)
Content-Language 告知客户端,实体主体使用的自然语言。(中文或英文等语言)
Content-Length 表明了实体主体部分的大小。
Content-Location 给出与报文主体返回资源对应的URI。
Content-MD5 是一串由MD5算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。
Content-Range 针对范围请求,返回响应时使用的首部字段,能告知客户端作为相应返回的实体的哪个部分符合范围请求。
Content-Type 说明了实体主体内对象的媒体类型,该字段用type/subtype形式赋值。
Expires 会将资源失效的日期告知客户端。
Last-Modified 指明资源最终修改的时间
  • 拓展首部

规范中没有定义的新首部

HTTP状态码

HTTP状态码被分为五大类:

  • 1xx: 信息性状态码,表示接收到请求并且继续处理
  • 2xx: 成功状态码,表示动作被成功接收、理解和接受
  • 3xx: 重定向状态码,为了完成指定的动作,必须接受进一步处理
  • 4xx: 客户端错误状态码,请求包含错误语法或不能正确执行
  • 5xx: 服务器错误状态码,服务器不能正确执行一个正确的请求

常用状态码

状态码 短语描述 描述
100 Continue 继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息
200 OK 正常返回信息
201 Created 请求成功并且服务器创建了新的资源
202 Accepted 服务器已接受请求,但尚未处理
301 Moved Permanently 请求的网页已永久移动到新位置。
302 Found 临时性重定向。
303 See Other 临时性重定向,且总是使用 GET 请求新的 URI。
304 Not Modified 自从上次请求后,请求的网页未修改过。
400 Bad Request 服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。
401 Unauthorized 请求未授权。
403 Forbidden 禁止访问。
404 Not Found 找不到如何与 URI 相匹配的资源。
500 Internal Server Error 最常见的服务器端错误。
503 Service Unavailable 服务器端暂时无法处理请求(可能是过载或维护)

完整版状态码

状态码 描述
100 客户必须继续发出请求
101 客户要求服务器根据请求转换HTTP协议版本
200 表明该请求被成功地完成,所请求的资源发送回客户端
201 提示知道新文件的URL
202 接受和处理、但处理未完成
203 返回信息不确定或不完整
204 请求收到,但返回信息为空
205 服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206 服务器已经完成了部分用户的GET请求
300 请求的资源可在多处得到
301 本网页被永久性转移到另一个URL
302 请求的网页被转移到一个新的地址,但客户访问仍继续通过原始URL地址,重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request。
303 建议客户访问其他URL或访问方式
304 自从上次请求后,请求的网页未修改过,服务器返回此响应时,不会返回网页内容,代表上次的文档已经被缓存了,还可以继续使用
305 请求的资源必须从服务器指定的地址得到
306 前一版本HTTP中使用的代码,现行版本中不再使用
307 申明请求的资源临时性删除
400 客户端请求有语法错误,不能被服务器所理解
401 请求未经授权
402 保留有效ChargeTo头响应
403 禁止访问,服务器收到请求,但是拒绝提供服务
404 一个404错误表明可连接服务器,但服务器无法取得所请求的网页,请求资源不存在。eg:输入了错误的URL
405 用户在Request-Line字段定义的方法不允许
406 根据用户发送的Accept拖,请求资源不可访问
407 类似401,用户必须首先在代理服务器上得到授权
408 客户端没有在用户指定的饿时间内完成请求
409 对当前资源状态,请求不能完成
410 服务器上不再有此资源且无进一步的参考地址
411 服务器拒绝用户定义的Content-Length属性请求
412 一个或多个请求头字段在当前请求中错误
413 请求的资源大于服务器允许的大小
414 请求的资源URL长于服务器允许的长度
415 请求资源不支持请求项目格式
416 请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
417 服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求长
500 服务器遇到错误,无法完成请求
502 网关错误
503 由于超载或停机维护,服务器目前无法使用,一段时间后可能恢复正常

木木
56 声望1 粉丝