http
超文本传送协议。基于tcp进行请求和响应的交互,必须按照规定的格式和遵循一定的规则,这些格式和规则就是http。
特点
1.无连接、无状态。虽然需要建立tcp连接,但是不需要建立http连接,每次请求都是独立的。
http/1.0和http/1.1的区别
1.0完成一次请求响应后会释放已建立的tcp连接,下次请求时再重新创建。
1.1完成一次请求响应后会在一段时间内保留已建立的tcp连接,下次请求时可以复用。
浏览器方面降低了请求的响应时间,服务器方面减少了频繁创建、释放tcp连接的性能开销。
http1.1的持续连接的两种工作方式
1.非流水线:浏览器在收到前一个请求的响应之后才能发出下一个请求。
2.流水线:浏览器在收到响应之前就可以接着发送新的请求。这种方式是tcp连接的空闲时间减少,提高了请求处理效率。
队头阻塞:http/1.x 的请求和响应是同步的,当上一个请求的响应收到之后,才能发起下一个请求。
因此当前面的请求阻塞后,会导致后面的请求也全部阻塞。虽然 pipelining 确实能够让客户端在一个连接上发送多个请求,
但它依然存在队头阻塞的问题:即使请求可以并发发送,但响应必须按请求的顺序返回,因此无法彻底避免阻塞。
HTTP/2 引入的多路复用(Multiplexing)机制不仅允许并发发送请求,还能并发接收响应,无响应顺序要求,
避免了队头阻塞,因此性能更优。
HTTP/2
基于二进制帧传输,支持多路复用(Multiplexing),解决了“队头阻塞”问题。
提高传输效率,支持服务器推送(Server Push)。
HTTP 方法
GET:获取资源。
POST:提交数据以创建或更新资源。多用于创建,非幂等性
PUT:替换指定资源。全量替换\更新,幂等性
DELETE:删除资源。
PATCH:部分更新资源。部分替换\更新,幂等性。
OPTIONS:查询服务器支持的通信选项。
HEAD:获取响应头信息,忽略响应体。
请求格式
<请求行>
<请求头>
<空行> // 用于分隔请求头和请求体
<请求体>
请求样例
POST /login HTTP/1.1
Host: www.example.com
User-Agent: curl/7.68.0
Content-Type: application/json
Content-Length: 34
{
"username": "Alice",
"password": "123456"
}
响应格式
<状态行>
<响应头>
<空行>
<响应体>
响应样例
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 23
{
"status": "success"
}
常见状态码
2xx(成功):200 OK, 201 Created
3xx(重定向):301 Moved Permanently, 302 Found
4xx(客户端错误):400 Bad Request, 404 Not Found
5xx(服务器错误):500 Internal Server Error, 503 Service Unavailable
协议解析时拆包与粘包
拆包:当一个大的 HTTP 消息被拆成了多个 TCP 数据包发送,接收方在接收到部分数据包时无法知道完整的 HTTP 消息的结束。
粘包:多个 HTTP 消息被合并成一个 TCP 数据包发送,接收方无法分辨每条 HTTP 消息的边界。
请求体的长度从请求头中获得,那请求头如何解析?
HTTP 头部的传输结构是清晰明确的,浏览器或服务器能够根据标准格式来正确地解析 HTTP 请求或响应的头部,
即使这些数据是在不同的 TCP 包中传输的,也能正确识别每个请求的边界,从而避免拆包和粘包问题。
HTTP 头部本身遵循一个标准结构,请求头中的键值对以 CRLF (\r\n) 作为分隔符,
头部的结束由两个连续的 CRLF (\r\n\r\n) 表示。请求体的长度从请求头中获得。