一、http
http的历史
http(超文本传输协议),在创建之初就是为了将超文本标记语言(html)文档从web服务端传送给浏览器的客户端。随着我们网页内容变得复杂,不单单有文字、图片,还有css,js等等渲染,ajax的出现、移动互联网的高速发展,随着时代的变迁,http也一直升级优化,丰富自己的功能特性。
http的局限
其中带宽和延迟是影响http网络请求的两个重要的因素
带宽:
虽然我们还停留在拨号上网的阶段,但我们网络基建有着飞速的发展,2G、3G、4G、5G,带宽得到了极大的提升(虽然有时感觉还是达不到运营商承诺的那样,这是由于各个方面的复杂的原因决定了,但不否认网速的确提高了),我们对带宽的影响关注度小了。
延迟:
浏览器阻塞:为了提高众多用户的访问速度和解决阻塞问题,浏览器默认会对同一御下的资源只保持一定的连接数(这个连接数是由浏览器内核决定的)
DNS查询:dns系统需要实现域名、IP的转换,提高转换速度很重要(dns缓存的出现)
建立连接:http传输文件需要利用tcp的三次握手连接,这就会存在和三次握手一样的问题,建立连接需要经过多次确认消耗时间。
http1.0:
最早在1996年在网页中使用,内容简单,所以浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态)。
HTTP1.1:
到1999年广泛在各大浏览器网络请求中使用,HTTP/1.0中默认使用Connection: close。在HTTP/1.1中已经默认使用Connection: keep-alive(长连接),避免了连接建立和释放的开销,但服务器必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容。通过Content-Length字段来判断当前请求的数据是否已经全部接收。不允许同时存在两个并行的响应。
HTTP2.0:
HTTP/2引入二进制数据帧和流的概念,其中帧对数据进行顺序标识,(流(stream):已建立连接上的双向字节流;消息:与逻辑消息对应的完整的一系列数据帧;帧:HTTP2.0通信的最小单位,每个帧包含帧头部,至少也会标识出当前帧所属的流(stream id))这样浏览器收到数据之后,就可以按照序列对数据进行合并,而不会出现合并后数据错乱的情况。同样是因为有了序列,服务器就可以并行的传输数据,这就是流所做的事情。这些数据帧都在一个tcp连接(可以承载任意数量的双向数据流)上并行发送。
http1.0和http1.1的主要区别如下:
1、缓存处理:1.1添加更多的缓存控制策略(如:Entity tag,If-Match)
2、网络连接的优化:1.1支持断点续传
3、错误状态码的增多:1.1新增了24个错误状态响应码,丰富的错误码更加明确各个状态
4、Host头处理:支持Host头域,不在以IP为请求方标志
5、长连接:减少了建立和关闭连接的消耗和延迟,http请求头keep-alive,短时间内的长连接
http1.1和http2.0的主要区别:
1、新的传输格式:2.0使用二进制格式,1.0依然使用基于文本格式
2、多路复用:连接共享,不同的request可以使用同一个连接传输(最后根据每个request上的id号组合成正常的请求)
3、header压缩:由于1.X中header带有大量的信息,并且得重复传输,2.0使用encoder来减少需要传输的hearder大小
4、服务端推送:同google的SPDUY(1.0的一种升级)一样
二、webSocket
一种双向通信协议,在建立连接后,WebSocket服务器和Browser/UA都能主动的向对方发送或接收数据,就像Socket一样,不同的是WebSocket是一种建立在Web基础上的一种简单模拟Socket的协议;
WebSocket需要通过握手连接,类似于TCP它也需要客户端和服务器端进行握手连接,连接成功后才能相互通信。
WebSocket在建立握手连接时,数据是通过http协议传输的,“GET/chat HTTP/1.1”,这里面用到的只是http协议一些简单的字段。但是在建立连接之后,真正的数据传输阶段是不需要http协议参与的。
只支持HTTP Get请求