http 简述
一、历史
1991年:
http/0.9 只支持get
1996年:
http/1.0 get、post、head、header头信息、状态码、缓存等等
1997年:
http/1.1 进一步完善 http 协议,put、patch、options、delete等
2015年:
http/2 解决 http/1.1 效率不高问题,新增特性
二、常见状态码
信息状态码:请求正在处理
1XX
成功状态码:请求处理完成
200 成功
重定向状态码:需要进行附加操作
301 永久重定向
302 暂时重定向
304 本地缓存
客户端错误状态码:服务器无法处理请求
403 禁止访问,没有权限
404 服务器没有请求的资源
服务端错误状态码:服务器处理请求出错
500 服务器内部错误
503 服务器可能处于超负荷状态或者停机维护
三、常见头部
client:
Accept: 可接受的文件类型
Accept-Charset:可接受的字符集
Accept-Encoding:可接受/支持的压缩方法
Accept-language:可接受的语言类型,如中文、英文等
Accept-Range: 是否可以接受获取某个实体(文件)的一部分的请求
Age:从服务器请求的文件,从请求得到的那一刻到现在经过的时间
Authorization:身份验证信息
Connection:是否保持长连接
Content-Length:发送的文件长度
Content-Type:发送的文件类型
Cookie:保存用户敏感信息
If-Modified-Since: 与 Last-Modified 对应,决定是否使用缓存
If-Match: 于 ETag 对应,若相等则使用缓存
Host:请求主机。包含协议和端口
Origin:原始请求地址
Referer:请求页面的上一个来源
User-Agent: 浏览器信息
等等
server
Connection:是否保持长连接
Content-Length:返回的文件长度
Content-Type:返回的文件类型
Cache-control: 控制缓存 优先级高于 Expires
Expires: 控制缓存
Date: 服务器当前日期
ETag: 与 If-Match 对应,优先高于 Last-Modified
Last-Modified: 最后修改时间
Transfer-Encoding: 是否支持
Set-Cookie:服务端设置cookie时存在
Host:请求主机。包含协议和端口
Origin:原始请求地址
Referer:请求页面的上一个来源
User-Agent: 浏览器信息
四、优缺点与优化
http/0.9
只有 get 方法
客户端只能向服务端请求网页
服务端只能回应 html 格式的字符串
http/1.0
问题:
每个 tcp 连接只能发送一个请求,发送完毕就关闭连接
tcp 连接成本高,需要三次握手
而且一开始的发送速度较慢,即慢启动
所以性能较差
解决:
非标准字段 Connection
Connection: keep-alive
客户端发送该字段,要求服务不要关闭 tcp 连接,以便其他请求复用
服务器同样回应该字段
直到客户端或者服务器主动关闭连接
http/1.1
标准化了持久连接, tcp 连接默认不关闭,可以被多次请求复用
客户端和服务器发现对方一段时间没有活动,会主动关闭连接
规范的做法是客户端在最后一个请求时,发送
Connection: close ,明确关闭 tcp 连接
对于同一个域名,大多浏览器允许同时建立 6 个持久连接
同个 tcp 连接中,可以发送多个请求,但是服务端处理请求依旧是按照顺序处理
若前一个请求处理很耗时,会导致后面的请求排队等着,称之为“对头堵塞”
解决:
减少请求数、多开持久连接
优化技巧:合并脚本、样式表、域名分片等等
http/2
相比 http/1.1 增加特性:
1、二进制协议
http/1.1 头信息是文本,数据体可以是文本或者二进制
http/2是一个彻底的二进制协议,头信息和数据体统称为帧: 头信息帧和数据帧
二进制可以定义额外的帧。
文本实现这种功能,解析数据会比较麻烦,二进制方便的多
2、多工
http/2 复用 tcp 连接时候,同个连接当中,客户端和服务端可以同时发送多个请求或回应,
与http/1.1不同的是,不用按照顺序一一对应,避免对头堵塞;
数据分块处理,完成多少就返回多少;同时可以处理多个请求的数据
双向实时通讯,即为多工
3、数据流
http/2 不按顺序发送,同一个链接里面连续的数据包,可能属于不同的回应
所以需要对数据包做标记,指出是属于哪个回应
每个请求或回应的数据包,称为一个 数据流
数据流有 数据流ID,用来区分属于哪个数据流
规定客户端发送的数据流ID 为奇数,服务端为偶数
数据流发到一半的时候,客户端和服务端可以发送信息,取消该数据流
客户端还可以指定数据流的优先级,服务端根据优先级处理数据
4、头信息压缩
客户端与服务端维护一张头信息表,所有字段存入这个表,生成索引,后续只发送索引即可
5、服务器推送
服务端可以主动推动信息到客户端