# 计算机网络(四)---HTTP与HTTPS


本文主要介绍了`HTTP`、`HTTPS`的基本概念及两者的区别，`HTTPS`的工作原理及优缺点，最后介绍了HTTP的响应状态码。

<!--more-->

## 1. HTTP和HTTPS基本概念

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

HTTPS：是以**安全**为目标的HTTP通道，简单讲是**HTTP的安全版**，即HTTP下加入**SSL层**，HTTPS的安全基础是SSL，因此加密的详细内容就需要SSL。

```java
HTTP--> HTTP-->TCP-->IP
HTTPS-> HTTP-->SSL-->TCP-->IP
```

HTTPS协议的**主要作用**：一种是建立一个信息安全通道，来保证数据传输的安全；另一种就是确认网站的真实性。

## 2. HTTP与HTTPS的区别

HTTP协议传输的数据都是未加密的，也就是明文的，因此使用**HTTP协议传输隐私信息非常不安全**，为了保证这些隐私数据能加密传输，于是网景公司设计了SSL（Secure Sockets Layer）协议用于对HTTP协议传输的数据进行加密，从而就诞生了HTTPS。简单来说，**HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议，要比HTTP协议安全**。

![](https://github.com/lixd/blog/raw/master/images/network/https-key-lvalue.jpg)

**HTTPS和HTTP的区别:**

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

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

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

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

> 这里推荐一下`https://letsencrypt.org/`已经推出了免费SSL证书
>
> 有效期90天，不过可以免费续期。
>
> 不想自己弄得话`https://user.vaptcha.com/ssl`这里提供了比较方便的生成方式也是免费的。

## 3. HTTPS工作原理

我们都知道HTTPS能够加密信息，以免敏感信息被第三方获取，所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。

**SSL协议的握手过程**

* 第一步，客户端给出SSL协议版本号、一个客户端生成的随机数1（Client random），以及客户端支持的加密方法。

* 第二步，服务端根据客服端支持的加密方法选出双方使用的加密方法，并给出数字证书、以及一个服务器生成的随机数2（Server random）。

* 第三步，客户端确认数字证书有效，然后生成一个新的随机数3（Premaster secret），并使用数字证书中的公钥，加密这个随机数，发给服务端。

* 第四步，服务端使用自己的私钥，获取客户端发来的随机数3（即Premaster secret）。到这里双方都拥有三个随机数了，为什么要使用三个随机数呢？这是因为 SSL/TLS 握手过程的数据都是明文传输的，并且多个随机数种子来生成秘钥不容易被暴力破解出来。 

* 第五步，客户端和服务端根据约定的加密方法，使用前面的三个随机数，生成"对话密钥"（session key），用来加密接下来的整个对话过程。

* 第六步，客户端将前面的握手消息生成摘要再用协商好的秘钥加密，这是客户端发出的第一条加密消息。服务端接收后会用秘钥解密，能解出来说明前面协商出来的秘钥是一致的。 

* 第七步，服务端也会将握手过程的消息生成摘要再用秘钥加密，这是服务端发出的第一条加密消息。客户端接收后会用秘钥解密，能解出来说明协商的秘钥是一致的。 

到这里，双方已安全地协商出了同一份秘钥，所有的应用层数据都会用这个秘钥加密后再通过 TCP 进行可靠传输。 

  ![https握手过程](https://github.com/lixd/blog/raw/master/images/network/https-ssl-connection.png)

## 4. HTTPS的优缺点

　　**优点:**

　　（1）使用HTTPS协议可认证用户和服务器，确保数据发送到正确的客户机和服务器；

　　（2）HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议，要比http协议安全，可防止数据在传输过程中不被窃取、改变，确保数据的完整性。

　　（3）HTTPS是现行架构下最安全的解决方案，虽然不是绝对安全，但它大幅增加了中间人攻击的成本。

　　（4）谷歌曾在2014年8月份调整搜索引擎算法，并称“比起同等HTTP网站，采用HTTPS加密的网站在搜索结果中的排名将会更高”

　　**缺点:**

　　（1）HTTPS协议握手阶段比较费时，会使页面的加载时间延长近50%，增加10%到20%的耗电；

　　（2）HTTPS连接缓存不如HTTP高效，会增加数据开销和功耗，甚至已有的安全措施也会因此而受到影响；

　　（3）SSL证书需要钱，功能越强大的证书费用越高，个人网站、小网站没有必要一般不会用。

　   （4）SSL证书通常需要绑定IP，不能在同一IP上绑定多个域名，IPv4资源不可能支撑这个消耗。

　　（5）HTTPS协议的加密范围也比较有限，在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的，SSL证书的信用链体系并不安全，特别是在某些国家可以控制CA根证书的情况下，中间人攻击一样可行。

## 5. HTTP响应状态码

状态码以3位数字和原因短语组成，例如 200 OK 。

数字的第一位指定了响应类型，后两位无分类。响应类别一共有5种：

- 1XX Informational(信息性状态码)
- 2XX Success(成功状态码)
- 3XX Redirection(重定向状态码)
- 4XX Client Error(客户端错误状态码)
- 5XX Server Error(服务器错误状态码)

```java
200：请求成功      处理方式：获得响应的内容，进行处理 

201：请求完成，结果是创建了新资源。新创建资源的URI可在响应的实体中得到    处理方式：爬虫中不会遇到 

202：请求被接受，但处理尚未完成    处理方式：阻塞等待 

204：服务器端已经实现了请求，但是没有返回新的信 息。如果客户是用户代理，则无须为此更新自身的文档视图。    处理方式：丢弃

300：该状态码不被HTTP/1.0的应用程序直接使用， 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。    处理方式：若程序中能够处理，则进行进一步处理，如果程序中不能处理，则丢弃
301：请求到的资源都会分配一个永久的URL，这样就可以在将来通过该URL来访问此资源    处理方式：重定向到分配的URL
302：请求到的资源在一个不同的URL处临时保存     处理方式：重定向到临时的URL 

304 请求的资源未更新     处理方式：丢弃 

400 非法请求     处理方式：丢弃 

401 未授权     处理方式：丢弃 

403 禁止     处理方式：丢弃 

404 没有找到     处理方式：丢弃 

5XX 回应代码以“5”开头的状态码表示服务器端发现自己出现错误，不能继续执行请求    处理方式：丢弃
```

## 6. HTTP长连接、短连接

在HTTP/1.0中默认使用短连接。也就是说，客户端和服务器每进行一次HTTP操作，就建立一次连接，任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源（如JavaScript文件、图像文件、CSS文件等），每遇到这样一个Web资源，浏览器就会重新建立一个HTTP会话。

而从HTTP/1.1起，默认使用长连接，用以保持连接特性。使用长连接的HTTP协议，会在响应头加入这行代码：

```
Connection:keep-alive
```

在使用长连接的情况下，当一个网页打开完成后，客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭，客户端再次访问这个服务器时，会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接，它有一个保持时间，可以在不同的服务器软件（如Apache）中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

**HTTP协议的长连接和短连接，实质上是TCP协议的长连接和短连接。**

**https加密是在传输层** 

https报文在被包装成tcp报文的时候完成加密的过程，无论是https的**header域**也好，body域也罢都是会被加密的。

当使用**tcpdump或者wireshark**之类的tcp层工具抓包，获取是加密的内容，而如果用应用层抓包，使用**Charels(Mac)、Fildder(Windows)**抓包工具，那当然看到是明文的。

## 7. 参考

`https://www.cnblogs.com/qiangxia/p/5261813.html`

`https://www.cnblogs.com/wqhwe/p/5407468.html`

`http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html`

---

> 作者: [意琦行](https://github.com/lixd)  
> URL: https://www.lixueduan.com/posts/network/04-http-https/  

