[计网]从HTTP0.9到HTTP3.0

274 阅读5分钟

HTTP协议.png 建议配合思维导图阅读以下文章...

HTTP协议

超文本传输协议(Hyper Text Transfer Protocol,HTTP),是一个位于应用层的请求响应协议。

HTTP0.9

这是最早的HTTP协议,主要用于学术交流,只传递HTML超文本的内容,所以设计的也很简单,只有一个请求行.

通讯过程

TCP三次握手建立连接
客户端发送请求行GET/index.html
服务端响应,将内容以ASCII字符流来传输
TCP四次挥手断开连接

HTTP1.0

时代在进步,网景公司推出了浏览器,开始面向大众。
需求发生了变化,不再局限于HTML文件,还包括了JS,CSS,图片等,编码类型也发生了变化。这时就提出了请求头和响应头
将浏览器想要的文件类型,编码方式,语言,用户代理等写在请求头中,
实际返回的类型,缓存控制Cache等信息写在响应头中。
请求行中新增了状态码

请求头

image.png

image.png Accept:想要的文本类型
Accept-Encoding:想要的压缩方式
Accept-language:想要的语言。
User-Agent:用户代理,统计用户的基础信息,比如系统类型。

响应头

image.png

image.png
Content-Encoding:响应内容的实际压缩方式。
Content-Type:响应内容的实际类型和编码方式
Cache-Control:响应是否内被缓存。

HTTP1.1

时代又发展了,人们对于网络的传输速率又有了更高的要求。

长连接(持续连接)

我们来回顾一下之前的TCP连接。

image.png
每一个请求都要重新建立连接,就算同一个客户端和服务端,再发请求又要重新连接,所以在HTTP1.1中提出了同一个客户端和服务端建立的连接可以进行多次通信。

image.png

提供虚拟机支持

一个计算机可以有多个虚拟机,每个虚拟机的ip地址是相同的,但是域名是不相同的,为了区分相同ip地址下的虚拟机,请求头中引入了HOST字段。

image.png

分块传输

在http1.0中,响应头中有Content-length来表示数据长度,当浏览器接收的数据到达这个长读就代表本次响应完成,但是随着数据越来越大,服务端每次都要先计算整个文件的数据长度,计算完再发送就会耗费大量时间,在此引入了trunk transfer,分块传输,将大文件分成许多小块,每一个小块有两部分组成,当前小块的长度和数据,最后一个小块长度为0,一个形象的例子,等所有饭菜上完再吃,和边吃边上菜。

引入了cookie

Http本身是无状态的,一个常见的场景,判断用户是否登录,用户输入密码成功登录后,后端将该用户的状态写入响应头中的Set-Cookie:...,客户端将Cookie存到本地,每次发送http连接就带上Cookie.

响应头:

image.png

请求头

image.png

增加TCP连接数

浏览器为每个域名最多同时维护 6 个 TCP 持久连接;

使用CDN域名分片

域名分片技术把页面资源拆分成多个域名进行访问,从而提高页面加载速度,(因为单个域名最多只能为6个TCP连接,那我就多开几个域名)

HTPP2.0

HTTP1.1虽然对资源加载速度做了优化,但是对带宽的利用率不高。

http1.1带宽利用率不高的原因

TCP的慢启动

TCP有自己的流量控制,防止网络拥塞,会慢慢的提高传输速度。

队头阻塞问题

一个TCP长连接,每次都要等上一个请求得到响应后,才能发下一个请求。

多条TCP连接竞争带宽

TCP的传输速度是慢慢上升的,当多条TCP连接速度都上升了,带宽不够用了,就会抢占带宽,关键资源得不到加载。

一个域名只能使用一个TCP长连接。

协议栈引入二进制分帧层

将数据分成带有ID编号的帧,一次将这些帧全部发送,服务端根据ID编号重新合成完整请求,根据请求将需要响应的资源又分帧打上ID编号发给浏览器。

多路复用

一个TCP连接中可以存在多条流,ID编号相同的帧合在一起我们称为流.

image.png
从流的层面看,是有多路流并行的。

可以设置请求优先级

发生请求时标上该请求优先级,服务器会优先处理优先级高的请求。

服务器推送

将请求的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

image.png