建议配合思维导图阅读以下文章...
HTTP协议
超文本传输协议(Hyper Text Transfer Protocol,HTTP),是一个位于应用层的请求响应协议。
HTTP0.9
这是最早的HTTP协议,主要用于学术交流,只传递HTML超文本的内容,所以设计的也很简单,只有一个请求行.
通讯过程
TCP三次握手建立连接
客户端发送请求行GET/index.html
服务端响应,将内容以ASCII字符流来传输
TCP四次挥手断开连接
HTTP1.0
时代在进步,网景公司推出了浏览器,开始面向大众。
需求发生了变化,不再局限于HTML文件,还包括了JS,CSS,图片等,编码类型也发生了变化。这时就提出了请求头和响应头,
将浏览器想要的文件类型,编码方式,语言,用户代理等写在请求头中,
实际返回的类型,缓存控制Cache等信息写在响应头中。
请求行中新增了状态码
请求头
Accept:想要的文本类型
Accept-Encoding:想要的压缩方式
Accept-language:想要的语言。
User-Agent:用户代理,统计用户的基础信息,比如系统类型。
响应头
Content-Encoding:响应内容的实际压缩方式。
Content-Type:响应内容的实际类型和编码方式
Cache-Control:响应是否内被缓存。
HTTP1.1
时代又发展了,人们对于网络的传输速率又有了更高的要求。
长连接(持续连接)
我们来回顾一下之前的TCP连接。
每一个请求都要重新建立连接,就算同一个客户端和服务端,再发请求又要重新连接,所以在HTTP1.1中提出了同一个客户端和服务端建立的连接可以进行多次通信。
提供虚拟机支持
一个计算机可以有多个虚拟机,每个虚拟机的ip地址是相同的,但是域名是不相同的,为了区分相同ip地址下的虚拟机,请求头中引入了HOST字段。
分块传输
在http1.0中,响应头中有Content-length来表示数据长度,当浏览器接收的数据到达这个长读就代表本次响应完成,但是随着数据越来越大,服务端每次都要先计算整个文件的数据长度,计算完再发送就会耗费大量时间,在此引入了trunk transfer,分块传输,将大文件分成许多小块,每一个小块有两部分组成,当前小块的长度和数据,最后一个小块长度为0,一个形象的例子,等所有饭菜上完再吃,和边吃边上菜。
引入了cookie
Http本身是无状态的,一个常见的场景,判断用户是否登录,用户输入密码成功登录后,后端将该用户的状态写入响应头中的Set-Cookie:...,客户端将Cookie存到本地,每次发送http连接就带上Cookie.
响应头:
请求头
增加TCP连接数
浏览器为每个域名最多同时维护 6 个 TCP 持久连接;
使用CDN域名分片
域名分片技术把页面资源拆分成多个域名进行访问,从而提高页面加载速度,(因为单个域名最多只能为6个TCP连接,那我就多开几个域名)
HTPP2.0
HTTP1.1虽然对资源加载速度做了优化,但是对带宽的利用率不高。
http1.1带宽利用率不高的原因
TCP的慢启动
TCP有自己的流量控制,防止网络拥塞,会慢慢的提高传输速度。
队头阻塞问题
一个TCP长连接,每次都要等上一个请求得到响应后,才能发下一个请求。
多条TCP连接竞争带宽
TCP的传输速度是慢慢上升的,当多条TCP连接速度都上升了,带宽不够用了,就会抢占带宽,关键资源得不到加载。
一个域名只能使用一个TCP长连接。
协议栈引入二进制分帧层
将数据分成带有ID编号的帧,一次将这些帧全部发送,服务端根据ID编号重新合成完整请求,根据请求将需要响应的资源又分帧打上ID编号发给浏览器。
多路复用
一个TCP连接中可以存在多条流,ID编号相同的帧合在一起我们称为流.
从流的层面看,是有多路流并行的。
可以设置请求优先级
发生请求时标上该请求优先级,服务器会优先处理优先级高的请求。
服务器推送
将请求的HTML中引用的JS和CSS一并发送给浏览器,解析到JS,CSS浏览器就不需要再发请求了.
头部压缩
将请求头和响应头进行压缩。
HTTP3.0
前面几个版本的HTTP协议都是基于TCP的,就会带来TCP的一些特性。
TCP存在丢包重传机制
当多个数据包一起发送时,其中因为某些原因丢失了一个包,服务端就会将先到达的包进行缓存,等到客户端重传丢失的包才会一起上交给应用层。
TCP的三次握手
TCP建立连接需要进行三次握手就相当于需要多出1.5个往返时间(RTT),如果此时再使用TLS进行加密,就要再多出1个往返时间,相当于总共多出了大约2.5个往返时间。
QUIC协议
HTTP3是基于QUIC协议的,
由于中间设备僵化:路由器,交换机,计算机内核只兼容TCP和UDP,所以QUIC协议是基于UDP协议的。
集成了TLS加密功能
实现了类似TCP的流量控制,传输的可靠性
实现了HTTP/2中的多路复用
实现快速握手
对HTTP3有兴趣的同学可以去QUIC官方的测试网站尝尝鲜HTTP3