HTTP 1.0 → HTTP 1.1

长连接

HTTP 1.1默认支持长连接,减少了TCP连接次数,节约开销。

HTTP 1.0所保持的TCP每次只能处理一个请求,最典型的就是pipline管线化模型,虽然能一次性接收多个请求,但是还是得按顺序一次处理一个请求,这样很容易造成后续请求等待前序请求完成,造成阻塞,也就是我们常说的”线头阻塞”。

总结:HTTP 1.0需要使用keep-alive参数来告知服务器建立长连接,而HTTP 1.1默认支持长连接,减少了TCP连接次数,减少了开销和延迟!!!

_缓存_

HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准。

HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略

新增状态码

HTTP1.1 中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删!

http1.1带宽优化

HTTP 1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服务器。这样当服务器返回401的时候,客户端就可以不用发送请求body了,节约了带宽。另外HTTP还支持传送内容的一部分。这样当客户端已经有一部分的资源后,只需要跟服务器请求另外的部分资源即可。这是支持文件断点续传的基础。HTTP1.1在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。

HOST域

HTTP 1.1支持host域,服务端可以通过host域设置多个虚拟站点来共享一个ip和端口。因为随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)




HTTP 1.1 → HTTP 2.0

多路复用

HTTP 2.0使用多路复用技术,使用一个TCP连接_并发_处理多个请求,不但节约了开销而且可处理请求的数量也比HTTP 1.1大了很多。

当然HTTP1.1也可以多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的。
TCP连接有一个预热和保护的过程,先检查数据是否传送成功,一旦成功过,则慢慢加大传输速度。因此对应瞬时并发的连接,服务器的响应就会变慢。所以最好能使用一个建立好的连接,并且这个连接可以支持瞬时并发的请求。

头部压缩

HTTP 1.1不支持header数据压缩,HTTP 2.0使用HPACK算法对header的数据进行压缩,使得数据传输更快。

服务器推送

当我们对支持HTTP 2.0的服务器请求数据额时候,服务器会顺便把一些客户端需要的资源一起推送到服务器,这种方式适用于加载静态资源,节约带宽。服务器端推送的这些资源其实存在客户端的某处地方,客户端直接从本地加载这些资源就可以了,不用走网络,速度自然是快很多的。

HTTP → HTTPS HTTPS = HTTP + TLS/SSL加密 + 认证 + 完整性保护 (80 443)

在讲 HTTPS 之前,我们先来看看 HTTP 有哪些不足:

  • 使用明文通信,内容可能会被窃听
  • 不验证通信双方身份,有可能遭遇伪装
  • 无法证明报文的完整性,内容可能遭到篡改

为了解决这些不足,所以HTTPS 应运而生,先看看https的特性:

  • TLS/SSL内容加密
  • 数字证书(CA)验明身份: 防范中间人攻击
  • MD5、SHA-1等散列值方法防止信息篡改(中间人攻击:运营商等)

先来谈谈“对称加密”和“非对称加密”的概念

对称加密

所谓的“对称加密技术”,意思就是说:“加密”和“解密”使用相同的密钥。这个比较好理解,就好比你用 7zip 或 WinRAR 创建一个带密码(口令)的加密压缩包,当你下次要把这个压缩文件解开的时候,你需要输入同样的密码,在这个例子中,密码/口令就如同刚才说的“密钥”。

对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key),这种方法在密码学中叫做对称加密算法,对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。

非对称加密

所谓的“非对称加密技术”,意思就是说:“加密”和“解密”使用不同的密钥,这玩意儿比较难理解,也比较难想到,当年“非对称加密”的发明,还被誉为“密码学”历史上的一次革命。
非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key),私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人,非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。

总结:非对称相对更安全,但是性能要求更高!

https加密方式

虽然TLS/SSL采用公开密钥这种非对称加密方式,但是HTTPS并不是全部使用非对称加密,而是使用混合加密方式,即:公开密钥(非对称加密)+共享密钥(对称加密)

因为公开密钥与共享密钥加密相比,其处理速度要慢很多。所以HTTPS冲锋利用了两者各自的优势,将多种方法组合起来用于通信。https在交换密钥环节使用公开密钥加密方式,之后建立的通信交换报文阶段则使用共享密钥加密方式

证明公开密钥的正确性的证书

遗憾的是, 公开密钥加密方式还是存在一些问题的, 那就是无法证明公开密钥本身就是货真价实的公开密钥. 比如, 正准备和某台服务器建立公开密钥加密方式下的通信时, 如何证明收到的公开密钥就是原本预想的那台服务器发行的公开密钥. 或许在公开密钥传输途中, 真正的公开密钥已经被攻击者替换了.

为了解决上述问题, 可以使用有数字证书认证机构(CA)其他相关机关颁发的公开密钥证书

基本流程为:

  • 1.服务器把自己的公开密钥登录至数字证书认证机构
  • 2.数字证书认证机构用自己的私有密钥向服务器的公开密钥署数字签名并颁发公钥证书
  • 3.客户端拿到服务器的公钥证书后, 使用数字证书认证机构的公开密钥, 向数字证书认证机构验证公钥证书上的数字签名, 以确认服务器的公开密钥的真实性
  • 4.使用服务器的公开密钥对报文加密后发送
  • 5.服务器用私有密钥对报文解密

性能问题

通常我们会认为,使用HTTPS会导致网站加载速度变慢。实际上,只要我们合理优化使用HTTPS过程,使用HTTPS可能会比使用HTTP还快!
使用HTTPS相比于HTTP所增加的延迟点:

  • HTTP 302 跳转到 HTTPS 的耗时

  • CPU 进行 RSA 加解密运算的耗时

  • 请求和验证 CA 所花的时间

优化方式:

  • 使用 HSTS 技术,去掉从80跳转到443的跳转(HSTS使用的是内部307跳转技术,不会产生多余的网络请求) PS:302 和 307 效果相同,只是307强制使用post

  • 使用专门的加解密硬件处理加解密,减轻CPU负担。这样不仅减少了处理时间,所能承受的qps也会增加。

  • 减少证书链,减少 CA 请求时间

  • session复用,减少建立连接的次数

为什么不都使用https

  • 性能问题
  • 金钱问题

参考
HTTP1.0、HTTP1.1 和 HTTP2.0 的区别
HTTP、SSL/TLS和HTTPS协议的区别与联系

浅谈Http1.0/Http1.1/Http2.0/Https的更多相关文章

  1. 浅谈href=#与href=javascript:void(0)的区别

    #"包含了一个位置信息 默认的锚点是#top 也就是网页的上端 而javascript:void(0)  仅仅表示一个死链接 这就是为什么有的时候页面很长浏览链接明明是#可是跳动到了页首 而 ...

  2. http2.0与http1.X的区别

    此文只是方便重看,原文在:http://www.mamicode.com/info-detail-1199706.html 1.1 HTTP应用场景 http诞生之初主要是应用于web端内容获取,那时 ...

  3. 杂谈:HTTP1.1 与 HTTP2.0 知多少?

    HTTP是应用层协议,是基于TCP底层协议而来. TCP的机制限定,每建立一个连接需要3次握手,断开连接则需要4次挥手. HTTP协议采用"请求-应答"模式,HTTP1.0下,HT ...

  4. HTTP/1.0和HTTP/1.1 http2.0的区别,HTTP怎么处理长连接(阿里)

    HTTP1.0 HTTP 1.1主要区别 长连接 HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接. HTTP是基于TCP/IP协议的,创 ...

  5. HTTP,HTTP2.0,SPDY,HTTPS你应该知道的一些事

    作为一个经常和web打交道的程序员,了解这些协议是必须的,本文就向大家介绍一下这些协议的区别和基本概念,文中可能不局限于前端知识,还包括一些运维,协议方面的知识,希望能给读者带来一些收获,如有不对之处 ...

  6. HTTP2.0那些事

    1. HTTP2.0的前世 http2.0的前世是http1.0和http1.1这两兄弟.虽然之前仅仅只有两个版本,但这两个版本所包含的协议规范之庞大,足以让任何一个有经验的工程师为之头疼.http1 ...

  7. https 加密、http2.0、keep-alive

    原文地址:https://ainyi.com/44 HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议 ...

  8. 《HTTP - http2.0》

    推荐一首歌 - <卡路里>火箭101 杨超越真的只唱了一句! PS: 这章主要讲述了在 HTTP 发展之后的,一些扩展协议和补充,也会在这个章节对这几种协议和补充做一个比较. 1:HTTP ...

  9. HTTP、HTTP2.0、HTTPS、SPDY

    本文原链接:https://cloud.tencent.com/developer/article/1082516 HTTP,HTTP2.0,SPDY,HTTPS你应该知道的一些事 1.web始祖HT ...

  10. 【HTTP】402- 深入理解http2.0协议,看这篇就够了!

    本文字数:3825字 预计阅读时间:20分钟 导读 http2.0是一种安全高效的下一代http传输协议.安全是因为http2.0建立在https协议的基础上,高效是因为它是通过二进制分帧来进行数据传 ...

随机推荐

  1. 10行代码搞定移动web端自定义tap事件

    发发牢骚 移动web端里摸爬滚打这么久踩了不少坑,有一定移动web端经验的同学一定被click困扰过.我也不列外.一路走来被虐的不行,fastclick.touchend.iscroll什么的都用过, ...

  2. SimpleDateFormat实现String与Date之间的转换

    基本用法: java.text.SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd"); java.util.Date ...

  3. Python笔记 #10# Histograms

    1.Build a histogram In [1]: help(plt.hist) Help on function hist in module matplotlib.pyplot: hist(x ...

  4. logstash收集Nginx日志,转换为JSON格式

    Nginx日志处理为JSON格式,并放置在http区块: log_format json '{"@timestamp":"$time_iso8601",' '& ...

  5. 如何把js的循环写成异步的

    针对这里的问题:深入理解node.js异步编程:基础篇https://cnodejs.org/topic/533d6edbc2621e680800e0ea 这一节有一个代码:###4.1 Node.j ...

  6. Java静态内存与动态内存分配的解析

    1. 静态内存 静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源. 程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用 ...

  7. 同样的输入,为什么Objects.hash()方法返回的hash值每次不一样?

    背景 开发过程中发现一个问题,项目中用Set保存AopMethod对象用于去重,但是发现即使往set中添加相同内容的对象,每次也能够添加成功. AopMethod类的部分代码如下: public cl ...

  8. nginx限制蜘蛛的频繁抓取

    蜘蛛抓取量骤增,导致服务器负载很高.最终用nginx的ngx_http_limit_req_module模块限制了百度蜘蛛的抓取频率.每分钟允许百度蜘蛛抓取200次,多余的抓取请求返回503. ngi ...

  9. python有木有哪些必须要学习的高级模块

    python有木有哪些必须要学习的高级模块 字母表

  10. python 将类属性转为字典

    class dictObj(object): def __init__(self): self.x = 'red' self.y = 'Yellow' self.z = 'Green' def do_ ...