为什么要有HTTPS

  HTTP 天生具有明文的特点,整个传输过程完全透明,任何人都能够在链路中截获、修改或者伪造请求 / 响应报文,数据不具有安全性。仅凭HTTP 自身是无法解决的,需要引入新的HTTPS协议,简单的说就是不安全。

什么是HTTPS

   HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立安全信道,加密数据包。

  HTTPS 是一个“非常简单”的协议,RFC 文档很小,只有短短的 7 页,里面规定了新的协议名“https”,默认端口号 443,至于其他的什么请求 - 应答模式、报文结构、请求方法、URI、头字段、连接管理等等都完全沿用 HTTP,没有任何新的东西。

  也就是说,除了协议名http和端口号 80 这两点不同,HTTPS 协议在语法、语义上和 HTTP 完全一样,优缺点也照单全收(当然要除去明文和不安全)

HTTPS 是怎么做到安全性?

  秘密就在于 HTTPS 名字里的“S”,它把 HTTP 下层的传输协议由 TCP/IP 换成了 SSL/TLS,由HTTP over TCP/IP变成了HTTP over SSL/TLS,让 HTTP 运行在了安全的 SSL/TLS 协议上,收发报文不再使用 Socket API,而是调用专门的安全接口。

  HTTPS 并不是一个新的应用层协议,它其实就是 HTTP + TLS/SSL 协议组合而成,而安全性的保证正是 SSL/TLS 所做的工作 。
  https = http + ssl/tls 

SSL/TLS

  SSL 即安全套接层(Secure Sockets Layer),在 OSI 模型中处于第 5 层(会话层),由网景公司于 1994 年发明,有 v2 和 v3 两个版本,而 v1 因为有严重的缺陷从未公开过。

  SSL 发展到 v3 时已经证明了它自身是一个非常好的安全通信协议,于是互联网工程组 IETF 在 1999 年把它改名为 TLS(传输层安全,Transport Layer Security),正式标准化,版本号从 1.0 重新算起,所以 TLS1.0 实际上就是 SSLv3.1。

  简单的理解就是安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性的作用。

  TLS 协议包括两个协议组―― TLS 记录协议和 TLS 握手协议

  TLS 由记录协议、握手协议、警告协议、变更密码规范协议、扩展协议等几个子协议组成,综合使用了对称加密、非对称加密、身份认证等许多密码学前沿技术,具体可以查阅相关资料进一步了解。

HTTP/2 的理解

  你一定很想知道,为什么 HTTP/2 不像之前的1.0、1.1、那样叫2.0呢?

  这个也是很多初次接触 HTTP/2 的人问的最多的一个问题,对此 HTTP/2 工作组特别给出了解释。

  他们认为以前的1.0、1.1造成了很多的混乱和误解,让人在实际的使用中难以区分差异,所以就决定 HTTP 协议不再使用小版本号,只使用大版本号,从今往后 HTTP 协议不会出现 HTTP/2.0、2.1,只会有HTTP/2,HTTP/3……

国内哪些网站用了HTTP2

目前还是很多公司都升级到了HTTP/2 比如 苹果官网、腾讯网、csdn、掘金 等

兼容http/1

  由于 HTTPS 已经在安全方面做的非常好了,所以 HTTP/2 的唯一目标就是改进性能,且兼容HTTP1.x 版本的。

HTTP/2特点

头部压缩

  HTTP/2 对报文的头部做了一个大的改变,由于报文Head一般会携带 User-Agent、Cookie、Accept、Server、Range  等许多固定的字段,多达几百甚至几千字节,而 Body 却经常只有几十字节,所以导致头部偏重。HTTP/2 使用 HPACK 算法进行头部压缩。
 

二进制分帧

  二进制分帧指的是传输的都是二进制,而帧只是一个传输单位。把原来的Header+Body的消息报文格式,拆分为一个一个的二进制“帧”(Frame),

HEADERS帧存放头数据、DATA帧存放实体数据。

  这样子的话,就是一堆乱序的二进制帧,它们不存在先后关系,因此不需要排队等待,解决了HTTP队头阻塞问题。

虚拟的流--多路复用

  二进制分帧把数据都拆分为一个一个的二进制数据包,那么传输过去之后数据怎么组装起来呢?

HTTP/2 为此定义了一个流(Stream)的概念,它是二进制帧的双向传输序列,同一个消息往返的帧会分配一个唯一的流 ID。你可以把它想象成是一个虚拟的“数据流”,在里面流动的是一串有先后顺序的数据帧,这些数据帧按照次序组装起来就是 HTTP/1 里的请求报文和响应报文。

  因为流是虚拟的,实际上并不存在,所以 HTTP/2 就可以在一个 TCP 连接上用流同时发送多个拆分之后的二进制帧数据包,这就是常说的多路复用( Multiplexing)——多个往返通信都复用一个连接来处理。

如何理解h2 中的流

  客户端将多个请求分成不同的流,然后每个流里面在切成一个个二进制帧,发送的时候是按二进制帧发送。每个帧存着一个流ID来表示它属于的流,服务端收到请求的时候将帧按流ID进行拼接。

  从传输的角度来看流是不存在的,只是看到了一个个帧,所以说流是虚拟的,如图

强化安全

  https 是大势所趋,通常所能见到的 HTTP/2 都是使用“https”协议名,跑在 TLS 上面。

  为了区分“加密”和“明文”这两个不同的版本,HTTP/2 协议定义了两个字符串标识符:

    1、h2表示加密的 HTTP/2

    2、h2c表示明文的 HTTP/2,多出的那个字母c的意思是clear text

协议栈对比

HTTP/2 小结

  • HTTP 协议取消了小版本号,所以 HTTP/2 的正式名字不是 2.0;
  • HTTP/2 在“语义”上兼容 HTTP/1,保留了请求方法、URI 等传统概念;
  • HTTP/2 使用HPACK算法压缩头部信息,消除冗余数据节约带宽;
  • HTTP/2 的消息不再是“Header+Body”的形式,而是分散为多个二进制帧
  • HTTP/2 使用虚拟的“流”传输消息,解决了困扰多年的“队头阻塞”问题,同时实现了“多路复用”,提高连接的利用率;
  • HTTP/2 也增强了安全性,要求至少是 TLS1.2,而且禁用了很多不安全的密码套件。

HTTP2 的核心就是二进制分帧、流概念、多路复用(永远都只在一个TCP 连接里面,因为一个TCP 中虚拟了很多流,一个请求-响应就对应一个流)

队头阻塞

  从HTTP/1.0诞生,一直到HTTP/2,在这24年里,HTTP协议已经做过了三次升级,但是有一个关键的技术点是不变的,那就是这所有的HTTP协议,都是基于TCP协议实现的。流水的HTTP,铁打的TCP,这是因为相对于UDP协议,TCP协议更加可靠。

  HTTP/2废弃了管道化的方式,而是创新性的引入了帧、消息和数据流等概念。客户端和服务器可以把 HTTP 消息分解为互不依赖的帧,然后乱序发送,最后再在另一端把它们重新组合起来。因为没有顺序了,所以就不阻塞了,就有效的解决了HTTP对头阻塞的问题。

  但是,HTTP/2仍然会存在对头阻塞的问题,那是因为HTTP/2其实还是依赖TCP协议实现的。

TCP传输过程

  TCP传输过程中会把数据拆分为一个个按照顺序排列的数据包,这些数据包通过网络传输到了接收端,接收端再按照顺序将这些数据包组合成原始数据,这样就完成了数据传输。

但是如果其中的某一个数据包没有按照顺序到达,接收端会一直保持连接等待数据包返回(丢包重传机制),这时候就会阻塞后续请求。这就发生了TCP队头阻塞

  http/2 只是解决http 的对头阻塞,并没有解决tcp 的对头阻塞,队头阻塞分为两个层面,一个是HTTP 队头阻塞,一个是TCP 队头阻塞。

HTTP 对头阻塞

  HTTP 是一个请求-应答的模式,类似一个队列,先进先出的模式,后面的一个请求只能等前面的请求好了,才发出请求。

  如果队首的请求因为处理的太慢耽误了时间,那么队列里后面的所有请求也不得不跟着一起等待,结果就是其他的请求承担了不应有的时间成本,造成了阻塞。

  

  在HTTP1.1 中针对HTTP对头阻塞,增加了并发连接的规则,这也算是空间换时间的思路,浏览器与服务器建立多个TCP连接,现在比较常用的并发连接数已经增加到 6 - 8个,不同的浏览器应该不同的实现。

  在HTTP2 中增加了流、以及二进制分帧、多路复用,让数据包之间可以是乱序的发送,数据包之间没有顺序的依赖关系,解决HTTP 对头阻塞的问题,但是底层还是基于TCP 协议,所以还存在TCP 对头阻塞问题,所以HTTP3 来了。

  HTTP3的基本思路,应该跟处理这个HTTP 对头阻塞差不多,让各个数据包之间没有依赖关系,其中一个有问题,不会影响其他连接。

TCP 对头阻塞

  在HTTP/2 中应用层向下传输的数据是做到了乱序,二进制,但是TCP层的数据包还是有序传输,中间一个数据包丢失,会等待该数据包重传,造成后面的数据包的阻塞,这也就是丢包重传机制,因为TCP在丢包的情况下必须等待重传确认,此时其他包就算到达缓冲区,上层应用也是无法拿出来的。

总结

  做兴趣使然的Hero,发现问题,解决问题。

前端---梳理 http 知识体系 2的更多相关文章

  1. 前端---梳理 http 知识体系 1

    最近看了http相关的知识点,觉得还是有必要整理下,这样对自己的网络知识体系也有帮助. http 是什么 http叫超文本传输协议,可以拆成超文本.传输.协议来理解 协议 http 是一个用在计算机里 ...

  2. 从输入URL到页面加载的过程?如何由一道题完善自己的前端知识体系!

    前言 见解有限,如有描述不当之处,请帮忙指出,如有错误,会及时修正. 为什么要梳理这篇文章? 最近恰好被问到这方面的问题,尝试整理后发现,这道题的覆盖面可以非常广,很适合作为一道承载知识体系的题目. ...

  3. github上最全的资源教程-前端涉及的所有知识体系

    前面分享了前端入门资源汇总,今天分享下前端所有的知识体系. 个人站长对个人综合素质要求还是比较高的,要想打造多拉斯自媒体网站,不花点心血是很难成功的,学习前端是必不可少的一个环节, 当然你不一定要成为 ...

  4. Web前端知识体系精简

    Web前端技术由html.css和javascript三大部分构成,是一个庞大而复杂的技术体系,其复杂程度不低于任何一门后端语言.而我们在学习它的时候往往是先从某一个点切入,然后不断地接触和学习新的知 ...

  5. Web前端知识体系

    看到一篇不错的文章,拿来收藏和分享. 原文:http://mp.weixin.qq.com/s/UFTfdE7LYhHquWEzwZKLCQ Web前端技术由html.css和 javascript三 ...

  6. web前端知识体系总结

    1. 前言 大约在几个月之前,让我看完了<webkit技术内幕>这本书的时候,突然有了一个想法.想把整个web前端开发所需要的知识都之中在一个视图中,形成一个完整的web前端知识体系,目的 ...

  7. 自己总结的web前端知识体系大全【欢迎补充】

    1. 前言 大约在几个月之前,让我看完了<webkit技术内幕>这本书的时候,突然有了一个想法.想把整个web前端开发所需要的知识都之中在一个视图中,形成一个完整的web前端知识体系,目的 ...

  8. WEB前端知识体系脑图

    说在开始的话: 我上大学那会,虽说主要是学Java语言,但是web前端也稍微学了一些,那时候对前端也没多在意,因为涉入的不深,可以搞一个差不多可以看的界面就可以了,其他也没过多在意. 因为稍微了解一点 ...

  9. 、web前端的这么知识应该是怎样的一个知识体系架构?

    .web前端的这么知识应该是怎样的一个知识体系架构?之前我以为可以以W3C为纲要,把W3C的东西学会了就够了.后来发现我错了,W3C还不全面. 真正全面的覆盖了web前端知识体系的东西是——浏览器内核 ...

随机推荐

  1. Multidimension Tools(多维工具)

    多维工具 # Process: 创建 NetCDF 栅格图层 arcpy.MakeNetCDFRasterLayer_md("", "", "&quo ...

  2. Conda 命令

    Conda 命令 1 检验当前conda的版本 conda -V 2 conda常用的命令 查看已有的虚拟环境 conda env list 创建虚拟环境和删除虚拟环境 anaconda命令创建pyt ...

  3. SpringBoot-thymeleaf-静态资源引入和接管

    引入前端 templates下放html页面 static下放css.js.image等静态资源 添加thymeleaf命名空间 <html lang="en" xmlns: ...

  4. Oracle中常用的to_char用法详解

    Oracle函数to_char转化数字型指定小数点位数的用法 to_char,函数功能,就是将数值型或者日期型转化为字符型. 比如最简单的应用: -- 1.0123=>1.0123 SELECT ...

  5. [kuangbin带你飞]专题一 简单搜索 棋盘问题

    题来:链接https://vjudge.net/problem/OpenJ_Bailian-132 J - 棋盘问题 1.题目: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别. ...

  6. 敏捷 Scrum Master 的難點

    什麼是 Scrum Master? Scrum master 是一個團隊角色,負責確保團隊遵守敏捷方法和原則並符合團隊的流程和實踐. Scrum Master 促進敏捷開發團隊成員之間的協作.Scru ...

  7. Java编程开发学习路线图(附所有免费课程+在线自测)

    转自  https://yq.aliyun.com/articles/134286?spm=5176.100239.0.0.1UfveS 摘要: 长期以来,Java一直占据TIOBE编程语言排行版第一 ...

  8. seata整合nacos完成分布式的部署

    seata整合nacos完成分布式的部署 一.背景 二.部署机器 三.部署步骤 1.在seata上创建命名空间 2.下载对应版本的seata 3.单机启动 1.修改seata配置文件 1.修改注册中心 ...

  9. 手写vue-router & 什么是Vue插件

    博文分享 这篇文章你可以学习到: 实现一个自己的vue-router 了解什么是Vue的插件 学习b站大佬后做的笔记整理和源码实现 1.1.3一步一步带你弄懂vue-router核心原理及实现哔哩哔哩 ...

  10. Get value from agent failed: cannot connect to [[127.0.0.1]:10050]: [111] Connection refused

    zabbix 监控连接失败 1.查看配置文件端口,server端口10051开启正常,agent端10050开启正常 2.查看/var/log/zabbix/zabbix_server.log./va ...