小知识,大挑战!本文正在参与「程序员必备小知识」创作活动 本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金
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.头部压缩