http1.0 http1.1 http2.0 https 总结

最近不太顺,以前学过的很多东西都忘记了.这段时间好好沉淀一下,把看过的基础知识做一个大汇总.
本文起了一个开头,业务来了,忙的不可开交,几天之后继续来写,发现之前看过的都忘的差不多,刚好又在新春之际,提前祝大家新年快乐.
下面开始我们的正文吧.
先从http开始吧!

http大家耳熟能详,用的也比较多.本文将从版本的角度对比一下各个版本(http1.0, http1.1, http2.0, https)的不同和区别.
   1. http1.0 
    http1.0在1996年就出来了,最初的目的是为了一种发布和接受html的方法,从www 服务器传输超文本到浏览器的传输协议.默认端口80.
    http是基于tcp的可靠传输.HTTP使用TCP而不是UDP的主要原因在于 TCP 是可靠链接,每次链接之前都要进行三次握手, 可以保证数据的完整和正确,而UDP 是不可靠的,只管自己发 不管对方收.所以常用的网页都是基于tcp,而QQ 等实时通讯工具 和视频等下载传输使用 UDP.
    既然http是基于TCP的,所以大部分http的优化手段和技巧都是基于tcp的特性.在http1.0最大的一个问题就是链接无法复用,每次传输都必须重新来一次三次握手, TCP建立连接时三次握手有1.5个RTT(round-trip time)的延迟,并且还有慢启动的特性,所以我们前端在优化又一条就是减少请求数. 因为上面的缺点出现了http1.1.

    2.http1.1
    1. http1.1在1.0后的半年就出现了,也是现行使用最广泛的协议.http1.1继承了1.0的优点做了大量的改动.最主要的一个就是默认keep-alive长链接,因为每次握手都带来巨大的开销,长连接(PersistentConnection) 允许用户在一次tcp上面发送多个http,减少了大量不必要的开销.

    2. 增加了host字段,在http1.0中默认每个服务器只有一个ip地址,所以请求中不带host,但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。所以现在全都请求都需要设置一个host.

3.cache 缓存

在HTTP/1.0中,使用Expire头域来判断资源的fresh或stale,并使用条件请求(conditional request)来判断资源是否仍有效。例如,cache服务器通过If-Modified-Since头域向服务器验证资源的Last-Modefied头域是否有更新,源服务器可能返回304(Not Modified),则表明该对象仍有效;也可能返回200(OK)替换请求的Cache对象。

此外,HTTP/1.0中还定义了Pragma:no-cache头域,客户端使用该头域说明请求资源不能从cache中获取,而必须回源获取。

HTTP/1.1在1.0的基础上加入了一些cache的新特性,当缓存对象的Age超过Expire时变为stale对象,cache不需要直接抛弃stale对象,而是与源服务器进行重新激活(revalidation)。

HTTP/1.0中,If-Modified-Since头域使用的是绝对时间戳,精确到秒,但使用绝对时间会带来不同机器上的时钟同步问题。而HTTP/1.1中引入了一个ETag头域用于重激活机制,它的值entity tag可以用来唯一的描述一个资源。请求消息中可以使用If-None-Match头域来匹配资源的entitytag是否有变化。

为了使caching机制更加灵活,HTTP/1.1增加了Cache-Control头域(请求消息和响应消息都可使用),它支持一个可扩展的指令子集:例如max-age指令支持相对时间戳;private和no-store指令禁止对象被缓存;no-transform阻止Proxy进行任何改变响应的行为。

Cache使用关键字索引在磁盘中缓存的对象,在HTTP/1.0中使用资源的URL作为关键字。但可能存在不同的资源基于同一个URL的情况,要区别它们还需要客户端提供更多的信息,如Accept-Language和Accept-Charset头域。为了支持这种内容协商机制(content negotiation mechanism),HTTP/1.1在响应消息中引入了Vary头域,该头域列出了请求消息中需要包含哪些头域用于内容协商。

4.Chunked transfer-coding ,HTTP应答消息中发送的数据是整个发送的,Content-Length消息头字段表示数据的长度。数据的长度很重要,因为客户端需要知道哪里是应答消息的结束,以及后续应答消息的开始。然而,使用分块传输编码,数据分解成一系列数据块,并以一个或多个块发送

http2.0

    1: 多路传输:HTTP/1.x 有个问题叫线端阻塞(head-of-line blocking), 它是指一个连接(connection)一次只提交一个请求的效率比较高, 多了就会变慢。 HTTP/1.1 试过用流水线(pipelining)来解决这个问题, 但是效果并不理想(数据量较大或者速度较慢的响应, 会阻碍排在他后面的请求). 此外, 由于网络媒介(intermediary )和服务器不能很好的支持流水线, 导致部署起来困难重重。而多路传输(Multiplexing)能很好的解决这些问题, 因为它能同时处理多个消息的请求和响应; 甚至可以在传输过程中将一个消息跟另外一个掺杂在一起。所以客户端只需要一个连接就能加载一个页面。

2.spdy 二进制传输
在应用层与传输层之间增加一个二进制分帧层,以此达到“在不改动HTTP的语义,HTTP 方法、状态码、URI及首部字段的情况下,突破HTTP1.1的性能限制,改进传输性能,实现低延迟和高吞吐量。”在二进制分帧层上,HTTP2.0会将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,其中HTTP1.x的首部信息会被封装到Headers帧,而我们的request body则封装到Data帧里面。

3.header 压缩.
http1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。SPDY对header的压缩率可以达到80%以上,低带宽环境下效果很大。

4.服务器推送.
在 HTTP2.0中,服务器推送是指在客户端请求之前发送数据的机制。如果一个请求是由你的主页发起的,服务器很可能响应主页内容、logo以及样式表,因为它知道客户端会用到这些东西。这相当于在一个 HTML 文档内集合了所有的资源,不过与之相比,服务器推送有一个很大的优势:可以缓存!

对优化的影响:
因为“所有的HTTP2.0的请求都在一个TCP链接上”,“资源合并减少请求”,比如CSS Sprites,多个JS文件、CSS文件合并等手段没有效果,或者说没有必要。

因为“多路复用”,采用“cdn1.cn,cdn2.cn,cdn3.cn,打开多个TCP会话,突破浏览器对同一域名的链接数的限制”的手段是没有必要的。因为因为资源都是并行交错发送,且没有限制,不需要额外的多域名并行下载。

因为“服务器推送”,内嵌资源的优化手段也变得没有意义了。而且使用服务器推送的资源的方式更加高效,因为客户端还可以缓存起来,甚至可以由不同的页面共享(依旧遵循同源策略)

https
https  比较复杂 我尽量用自己的理解直白的说出来.

https 中的s 指的是 TSL/SSL , 在http 和tcp 之际加了一个加密层.

网上有很多对于https 的原理有大量的描述,我希望自己能用简洁直白的语言描述 出来:

https 在请求的时候,服务端会返回一个ssl证书,
    第一:证书中的信息使用了hash加密(防止篡改),通过证书拿到公钥(非对称加密)
    第二: 使用公钥对会话秘匙加密( 对称加密)
    第三:客户端服务器双方都有会话密钥,之后传输的所有Http数据,都通过会话密钥加密。
上面只是简单的总结,方便记忆.
最后在简单的总结一下http1.0  》 http1.1 》 http2.0 中主要的区别区别点.

http1.0因为请求无法复用的问题,
http1.1就有了keep-alive解决复用,同时增加了host字段(多host共享同一ip)和cache缓存更多字段.但是在http1.1中有头部阻塞的问题
所以在http2.0中出现了多路传输,同时使用header压缩和二进制传输进行优化.

你可能感兴趣的:(http1.0 http1.1 http2.0 https 总结)