http与https协议

http与https协议

http长链接和短连接

http的长链接与短连接

所谓http的短连接和长链接实际上是TCP的长链接和短连接,http的短连接就是,当tcp进行三次握手完成之后,进行一个http通信就通过四次挥手断开连接。而http长链接则是当tcp连接成功之后可以进行多次http通信,直到双方都愿意关闭通道。

http 1.1 默认使用长链接。使用长连接的HTTP协议,会在响应头有加入这行代码:

Connection:keep-alive

http长链接和短连接适应场景

http长链接适用于客户端与服务端I/O通信频繁的场景,这样可以大量减少握手和回收的时间,但如果使用长链接的形式但是客户端有只是连接了不予服务器通信,这样很容易造成服务器资源浪费,且当用户连接数多服务器的压力会很大。服务器还要通过探测报文的方法去管理这些长链接,关闭一些长时间没有读写事件的连接或者客户端崩溃的情况(客户消失,使得服务器保留了半开放的连接)。

http短连接适用于多用户并发访问的场景,像网上商城这些,并发量大,且用户操作不频繁的就可以使用短连接。

实现长连接要客户端和服务端都支持长连接。

http与https的区别

https诞生的原因,https如何解决这些问题的

https产生之前都是使用明文加密,会有风险

  1. 窃听风险 使用明文传输http报文容易被窃听
  2. 篡改风险 无法验证报文的完整性
    • 例如客户从服务器下载数据,无法保证服务器上的数据和下载到客户端的数据是否一致,客户端接收到的内容可能有误,在传输中内容被篡改了,被称为中间人攻击MITM Man-in-the-Middle attack
  3. 冒充风险 不验证对方的身份就可能遭遇伪装
    • 有可能客户的请求的服务器遭到了伪装
    • 服务器不会拒绝服务,无意义的请求也会照单全收,无法阻止DOS攻击(Denial of Service)

https是在传输层的TCP和http的应用层加了一层SSL(Security Socket Layer)/TLS(Transport Layer Seceurity),TLS是以SSL的原型进行开发的。

https提供了三个功能解决上述的三种风险

  1. 加密:使用加密解决窃听风险
  2. 认证:通过证书完成客户端和服务端的相互认证,通信前先确认服务端证书,客户端持有证书就可以完成个人身份的确认
  3. 完整性保护:使用加密确保数据在中途不被篡改

前置知识

加密方式分为两种一种是共享秘钥,一种是公开密钥(非对称秘钥)

共享秘钥

共享秘钥是指客户端与服务端用同一种加密方式,客户端发起请求,服务端会先把共享秘钥发送给客户端,然后客户端发送的数据先经过秘钥加密然后进行传输。

缺点:如果在服务端发送秘钥给客户端的过程中,中间人获取了秘钥,那么之后的通信都不是安全的

公开密钥

公开密钥是指客户端发起请求,服务端会先把公开密钥发送给客户端,然后客户端发送的数据使用公开密钥进行加密之后发送给服务端,服务端收到加密的数据,使用私有秘钥进行解密,拿到真正的数据。私有秘钥是不公开的。

缺点:传输公共密钥的时候,中间人会把公共密钥换掉,从而客户端无法与服务端进行正常的通信。也就是说客户端不能确定自己收到的密钥是否是服务器传来的公共密钥。

证书

证书的出现就是为了解决公开密钥的缺点的。

服务器会把自己的公开密钥交给CA(certificate authority)购买公开密钥证书(服务器的公开密钥 + 数字证书机构的数字签名)。之后客户端进行请求的时候,服务器会把这份公钥证书发送给客户端,客户端拿到证书后会使用数字证书机构的公开密钥验证公钥证书上的数字签名,验证通过就说明两件事

  1. 认证服务器的公开密钥的数字证书认证机构是真实可信的
  2. 服务器的公开密钥真实可信的

数字证书认证机构的公开密钥一般是直接植入浏览器的。

img

CA 签发证书的过程,如上图左边部分:

  • 首先 CA 会把持有者的公钥、用途、颁发者、有效时间等信息打成一个包,然后对这些信息进行 Hash 计算,得到一个 Hash 值;
  • 然后 CA 会使用自己的私钥将该 Hash 值加密,生成 Certificate Signature,也就是 CA 对证书做了签名;
  • 最后将 Certificate Signature 添加在文件证书上,形成数字证书;

客户端校验服务端的数字证书的过程,如上图右边部分:

  • 首先客户端会使用同样的 Hash 算法获取该证书的 Hash 值 H1;
  • 通常浏览器和操作系统中集成了 CA 的公钥信息,浏览器收到证书后可以使用 CA 的公钥解密 Certificate Signature 内容,得到一个 Hash 值 H2 ;
  • 最后比较 H1 和 H2,如果值相同,则为可信赖的证书,否则则认为证书不可信。

注意点

共享秘钥比公开秘钥加密解密要快,所以服务器会先用公开密钥的方式发送共享秘钥,之后使用共享秘钥进行通信。

那Https的通信步骤就是以下步骤

  1. TCP三次握手建立连接
  2. 进行SSL通信
    1. 服务器发送公钥证书给客户端
    2. 客户端拿到公钥证书使用数字认证机构的公钥对数字签名进行验证,拿到服务器的公钥
    3. 客户端计算出共享秘钥然后使用公钥加密发送给服务端
    4. 服务端使用私钥解密拿到共享秘钥
  3. 之后使用共享秘钥进行http通信
  4. 四次挥手断开TCP连接

https通信的详细过程如下图所示:

img

原文地址:https://www.cnblogs.com/iandf/p/14629353.html