Http、Https 和 Socket 的区别与联系

一、HTTP与HTTPS

      我们都知道,HTTP是一种常用的网络传输协议,它是基于TCP的一种应用层协议,应用层是什么样的一个概念,通过下面这张示意图可以很好的理解:


HTTP协议的网络传输十分常见,例如网易的主页http://www.163.com/。HTTP类型的网络传输使用十分方便,但是其在安全性上却有很大问题,列举如下:

1.HTTP协议在传输数据时是明文的,任何人通过一个简单的抓包工具,就可以截获到所有传输数据。

2.HTTP协议在传输数据时无法保证数据的完整,在截获到明文数据后,很容易就可以将其篡改,这也是一些网页总是被植入恶意广告的原因。

3.HTTP协议在传输数据时无法保证真实性,这也是最恐怖的一点。误入了域名欺骗的钓鱼网站,极容易对用户带来财产损失。

基于上面3点安全性的考虑,一种更加安全的网络传输协议势必要推行,那就是HTTPS。

      要理解HTTPS协议,首先需要明白什么是SSL/TLS。SSL全称“Secure Sockets Layer”,意思为安全套接层。其实由网景公司为了解决HTTP传输协议在安全方面的缺陷而设计的。后来被标准化,更名为TLS,全称“Transport Layer Security”,意思为传输层安全协议。

        那么现在就好理解了,其实HTTPS就是将HTTP协议与TLS协议组合起来,在不改变HTTP协议原设计的基础上,为其添加安全性校验并对传输的数据进行加密。那么TLS究竟在网络传输的那一层进行了处理了,下图可以很好的表示:


证书

      通过前面所介绍,我们知道HTTPS主要是为了解决3个问题:数据加密、数据完整、数据真实。那么下一步就是如何解决这些问题,数据加密在发送数据前依赖SSL层对数据进行加密,数据完整与真实性则要靠另一种关键技术:数字证书。

      通过一个小例子可以很容易的理解证书的作用,这个例子的来源是<编程随想>的作者,我这里暂且借用一下:A公司的a到B公司办事,为了证明a确实是A公司的职员而不是商业间谍,A公司会为a提供一个带有公章的证明,当B公司看到这个证明时,就可以信任办事员a。对比网络传输,这个证明就是证书,证书可以保证这个网站的真实性。我们继续往后分析,当B公司与越来越多的公司进行商业合作时,就又有新的问题出现了,比如C公司的c来B公司办事,就需要拿C公司带公章的证明,D公司的d来B公司办事就需要拿D公司带公章的证明...这样一来,B公司要存放好多公司的公章和证明的模板,才能够完成校验。这样未免也太麻烦了,对应到网络传输中,客户端就是B公司,各个网站都有自己的证书文件,这样客户端需要安装信任大量的证书,为了解决这样的问题,就有了第三方CA机构。第三方CA机构是由大家公认信任的机构,例如R公司为第三方信任机构,其业务是为其他公司提供公章证明,这样一来,B公司只要保有这个R公司的公章证明副本,其他A,C,D公司的办事员也只需要从R公司申请到一个公章证明就可以到B公司来交流业务了。

    CA的全称是“Certificate Authority”,意为证书授权中心。大部分CA机构颁发的证书都是需要付费的,CA机构颁发的证书一般都是根证书,根证书也比较容易理解,首先证书是有链式信任关系的,例如Y证书是由CA机构颁发的根证书,由这个Y证书还可以创建出许多子证书,子证书可以继续创建子证书,只要根证书是受信任的,其下所有的子证书都是受信任的,如下图:


    我们可以打开开源中国博客的主页:https://www.oschina.net/blog。在Chrome浏览器地址栏左边可以查看证书信息,如下:

点击证书信息,可以看到完整的证书链,如下图:


从图中可以看到,根证书是由CA机构VerSign公司颁发的。此处还可以看到当前证书是否有效以及过期时间,如果证书无效则说明此网页信息有可能被篡改过,用户在访问时就要小心了。

    除了CA机构可以签发证书外,个人其实也是可以创建证书的,当然个人创建的证书也是不被信任的,我们姑且把这类证书叫做自签名证书,如果用自签名证书搭建了HTTPS的服务,则客户端需要安装对应的证书信任,才可以进行此服务的访问。

证书费用

要实现 HTTPS,证书是必不可少的组成部分。一般,证书都会部署在网站等网络服务的服务器端。证书的实质,是一个公私钥对,其内部原理,是一种非对称加密算法。最常见算法是 RSA。由于这种算法、原理都是透明的,并且开放的,所以,任何人都可以随意去制作公私钥对,所以,在通信双方进行通信时,除了必须要有公私钥对这个必要条件,还要知道,当前使用的公钥,是否就是目标通信方所公布的。

从目前现状来看,作出这个判断,并不容易,也没有什么可靠的办法。实际采用的办法是,采用国际上具有公信力的机构来认证这些公私钥是否是目标通信方。这种具备公信力的机构,就叫证书颁发机构,英文是 CA,Certificate Authority。顶级的证书颁发机构,叫 Root CA底下还设有下级分支机构。分支机构视授权不同,有些也具有证书颁发的能力。

每一张有效证书,都带有自己的颁发机构的信息,也是一张证书,这个证书还带有自己的颁发机构,一直上溯到顶级证书颁发机构,这个叫做证书链为了帮助快速安全验证通信目标方的证书真伪,顶级证书颁发机构的证书,都会预置到操作系统或者浏览器或者客户端的内部,随软件分发,一起分发到终端用户,这样在进行加密通信前,只要上溯证书链,就可以判定当前证书是否真实有效。

从上述原理过程来看,公私钥对,人人都可以自己随便建立,甚至连证书也可以随便造出来,但是想让世界上最广大的用户都能自动认可这个证书,需要在全世界最广泛的操作系统里和浏览器里去预置证书颁发机构的顶级证书,这个就不是任何人随便可以构造出来的。

由此,就解释了,为什么 HTTPS 证书为什么这么贵。一张证书的制作成本,其实约等于零,但是证书的用户需要分摊这些流程中提到的具有公信力的机构的运作成本。包含但不限于:

1、审核 ,验证 CSR 成本,支持成本,法律成本(保险费用,担保费用)

2、要进入各个浏览器的根证书列表,WebTrust 年度审计费用,是很大的开销

3、一些浏览器厂商还会对植入根证书列表的 CA 收费

4、基础设施开销,CRL 和 OCSP 服务器成本

5、验证 CSR:就是提交证书申请后,CA要做多项验证,越是高级的证书(比如EV)验证越麻烦。不固定开销,有些要花费很多人力和时间来完成。

6、CA链费用:新开的CA公司要等5-10年,才会被普遍信任,才能广泛进入根证书链。要想加快点,就得给别的大牌CA公司掏钱,买次级证书。

那么,既然这么多成本,为什么 HTTPS 证书,又可以免费取得呢?这个,就没有太一致的说法,我理解的是,证书的认证,其实是分级的,一般的免费的证书,都是 DV,Domain Verification,域名验证,也即,在通信的时候,只能保证客户访问的域名,和域名带有的证书,确实是一致的,再进一步的信息就都没有了。如果,对域名的记忆不准确,可能也会遇到风险,毕竟域名只是一个字母串,有些是单词,有些连单词也不是,记错的概率还是有的。而且就算记准确了,域名的持有者发生了变更,也不是立刻就可以得知的。所以,证书认证的还有一些高级的形式,比如 EV,Extended Verification,扩展验证,这种级别的证书,一般都不会免费,它就可以提供比如,域名的持有者到底是谁的验证,这样,多重信息吻合下,用户就可以更加确定通信的目标方,就是自己期望的那一个。

随着互联网的发展,越来越多的信息开始电子化,各种类型的交易开始网络化,网络通信安全,越来越重要,以至于,都快成了互联网的基石,这个时候,有越来越多人受惠于加密通信,或者,受制于加密通信,这个时候,他们就有动机出来,让这个东西全面化和免费化,以加速互联网通信加密化的进程,当然,这里可能也免不了一些伟大的人类的使命感。在他们的资助下,让 DV 这种低级证书全面免费化,就开始逐步成为现实。甚至有些推动者,正是证书颁发机构本身,让更广大的用户体验自己提供的基础服务,在此基础上,提供更优质的增值服务,也算是互联网时代下一种典型的营销手段。

综上,我们目前确实有了很多选择来取得免费的证书。当然,这里也是有点鱼龙混杂的,甚至有居心叵测者,怀揣不良的目的,来免费提供证书,所以,大家如果需要部署 HTTPS 证书的话,还是要擦亮眼睛,选大厂,名牌产品,不要被一般的小店给骗了。

二、HTTP与SOCKET

要弄明白 http 和 socket 首先要熟悉网络七层:物 数 网 传 会 表 应,如图1


如图1

HTTP 协议:超文本传输协议,对应于应用层,用于如何封装数据.

TCP/UDP 协议:传输控制协议,对应于传输层,主要解决数据在网络中的传输。

IP 协议:对应于网络层,同样解决数据在网络中的传输。

传输数据的时候只使用 TCP/IP 协议(传输层),如果没有应用层来识别数据内容,传输后的协议都是无用的。

应用层协议很多 FTP,HTTP,TELNET等,可以自己定义应用层协议。

Web 使用 HTTP 作传输层协议,以封装 HTTP 文本信息,然后使用 TCP/IP 做传输层协议,将数据发送到网络上。

 

一、HTTP 协议

http 为短连接:客户端发送请求都需要服务器端回送响应.请求结束后,主动释放链接,因此为短连接。通常的做法是,不需要任何数据,也要保持每隔一段时间向服务器发送"保持连接"的请求。这样可以保证客户端在服务器端是"上线"状态。

HTTP连接使用的是"请求-响应"方式,不仅在请求时建立连接,而且客户端向服务器端请求后,服务器才返回数据。

 

二、Socket 连接

要想明白 Socket,必须要理解 TCP 连接。

TCP 三次握手:握手过程中并不传输数据,在握手后服务器与客户端才开始传输数据,理想状态下,TCP 连接一旦建立,在通讯双方中的任何一方主动断开连接之前 TCP 连接会一直保持下去。

Socket 是对 TCP/IP 协议的封装,Socket 只是个接口不是协议,通过 Socket 我们才能使用 TCP/IP 协议,除了 TCP,也可以使用 UDP 协议来传递数据。

创建 Socket 连接的时候,可以指定传输层协议,可以是 TCP 或者 UDP,当用 TCP 连接,该Socket就是个TCP连接,反之。

Socket 原理

Socket 连接,至少需要一对套接字,分为 clientSocket,serverSocket 连接分为3个步骤:

(1) 服务器监听:服务器并不定位具体客户端的套接字,而是时刻处于监听状态;

(2) 客户端请求:客户端的套接字要描述它要连接的服务器的套接字,提供地址和端口号,然后向服务器套接字提出连接请求;

(3) 连接确认:当服务器套接字收到客户端套接字发来的请求后,就响应客户端套接字的请求,并建立一个新的线程,把服务器端的套接字的描述发给客户端。一旦客户端确认了此描述,就正式建立连接。而服务器套接字继续处于监听状态,继续接收其他客户端套接字的连接请求.

Socket为长连接:通常情况下Socket 连接就是 TCP 连接,因此 Socket 连接一旦建立,通讯双方开始互发数据内容,直到双方断开连接。在实际应用中,由于网络节点过多,在传输过程中,会被节点断开连接,因此要通过轮询高速网络,该节点处于活跃状态。

 

很多情况下,都是需要服务器端向客户端主动推送数据,保持客户端与服务端的实时同步。

若双方是 Socket 连接,可以由服务器直接向客户端发送数据。

重要的事情说三遍:可向客户端发送数据,可向客户端发送数据,可向客户端发送数据,可参考

《Android中使用socket通信实现消息推送的方法详解》


若双方是 HTTP 连接,则服务器需要等客户端发送请求后,才能将数据回传给客户端。

因此,客户端定时向服务器端发送请求,不仅可以保持在线,同时也询问服务器是否有新数据,如果有就将数据传给客户端。