这段时间毕竟也是 “金九银十” 的面试的黄金季节,阿粉当然也想去面试,但是因为自身受限,所以只能采访一下出去面试的同学们都问了什么内容,其中有一个,阿粉觉得有必要给大家分享一下,就是问关于 HTTP 的内容。

HTTP

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议。HTTP 是基于 TCP/IP 协议通信协议来传递数据(HTML 文件、图片文件、查询结果等)。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。

这其实就是百度百科里面的精简化的内容,虽然说不上太细致,但是已经算是对HTTP做了一个大概的描述,我们接下来就从以下的几个方面来看一下这个HTTP吧。

我们从这里就不再多解释 HTTP报文 和 主体 这些内容了,阿粉之前也是完整的给大家解释过了,包括了 HTTP 的进化历史,阿粉今天我们来讲讲 HTTP 和 HTTPS 的关系。

HTTP缺点

众所周知,HTTP 的优点那可是一大堆:


  1. 简单、灵活、易于扩展
  2. 应用广泛、环境成熟
  3. 无状态 (不需要额外的资源来记录状态信息)

但是 HTTP 的缺点也是非常的显著,为什么这么说,HTTP 使用的是明文的方式进行传输,虽然方便了我们的调试,但是信息会被暴露出来,每一个环节没有隐私可言。

而且 HTTP 在我们的认知当中,他就是一个不安全的,第一个原因是上面说的明文,还有就是 HTTP 不验证通信双方的身份,所以对方的身份有可能伪装,就像某些公共场所的那些 公共WIFI ,还有就是 HTTP 不能验证报文的完整性,所以报文也是有可能被篡改的。

基于这些内容,所以我们很多时候对 HTTP 的选择都比较慎重,不然你传输内容的时候,别人用抓包工具就很容易的能够分析出你想要传递的内容。

这时候我们就想到了一个事情,加密处理一下不就好了?

对,完全没问题,HTTP 没有加密的机制,但是我们可以想办法处理,这个办法就是:

SSL 或者 TLS

SSL: 安全套接层

TLS:安全层传输协议

当他们组合使用的时候,就能够加密 HTTP 的通信的内容了,这时候就能在这条线路上进行通信,而通过 SSL组合使用后的 HTTP 被称为 HTTPS 或者称之为 HTTP overSSL。

HTTPS

大白话说一下,HTTP 在加上加密处理和认证以及完整性保护之后就是 HTTPS。

分辨 HTTPS 最简单的方法就是,你在浏览器访问的时候,能够看到一个小锁的标识。

面试官问 HTTPS 是怎么从 HTTP 转过来的,我有点懵_服务器

现在百分之90以上的网站不都是使用的 HTTPS 么,

我们使用抓包工具来看一下 HTTPS 的传输内容试试。

面试官问 HTTPS 是怎么从 HTTP 转过来的,我有点懵_服务器_02

我们从中看到了TLS 的版本,还有阿粉没有截图上的随机数。

这时候我们就得来完整的分析 HTTPS 的安全通信机制了。来看个图看一下 然后我们再拿我们的抓包工具来进行分析。

面试官问 HTTPS 是怎么从 HTTP 转过来的,我有点懵_客户端_03

上面这是 HTTPS 的安全通信的机制,我们分别来看看都干了什么。

第一步:Client Hello

客户端通过 发送 Client Hello 报文开始 SSL/TSL 通信。其中包含了 SSL/TSL 的版本,所使用的加密的方法等一系列的内容。

第二步:Server Hello

服务端根据客户端发送的支持的 SSL/TLS 协议版本,和自己的比较确定使用的 SSL/TLS 协议版本。缺点假面算法等内容。

第三步:服务器发送 Certificate 报文,报文中包含了公开密钥证书。

证书的目的实际上就是保证标识的身份,证书一般采用X.509标准。

第四步:Server Key Exchange

服务器发送 Server Hello Done 报文请求客户端,第一阶段的 SSL/TSL 握手协商部分结束。

也有很多人习惯的称第四步是 Server Hello Done 实际上当我们抓包的时候,发现他们是在一次请求中的,我们一会抓包看一下试试。Server Hello Done 实际上就是相当于我给你说我这边发完毕了。

第五步:Client Key Exchange

完成 SSL/TSL 第一次握手之后,客户端就发送 Client Key Exchange 报文作为回应,这里实际上就是为了交换秘钥参数,

面试官问 HTTPS 是怎么从 HTTP 转过来的,我有点懵_服务器_04

这里客户端会再生成一个随机数,然后使用服务端传来的公钥进行加密得到密文PreMaster Key。服务端收到这个值后,使用私钥进行解密,这样两边的秘钥就协商好了。后面数据传输就可以用协商好的秘钥进行加密和解密。

第六步:Change Cipher Spec

客户端发送 Change Cipher Spec 报文,提示服务器编码改变,就是说以后我们再发消息的时候,我是用之前我们定义的密钥进行加密。

第七步:Client Finished

户端将前面的握手消息生成摘要再用协商好的秘钥加密,这是客户端发出的第一条加密消息,这一步也是比较关键的一步,这次的操作的成功与否,就得看服务器是否能够成功解密这次的报文来作为判断依据了。

第八步:服务器发送 Change Cipher Spec

第九步:服务器发送Server Finished 报文

实际上作用和 Client 差不多。

第十步:服务端和客户端的 Finished 交换完成了,这时候 SSL/TSL 的连接就OK了,发送信息也就是完整的称为 HTTPS 了。

最后就是进行数据传输的内容了。

既然 HTTPS 都是安全的了,为什么不大范围的广泛使用呢?

实际上加密通信虽然在一定程度上保护了数据的隐私,但是效率比较低,每一次通信都要加密,会消耗资源,如果包含一些钱的肯定那必须得使用加密的通信,而且主要证书要收费呀。

你要想用,那肯定需要证书,就像大家在做微信支付的时候,不是也需要购买证书么,一般一年怎么也得几百块钱,所以你知道 HTTP 和 HTTPS 的关系了么?

文章参考

《图解HTTP》


< END >

告诉大家一个好消息,Java极客技术读者交流群(摸鱼为主),时隔 2 年后再次开放了,感兴趣的朋友,可以在公号回复:999

面试官问 HTTPS 是怎么从 HTTP 转过来的,我有点懵_客户端_05