HTTP权威指南------1.3HTTP报文


HTTP报文是在HTTP应用程序之间发送的数据块,数据块以一些文本形式的信息(元信息)为开头,用于描述报文的内容与含义,(元信息是描述信息的信息)。

报文流

使用流入与流出来描述报文在客户端,服务器,代理之间的流动,用上游与下游来描述对应的流动方向。
流入表示报文由客户端向服务器流动,也就是相应的请求报文,流出是服务器向客户端的报文流动,也就是响应报文。

对应的流入时,客户端是在上游,服务器在下游,流出时服务器在上游,客户端在下游,报文的流向永远是上游向下游游动。

报文组成

报文是简单的格式化数据块,其要么是客户端发出的请求,要么就是服务器发出的响应,具体由起始行,首部块,主体三个部分组成。
在这里插入图片描述
起始行,首部块都是按行的ASCII码,每行都以’回车’加’换行’作为结束,而主体部分是一个可选的数据块,其内容可以是二进制数据也可以是文本数据,也可以为空,Content-Type定义其内容的类型,Content-Length定义了主体的大小。

起始行

起始行作为开始,请求报文的起始行说明了要做的内容,响应报文的起始行说明了发生了什么。

  • 版本号: HTTP(1.0)之后要求起始行中包含HTTP版本号,在起始行中用空格进行分割;其说明了通信方应用中协议的能力,便于相关特性的兼容使用(旧版本许多新特性无法使用)。

请求报文

  • 请求行: 请求报文的起始行,包含方法名,请求URL,都是用空格进行分割。
  • 方法: 也就是一些请求命令的定义,常用的有:

    有些方法需要有报文主体,有些方法不需要。

响应报文

  • 响应行: 响应报文的起始行,包含状态信息,有一个状态码,还有一个描述状态的原因短语,也是用空格进行分割。
  • 状态码: 使用三位数字来对不同的相应状态进行表示,对应于一个原因短语共同表示状态,根据编码可以得到如下分类:

    超出已定义范围的状态码则以整体范围的分类进行识别。
  • 原因短语: 为状态码提供文本解释,是状态码的可读版本,与状态码对应成对出现。

首部行

由多个首部字段组成,每一个首部字段都是一个键值对,对应的在请求或者响应报文中添加附加信息,首部可以分为以下几类,通用首部(请求报文与响应报文中都有的),请求首部(提供请求的附加信息),响应首部(提供响应的附加信息),实体首部(用于描述报文实体中子源的附加信息),扩展首部(额外扩展的首部信息)。为了保证可读性,会将首部行中的多个字段每个字段单独作为一行。

报文主体

主要承载要传输的数据,类型有很多种,可以是文本信息,也可以是二进制信息。

方法

基本的HTTP协议只要实现GET与HEAD方法就可以了,此外HTTP定义了一组安全的方法,这些方法在服务器上的运行不会引起不安全的事件,相应的在用户使用时就可以得到程序的安全提示,告知你使用的方法可能对服务器的影响。

GET

用于向服务器请求某个资源,服务器收到该方法后会根据请求发送相应的资源。

HEAD

HEAD方法相比较于GET方法,只是要求服务器在响应时只返回首部,不用返回实际的报文主体数据,通过对于首部的检测可以在未获取资源之前先对资源的状况进行一个了解,同时也可以先测试一下资源的请求状况。

PUT

GET是获取资源,PUT则是上传资源,通过报文中请求主体部分与URL来在服务器中创建一个与URL路径对应的文件,如果路径所在处已经有重名文件了就覆盖该文件;显然这一操作对于服务器的安全是不利的,所以使用的过程中需要进行认证与授权等方式来限制。

POST

用于向服务器发送数据,其与HTML中的表单对应,数据发给服务器后,服务器会根据相应的路径与主体中的内容,交由相应的程序处理(比如对数据库的查询等)。

图中是交由网关程序处理。

TRACE

当请求路径中有多个中间结点时,每个结点都可能会对请求报文进行修改,使用TRACE方法请求方就可以查看最终到服务时请求报文的内容,查看中间结点对于报文的修改情况。
其实现过程时在服务器接收报文后,会发送一个反馈响应,在报文主体中放入其收到的来自上一结点的原始请求报文。

其请求的报文主体部分为空,在响应报文的主体部分则是服务器收到的请求报文的副本。其也可以用来诊断链接的连接情况。

OPTIONS

主要实现对服务器所支持方法的查询,通过服务器的响应来判断访问资源的最优方式。

DELETE

DELETE方法则是删除服务器中对应URL出的资源,但是该请求无法保证服务器中的资源一定会删除,HTTP允许服务器在不通知客户端的情况下撤销请求。

扩展方法


并非所有的应用程序都能识别拓展方法,这些方法是在规范定义之外的。

状态码

响应报文的状态码是一个三位的编码,大致分为五类,分别是信息性状态码,成功状态码,重定向状态码,客户端错误状态码,服务器错误状态码。

信息性状态码

其范围为100~199,已定义了100与101两个,是在HTTP/1.1中引入的。

  • 100 Continue: 对应的原因短语是Continue
    当客户端需要向服务器发送一个大的实体数据时,客户端会先在首部中添加Expect:100 Continue的请求首部,服务器收到后会发送100 Continue的响应,之后客户端进行实体的发送。
    但是如果服务器出现了相关的错误就应该发送相应的服务器错误状态码,或者在发送100 Continue响应之前,服务器收到了客户端的实体数据,表示客户端已经开始发送数据了,这时就可以不发送100响应。而客户端也不会一直等服务器的相关响应,其在一定时间之后也会进行相应的操作,比如直接发送数据。
    而代理收到这些数据后,不论是否知晓下一跳服务器的协议版本支持HTTP/1.1都将相应的Expect:100 Continue加入请求,如果对应下一跳服务器不支持HTTP/1.1,则返回相应的服务器错误状态码。(也可以返回给客户端100响应,在转发给服务器的时候删除Expect首部)
  • 101 Switching Protocols: 原因短语为Switching Protocols,用于协议的转换,客户端在首部中添加Update首部,指定需要更换的协议,服务器收到后根据Update中的值来进行协议切换。

成功状态码

其范围为200~299,已定义了200到206七个,表示客户端的请求成功。

  • 200 OK: 请求成功,对应的原因短语OK,实体中包含了所请求的资源。
  • 201 Created: 对应的原因短语Created,用于创建服务器对象的请求响应,说明创建成功,配合首部中的Location首部,给出资源的具体引用。
  • 202 Accepted: 对应的原因短语Accepted,请求被服务器接收,但是并未立刻处理,在报文主体部分包含对于请求状态的描述。
  • 203 Non-Authoritative Information: 对应的原因短语Non-Authoritative Information,实体首部包含的信息不是来自服务器,而是资源的一份副本(中间结点如果存在相应副本,但是无法对其相关信息进行验证,对应得到该响应)。
  • 204 No Content: 对应的原因短语No Content,说明响应报文的实体中没有主体部分。
  • 205 Reset Content: 对应的原因短语为Reset Content,告知浏览器清除页面中的HTML表单元素。
  • 206 Partial Content: 对应的原因短语为Partial Content,当客户端对服务器器进行分页的请求,一次只请求部分数据时会得到该响应码,但是在响应中必须包含Content-Range,Date,ETag或者Content-Location首部。

重定向状态码

其范围为300~399,已定义300到307八个,其中306未使用。
主要告知客户端新的请求位置,可能是资源被移动了,使用新的位置去访问,而浏览器收到后会进行相应的二次请求,看起来像是一次请求,不会打扰到用户。

  • 300 Multiple Choices: 对应的原因短语Multiple Choices,当客户端请求的URL指向多个资源的时候,会返回这个状态码,服务器在响应报文中可以通过Location来说明首选的URL。
  • 301 Moved Permanently: 对应的原因短语Moved Permanently,说明客户端请求的URL被移动了,响应报文中的Location首部会指明当前资源的URL位置。
  • 302 Found: 对应的原因短语Found,与301相似的是,用户也需要通过响应报文中的Location首部来定位资源,但是定位之后仍使用老的URL来访问资源,而301在之后的相应资源访问中使用新的URL访问资源。301是永久性的资源路径改变,而302是临时性的资源路径改变。(也支持HTTP/1.0)
  • 303 See Other: 对应的原因短语See Other,当客户端发起POST请求后,用响应中的Location首部来重新定位资源,之后使用GET方法而非POST方法对资源进行请求,实现POST方法的重定向实现。
  • 304 Not Modified: 对应的原因短语Not Modified,表示访问的资源最近未被修改,可以使用之前的缓存副本替代,并且返回的响应报文实体中是不含主体的。
  • 305 Use Proxy: 对应的原因短语Use Proxy,要求客户端通过代理来间接访问资源,相应的Location位置在首部给出。
  • 306(未使用)
  • 307 Temporary Redirect: 对应的原因短语Temporary Redirect,这是一个临时的重定向,之后请求的URL不会改变,也是用响应中的Location首部来重新定位资源,第二次请求时的方法要保持与第一次相同,比如第一次是POST,那么第二次也是POST,这个是与303不同的。实际上其作用与302类似,但是其用于HTTP/1.1,空出302给HTTP/1.0

客户端错误状态码

其范围为400~499,已定义400到417共十八个,402保留未用。其用于说明客户端请求产生的错误。

  • 400 Bad Request: 对应的原因短语Bad Request,说明客户端发送的请求错误。
  • 401 Unanthorized: 对应的原因短语Unanthorized,客户端在获取资源访问权之前先要进行验证。
  • 402 Payment Required: 保留未用。
  • 403 Forbidden: 对应的原因短语Forbidden,服务器拒绝了相应的请求,具体的原因可以在报文主体中说明,但是一般服务器不会说明原因。
  • 404 Not Found: 对应的原因短语Not Found,服务器找不到客户端请求的URL,一般会在报文主体中放一个404页面的HTML文件,方便进行展示。
  • 405 Method Not Allowed: 对应的原因短语Method Not Allowed,客户端请求中的方法服务器不支持,对应在返回报文中,可以在首部的Allow字段中将服务器允许的方法进行说明。
  • 406 Not Acceptable: 对应的原因短语Not Acceptable,客户端在请求中会对应给出希望得到的资源类型,但是服务器对应的URL中没有相应类型的资源,说明类型不匹配。
  • 407 Proxy Authentication Required: 对应的原因短语Proxy Authentication Required,与401相似的在获取资源之前需要进行认证,但是407是对代理服务器进行的认证要求。
  • 408 Request Timeout: 对应的原因短语Request Timeout,客户端在处理服务器的请求时用时过长,服务器会返回这一状态码并关闭连接。
  • 409 Conflict: 对应的原因短语Conflict,说明客户端相应的请求可能会产生资源上的冲突。响应主体中会描述相应的冲突。
  • 410 Gone: 对应的原因短语Gone,与404相似请求的资源当前没有,但是一段时间之前资源时有的。可以用于提示客户端对应的资源被移除了。
  • 411 Length Required: 对应的原因短语Length Required,服务器要求在请求报文中包含Content-Length首部信息。
  • 412 Precondition Failed: 对应的原因短语Precondition Failed,客户端首部使用Expect字段来进行条件请求,如果其中一个条件不满足就使用该状态码。
  • 413 Request Entity Too Large: 对应的原因短语Request Entity Too Large, 客户端请求报文中的主体部分长度过大,服务器使用该状态码进行提示。
  • 414 Request URI Too Long: 对应的原因短语Request URI Too Long, 客户端请求中的URL过长,服务器无法处理时,使用该状态码进行提示。
  • 415 Unsupported Media Type: 对应的原因短语Unsupported Media Type, 客户端所发送的报文中的内容类型服务器无法识别,返回该状态码进行提示。
  • 416 Requested Range Not Satisfiable: 对应的原因短语Requested Range Not Satisfiable, 客户端进行分段请求时,相应的分段超出范围或者范围无效时,通过该状态码进行提示。
  • 417 Expectation Failed: 对应的原因短语Expectation Failed, 与412不同的是,412是无法满足请求中的先觉条件,417是不满足请求中的期望,相应的期望也是在报文中的Expect字段中。

服务器错误状态码

其范围为500~599,已定义500到505六个,其用于说明服务器处理时产生的错误,相应的客户端请求触及到了服务器的缺陷,或者服务器子元素中的缺陷。

  • 500 Internal Server Error: 对应的原因短语Internal Server Error,服务器内部处理请求时出现错误,使用该状态码。
  • 501 Not Implemented: 对应的原因短语Not Implemented,客户端发起的请求超出服务器处理的能力范围,使用该状态码。
  • 502 Bad Gateway: 对应的原因短语Bad Gateway,网关或者代理服务器在请求过程中,无法连接到下一结点或者连接出错时,使用该状态码。
  • 503 Service Unavailable: 对应的原因短语Service Unavailable,说明服务器当前无法为请求提供服务,如果服务器可以给出资源可用的时间,就在响应中包含一个Retry-After首部。
  • 504 Gateway Timeout: 对应的原因短语Gateway Timeout,与408状态码类似,网关或者代理在请求服务器处理时超时了,返回该状态码。
  • 505 HTTP Version Not Supported: 对应的原因短语HTTP Version Not Supported,服务器收到的请求中协议版本与服务器不匹配时,使用该状态码。

首部

请求与响应报文都可以用首部来提供消息,有些首部是专用的,有的首部是通用的,大致可以分为五类分别是:通用首部,请求首部,响应首部,实体首部,扩展首部。 扩展首部一般没有很好的标准化。

通用首部

提供报文最基本的信息,请求报文与响应报文都可以使用。
通用信息首部

  • Connection: 允许客户端与服务器指定与连接有关的选项。
  • Date: 报文创建时间。
  • MIME-Version: 发送端使用的MIME版本。
  • Trailer: 用于分块传输编码,列出报文拖挂部分的首部集合。
  • Transfer-Encoding: 报文中使用的编码方式。
  • Update: 发送端希望服务端(升级)使用的版本或者协议。
  • Via: 显示报文经过的中间结点。

通用缓存首部
缓存的目的是减少对服务端的请求,每次从服务端处获得数据均可以在缓存中存留一个副本,有些重复请求可以直接从缓存处获得,相应的通用缓存首部有两个分别是Cache-ControlPragma,都是随报文传送的缓存指示,但是Cache-Control专用于缓存的控制,性能优于Pragma,同时Pragma是一种请求首部,但是常被用于响应首部,其不专用于缓存。

请求首部

专用于请求报文中,用于说明请求的情况,客户端的情况与需求,或是说明请求来源,服务器根据客户端发送的信息为其提供响应。
请求的信息性首部

  • From: 提供客户端用户的Email地址
  • Host: 请求的目标服务器的主机名和端口号
  • Referer: 说明请求的来源或者当前请求的URL,比如在跳转时Referer是当前界面的URL,目的位置是跳转之后的URL;如果是直接的URL请求,那么Referer就是直接的URL。
  • User-Agent: 发起请求的应用程序名称。

此外还有一些没有定义的首部,但是客户端应用都对其进行了实现:

  • Client-IP: 客户端运行机器的IP地址。
  • UA-Color: 客户端显示器颜色的相关信息。
  • UA-CPU: 客户端CPU类型与厂商的相关信息。
  • UA-Disp: 客户端显示器能力的相关信息。
  • UA-OS: 客户端所在机器上操作系统的信息。
  • UA-Pixels: 客户端显示器的像素信息。

Accept首部
客户端向服务器告知其相应的喜好与能力,服务器根据这些信息进行相应。

  • 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: 与Authorization相同的作用,存放认证的相关数据,在与代理进行认证时使用。
  • Proxy-Connection: 与Connection相同作用,允许指定与连接有关的选项,用于与代理建立连接时使用。

响应首部

用于相应报文,是服务器向客户端提供的一些额外信息,比如响应的来源,响应者的功能等,有助于客户端处理响应与发送新的请求。
响应的信息性首部

  • Age: 响应的持续时间。
  • Public: 服务器支持的资源请求方法。
  • Retry-After: 请求资源不可用,下一次重试的时间。
  • Server: 服务器应用程序的名称与版本信息。
  • Title: 与HTML文档相应的标题,来源于HTML文档的源端。
  • Warning: 警告报文信息,相比于原因短语更加详细。

协商首部
有些请求无法确定到一个具体的资源,需要服务器与客户端进行进一步协商。

  • Accept-Ranges: 对相应的资源,服务器能够处理的范围类型。
  • Vary: 其是一个首部列表,里面包含资源的相关信息,服务器从这些信息中选出最适合的资源版本进行发送。在缓存服务中,根据Vary首部可以判断是使用缓存内容,还是重新请求。

安全响应首部
与客户端的安全请求首部对应,进行相应的响应。

  • Proxy-Authenticate: 代理对客户端的质询列表。
  • Set-Cookie: 为客户端的Cookie内容进行设置。
  • Set-Cookie2: 与Set-Cookie类似。
  • WWW-Authenticate: 服务器对客户端的质询列表。

实体首部

用于描述实体与实体中内容的信息,报文接收者可以相应的对其进行处理。
实体的信息性首部

  • Allow: 可以对实体执行的请求方法。
  • Location: 告知客户端,实体具体的位置,用于重定向时确定资源的实际位置。

内容首部
提供了与实体内容相关的信息,说明实体中数据的类型,大小等相关信息。

  • Content-Base: 解析主体资源URL时,将其分为Base部分与相对URL,Content-Base为Base部分。
  • Content-Encoding: 对实体进行的编码方式。
  • Content-Language: 实体中的语言。
  • Content-Length: 实体的大小或尺寸。
  • Content-Location: 资源所在的实际位置。
  • Content-MD5: 实体的MD5校验和。
  • Content-Range: 整个报文中实体所占的字节范围。
  • Content-Type: 实体的类型。
    其中Content-Base并没有被标准定义。

实体缓存首部
缓存首部记录被缓存实体的相关信息。

  • ETag: 用于标记该实体的相关信息,比如标记版本信息。
  • Expires: 实体失去有效性,需要再次获取最新实体信息时,用来记录获取的时间日期。
  • Last-Modified: 该实体最后一次被修改的时间。
原文地址:https://www.cnblogs.com/yanzs/p/13788224.html