理解几个经典协议——HTTP章3
返回结果的HTTP状态码
我们知道,ICMP可以传递IP通信时候的状态如何。HTTP虽然没有辅助的解析,但是它可以使用状态码来表达我们的HTTP请求的结果,标记服务器端的处理是否正常、通知出现的错误等工作。这就是状态码的职责。
比如说,当我们的状态码是2xx的时候,就说明我们的请求不光到达了服务器,而且还得到了正确的处理。如果出现了4XX,则是说明我们的服务器无法请求处理(这个请求是你的请求出现的问题),如果出现了5XX,说明是服务器内部的错误,这是服务器的问题。所以,我们对状态码的第一位做一个分类,可以得到:
种类 | 类别 | 原因短语 |
---|---|---|
1XX | 信息性状态码 | 接收的请求正在处理 |
2XX | 成功状态码 | 请求正常处理完毕 |
3XX | 重定向状态码 | 需要进行附加操作以完成请求 |
4XX | 客户端错误码 | 服务器无法处理请求,这是客户端的请求非法导致的 |
5XX | 服务端错误码 | 服务端请求处理出错了,这是服务器内部的错误 |
具体每一个号码的请求请参考附录。
与 HTTP 协作的 Web 服务器
我们的HTTP/1.1 规范允许一台 HTTP 服务器搭建多个 Web 站点。这就是使用物理单台主机的虚拟多主机(也就是说,我们虚拟化了我们的主机,看起来有很多台主机在运作,但是实际上只有一台)
客户端使用 HTTP 协议访问服务器时,会经常采用类似这样的主机名和域名。在互联网上,域名通过 DNS 服务映射到 IP 地址(域名解析)之后访问目标网站。可见,当请求发送到服务器时,已经是以 IP 地址形式访问了。
通信数据转发程序 :代理、网关、隧道
HTTP通信除了围绕我们的客户端和服务器之外,还会有一部分用来进行通信数据转发。比如说,我们的代理,网关和隧道,他们配合我们的服务器进行工作。
代理
代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。这个时候,我们授权让我们的代理跟我们的服务器进行通话,而不是我们本人
网关
网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。
隧道
隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。我们一般会用来进行安全加密,保证一个安全的HTTP通信
资源的缓存
缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可减少对源服务器的访问,因此也就节省了通信流量和通信时间。
缓存服务器是代理服务器的一种,并归类在缓存代理类型中。换句话说,当代理转发从服务器返回的响应时,代理服务器将会保存一份资源的副本。
这个场景,是我们用在请求一部分资源的时候,我们的缓存服务器会咨询我们的源服务器对应的资源是否有效,如果有效,缓存服务器直接将缓存的副本传递回来,而不是再请求一次资源。毕竟,传递“这个资源有效,就用你原来的”的消耗远比直接不管不顾再发送资源来的快。
当然,资源本身也是有期限的,不管是不是过期了,失能的资源需要再向服务器发起请求刷新。
附录
状态码大全
状态码 | 含义 | 出现状态码的原因 |
---|---|---|
100 | Continue | 客户端应继续其请求,服务器已接收到请求的初始部分 |
101 | Switching Protocols | 服务器已理解请求,并将切换协议 |
102 | Processing | 服务器已收到并正在处理请求,但尚未完成 |
200 | OK | 请求成功 |
201 | Created | 请求成功并创建了新资源 |
202 | Accepted | 请求已被接受,但尚未处理 |
203 | Non-Authoritative Info | 返回的信息来自第三方而非原始服务器 |
204 | No Content | 请求成功,但无返回内容 |
205 | Reset Content | 请求成功,请重置文档视图 |
206 | Partial Content | 服务器成功处理了部分请求 |
207 | Multi-Status | 响应包含多个独立操作结果(WebDAV) |
300 | Multiple Choices | 请求有多种可用响应 |
301 | Moved Permanently | 请求的资源已永久移动到新位置 |
302 | Found | 请求的资源临时从不同 URI 响应 |
303 | See Other | 请求应通过另一个 URI 获取资源 |
304 | Not Modified | 资源未修改,可使用缓存 |
305 | Use Proxy | 请求应使用代理访问 |
307 | Temporary Redirect | 请求的资源临时从不同 URI 响应(方法不变) |
308 | Permanent Redirect | 请求的资源永久从不同 URI 响应(方法不变) |
400 | Bad Request | 请求格式错误,服务器无法理解 |
401 | Unauthorized | 请求未经授权,需身份验证 |
402 | Payment Required | 保留状态码,预留用于将来支付机制 |
403 | Forbidden | 服务器理解请求但拒绝执行 |
404 | Not Found | 请求的资源不存在 |
405 | Method Not Allowed | 请求方法被禁止 |
406 | Not Acceptable | 请求的资源不满足客户端的 Accept 头要求 |
407 | Proxy Authentication Req | 需要代理身份验证 |
408 | Request Timeout | 请求超时 |
409 | Conflict | 请求冲突(例如资源状态冲突) |
410 | Gone | 请求的资源已被永久删除 |
411 | Length Required | 请求未定义 Content-Length 头 |
412 | Precondition Failed | 请求头中指定的前提条件失败 |
413 | Payload Too Large | 请求实体过大 |
414 | URI Too Long | 请求的 URI 过长 |
415 | Unsupported Media Type | 请求格式不受支持 |
416 | Range Not Satisfiable | 请求的范围无效 |
417 | Expectation Failed | 请求头中的 Expect 无法满足 |
418 | I’m a teapot | 玩笑用的状态码,不支持冲泡咖啡 |
421 | Misdirected Request | 请求被发送到不能生产响应的服务器 |
422 | Unprocessable Entity | 请求格式正确但语义错误(WebDAV) |
423 | Locked | 资源被锁定(WebDAV) |
424 | Failed Dependency | 由于之前的请求失败,当前请求失败(WebDAV) |
425 | Too Early | 服务器不愿意处理过早的请求 |
426 | Upgrade Required | 客户端需升级协议 |
428 | Precondition Required | 需指定请求条件以防止冲突 |
429 | Too Many Requests | 客户端发送请求过多,已被限流 |
431 | Request Header Fields Too Large | 请求头字段过大 |
451 | Unavailable For Legal Reasons | 请求内容因法律原因不可用 |
500 | Internal Server Error | 服务器内部错误 |
501 | Not Implemented | 服务器不支持请求方法 |
502 | Bad Gateway | 网关服务器收到无效响应 |
503 | Service Unavailable | 服务器暂时超载或维护中 |
504 | Gateway Timeout | 网关服务器请求超时 |
505 | HTTP Version Not Supported | 不支持的 HTTP 版本 |
506 | Variant Also Negotiates | 内容协商出现循环引用 |
507 | Insufficient Storage | 服务器无法存储请求所需内容(WebDAV) |
508 | Loop Detected | 服务器检测到无限循环(WebDAV) |
510 | Not Extended | 请求需进一步扩展 |
511 | Network Authentication Required | 需要进行网络认证 |