前端---梳理 http 知识体系 2
为什么要有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,而是调用专门的安全接口。
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特点
头部压缩
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的更多相关文章
- 前端---梳理 http 知识体系 1
最近看了http相关的知识点,觉得还是有必要整理下,这样对自己的网络知识体系也有帮助. http 是什么 http叫超文本传输协议,可以拆成超文本.传输.协议来理解 协议 http 是一个用在计算机里 ...
- 从输入URL到页面加载的过程?如何由一道题完善自己的前端知识体系!
前言 见解有限,如有描述不当之处,请帮忙指出,如有错误,会及时修正. 为什么要梳理这篇文章? 最近恰好被问到这方面的问题,尝试整理后发现,这道题的覆盖面可以非常广,很适合作为一道承载知识体系的题目. ...
- github上最全的资源教程-前端涉及的所有知识体系
前面分享了前端入门资源汇总,今天分享下前端所有的知识体系. 个人站长对个人综合素质要求还是比较高的,要想打造多拉斯自媒体网站,不花点心血是很难成功的,学习前端是必不可少的一个环节, 当然你不一定要成为 ...
- Web前端知识体系精简
Web前端技术由html.css和javascript三大部分构成,是一个庞大而复杂的技术体系,其复杂程度不低于任何一门后端语言.而我们在学习它的时候往往是先从某一个点切入,然后不断地接触和学习新的知 ...
- Web前端知识体系
看到一篇不错的文章,拿来收藏和分享. 原文:http://mp.weixin.qq.com/s/UFTfdE7LYhHquWEzwZKLCQ Web前端技术由html.css和 javascript三 ...
- web前端知识体系总结
1. 前言 大约在几个月之前,让我看完了<webkit技术内幕>这本书的时候,突然有了一个想法.想把整个web前端开发所需要的知识都之中在一个视图中,形成一个完整的web前端知识体系,目的 ...
- 自己总结的web前端知识体系大全【欢迎补充】
1. 前言 大约在几个月之前,让我看完了<webkit技术内幕>这本书的时候,突然有了一个想法.想把整个web前端开发所需要的知识都之中在一个视图中,形成一个完整的web前端知识体系,目的 ...
- WEB前端知识体系脑图
说在开始的话: 我上大学那会,虽说主要是学Java语言,但是web前端也稍微学了一些,那时候对前端也没多在意,因为涉入的不深,可以搞一个差不多可以看的界面就可以了,其他也没过多在意. 因为稍微了解一点 ...
- 、web前端的这么知识应该是怎样的一个知识体系架构?
.web前端的这么知识应该是怎样的一个知识体系架构?之前我以为可以以W3C为纲要,把W3C的东西学会了就够了.后来发现我错了,W3C还不全面. 真正全面的覆盖了web前端知识体系的东西是——浏览器内核 ...
随机推荐
- Multidimension Tools(多维工具)
多维工具 # Process: 创建 NetCDF 栅格图层 arcpy.MakeNetCDFRasterLayer_md("", "", "&quo ...
- Conda 命令
Conda 命令 1 检验当前conda的版本 conda -V 2 conda常用的命令 查看已有的虚拟环境 conda env list 创建虚拟环境和删除虚拟环境 anaconda命令创建pyt ...
- SpringBoot-thymeleaf-静态资源引入和接管
引入前端 templates下放html页面 static下放css.js.image等静态资源 添加thymeleaf命名空间 <html lang="en" xmlns: ...
- Oracle中常用的to_char用法详解
Oracle函数to_char转化数字型指定小数点位数的用法 to_char,函数功能,就是将数值型或者日期型转化为字符型. 比如最简单的应用: -- 1.0123=>1.0123 SELECT ...
- [kuangbin带你飞]专题一 简单搜索 棋盘问题
题来:链接https://vjudge.net/problem/OpenJ_Bailian-132 J - 棋盘问题 1.题目: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别. ...
- 敏捷 Scrum Master 的難點
什麼是 Scrum Master? Scrum master 是一個團隊角色,負責確保團隊遵守敏捷方法和原則並符合團隊的流程和實踐. Scrum Master 促進敏捷開發團隊成員之間的協作.Scru ...
- Java编程开发学习路线图(附所有免费课程+在线自测)
转自 https://yq.aliyun.com/articles/134286?spm=5176.100239.0.0.1UfveS 摘要: 长期以来,Java一直占据TIOBE编程语言排行版第一 ...
- seata整合nacos完成分布式的部署
seata整合nacos完成分布式的部署 一.背景 二.部署机器 三.部署步骤 1.在seata上创建命名空间 2.下载对应版本的seata 3.单机启动 1.修改seata配置文件 1.修改注册中心 ...
- 手写vue-router & 什么是Vue插件
博文分享 这篇文章你可以学习到: 实现一个自己的vue-router 了解什么是Vue的插件 学习b站大佬后做的笔记整理和源码实现 1.1.3一步一步带你弄懂vue-router核心原理及实现哔哩哔哩 ...
- 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 ...