查看原文
其他

谈一谈我所了解的HTTPS

专注于编程、互联网动态。最终将总结的技术、心得、经验(数据结构与算法、源码分析等)分享给大家,这里不只限于技术!还有职场心得、生活感悟、以及面经点击上方 "程序员小乐" ,选择“置顶公众号”,第一时间送达!


每日英文
Sometimes you have to put a fake smile on and pretend like it all never happened. It's not called giving up, it's called growing up.
有时候你不得不假装微笑,就如一切未曾发生一样。这不是放弃,而是成熟。

乐乐有话说
今天做的一切努力都是为了明天的美丽,所以不要放弃。人生最遗憾的,莫过于,轻易地放弃了不该放弃的,固执地坚持了不该坚持的。青春是一场大雨,即使感冒了,还盼回头再淋一次。

来自:klivitamJ

链接:http://www.imooc.com/article/42940

图片来自网络

前言

这篇文章我想写很久了,本来想等应用用上https之后再进行阐述。但是时不我待,感觉我们的项目在需求的压力下,暂时没有人、精力来完善这一块。但是我并不想我之前的研究白费,所以我就在这里写下,我所了解的https。

http协议

首先我并不会很深入的去探讨这个东西,即使我曾经花了很长的时间去研究这个东西。主要是我考虑到

1、 自己没有系统的去学习这一块的知识,讲解的会比较的肤浅。
2、 就算是懂这个东西也不一定会为诸位看官讲清楚这个东西。

考虑到上面两条,我决定关于http这一块,我就重点来讲:

1、http的基本概念
2、http的三次握手
3、http的四次挥手
4、常用的http方法
5、常用的http状态码

1、http的基本概念:

协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。

http协议,即超文本传输协议。是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。

http协议是用于从万维网服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

http是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。

http协议永远都是客户端发起请求,服务器回送响应。这样就限制了使用http协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。

http协议的主要特点可概括如下:

1、支持客户/服务器模式。支持基本认证和安全认证。

2、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有get、head、post。每种方法规定了客户与服务器联系的类型不同。由于http协议简单,使得http服务器的程序规模小,因而通信速度很快。

3、灵活:http允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

4、http 0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。http 1.1使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象,采用这种方式可以节省传输时间。

5、无状态:http协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。

2、http的三次握手

谈到http必定就会谈到的一个问题--http的三次握手,三次握手其实你真正明白这个问题了之后,这个东西会被你想的很简单。首先你要明白三次挥手是用来干嘛的?
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。如下图所示

希望有大佬们推荐一个好用的画图软件

首先明白上面的含义的时候,你必须要了解几个状态的含义:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)。
结合上图我们将连接过程分为三个过程:

(1):首先是客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

(2):服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

(3):客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据。

3、http的四次挥手

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。如下图所示

结合上图可知,我们将关闭连接的过程划分为四个过程:

(1)客户端发送一个FIN,用来关闭客户到服务器的数据传送。
(2)服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3)服务器关闭与客户端的连接,发送一个FIN给客户端。
(4)客户端发回ACK报文确认,并将确认序号设置为收到序号加1。

4、常用的http方法与使用场景

http的方法有很多,大概有:

1、 GET:用于请求访问已经被URL(统一资源标识符)识别的资源,可以通过URL传参给服务器。

2、 POST:用于传输信息给服务器,主要功能与Get方法类似,但一般推荐POST方式。

3、 PUT:传输文件,报文主体包含文件内容,保存到对应URL位置。

4、 HEAD:获取报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URL是否有效。

5、 DELET:删除文件,与PUT方法相反,删除对应URL位置的文件。

6、 OPTIONS:查询相应URL支持的HTTP方法。

但是我经常使用的还是get加post,我在这里就简单的介绍一下get/post的区别吧:

(1) get请求一般用来获得数据,而post请求一般用来发送数据。人们期望,get请求不会对服务器造成任何影响,而post请求则可能会影响服务器端的数据。get请求消耗的资源较post请求而言,会少一些,但相对安全性较差。发送同样大小的数据,get请求的效率最高可以达到post请求的2倍。

(2)一般按照约定,使用get请求时,将数据通过url进行传递,而是用post请求时,将数据放在body里。但这并非硬性规定,因为method和data本身是正交的。post请求亦可将数据放在url中。

(3)就协议底层实现而言,在get请求中,只产生一个TCP数据包,浏览器会将header和data一并发送出去,等待服务器的回应;而在post请求中,会产生2个TCP数据包。,浏览器先发送header,服务器响应100 continue,浏览器再发送data。

5、常用的http状态码

总的来说,我现在项目有用到的:

200 OK 请求正常处理完毕
204 No Content 请求成功处理,没有实体的主体返回
304 Not Modified 发送的附带条件请求未满足
400 Bad Request 请求报文语法错误或参数错误
401 Unauthorized 需要通过HTTP认证,或认证失败
403 Forbidden 请求资源被拒绝
404 Not Found 无法找到请求资源(服务器无理由拒绝)
500 Internal Server Error 服务器故障或Web应用故障
503 Service Unavailable 服务器超负载或停机维护

http概念

https呢?可以理解为HTTP+SSL/TLS, 即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL,用于安全的 HTTP 数据传输。众所周知,我们在使用http协议的时候,数据的交换都是明文,这样就会带来很大的信息安全于是引入了https。

我在这里呢?主要是讲述https的对称加密和非对称加密。后面我在真正开始写算法章节的时候,会重点来讲一讲我研究的几个加密算法。

1、对称加密

对称加密呢?打个不切当的比方,小明和小红在上学的时候互生情愫,但是又害怕被父母发现。于是他们想到了一个办法,就是他们在一个大树下面放了一个箱子,并且用锁锁起来。如果小红给小明写了信,就通知小明拿着钥匙去去放在箱子里面的信。小明取信也是如此。

小明和小红的钥匙就好比对称加密中数据传输双方的公钥,数据可以通过公钥加密后,通过他们仅有他们知道的公钥去解密。这种加密方法一定程度上面做到加密的效果。这样做的好处主要有:对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。但是如果小明和小红的钥匙遗失也就是保密双方的公钥丢失,或者小明、小红的钥匙被泄漏也就是公钥解密方式被泄漏 这样也就达不到加密的效果了。
我这里有一个不恰当的动画

背景:小明和小红买了一个箱子,一把锁。两个人揣着两把锁的钥匙,想通过这个来传递书信。
一回目 小明:小红,我给你写了一封信。(对称加密)
二回目 小红拿出箱子的钥匙,打开箱子读取小明寄来的书信。(对称解密)
三回目 小红:小明,我给你回信了,(对称加密)
四回目 小明拿出箱子的钥匙,打开箱子读取小红回寄的书信。(对称解密)

2、非对称加密

既然对称加密方式存在很大程度上的缺陷。于是聪明的计算机先辈们就发明了非对称加密。关于非对称加密呢?其运行的方式:

首先乙方生成一对密钥(公钥和私钥)并将公钥向其它方公开。然后得到该公钥的甲方使用该密钥对机密信息进行加密后再发送给乙方。最后乙方再用自己保存的另一把专用密钥(私钥)对加密后的信息进行解密。乙方只能用其专用密钥(私钥)解密由对应的公钥加密后的信息。反之也一样。

这样做的话,即使在传输过程中攻击者截获了传输的密文,并得到了乙的公钥,也无法破解密文,因为只有乙的私钥才能解密密文。这种方式在一定程度加强了数据的安全性。但是同样非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。

同样我在这里也画了一个动画。

背景:被双方妈妈掌握钥匙的小男女,于是双方都买了一个未上锁的箱子
一回目 小红拿着未上锁的箱子跟小明说:小明,如果你想跟我写信,就放在这个箱子里面。
二回目 小明将写好的书信,放在箱子里面,并且锁好,并跟小红说:小红,我给你写信了。
三回目 小红拿出箱子的钥匙,将箱子里面的书信取出来,开心的读了起来并感慨:小明真有趣。

最后说点https和http

1、 基本概念:

HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从万维网服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。

HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

2、 http与https有什么区别

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

说在最后

这篇文章其实早就该写出来了,但是自己挨都今天才去发表 讲道理还是比较拖延癌的前兆的。其实这篇文章并不是我研究的全部,但是我这篇文章的目的是让各位看官大致的认识到https和http。好了,最近提倡早睡、早起 就不继续写下去了。准备手绘几张对称/非对称图来加深大家对这个的理解。如果有好的画图工具可以跟我说一哈,不然我自己都看不下去我的手绘了。

如果您觉得不错,请别忘了转发、分享、点赞让更多的人去学习, 您的举手之劳,就是对小乐最好的支持,非常感谢!

如何您想进技术群交流,关注公众号在后台回复 “加群”,或者 “学习” 即可

著作权归作者所有,欢迎大家投稿。



推荐阅读

阿里、腾讯、百度、华为、京东、搜狗和滴滴最新面试题汇集

红黑树详细分析,看了都说好

最全排序算法汇总
为什么企业宁愿开高工资给新员工,都不愿意给老员工加工资?
IT职场求生法则
怎样应对“需求不确定型项目”?
分享8年开发经验,浅谈程序员职业规划


看完本文有收获?请转发分享给更多人
关注「程序员小乐」,提升技能

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存