web 的基石
最重要的应用层协议。
特点
- 无状态
- 没有持久连接
- 面向报文
HTTP
报文的组成部分
由三个部分:起始行,首部,主体(可选) 组成。
其中 起始行和首部 都是ASCII码文本,以一个回车和换行符结束。
主体可以是文本、二进制数据或者为空。
- 请求报文
起始行+首部+请求实体
GET api/getUserInfo HTTP/1.1 ===> 起始行
Host: www.yourdomain.com ===> 首部字段开始
Accepts: */*
...
可选的主体部分
- 响应报文
起始行+首部+响应实体
HTTP/1.1 200 OK
Content-Length: 300
Content-Type: txt/html
...
可选的主体部分。
常见的响应状态码
200 ==> success
204 ==> no content
300 ==> no content
301 ==> 永久重定向
302 ==> 临时重定向
304 ==> 协商缓存
400 ===> 错误请求
401 ===> 鉴权失败(权限)
403 ===> forbidden
404 ===> not found
500 ===> internal server error(常见于服务端内部逻辑错误导致)
首部字段
- 常见的请求报文中的首部字段
Host
Cookie
Accept
Authrization
Cache-Control
Connection
Referer
User-Agent
- 响应报文中的首部字段
Content-Type
Content-Length
Date
Server
Set-Cookie
Expires
Last-Modified
重点 缓存 相关的首部字段
// 第一组 协商缓存
client: If-Modified-Since
server: Last-Modified
// 第二组 协商缓存
client: If-None-Match
server: Etag
// 第三组 强缓存
client:
server: Expires: Thu Mar 04 2021 13:44:00 GMT+0800 (CST)(绝对值)
// 第四组 强缓存
client:
server: Cache-Control: max-age=500(相对值 单位秒)
- 优先使用强制缓存, Cache-Control 优先级比 Expires高
- 再匹配协商缓存
http协议的演进
http 0.9
- 简单
- 没有头部信息
http1.0
- 增加头部信息
- 不支持持久连接
http1.1
- 增加
TCP
持久连接:connection: keep-alive
,多个请求排队共用一个连接,减少了TCP建立连接的等待时间(目前浏览器支持同时建立6个TCP连接) - 增加了
Host
请求头:支持虚拟主机(否则只有ip) - 支持cookie
存在的问题:
- 队头阻塞问题,因为多个请求共用一个
TCP
连接,如果前一个请求没有返回,后面的就无法发起。 - 带宽利用率:
TCP慢启动
,多个TCP
连接竞争固定的带宽。
http 2
- 一个域名使用一个
TCP
连接:减少抢占带宽和慢启动问题(只需要进行一次慢启动过程) - 多路复用:为每一个请求增加一个id,增加了一个二进制分帧层。服务端收到之后,将相同id的组合成完整的请求,然后响应也带有id,进入二进制分帧层,返回客户端,客户端将相同id的响应组合成完整的响应。
- 设置请求优先级,
- 服务器推送
- 压缩请求头。
网友评论