课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
没有任何一种编程开发语言是一成不变的,而是随着互联网的不断发展而升级更新的,下面我们就一起来了解一下,http都经历了多少版本又有哪些特点。
HTTP1.0:
短连接,发送一次数据后就断开TCP连接
HTTP1.1:
默认是长连接,可以用connection:keep-alive/close来设置
服务器和浏览器都要支持
长连接,在请求关闭连接前客户端与服务器保持连接。
如果长连接在超时时间后,这个http没有发送请求,那么此时这个长连接就会被断开。
Connection:keep-aliveKeep-Alive:timeout=60,表示空闲时间为60s。
Connection:keep-alive,不设置超时时间,就是永久有效。
TCP连接默认闲置时间是2小时,一般设置为30分钟足够了。
http连接保持时间是由服务端的消息头connection字段和keep-alive字段定的。
HTTP2.0:
部压缩。对消息头采用HPACK进行压缩传输,节省消息头占用的网络流量(HTTP1.1带有大量的冗余头信息)
二进制传输。采用二进制格式传输数据(HTTP1.1是问二八年格式),在协议解析和优化扩展上带来更多优势和可能。
多路复用。采用多路复用的单一长连接
服务端推送。主动把客户端可能需要的推送给客户端。
请求优先级。如果流被赋予了优先级,它就会基于这个优先级来处理,由服务器决定需要多少资源来处理该请求。
HTTP2,在底层传输机制上完全重构,采用Frame,包含frame-header和frame-data,每个frameheader都有一个stream-ID,每次请求/响应使用不同的stream-ID,从而实现多路复用。
server-push,当服务端主动推送某个资源的时候,便会发送一个frame-type为push—promise的frame,里面有push需新建的stream-id,客户端接收到后发现是push—promise,就准备好接收。
HTTP3.0:
QUIC(quickudpinternetconnections),基于UDP的传输层协议,提供像TCP一样的可靠性。
HHTP/2,虽然,不同流之间相互独立,但是数据还是一帧一帧的发送和接受的,一旦一个包丢失,后面的就会阻塞。QUIC,基于UDP,让不同的流之间真正实现相互独立传输,互不干扰。
切换网络时的连接保持。基于TCP的协议,切换网络后,IP会变,因此连接会断开。基于UDP,则可以内建与TCP不同的连接标识方法,从而在网络完成切换后,恢复之前与服务器的连接。
目前TCP与SSL/TLS(1.0,1.1,1.2)每次建连需要TCP三次握手+安全握手,需要4~5个RRT。QUIC实现零RTT建立连接。
连接:
client->server:发送一个hellopackage
server->client:安全证书和对应客户端的的SYNcookie
client:解码,保存SYNcookie【此时使用了一个RRT】
client如果解码失败。lient->server:要求重新发送安全证书,并将SYNcookie附加到这个请求包中,以便让服务器验证请求的正确性和有效性。【此时,建立连接需要2个RTT。】
client->server:加密一个HelloPacket并发送。不用等恢复,继续发送数据包。
server:接到Hello包之后,用自己现有的秘钥解码,如果解码不成功,将把客户端的连接当做一次连接,重发安全证书等信息。同上介绍的一样。此时,通常会有2个RTT,极端情况下是3个RTT。
服务器成功解码之后,验证了客户端的安全性之后,就可以继续处理接下来收到的数据包。此时延时是0个RTT。
为了预防丢包等问题,HelloPacket可能会隔一段时间被重传多次,保证减少丢包造成的延迟。比如,先发一个Hello包,之后发送数据包,再发送一个Hello包。
优雅的丢包处理:
FEC前向纠错:
数据包=本身数据+其他数据包部分数据。
在少量丢包的情况下,可以使用其他数据包的冗余数据完成数据组装而无需重传,从而提高数据的传输速度。
具体实现类似于RAID5,将N个包的校验和(异或)建立一个单独的数据包发送,这样如果在这N个包中丢了一个包可以直接恢复出来。除此之外还可以用来校验包的正确性。
关键包发送多次:
快速重启会话:支持网络切换。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!