带你全面了解Http和Https

戳蓝字“CSDN云计算”关注我们哦!

640?wx_fmt=png


作者:  左大人 | 来源 公众号 程序员小乐

来源:jianshu.com/p/27862635c077

 00 前言 

Http和Https属于计算机网络范畴,但作为开发人员,不管是后台开发或是前台开发,都很有必要掌握它们。
在学习Http和Https的过程中,主要是参考了阮一峰老师的博客,讲的很全面,并且通俗易懂,有兴趣的同学可以去学习学习。


http://www.ruanyifeng.com/blog/2016/08/http.html


这篇文章主要是按照自己的思路来讲解对Http和Https的理解。文章将会从以下几个方面介绍。

目录树:



从目录结构可以看出,每个标题展开来说都是一个很大的主题。但本文旨在让各位同学对Http和Https相关知识有一个全面的认知,不会太过深入探讨各个主题,有兴趣的同学可以进行针对性研究。


 01 网络层结构 

网络结构有两种主流的分层方式:OSI七层模型和TCP/IP四层模型。


OSI七层模型和TCP/IP四层模型


OSI是指Open System Interconnect,意为开放式系统互联。


TCP/IP是指传输控制协议/网间协议,是目前世界上应用最广的协议。


640?wx_fmt=png


两种模型区别


  1. OSI采用七层模型,TCP/IP是四层模型

  2. TCP/IP网络接口层没有真正的定义,只是概念性的描述。OSI把它分为2层,每一层功能详尽。

  3. 在协议开发之前,就有了OSI模型,所以OSI模型具有共通性,而TCP/IP是基于协议建立的模型,不适用于非TCP/IP的网络。

  4. 实际应用中,OSI模型是理论上的模型,没有成熟的产品;而TCP/IP已经成为国际标准。


 02 HTTP协议 

Http是基于TCP/IP协议的应用程序协议,不包括数据包的传输,主要规定了客户端和服务器的通信格式,默认使用80端口。


Http协议的发展历史


  1. 1991年发布Http/0.9版本,只有Get命令,且服务端直返HTML格式字符串,服务器响应完毕就关闭TCP连接。

  2. 1996年发布Http/1.0版本,优点:可以发送任何格式内容,包括文字、图像、视频、二进制。也丰富了命令Get,Post,Head。请求和响应的格式加入头信息。缺点:每个TCP连接只能发送一个请求,而新建TCP连接的成本很高,导致Http/1.0新能很差。

  3. 1997发布Http/1.1版本,完善了Http协议,直至20年后的今天仍是最流行的版本。
    优点:a. 引入持久连接,TCP默认不关闭,可被多个请求复用,对于一个域名,多数浏览器允许同时建立6个持久连接。b. 引入管道机制,即在同一个TCP连接中,可以同时发送多个请求,不过服务器还是按顺序响应。c. 在头部加入Content-Length字段,一个TCP可以同时传送多个响应,所以就需要该字段来区分哪些内容属于哪个响应。d. 分块传输编码,对于耗时的动态操作,用流模式取代缓存模式,即产生一块数据,就发送一块数据。e. 增加了许多命令,头信息增加Host来指定服务器域名,可以访问一台服务器上的不同网站。
    缺点:TCP连接中的响应有顺序,服务器处理完一个回应才能处理下一个回应,如果某个回应特别慢,后面的请求就会排队等着(对头堵塞)。

  4. 2015年发布Http/2版本,它有几个特性:二进制协议、多工、数据流、头信息压缩、服务器推送。

Http请求和响应格式


Request格式:


GET /barite/account/stock/groups HTTP/1.1QUARTZ-SESSION: MC4xMDQ0NjA3NTI0Mzc0MjAyNg.VPXuA8rxTghcZlRCfiAwZlAIdCADEVICE-TYPE: ANDROIDAPI-VERSION: 15Host: shitouji.bluestonehk.comConnection: Keep-AliveAccept-Encoding: gzipUser-Agent: okhttp/3.10.0QUARTZ-SESSION: MC4xMDQ0NjA3NTI0Mzc0MjAyNg.VPXuA8rxTghcZlRCfiAwZlAIdCA
DEVICE-TYPE: ANDROID
API-VERSION: 15
Host: shitouji.bluestonehk.com
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.10.0


Response格式:


HTTP/1.1 200 OKServer: nginx/1.6.3Date: Mon, 15 Oct 2018 03:30:28 GMTContent-Type: application/json;charset=UTF-8Pragma: no-cacheCache-Control: no-cacheExpires: Thu, 01 Jan 1970 00:00:00 GMTContent-Encoding: gzipTransfer-Encoding: chunkedProxy-Connection: Keep-alive{"errno":0,"dialogInfo":null,"body":{"list":[{"flag":2,"group_id":1557,"group_name":"港股","count":1},{"flag":3,"group_id":1558,"group_name":"美股","count":7},{"flag":1,"group_id":1556,"group_name":"全部","count":8}]},"message":"success"}
Date: Mon, 15 Oct 2018 03:30:28 GMT
Content-Type: application/json;charset=UTF-8
Pragmano-cache
Cache-Control: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-Encoding: gzip
Transfer-Encoding: chunked
Proxy-ConnectionKeep-alive

{"errno":0,"dialogInfo":null,"body":{"list":[{"flag":2,"group_id":1557,"group_name":"港股","count":1},{"flag":3,"group_id":1558,"group_name":"美股","count":7},{"flag":1,"group_id":1556,"group_name":"全部","count":8}]},"message":"success"}


说明一下请求头和响应头的部分字段:



03 Tcp三次握手 

Http和Https协议请求时都会通过Tcp三次握手建立Tcp连接。


那么,三次握手是指什么呢?


640?wx_fmt=other


那么,为什么一定要三次握手呢,一次可以吗?两次可以吗?


带着这些问题,我们来分析一下为什么必须是三次握手。


  1. 第一次握手,A向B发送信息后,B收到信息。B可确认A的发信能力和B的收信能力

  2. 第二次握手,B向A发消息,A收到消息。A可确认A的发信能力和收信能力,A也可确认B的收信能力和发信能力

  3. 第三次握手,A向B发送消息,B接收到消息。B可确认A的收信能力和B的发信能力


通过三次握手,A和B都能确认自己和对方的收发信能力,相当于建立了互相的信任,就可以开始通信了。

下面,我们介绍一下三次握手具体发送的内容,用一张图描述如下:


640?wx_fmt=other


首先,介绍一下几个概念:



知道了上面几个概念后,看一下三次握手的具体流程:


  1. 第一次握手:建立连接请求。客户端发送连接请求报文段,将SYN置为1,seq为随机数x。然后,客户端进入SYN_SEND状态,等待服务器确认。

  2. 第二次握手:确认连接请求。服务器收到客户端的SYN报文段,需要对该请求进行确认,设置ack=x+1(即客户端seq+1)。同时自己也要发送SYN请求信息,即SYN置为1,seq=y。服务器将SYN和ACK信息放在一个报文段中,一并发送给客户端,服务器进入SYN_RECV状态。

  3. 第三次握手:客户端收到SYN+ACK报文段,将ack设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕,客户端和服务券进入ESTABLISHED状态,完成Tcp三次握手。


从图中可以看出,建立连接经历了三次握手,当数据传输完毕,需要断开连接,而断开连接经历了四次挥手:


  1. 第一次挥手:主机1(可以是客户端或服务器),设置seq和ack向主机2发送一个FIN报文段,此时主机1进入FIN_WAIT_1状态,表示没有数据要发送给主机2了

  2. 第二次挥手:主机2收到主机1的FIN报文段,向主机1回应一个ACK报文段,表示同意关闭请求,主机1进入FIN_WAIT_2状态。

  3. 第三次挥手:主机2向主机1发送FIN报文段,请求关闭连接,主机2进入LAST_ACK状态。

  4. 第四次挥手:主机1收到主机2的FIN报文段,想主机2回应ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段后,关闭连接。此时主机1等待主机2一段时间后,没有收到回复,证明主机2已经正常关闭,主机1页关闭连接。


下面是Tcp报文段首部格式图,对于理解Tcp协议很重要:


640?wx_fmt=other


 04 Https协议/SSL协议 

Https协议是以安全为目标的Http通道,简单来说就是Http的安全版。主要是在Http下加入SSL层(现在主流的是SLL/TLS),SSL是Https协议的安全基础。Https默认端口号为443。


前面介绍了Http协议,各位同学能说出Http存在的风险吗?


  1. 窃听风险:Http采用明文传输数据,第三方可以获知通信内容

  2. 篡改风险:第三方可以修改通信内容

  3. 冒充风险:第三方可以冒充他人身份进行通信


SSL/TLS协议就是为了解决这些风险而设计,希望达到:


  1. 所有信息加密传输,三方窃听通信内容

  2. 具有校验机制,内容一旦被篡改,通信双发立刻会发现

  3. 配备身份证书,防止身份被冒充


下面主要介绍SSL/TLS协议。


SSL发展史(互联网加密通信)


  1. 1994年NetSpace公司设计SSL协议(Secure Sockets Layout)1.0版本,但未发布。

  2. 1995年NetSpace发布SSL/2.0版本,很快发现有严重漏洞

  3. 1996年发布SSL/3.0版本,得到大规模应用

  4. 1999年,发布了SSL升级版TLS/1.0版本,目前应用最广泛的版本

  5. 2006年和2008年,发布了TLS/1.1版本和TLS/1.2版本

SSL原理及运行过程


SSL/TLS协议基本思路是采用公钥加密法(最有名的是RSA加密算法)。大概流程是,客户端向服务器索要公钥,然后用公钥加密信息,服务器收到密文,用自己的私钥解密。


为了防止公钥被篡改,把公钥放在数字证书中,证书可信则公钥可信。公钥加密计算量很大,为了提高效率,服务端和客户端都生成对话秘钥,用它加密信息,而对话秘钥是对称加密,速度非常快。而公钥用来机密对话秘钥。


下面用一张图表示SSL加密传输过程:


640?wx_fmt=other


详细介绍一下图中过程:


  1. 客户端给出协议版本号、一个客户端随机数A(Client random)以及客户端支持的加密方式

  2. 服务端确认双方使用的加密方式,并给出数字证书、一个服务器生成的随机数B(Server random)

  3. 客户端确认数字证书有效,生成一个新的随机数C(Pre-master-secret),使用证书中的公钥对C加密,发送给服务端

  4. 服务端使用自己的私钥解密出C

  5. 客户端和服务器根据约定的加密方法,使用三个随机数ABC,生成对话秘钥,之后的通信都用这个对话秘钥进行加密。


05 SSL证书 

上面提到了,Https协议中需要使用到SSL证书。


SSL证书是一个二进制文件,里面包含经过认证的网站公钥和一些元数据,需要从经销商购买。
证书有很多类型,按认证级别分类:



EV证书浏览器地址栏样式:


640?wx_fmt=other


OV证书浏览器地址栏样式:


640?wx_fmt=other


DV证书浏览器样式:


640?wx_fmt=other


按覆盖范围分类:



认证级别越高,覆盖范围越广的证书,价格越贵。也有免费的证书,为了推广Https,电子前哨基金会成立了Let's Encrypt提供免费证书。


https://letsencrypt.org/


证书的经销商也很多,知名度比较高的有亚洲诚信(Trust Asia)。


06 RSA加密和DH加密 

加密算法分类


加密算法分为对称加密、非对称加密和Hash加密算法。



对称加密算法加解密效率高,速度快,适合大数据量加解密。常见的堆成加密算法有DES、AES、RC5、Blowfish、IDEA


非对称加密算法复杂,加解密速度慢,但安全性高,一般与对称加密结合使用(对称加密通信内容,非对称加密对称秘钥)。


常见的非对称加密算法有RSA、DH、DSA、ECC


Hash算法特性是:输入值一样,经过哈希函数得到相同的散列值,但并非散列值相同则输入值也相同。常见的Hash加密算法有MD5、SHA-1、SHA-X系列


下面着重介绍一下RSA算法和DH算法。


RSA加密算法


Https协议就是使用RSA加密算法,可以说RSA加密算法是宇宙中最重要的加密算法。


RSA算法用到一些数论知识,包括互质关系,欧拉函数,欧拉定理。此处不具体介绍加密的过程,如果有兴趣,可以参照RSA算法加密过程。

http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html


RSA算法的安全保障基于大数分解问题,
目前破解过的最大秘钥是700+位,也就代表1024位秘钥和2048位秘钥可以认为绝对安全。


大数分解主要难点在于计算能力,如果未来计算能力有了质的提升,那么这些秘钥也是有可能被破解的。


DH加密算法


DH也是一种非对称加密算法,DH加密算法过程。

https://zh.wikipedia.org/wiki/%E8%BF%AA%E8%8F%B2-%E8%B5%AB%E7%88%BE%E6%9B%BC%E5%AF%86%E9%91%B0%E4%BA%A4%E6%8F%9B


DH算法的安全保障是基于离散对数问题。



07 Http协议和Https协议的对比 


Http和Https的区别如下:


  1. https协议需要到CA申请证书,大多数情况下需要一定费用

  2. Http是超文本传输协议,信息采用明文传输,Https则是具有安全性SSL加密传输协议

  3. Http和Https端口号不一样,Http是80端口,Https是443端口

  4. Http连接是无状态的,而Https采用Http+SSL构建可进行加密传输、身份认证的网络协议,更安全。

  5. Http协议建立连接的过程比Https协议快。因为Https除了Tcp三次握手,还要经过SSL握手。连接建立之后数据传输速度,二者无明显区别。



 08 总结 

经过了3天的学习和总结,总算完成了这篇文章,本文可以帮助读者大体上把握Http和Https的知识框架。


并没有深入探讨每个主题的内容,当读者有了自己知识框架之后,可以自行深入了解每个知识点的内容。
这边提供一份总结资料:计算机网络相关知识汇总。


640?wx_fmt=png


福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!

640?wx_fmt=jpeg


推荐阅读:

  • 边缘计算将吞掉云计算!

  • ARM 发布新一代 CPU 和 GPU,实现 20% 性能提升!

  • 前端开发 20 年变迁史

  • 北漂杭漂的程序员,是如何买到第一套房子?

  • “爱装X”开源组织:“教科书级”AI知识树究竟长什么样?

  • 500行Python代码打造刷脸考勤系统

  • 权游播完了, 你在骂烂尾, 有人却悄悄解锁了新操作……


640?wx_fmt=png真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业实战_05_MyCat用户密码加密

接上一篇:企业实战_04_MyCat常用配置文件详解 https://gblfy.blog.csdn.net/article/details/100112080 文章目录1. 加密简述2. 加密目录3. 执行加密4. 添加加密属性5. 添加密文6. 测试是否可用声明:需要提前安装mysql Linux centos7 安装 MySQL5.7.x 1. 加密简述 …

大数据从哪里来?| 技术头条

戳蓝字“CSDN云计算”关注我们哦!作者:Feng来源:哈尔的数据城堡现代商业市场是一个数据驱动的环境,可以说不论技术怎么更新换代,数据都有着不可替代的地位,而且抛开数据谈大数据服务就是瞎扯,没…

java算法判断链表有没有闭环_前端算法系列之二:数据结构链表、双向链表、闭环链表、有序链表...

前言上一次我们讲到了数据结构:栈和队列,并对他们的运用做了一些介绍和案例实践;我们也讲到了怎么简单的实现一个四则运算、怎么去判断标签是否闭合完全等等,anyway,今天接着和大家介绍一些数据结构:链表链…

苹果宣布加入CNCF;华为要求美国运营商支付专利费;微软删除最大的公开人脸识别数据集...

戳蓝字“CSDN云计算”关注我们哦!嗨,大家好,重磅君带来的【云重磅】特别栏目,如期而至,每周五第一时间为大家带来重磅新闻。把握技术风向标,了解行业应用与实践,就交给我重磅君吧!重…

企业实战_14_MyCat跨分片查询_全局表

接上一篇:企业实战_13_MyCat清除冗余数据 https://gblfy.blog.csdn.net/article/details/100057317 文章目录一、跨分片查询验证1. 登录mycat2. 使用逻辑数据库1.3. 执行跨分片查询1.4. 异常信息,问题定位1.5. 表分布1.6. 跨分片查询的解决方式1.7. 场景…

java创建四叉树_Java实现 LeetCode 427 建立四叉树

427. 建立四叉树我们想要使用一棵四叉树来储存一个 N x N 的布尔值网络。网络中每一格的值只会是真或假。树的根结点代表整个网络。对于每个结点, 它将被分等成四个孩子结点直到这个区域内的值都是相同的.每个结点还有另外两个布尔变量: isLeaf 和 val。isLeaf 当这个节点是一个…

漫画:什么是二分查找?

戳蓝字“CSDN云计算”关注我们哦!作者 | 蠢萌的小灰来源 | 程序员小灰————— 第二天 —————什么意思呢?我们来举两个栗子:给定一个有序数组 2,5,7,9,12,14,20&…

mysql和mysqldump出现command not found 问题解决

mysql和mysqldump出现command not found 问题解决 一、给mysql配置环境变量 #找到mysql安装路径 cd /app/mysql-5.7.25 #vim /etc/profile export MYSQL_HOME/app/mysql-5.7.25 :${MYSQL_HOME}/bin二、建立软连接 1、查找mysql安装路径 find / -name mysql 通常mysql安装路径…

如何给老婆解释什么是微服务?(文末有福利)

戳蓝字“CSDN云计算”关注我们哦!程序员有了老婆之后就是累,上次好不容易给她解释了什么是Restful,这不,麻烦又来了…一个周日的清晨,阳光洒在我的脸上,慢慢把我唤醒。我翻过身,感觉好像少了些什…

oracle19c连接MySQL_oracle19c的安装和使用navicat连接oracle数据库

一,数据的安装Oracle官方下载链接:https://www.oracle.com/downloads/#category-database首先去oracle官网下载,数据库里面包含了客户端,所以不需要再下载客户端了注意:有的人不下载数据库,只下载客户端为了…

Mycat_MySql更新数据库失败 --read-only

接上一篇:企业实战_20_Mycat-Web之UI监控 https://blog.csdn.net/weixin_40816738/article/details/100100053 #登录数据库 mysql -uroot -p #使用指定数据库 use 数据库名 #查看数据库处于什么状态下 show variables like read-only; #关闭read-only属性状态 set g…

Linux 运维必备的 13 款实用工具,拿好了

戳蓝字“CSDN云计算”关注我们哦!来源 | 高效运维本文介绍几款 Linux 运维比较实用的工具,希望对 Linux 运维人员有所帮助。1. 查看进程占用带宽情况 - NethogsNethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽。下载&#xff1…

企业实战_12_MyCat水平扩展_分库分表

接上一篇:企业实战_11_MyCat垂直拆分相关配置 https://gblfy.blog.csdn.net/article/details/100055838 文章目录一、概念理论理解1. 垂直拆分理解2. 水平扩展理解3. 水平扩展案例4. 水平扩展场景5. 水平拆分原则6. 水平扩展架构图二、关键问题解决方案2.1. 分片后如…

面试阿里,我还是挂在了第四轮……

戳蓝字“CSDN云计算”关注我们哦!作者 | 倪升武责编 | 郭 芮可能每个技术人都有个阿里梦,我也不例外。最近准备跳槽,前一阵子在准备各种面试,也面了几个大厂,包括阿里。是的,最后我挂在了第四轮。这篇文章…

Mycat+Mysql 插入数据报错 i[Err] 1064 - partition table, insert must provide ColumnList

逻辑库结构和物理库表结构如下(逻辑库结构物理库表结构): CREATE TABLE order_key (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键,goods_name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 商品名称,place varchar(2…

微服务精华问答 | 如何理解中台战略和微服务

戳蓝字“CSDN云计算”关注我们哦!微服务(Microservice Architecture)是近几年流行的一种架构思想,关于它的概念很难一言以蔽之。今天,就让我们来看看关于微服务更加有深度的问题吧。1Q:什么是微服务A:1)一组小的服务&a…

php 对象转换成数组,PHP把对象转换为数组的问题

原始对象object(Qiniu\Http\Error)#24 (2) {["url":"Qiniu\Http\Error":private]>string(25) "http://rs.qbox.me/buckets"["response":"Qiniu\Http\Error":private]>object(Qiniu\Http\Response)#25 (6) {["sta…

华为内测基于Android 10.0的EMUI 10系统;2019年Q1真无线耳机市场份额,苹果占半壁江山……...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go 苹果获得悬停手势专利 可隔空…

企业实战_17_MyCat水平扩展_跨分片查询_ER分片

接上一篇:企业实战_16_MyCat全局自增ID https://blog.csdn.net/weixin_40816738/article/details/100064315 案例比较: 在垂直拆分场景中,针对字段个数少的类型为字典类型的表,我们可以使用全局表的方式解决。 在水平扩展场景中&a…

bmob php支付,支付服务 - 支付服务RESTful 开发文档 - 《Bmob 文档中心》 - 书栈网 · BookStack...

注意:目前支付宝无法使用,请用户暂时不要接入,等待官方的恢复公告!打款需知1.打款前请先在控制台填写以下信息2.每月的1、2、16、17号为申请打款时间,15号、月尾日为打款时间,确保用户有半个月的追诉期。Bm…