http 简述

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、服务器推送

服务端可以主动推动信息到客户端
原文地址:https://www.cnblogs.com/linjunfu/p/12686016.html