Appearance
HTTP
HTTP 属于应用层协议,基于 TCP 协议进行传输。
HTTP 请求类型一般分为 HTTP Request 和 HTTP Response,分别对应客户端发起的 HTTP 请求,服务器返回的 HTTP 响应。
HTTP 请求
一个 HTTP 请求由 3 部分组成:
- 起始行
起始行由 HTTP 方法(Method),URI,HTTP 协议版本组成,如 GET / HTTP/1.1
- 请求首部(Request Headers)
请求首部由 N 个键值对组成,它们以 CRLF 进行分隔,如
Accept: application;json, text/plain, */*
Accept-Encoding: gzip, deflate, br
- 请求体(Request Body)
请求体与请求首部之间会有一个空行(CRLF)
HTTP 响应
一个 HTTP 响应也由 3 部分组成:
- 起始行
起始行由 HTTP 协议版本,状态码(status code),状态短语(reason-phrase)组成
- 响应首部(Response Headers)
响应首部由 N 个键值对组成,它们以 CRLF 进行分隔,如
Connection: keep-alive
Server: nginx/1.14.2
- 响应体(Response body)
响应体与响应首部之间会有一个空行(CRLF)
无状态性
HTTP 协议具有无状态性,HTTP 协议本身不对请求与响应之间的通信状态进行保存。
持久连接
在初始版本的 HTTP 协议中,每进行一次通信都要进行一次 TCP 建立连接和释放连接的过程,增加了通信的开销。
因此,在 HTTP 1.1 版本中和部分的 HTTP 1.0 版本中提供了持久连接,也称作 HTTP keep-alive 或者 HTTP connection reuse。
只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。
在 HTTP 1.1 中,持久连接为默认的连接方式。
管道化
管道化指不用等待前面的 HTTP 请求接收到响应后,再发送后面的 HTTP 请求,能够并行发送多个 HTTP 请求到服务器。
状态码
状态码类别表
类别 | 原因短语 | |
---|---|---|
1XX | Information | 接收的请求正在处理 |
2XX | Success | 请求正常处理完毕 |
3XX | Redirection | 需要附加操作以完成请求 |
4XX | Client Error | 服务端无法处理请求 |
5XX | Server Error | 服务端处理请求出错 |
2XX 成功
- 200 OK
正常处理请求,根据请求方法决定是否返回响应体内容,如 HEAD 方法不返回响应体。
- 204 No Content
不返回响应体内容。
- 206 Partial Content
根据 HTTP 请求首部中的 Content-Range 字段的值返回部分字节内容。
3XX 重定向
- 301 Moved Permanently
永久性重定向。请求的资源已被分配了新的 URI。如果用户将该资源的 URI 保存为了书签,301 会去更新书签。
- 302 Found
临时性重定向。请求的资源临时被分配了新的 URI。如果用户将该资源的 URI 保存为了书签,302 不会去更新书签。
- 303 See Other
请求的资源存在另一个 URI,希望客户端使用 GET 方法获取请求的资源。
- 304 Not Modified
当客户端发送的 HTTP 请求头部中含有 If-Match,If-Modified-Since,If-Non-Match,If-Range,If-Unmodified-Since 其中一个时。304 状态码返回时,不包含任何响应体内容。该状态码和重定向没有关系。
4XX 客户端错误
- 400 Bad Request
表示请求中存在错误,修改请求后再次发送。浏览器端会当做 200 OK 状态码进行处理
- 401 Unauthorized
表示请求需要通过 HTTP 认证。
- 403 Forbidden
表示服务端对请求的资源进行了拒绝。
- 404 Not Found
表示无法找到请求的资源。也可以在服务端拒绝请求并不想说明原因时使用。
5XX 服务端错误
- 500 Internal Server Error
表示服务端在执行请求时遇到了错误,一般是 Web 应用程序内部故障导致的。
- 503 Service Unavailable
表示服务端暂时处于超负载或者正在进行停机维护中,无法处理客户端的请求。