HTTP 1-3

81 阅读2分钟

http 1.1

在TCP3次握手后采用一次一送的方式接收文件。

例如拿到了index.html在根据html依次请求css,js文件。

如果其中一个文件丢失,可能对造成队头阻塞。

为了解决队头阻塞,http采用管线化的技术:单个链接可以发送多个请求。但是采用这个技术接收顺序必须与发送顺序相同。

解决方法

1.精灵图可以减少http的请求次数。

2.data URLs:将图片转为2进制放入到html中

3.域名分片:网站新开多个域,增加浏览器的并行下载数量

http1.1缺点

1.如果采用https的方式,tls会增加通信前的握手次数。

2.http每次发送前都要带有cookie,token等信息,增大开销

3.TCP慢启动

http 2.0

多路复用

为了解决http1.1队头阻塞的问题

将http数据包封装成二进制的帧,加入了流标识符,表明顺序

接收顺序必须与发送顺序可以不同,接收与发送是独立开的

hpack

http1.1仅报文压缩,首部被压缩,而http2.0采用hpack将首部也压缩了。并且报文直接变成2进制的帧。

服务器推送

服务器提前将可能用到的文件都发送过去

http2.0缺点

http2只解决了http层面的队头阻塞问题,不能解决TCP层面的队头阻塞问题

http3.0(quic)

http3将TCP与TSL的握手整合在一起,减少了来回带来的开销,如果是恢复会话不用握手,实现0rtt。

网络结构 http3.0 http - quic - udp - ip

​ http2.0 http - tls - tcp - ip

封装流程:

应用数据------quic流------quic帧------quic包

quic包里面有自己独立的号码,如果丢失了一个quic包,就直接重传该丢失的包,以此解决TCP的队头阻塞问题

关于TCP的队头阻塞问题:

如果TCP采用回退N帧的方法控制丢失重传,那么当发送队列的前序TCP报文丢失,则这个报文后面的所有报文都要重新发送,也就是要回退N帧

Connection ID

在TCP中仅用一组四元组即可标识出一个特定的连接,而对于基于UDP的quic协议来说,想要标识出特定的连接就想要使用Connection ID。

Connection ID的作用:

从wifi坏境下切换到手机4G,ip地址被改变了,用四元组就不太好用了,必须得重新握手恢复通话。而使用Connection ID依旧可以正常标识出连接,维持会话