http(HyperText Transfer Protocol),是超文本传输协议,是目前互联网上运用最广泛的一种网络协议,所有的www文件必须遵守该协议。(属于应用层协议)
http的工作流程
- 浏览器与服务器建立TCP连接,即三次握手
- TCP连接成功,浏览器发出http请求命令
- 服务器接受请求并返回http响应
- 服务器关闭连接,即四次挥手
- 浏览器解析请求的资源
HTTP报文
分为请求和响应报文
http1.0
特点:
- 每次请求都必须新建一次连接,必须通过TCP的三次握手才能开始传输数据,然后四次挥手结束连接。
- 不跟踪每个浏览器的历史请求
缺点:
- 每次都得建立TCP连接,费时费力
- 队头阻塞,下一个请求必须在前一个请求响应到达后发送。如果某请求一直不到达,那么下一个请求就一直不发送。
http1.1
http1.1中默认支持长连接,即在一个TCP连接上可以传输多个http请求和响应,减少了建立和关闭连接的消耗和延迟。
特点:
- 支持长连接,通过Keep-Alive保持http连接不断开,避免重复建立TCP连接
- 管道化,通过长连接实现在一个连接中传输多个文件
- 加入cache-control缓存处理
- 增加了Host字段
- 添加了put、delete、options等其他请求方法
- 支持断点续传
改进和优化
- http管道化:是指将多个http请求整批提交给服务器的技术,虽然可以整批发送请求,但是服务器依然需要根据请求顺序来回复浏览器的请求。
- 对动态生成的内容提供了更好的支持:http1.0中,需要在响应头中设置完整的数据大小,浏览器根据设置的数据大小来接受数据。http1.1中引入了chunk transfer机制,服务器将数据分隔为若干个任意大小的数据块,每个数据块发送是附上上个数据块的长度,最后一个0长度的块作为发送数据完成的标志
- 浏览器为每个域名同时维护6个TCP持久连接,但是这些连接会竞争带宽。
缺点:
- 队头阻塞
- 无状态特性,协议对于连接状态没有记忆能力
- 不安全性 传输内容没有加密
- 不支持服务端推送
http2
特性:
- 二进制传输:将请求和 响应数据分为更小的帧,采用二进制编码
- 多路复用: 同一个域名下所有通信都是在单个连接上完成,单个连接可以承载任意数量的双休数据流,数据流以消息形式发送,而消息由一个或多个帧发送
- 支持服务器端推送,服务端可以主动向客户端发送消息,提前推送客户端需要的静态资源
- 提供安全性,http2也是明文的,只不过格式是二进制的,但http2都是https协议的,跑在TSL上面
http2仍然存在问题,TCP+TSL建立连接的时间是主要瓶颈,没从根本上解决队头阻塞问题,如果遇到丢包,tcp协议还是会重新发送数据。http2中多个请求跑在一个TCP管道中,如果其中任意一路数据流出现丢包,就会阻塞tcp连接中的所有请求。
http3
http3甩掉TCP、TSL的包袱,构建高效网络QUIC协议
HTTP3选择了UDP协议,基于UDP实现了类似TCP的多路数据流、传输可靠性等功能,将这套功能称为QUIC协议。
?特性:
- 基于UDP协议改造,实现了快速握手
- 集成了TLS的加密功能
- 多路复用,彻底解决了头阻塞问题(一个物理连接上可以有多个独立的逻辑数据流,实现了数据流的单独传输)
- 实现了类似TCP的流量控制、传输可靠性的功能
队头阻塞是指:当顺序发送的请求序列中的一个请求因为某种原因阻塞时,在后面排队的请求也一并阻塞,导致客户端收不到数据。
解决队头阻塞:
- 将同一页面的资源分散到不同域名下,提示连接上限。
- spriting合并多张小图为一张大图,再用JavaScript或css将小图重新分割
- 内联,将图片的原始数据嵌入在css文件里面的url里来减少网络请求次数
总结
http1.0
浏览器与服务器只保持短暂的链接,浏览器每次请求都需要与服务器建立一个TCP连接
http1.1
- 引入了持久连接,tcp不关闭,多个请求复用同一个TCP连接
- 多个请求按次序在服务端被处理
- 新增了一些请求方法、请求头和响应头
http2.0
- 采用了二进制而非文本字符串格式
- 多路复用,只需要建立一个连接即可实现并行
- 使用爆头压缩,降低开销
- 服务器推送
HTTP3.0