更多内容可以访问我的个人博客。
参考文章:
一、HTTP
HTTP与HTTPS都是应用层协议。HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议。HTTP 基于 TCP/IP 协议通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。
1.1 Http的特点
1.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、PUT、DELETE、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
2.灵活:HTTP允许传输任意类型的数据对象。
3.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。(随着时代发展,文档中包含大量图片的情况多了起来,Http1.1以及部分1.0开始使用持久连接)
4.无状态:**HTTP协议是无状态的,HTTP 协议自身不对请求和响应之间的通信状态进行保存。任何两次请求之间都没有依赖关系。**直观地说,就是每个请求都是独立的,与前面的请求和后面的请求都是没有直接联系的。协议本身并不保留之前一切的请求或 响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成如此简单的。
1.2 Http报文☆
Http报文包括请求报文和响应报文两大部分,其中请求报文由请求行(request line)、请求头(header)、空行和请求体四个部分组成(请求头与请求体之间一定存在空行)。而响应报文由状态行(状态码+解释状态码的短语)、响应头部、空行和响应体四个部分组成。接下来我们详细介绍下请求报文的各个部分及其作用。
1.3 Http请求方法
- GET 请求指定的页面信息,并返回实体主体。
- HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
- POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。
- PUT 从客户端向服务器传送的数据取代指定的文档的内容。
- DELETE 请求服务器删除指定的页面。
1.4 GET方法与POST方法的区别☆
- GET在浏览器回退时是无害的,而POST会再次提交请求
- GET请求会被浏览器主动缓存,而POST不会,除非手动设置
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留
- GET请求在URL中传送的参数是有长度限制的,而POST没有限制
- GET参数通过URL传递,POST放在Request body中
1.5 Http状态码☆
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
- 1xx:指示信息–表示请求已接收,继续处理
- 2xx:成功–表示请求已被成功接收、理解、接受
- 3xx:重定向–要完成请求必须进行更进一步的操作
- 4xx:客户端错误–请求有语法错误或请求无法实现
- 5xx:服务器端错误–服务器未能实现合法的请求
1.6 持久连接
HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。以当年的通信情况来说,因为都是些容量很小的文本传输,所以即使这样也没有多大问题。可随着 HTTP 的普及,文档中包含大量图片的情况多了起来。比如,使用浏览器浏览一个包含多张图片的 HTML 页面时,在发送请求访问 HTML 页面资源的同时,也会请 求该 HTML 页面里包含的其他资源。因此,每次的请求都会造成多余的 TCP 连接建立和断开,增加通信量的开销。
为解决上述 TCP 连接的问题,HTTP/1.1 和一部分的 HTTP/1.0 想出了持久连接(HTTP Persistent Connections,也称为 HTTP keep-alive 或 HTTP connection reuse)的方法。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。
持久连接的好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。另外, 减少开销的那部分时间,使 HTTP 请求和响应能够更早地结束,这样 Web 页面的显示速度也就相应提高了。
在 HTTP/1.1 中,所有的连接默认都是持久连接,但在 HTTP/1.0 内并未标准化。虽然有一部分服务器通过非标准的手段实现了持久连接,但服务器端不一定能够支持持久连接。毫无疑问,除了服务器端,客户端也需要支持持久连接。
1.7 管线化(管道化)
持久连接使得多数请求以管线化(pipelining)方式发送成为可能。从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。 这样就能够做到同时并行发送多个请求,而不需要一个接一个地等待响应了。通俗地讲,请求打包一次传输过去,响应打包一次传递回来。管线化的前提是在持久连接下。(消息队列)
假如当请求一个包含 10 张图片的 HTML Web 页面,与无连接相比,用持久连接可以让请求更快结束。 而管道化技术则比持久连接还要快。请求数越多,时间差就越明显。客户端需要请求这十个资源。以前的做法是,在同一个TCP连接里面,先发送A请求,然后等待服务器做出回应,收到后再发出B请求,以此类推,而管道机制则是允许浏览器同时发出这十个请求,但是服务器还是按照顺序,先回应A请求,完成后再回应B请求。
于是在使用持久连接的情况下,某个连接上消息的传递类似于
请求1->响应1->请求2->响应2->请求3->响应3
管线化方式发送变成了类似这样:
请求1->请求2->请求3->响应1->响应2->响应3
二、HTTPS
HTTPS是在HTTP上建立SSL加密层,并对传输数据进行加密,是HTTP协议的安全版。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
HTTPS主要作用是:
(1)对数据进行加密,并建立一个信息安全通道,来保证传输过程中的数据安全;
(2)对网站服务器进行真实身份认证。
我们经常会在Web的登录页面和购物结算界面等使用HTTPS通信。使用HTTPS通信时,不再用http://,而是改用https://。另外,当浏览器访问HTTPS通信有效的Web网站时,浏览器的地址栏内会出现一个带锁的标记。对HTTPS的显示方式会因浏览器的不同而有所改变。
2.1 为什么需要Https(Http的缺陷)
Http存在以下缺陷:
① 通信使用明文(不加密),内容可能被窃听;
会导致数据泄露、数据篡改、流量劫持、钓鱼攻击等安全问题,通过网络的嗅探设备及一些技术手段,就可还原HTTP报文内容。
② 无法证明报文的完整性,所以可能遭篡改;
所谓完整性是指信息的准确度。若无法证明其完整性,通常也就意味着无法判断信息是否准确。也就是说在请求或响应送出之后直到对方接收之前的这段时间内,即使请求或响应的内容遭到篡改,也没有办法获悉。 换句话说,没有任何办法确认,发出的请求/响应和接收到的请求/响应是前后相同的。
③ 不验证通信方的身份,因此有可能遭遇伪装;
HTTP协议中的请求和响应不会对通信方进行确认。服务器只要接收到请求,不管对方是谁都会返回一个响应(在发送端的IP地址和端口号没有被Web服务器设定限制访问的前提下),这样就会存在伪造请求欺骗服务器的情况;也存在伪造虚假服务器欺骗用户的情况,实现“钓鱼欺诈”,用户无法察觉。
Https的优势:
数据加密:内容经过对称加密,每个连接生成一个唯一的加***
数据完整性:内容传输经过完整性校验
身份认证:第三方无法伪造服务端(客户端)身份
2.2 Https的优势
HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL和TLS协议代替而已。
通常,HTTP直接和TCP通信。当使用Https时,则演变成先和SSL通信,再由SSL和TCP通信了。简言之,所谓HTTPS,其实就是身披SSL协议这层外壳的HTTP。
在采用SSL后,HTTP就拥有了HTTPS的加密、证书和完整性保护这些功能。也就是说HTTP加上加密处理和认证以及完整性保护后即是HTTPS。
HTTPS 协议的主要功能基本都依赖于 TLS/SSL 协议,TLS/SSL 的功能实现主要依赖于三类基本算法:散列函数 、对称加密和非对称加密,使用非对称加密实现身份认证和**协商,使用对称加密算法,采用协商的**对数据加密,基于散列函数验证信息的完整性。
2.2.1 解决信息窃听风险——加密
方法1.对称加密
这种方式加密和解密同用一个**。加密和解密都会用到**。没有**就无法对密码解密,反过来说,任何人只要持有**就能解密了。
以对称加密方式加密时必须将**也发给对方。可究竟怎样才能安全地转交?在互联网上转发**时,如果通信被监听那么**就可会落人攻击者之手,同时也就失去了加密的意义。另外还得设法安全地保管接收到的**。
方法2.非对称加密
公开**加密使用一对非对称的**。一把叫做私有**,另一把叫做公开**。顾名思义,私有**不能让其他任何人知道,而公开**则可以随意发布,任何人都可以获得。
使用公开**加密方式,发送密文的一方使用对方的公开**进行加密处理,对方收到被加密的信息后,再使用自己的私有**进行解密。利用这种方式,不需要发送用来解密的私有**,也不必担心**被攻击者窃听而盗走。
非对称加密的特点是信息传输一对多,服务器只需要维持一个私钥就能够和多个客户端进行加密通信。
这种方式有以下缺点:
公钥是公开的,所以针对私钥加密的信息,黑客截获后可以使用公钥进行解密,获取其中的内容;
公钥并不包含服务器的信息,使用非对称加密算法无法确保服务器身份的合法性,存在中间人攻击的风险,服务器发送给客户端的公钥可能在传送过程中被中间人截获并篡改;
使用非对称加密在数据加密解密过程需要消耗一定时间,降低了数据传输效率;
方法3.对称加密+非对称加密(HTTPS采用这种方式)
使用对称**的好处是解密的效率比较快,使用非对称**的好处是可以使得传输的内容不能被**,因为就算你拦截到了数据,但是没有对应的私钥,也是不能**内容的。就比如说你抢到了一个保险柜,但是没有保险柜的钥匙也不能打开保险柜。那我们就将对称加密与非对称加密结合起来,充分利用两者各自的优势,在交换**环节使用非对称加密方式,之后的建立通信交换报文阶段则使用对称加密方式。
具体做法是:发送密文的一方使用对方的公钥进行加密处理“对称的**”,然后对方用自己的私钥解密拿到“对称的**”,这样可以确保交换的**是安全的前提下,使用对称加密方式进行通信。所以,HTTPS采用对称加密和非对称加密两者并用的混合加密机制。
(即使用非对称加密,将对称加密的秘钥发送给对方,接收到对称加密的秘钥之后,就可以使用对称加密进行通信)
2.2.2 解决信息篡改(数据完整性校验)及身份验证风险——数字签名
2.3 Https工作流程
1.Client发起一个HTTPS(比如https://juejin.im/user/5a9a9cdcf265da238b7d771c)的请求,根据RFC2818的规定,Client知道需要连接Server的443(默认)端口。
2.Server把事先配置好的公钥证书(public key certificate)返回给客户端。
3.Client验证公钥证书:比如是否在有效期内,证书的用途是不是匹配Client请求的站点,是不是在CRL吊销列表里面,它的上一级证书是否有效,这是一个递归的过程,直到验证到根证书(操作系统内置的Root证书或者Client内置的Root证书)。如果验证通过则继续,不通过则显示警告信息。
4.Client使用伪随机数生成器生成加密所使用的对称**,然后用证书的公钥加密这个对称**,发给Server。
5.Server使用自己的私钥(private key)解密这个消息,得到对称**。至此,Client和Server双方都持有了相同的对称**。
6.Server使用对称**加密“明文内容A”,发送给Client。
7.Client使用对称**解密响应的密文,得到“明文内容A”。
8.Client再次发起HTTPS的请求,使用对称**加密请求的“明文内容B”,然后Server使用对称**解密密文,得到“明文内容B”。