ChuChencheng / note

菜鸡零碎知识笔记
Creative Commons Zero v1.0 Universal
3 stars 0 forks source link

HTTP 基础知识 #37

Open ChuChencheng opened 4 years ago

ChuChencheng commented 4 years ago

概念

HTTP(Hyper Text Transfer Protocol),超文本传输协议,是基于 TCP ,用于服务器传输超文本数据到本地的应用层协议。主要规定了客户端与服务器之间的通信格式。默认使用 80 端口。

特点

  1. 简单快速。客户端请求服务时,只需传送方法和路径。由于 HTTP 协议简单,因此通信快。
  2. 灵活。可以传送任意类型的数据
  3. 无连接。每完成一次请求即断开连接。
  4. 无状态。HTTP 请求不会保留之前请求的信息,每次请求都是独立的。

报文组成

请求报文

  1. 请求行,包括请求方法、请求 URL , HTTP 协议版本等信息
  2. 请求头,包含客户端请求相关的信息,由 关键字: 值 成对组成
  3. 空行,表示请求头结束,下面是请求体
  4. 请求体,包含请求的参数,可以有多个参数

响应报文

  1. 状态行,包含 HTTP 状态码,以及状态码原因信息
  2. 响应头,与请求头类似
  3. 空行,与请求报文空行类似
  4. 响应体,包含响应的数据信息

请求方法

GET 与 POST 的区别

状态码

HTTP 响应状态码用于指示 HTTP 请求是否成功完成。 响应分为五类:

虽然 RFC 2616 中已经推荐了描述状态的短语,例如"200 OK","404 Not Found",但是WEB开发者仍然能够自行决定采用何种短语,用以显示本地化的状态描述或者自定义信息。

下面列出一些常见状态码,具体见 MDN 文档

信息响应

100 Continue

表明所有内容都是可行的,客户端应继续请求,如果已经完成则忽略。

101 Switching Protocol

响应请求头中的 Upgrade 而发出,指示服务器也正在切换协议,例如在 WebSocket 中建立连接时,浏览器会先发出一个 GET 请求,带上 Upgrade: websocket 头部,客户端则会响应 101 ,切换到 WebSocket 对应协议。

102 Processing

表示服务器已收到并正在处理请求,但没有响应可用。

103 Early Hints

Link 头部一起使用,允许客户端在服务器仍在准备响应时开始预加载资源。

成功响应

200 OK

请求成功

201 Created

请求成功并因此创建了一个新的资源,通常是在 POST 请求或某些 PUT 请求后返回。

202 Accepted

请求已收到,但还未响应,没有结果。

重定向

300 Multiple Choice

被请求的资源有一系列可供选择的回馈信息,用户或浏览器能够自行选择一个首选的地址进行重定向。

301 Moved Permanently

被请求资源已永久移动到新位置,将来对此资源的引用都应该使用响应的若干个 URI 之一。该响应可缓存。

302 Found

请求的资源临时从不同 URI 响应请求,由于是临时的,客户端下次应该还是从原有地址请求此资源。只有在 Cache-Control 或 Expires 指定,才可缓存此响应。

304 Not Modified

如果客户端发送的 GET 请求的资源未改变,则返回这个状态码指示客户端使用缓存。该响应禁止包含响应体,因此始终以空行结束。参照 #36 协商缓存。

客户端响应

400 Bad Request

  1. 语义有误,请求无法被服务器理解,除非进行修改,否则客户端不应重复提交这个请求。
  2. 请求参数有误。

401 Unauthorized

当前请求需要用户验证。

403 Forbidden

服务器已理解请求,但拒绝执行。

404 Not Found

请求失败,资源未在服务器上发现。

405 Method Not Allowed

请求行中指定的请求方法不能被用于请求相应的资源。例如有些网页服务器不支持 PUT, DELETE 方法,则会返回 405 错误。

406 Not Acceptable

请求的资源内容特性无法满足请求头中的条件,因而无法生成响应实体。

408 Request Timeout

请求超时。客户端没有在服务器预备等待的时间内完成一个请求的发送。

服务端响应

500 Internal Server Error

服务器遇到了不知道如何处理的情况。

501 Not Implemented

此请求方法不被服务器支持且无法被处理。只有 GETHEAD 是要求服务器支持的,这两个方法一定不会返回 501 。

502 Bad Gateway

服务器作为网关,需要得到一个处理这个请求的响应,但是得到一个错误的响应。

503 Service Unavailable

服务器没有准备好处理请求。常见原因是服务器因维护或重载而停机。

504 Gateway Timeout

服务器作为网关,不能及时得到响应时返回 504 。

505 HTTP Version Not Supported

服务器不支持请求中所使用的 HTTP 版本。

连接管理

在 HTTP/1.x 里,有多种连接管理模型:

短连接

在 HTTP/1.0 中的默认模型是短连接,每一个 HTTP 请求都是独立完成的,即每发起一个 HTTP 请求都要建立一次 TCP 连接,导致十分耗时。

在 HTTP/1.0 中如果没有指定 Connection 头,或者值为 close 则会使用短连接。 在 HTTP/1.1 中只有当 Connectionclose 时才会使用短连接。

长连接

由于短连接十分耗时,因此设计出了长连接(在 HTTP/1.1 之前就有的概念)。

长连接在同一个 TCP 连接中可以发出多个 HTTP 请求,解决短连接中频繁建立 TCP 连接的问题。

但长连接也有缺点: 在空闲时候也会消耗服务器资源。

HTTP/1.0 中,把 Connection 设置为 close 以外的值即可使用长连接。 HTTP/1.1 中默认是使用长连接的。

HTTP 管线化

默认情况下, HTTP 请求是按顺序发出的,只有在当前请求收到响应后,才会发出下一个请求。

HTTP 管线化 (HTTP Pipelining)是在同一个长连接中发出连续的请求,不用等待响应。

HTTP 管线化同时依赖于客户端和服务器的支持。遵守 HTTP/1.1 的服务器支持管线化。这并不是意味着服务器需要提供管线化的回复,而只是要求在收到管线化的请求时候不会失败。

参考

ChuChencheng commented 4 years ago

HTTP 0.9 1.0 1.1 每个版本新增的特性

HTTP/0.9

HTTP/1.0

HTTP/1.1

参考