HTTP的发展历程

249 阅读3分钟

小知识,大挑战!本文正在参与「程序员必备小知识」创作活动 本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金

1.HTTP0.9

超文本传输协议:传输内容较单一

1.只有一个请求行,没有请求头和请求体

2.响应数据没有头信息

3.响应数据以ASCII码的形式传输

4.只能发送get这样的简单请求

2.HTTP1.0

解决问题:随着传输数据类型的多样化,客户端和服务器都需要给对方传达更多信息

方法:

1.引入请求头和响应头

请求头中包含的信息有:文件类型accept、文件压缩方式accept-encoding、文件的编码类型accept-Charset、所需的文件语言类型accept-language

响应头中包含的信息有:文件最终压缩方式content-encoding、文件类型content-type

2.引入状态码

3.引入catch机制,对数据进行缓存

4.请求头中添加用户代理字段

缺点:

  每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。

  TCP连接的新建成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢(slowstart)。所以,HTTP1.0版本的性能比较差。随着网页加载的外部资源越来越多,这个问题就愈发突出了。 TCP连接的新建成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢(slowstart)。所以,HTTP1.0版本的性能比较差。随着网页加载的外部资源越来越多,这个问题就愈发突出了。

  为了解决这个问题,有些浏览器在请求时,用列表项目了一个非标准的Connection字段。

  Connection:keep-alive

  一个可以复用的TCP连接就建立了,直到客户端或服务器主动关闭连接。但是,这不是标准字段,不同实现的行为可能不一致,因此不是根本的解决办法。

3.HTTP1.1

解决问题:

1.多次tcp连接浪费时间和资源

2.队头阻塞

3.虚拟服务器问题

4.内容动态生成导致无法确定传输文件大小

方法:

1.持久连接:在一个TCP连接上可以传输多个HTTP请求。

默认Connection为keep-alive状态。目前浏览器中对于同一域名,默认允许同时建立6个TCP持久连接。

2.管线化:试图解决队头阻塞问题,将请求整批发送给服务器

3.提供虚拟机支持,请求头中增加host字段

4.支持动态内容:使用chunk transfer解决文件大小不固定的情况

5.客户端cookie和安全机制

备注

1.1版的最大变化,就是引入了持久连接(persistentconnection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection:keep-alive。

客户端和服务器发现对方一段时间没有活动,就可以主动关闭连接。不过,规范的做法是,客户端在最后一个请求时,发送Connection:close,明确要求服务器关闭TCP连接。

4.HTTP2

要解决的问题:

1.HTTP1.1中同一域名可连通多个TCP连接,各个TCP之间将会竞争带宽,导致传输受阻。并且由于TCP的慢启动,在文件较小的情况下传输情况受限。

因此,在HTTP2中限制一个域名使用一个TCP长连接,减少带宽的竞争和慢启动。

2.队头阻塞问题

方法:

http2的优化策略都是在二进制分帧的基础上得到的。

1.二进制分帧:添加二进制分帧层,将数据包分成更小的数据帧进行传输

2.多路复用机制

3.设置请求优先级

4.服务器推送

5.头部压缩