http1.0 && http1.1 && http2.0 && Https
- Http协议:超文本传输协议是一种通信协议,它允许将超文本标记语言(HTML)文档从web服务器传输到客户端的浏览器。
- Http构建于TCP/IP协议之上,默认端口号是80
- Http是
无连接无状态
的。- 无连接,限制每次只处理一个请求
- 无状态,对处理的的事务没有记忆
HTTP的基本优化
影响一个 HTTP 网络请求的因素主要有两个:带宽和延迟。
- 带宽
- 延迟
- 浏览器阻塞(HOL Blocking):浏览器对于同一个域名,同时只能有4个连接(这个根据浏览器内核不同可能会有所差异),超过浏览器最大的连接数限制,后续请求会被阻塞
- DNS 查询(DNS Lookup): 解析域名。可以利用系统的DNS缓存来减少这个时间。
- 建立连接(initial connection): Http 是基于TCP 协议的,
浏览器最快也是在第三次握手时,捎带HTTP请求报文
,最快也要2RTT才能回得到响应。而这些连接无法复用,每次请求都经理三次握手和慢启动。
http1.0 & http1.1 的区别
- 长连接:HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接。
- 为什么使用长连接?
- Http1.0 一般都是短连接,即一个请求创建一个TCP连接(三次握手)传输,响应后就断开连接。如果每次通讯都要重新建立连接的话,对性能有影响。因此最好能维持一个长连接,可以用个长连接来发多个请求。
- 长连接是一直维持吗?
- 在Http1.1中,默认支持长连接的,即keep-alive参数。但是还有其他参数来控制长连接的维持时间,和请求次数。Timeout = 20 ,max = 100; TImeout 设置维持时间,20 ,维持20s,时间结束,就断开连接,新的 请求必须重新建立连接。max 设置该连接可以处理多少次请求,到达该数目后,断开连接,新的请求必须重新建立连接。
- Host头处理:在http1.0中认为每台服务器都绑定一个唯一的IP地址,因此,消息中的URL并没有传递主键名(hostname)。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
- 错误通知的管理:在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
- 带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
- 缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
ep:为什么使用长连接?
一个网页包含许多图片。客户端浏览器首先发出对该网页的请求,当浏览器解析WEB服务器返回该网页文档中的HTML内容时,浏览器将根据标签中的src属性所指定的URL地址再次向服务器发出请求。很明显,请求一个网页,包含了多次请求和响应,每次请求和响应都需要建立一个单独的连接,即使图片数据大小很小,但是每次TCP三次握手比较耗时。(就简单来说,JavaScript文件,CSS文件,也会想上面这种情况)。
HTTP Pipelining(HTTP 管线化)
默认情况下 HTTP 协议中每个传输层连接只能承载一个 HTTP 请求和响应,浏览器会在收到上一个请求的响应之后,再发送下一个请求。在使用持久连接的情况下,某个连接上消息的传递类似于请求1 -> 响应1 -> 请求2 -> 响应2 -> 请求3 -> 响应3。
HTTP Pipelining(管线化)
是将多个 HTTP 请求整批提交的技术,在传送过程中不需等待服务端的回应。使用 HTTP Pipelining
技术之后,某个连接上的消息变成了类似这样 请求1 -> 请求2 -> 请求3 -> 响应1 -> 响应2 -> 响应3。
注意下面几点:
- 管线化机制通过持久连接(persistent connection)完成,仅 HTTP/1.1 支持此技术(HTTP/1.0不支持)
- 只有 GET 和 HEAD 请求可以进行管线化,而 POST 则有所限制
- 初次创建连接时不应启动管线机制,因为对方(服务器)不一定支持 HTTP/1.1 版本的协议
- 管线化不会影响响应到来的顺序,如上面的例子所示,响应返回的顺序并未改变
- HTTP /1.1 要求服务器端支持管线化,但并不要求服务器端也对响应进行管线化处理,只是要求对于管线化的请求不失败即可
- 由于上面提到的服务器端问题,开启管线化很可能并不会带来大幅度的性能提升,而且很多服务器端和代理程序对管线化的支持并不好,因此现代浏览器如 Chrome 和 Firefox 默认并未开启管线化支持
http1.x & http2.0 的区别
- 多路复用 (Multiplexing) :
- 多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。在 HTTP/1.1 协议中浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制。超过限制数目的请求会被阻塞。这也是为何一些站点会有多个静态资源 CDN 域名的原因之一
- 二进制分帧
- HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。
- header压缩
- 就是压缩头,数据变小了,传输当然快了。SPDY 和 HTTP/2,SPDY 使用的是通用的DEFLATE 算法,而 HTTP/2 则使用了专门为首部压缩而设计的 HPACK 算法。
- 服务端推送
- 服务端推送是一种在客户端请求之前发送数据的机制。 把客户端所需要的资源伴随着第一次请求所需资源一起发送到客户端,省去了客户端重复请求的步骤。
HTTP2.0的多路复用和HTTP1.X中的长连接复用有什么区别?
- http1.x 中长连接复用,即请求排成队列串行化单线程处理,后面的请求等待前面的请求的返回才能获得执行机会,一旦某请求超时,后续请求只能被阻塞,这种情况被称为线头阻塞。
- HTTP/2多个请求可同时在一个连接上并行执行。某个请求任务耗时严重,不会影响到其它连接的正常执行;具体如图:
http & https
HTTPS
是以安全为目标的HTTP
通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
-
TTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
-
HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。
-
HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
-
HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题。
参考文章