HTTP权威指南-3
2016-09-27报文流
- 报文都会向下游流动,所有报文的发送者都在接收者的上游
报文的组成部分
- 报文由三部分组成,起始行,包含属性的首部,可选的包含数据的主体
起始行 | HTTP/1.0 200 OK |
---|---|
首部 | Content-type: text/pain |
Content-length: 19 | |
主体 | Hi! I’m a message! |
说明
起始行和首部就是由行分隔的ASCII文本,每行都以一个由两个字符组成的行终止序列作为结束,其中包括一个回车符(ASCII 13)和一个换行符(ASCII 10),这个行终止序列可以写作CRLF;主体部分是可选的,可以是文本或包含二进制数据,也可以为空。
报文的语法
报文分为两类:请求报文,响应报文,通常的请求报文格式是:
<method> <request-URL> <version>
<headers>
<entity-body>
响应报文格式:
<version> <status> <reason-phrase>
<headers>
<entity-body>
简要描述
- method: 客户端希望对服务器资源执行的动作。比如GET/HEAD/POST/PUT,后面会有详解。
- request-URL: 请求资源的完整URL
- version: HTTP 版本
HTTP/<major>.<minor>
major:主要版本号,minor:次要版本号,都是整数。 - status: 三位数字描述请求过程中所发生的情况。
- reason-phrase: 原因短语,是开发人员定义的,比如200,定义reason-phrase : NOT OK。
- header: 可以有零个或多个首部,每个首部都包含一个名字后面是(:)然后是可选的空格,接着是值,最后是一个CRLF。
- entity-body: 可选,包含一个由任意数据块组成的数据块。有时,报文只是以一个CRLF结束。
⚠️一组HTTP首部总是应该以CRLF结束,但由于历史原因,很多客户端和服务器在实现主体部分时,都(错误地)省略了最后的CRLF,为了这些流行但不符合规则的实现进行互通,客户端和服务器端都应该接受那些最后没有CRLF的报文。
起始行
- 请求行
- 响应行
- 方法 GET/HEAD/POST/PUT/TRACE/OPTIONS/DELETE
- 状态码 1XX/2XX/3XX/4XX/5XX
- 原因短语 对状态码提供的文本形式解释
- 版本号 HTTP/x.y
首部
- 通用首部 既可以在请求报文中也可以在响应报文中
- 请求首部 提供更多有关请求的信息
- 响应首部 提供更多有关响应的信息
- 实体首部 描述主体的长度和内容,或者资源本身
- 扩展首部 规范中没有定义的新首部
⚠️每个HTTP首部都有个一个简单的语法: 名字后面跟”:”然后是可选空格再跟字段值,最后是一个CRLF,比如Content-length: 12334 , Content-type: image/gif , …..等 首部行分为多行可提高可读性,多出来的每行前面至少要有一个空格或制表符(tab).
实体的主体部分
主体部分就是要传输的内容可承载很多类型的数字数据:图片、视频、HTML文档、软件应用程序、电子邮件等。
版本0.9的报文
HTTP/0.9报文也是由请求和响应组成,但请求中只包含方法和请求URL,响应中只包含实体。没有版本信息(它是第一个,也是当时唯一的版本),没有状态码或者原因短语,也没有首部。
方法
HTTP定义不产生动作的方法为安全方法,即不会在服务器端产生任何结果,反之不安全。 幂等指的是,请求若干次和请求一次的结果一致,反之非幂等。 详情
- GET 安全幂等
- HEAD 安全幂等,响应只返回首部
- PUT 向服务器写入文档,服务器根据请求URL来命名新文档,如果那个URL已经存在文档,则用当前请求的主体来替代它,因为PUT允许用户对内容进行修改,所以一般Web服务器都需要在执行PUT之前,用密码登陆。不安全,幂等。
- POST 不安全,不幂等
- TRACE 安全幂等
- OPTIONS 请求Web服务器告知其支持的各种功能 安全幂等
- DELETE 请求Web服务器删除请求URL所指定的资源 不安全幂等
- 扩展方法
状态码
- 100 ~ 199 信息性状态码
- 100 Continue 说明收到了请求的初始部分,请客户端继续,发送了这个状态码之后服务器在收到请求之后必须进行响应。
- 101 Switching Protocols 服务器根据客户端的指定,将协议切换成Update首部所列的协议。
- 200 ~ 299 成功状态码
200 OK |
---|
201 Created |
202 Accepted |
203 Non-Authoritative |
204 No Content |
205 Reset Content |
206 Partial Content |
- 300 ~ 399 重定向状态码
300 Multiple Choices |
---|
301 Moved Permanently |
302 Found; 303 See Other |
304 Not Modified |
305 Use Proxy |
306 未使用 |
307 Temporary Redirect |
⚠️ 302、303、307存在交叉,跟HTTP版本有关系1.0/1.1
- 400 ~ 499 客户端❌状态码
400 Bad Request |
---|
401 Unauthorized |
402 PaymentRequired |
403 Forbidden |
404 Not Found |
405 Method Not Allowed |
406 Not Acceptable |
407 Proxy Authentication Required |
408 Request Timeout |
409 Conflict |
410 Gone 与404类似,只是服务器曾经拥有该请求资源 |
411 Length Required |
412 Precondition Failed |
413 Request Entity Too Large |
414 Request URI Too Long |
415 Unsupported Media Type |
416 Requested Range Not Satisfiable |
417 Expectation Failed 请求首部包含Expect值但服务器无法满足时返回此状态码 |
- 500 ~ 599 服务器❌状态码
500 Internal Server Error |
---|
501 Not Implemented |
502 Bad GateWay |
503 Service Unabailable |
504 Gateway Timeout 与408类似 |
505 HTTP Version Not Supported |
首部
- 通用首部
首部 | 描述 |
---|---|
Connection | 允许客户端与服务器指定与请求/响应连接有关的选项 |
Date | 日期和时间标志,说明报文是何时创建的 |
MIME-Version | 给出发出端使用的MIME版本 |
Trailer | 如果报文采用分块传输编码方式,就可以用这个首部列出位于报文拖挂(trailer)部分的首部集合 |
Transfer-Encoding | 告知接收端为保证报文的可靠传输,对报文采用了什么编码方式 |
Update | 给出发送端可能想要升级使用的新版本或协议 |
Via | 显示报文经过的中间节点(代理、网关) |
通用缓存首部
Cache-Control | 用于报文传送缓存指示 |
---|---|
Pragma | 另一种随报文传送指示的方式,但并不专用于缓存 |
- 请求首部
首部 | 描述 |
---|---|
Client_IP | 客户端机器IP |
From | 客户端使用的E-mail地址 |
Host | 接收请求的服务器主机号和端口号 |
Referer | 包含当前请求URI的文档的URL |
UA-Color | 客户端显示器的颜色有关信息 |
UA-CPU | 客户端CPU类型或制造商 |
UA-Disp | 客户端显示器信息 |
UA-OS | 客户端操作系统 |
UA-Pixels | 客户端像素信息 |
UA-Agent | 发起请求的应用程序名称告知服务器 |
- Acctpt首部(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)
- 代理请求首部(Max-Forward
与TRACE一同使用
,Proxy-Authorization,Proxy-Connection)
- 响应首部 Server: Tiki-Hut/1.0
首部 | 描述 |
---|---|
Age | 从创建开始,响应持续时间 |
Public | 服务器为其资源支持的请求方法列表 |
Retry-After | 如果资源不存在,在此日期或时间重试 |
Server | 服务器软件的名称和版本 |
Title | 对HTML来说就是HTML文档的源端给出的标题 |
Warning | 比原因短语中更详细一些的警告报文 |
- 协商首部(Accept-Ranges:对此资源来说,服务器可以接受的范围类型.Vary:服务器查看的其他首部列表)
- 安全响应首部(与安全请求首部对应,Proxy-Authenticate,Set-Cookie,Set-Cookie2,WWW-Authenticate来自服务器的对客户端的质询列表)
- 实体首部 Content-Type: text/html; charset=iso-latin-1
首部 | 描述 |
---|---|
Allow | 列出可以对此实体执行对请求方法 |
Location | 实体资源的URL |
- 内容首部(Content-Base,Content-Encoding,Content-Language,Content-Length,Content-Location,Content-MD5,Content-Range,Content-Type)
- 实体缓存首部(ETag:与此实体相关的实体标记,Expires:实体不在有效,要从源端再次获取此实体的日期和时间,Last-Modified:实体最后一次被修改的日期和时间)
- 扩展首部 非标准首部,开发者自己创建
⚠️HTTP规范允许服务器在不通知客户端的情况下撤销请求