HTTP 主要特点
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快。
- 灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type(Content-Type 是 HTTP 包中用来表示内容类型的标识)加以标记。
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- 无状态:HTTP 协议是无状态协议。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP 报文
HTTP 报文由 请求报文 和 响应报文 组成。
请求报文
请求报文有如下四个组成部分:
- 请求行:包含请求类型、请求地址、请求协议
- 请求头:由键/值对组成,典型请求头如下
- Host:请求的主机名,允许多个域名同处一个 IP 地址,即虚拟主机。
- User-Agent:请求的浏览器类型。
- Accept:客户端可识别的内容类型列表。
- 空行:请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
- 请求体:请求数据不在 GET 方法中使用,而是在 POST 方法中使用。与请求数据相关的最常使用的请求头是 Content-Type 和 Content-Length。
响应报文
响应报文有如下四个组成部分:
- 状态行:包含协议、状态码、状态码提示;
- 响应头:由键/值对组成,典型响应头有
- Date: 响应日期时间;
- Content-Type: 响应内容类型;
- Content-Length: 响应内容长度;
- Last-Modified: 源头服务器认定的资源做出修改的日期及时间。
- 空行:同上;
- 响应体:响应内容;
HTTP 方法
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
- GET - 获取资源。
- POST - 传输资源。
- HEAD - 获取报文首部。
- PUT - 更新资源。
- DELETE - 删除资源。
- CONNECT - HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
- OPTIONS - 允许客户端查看服务器的性能。
- TRACE - 回显服务器收到的请求,主要用于测试或诊断。
- PATCH - 是对 PUT 方法的补充,用来对已知资源进行局部更新 。
GET 和 POST 的区别
# | GET | POST |
---|---|---|
1 | 参数长度有限制,过长会被截断 | 无限制 |
2 | 请求会被浏览器主动缓存 | 不会主动缓存,可手动设置 |
3 | 参数通过 URL 传递,一般不用来传递敏感信息 | 参数放在请求体中 |
4 | 同上,请求参数会被保留来浏览器历史记录中 | 不会 |
5 | 浏览器回退时无害,不会二次提交 | 浏览器回退会再次提交请求 |
6 | 只支持 URL 编码 | 支持多种编码格式 |
7 | 参数类型只接收 ASCII 字符 | 无限制 |
HTTP 状态码
状态码分类
分类 | 描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
常见状态码
# | 提示 | 描述 |
---|---|---|
200 | OK | 请求正常处理完毕 |
204 | No Content | 请求成功处理,没有实体的主体返回 |
301 | Permanently | 永久重定向 |
302 | Found | 临时重定向 |
304 | Not Modified | 客户端有缓存可用 |
400 | Bad Request | 客户端错误,表示请求报文存在语法错误或参数错误 |
403 | Forbidden | 服务器接收到请求,但请求被拒绝 |
404 | Not Found | 无法找到请求资源 |
500 | Internal Server Error | 服务器故障 |
503 | Service Unavailable | 服务器超负载或停机维护 |
HTTP 持久连接
在 HTTP 主要特点之一就是无连接,请求完成后即断开连接,这种方式可以节省传输时间。
但在 HTTP/1.1 开始支持持久连接,使用同一个 TCP 连接来发送和接收多个 HTTP 请求/应答,而不是为每一个新的请求/应答打开新的连接的方法。这样请求时连接就不会中断,而是保持连接,当客户端发送另一个请求时,它会使用同一个连接。这一直继续到客户端或服务器端认为会话已经结束,其中一方中断连接。
在 HTTP 1.1 中 所有的连接默认都是持续连接,除非特殊声明不支持。
报文表现为Connection: keep-alive
HTTP 管线化
HTTP 管线化 是将多个 HTTP 请求整批提交的技术,而在发送过程中不需先等待服务器的回应。
HTTP 管线化可以克服同域并行请求限制带来的阻塞,它是建立在持久连接之上,是把所有请求一并发给服务器,但是服务器需要按照顺序一个一个响应,而不是等到一个响应回来才能发下一个请求,这样就节省了很多请求到服务器的时间。不过,HTTP 管线化仍旧有阻塞的问题,若上一响应迟迟不回,后面的响应都会被阻塞到。
简单来讲就是将请求-响应从这样:
请求 1->响应 1->请求 2->响应 2->请求 3->响应 3
变成这样:
请求 1->请求 2->请求 3->响应 1->响应 2->响应 3
参考文档:
- MDN - 超文本传输 协议(HTTP)