Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HTTP 基础知识 #37

Open
ChuChencheng opened this issue Feb 27, 2020 · 1 comment
Open

HTTP 基础知识 #37

ChuChencheng opened this issue Feb 27, 2020 · 1 comment

Comments

@ChuChencheng
Copy link
Owner

概念

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 请求一个指定资源的表示形式,应该只被用于获取数据
  • HEAD 请求一个与 GET 相同的响应,但没有响应体
  • POST 用于将实体提交到指定资源,通常会导致服务器上资源状态的变化或副作用
  • PUT 替换指定资源
  • DELETE 删除指定资源
  • PATCH 对资源应用部分修改
  • OPTIONS 可使服务器传回该资源所支持的所有请求方法,可用于测试服务器功能是否正常运作
  • TRACE 回显服务器收到的请求,主要用于测试或诊断
  • CONNECT 建立一个到由目标资源标识的服务器的隧道

GET 与 POST 的区别

  • GET 在浏览器回退时是无害的, POST 则会再次提交请求,产生副作用
  • GET 请求会被浏览器主动缓存,而 POST 需要手动设置
  • GET 的请求参数由于是带在 URL 上,因此会被保留在历史记录中
  • GET 请求参数由于在 URL 上,因此有长度限制,而 POST 没有
  • GET 参数通过 URL 传递, POST 参数放在请求体中

状态码

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

  • 信息响应(100-199)
  • 成功响应(200-299)
  • 重定向(300-399)
  • 客户端错误(400-499)
  • 服务器错误(500-599)

虽然 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 管线化

短连接

在 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
Copy link
Owner Author

ChuChencheng commented Mar 4, 2020

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

HTTP/0.9

  • 单行指令, 请求报文由 GET 加上 URL 构成
  • 只有 GET 方法
  • 响应报文只包含数据
  • 没有 HTTP 头部
  • 只能传输 HTML ,无法传输其他类型的文件
  • 没有响应状态码或错误代码,发生错误时,只能发送一个描述问题的 HTML 文件

HTTP/1.0

  • 协议版本信息随每个请求发送,如 GET /index.html HTTP/1.0
  • 新增了 HTTP 响应状态码
  • 引入 HTTP 头的概念,协议变得灵活,更具扩展性
  • 由于引入了 HTTP 头,可以使用 Content-Type 字段,用来传输其他类型的文件
  • 长连接需要设置 keep-alive

HTTP/1.1

  • 连接可以复用,减少 TCP 建立连接次数
  • 增加管线化技术
  • 支持响应分块
  • 增加 cache-control ,etag 跟 if-none-match ,对缓存进行优化
  • 引入内容协商机制,包括语言,编码,类型等,并允许客户端和服务器之间约定以最合适的内容进行交换
  • Host 头能够使不同域名配置在同一个IP地址的服务器上

参考

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant