十分钟搞懂HTTP和HTTPS协议

527 阅读14分钟

最近感觉对HTTP和HTTPS的区别和联系不太确定了, 就查了一下

1.什么是协议?

网络协议是计算机之间为了实现网络通信而达成的一种"约定"或者"规则", 有了这种"约定", 不同的厂商生产的设备, 以及不同操作系统组成计算机之间, 就可以实现通信.

2.HTTP协议是什么?

HTTP协议是产文本传输协议的缩写, 英文为 Hyper Text Transfer Protocol. 他是从WEB服务器传输文本的标记语言 (HTML) 到本地浏览器的传输协议.

设计HTTP最初的目的是为了提供一种发布和接受HTML的传输协议.

HTTP有多个版本, 目前广泛使用的是HTTP/1.1版本.

3.HTTP原理

HTTP是一个基于TCP/IP通信协议来穿肚数据的协议, 传输的数据类型为HTML文件, 图片, 文件, 查询结果等.

HTTP协议一般用于B/S架构, 浏览器作为HTTP客户端通过URL想HTTP服务端即WEB服务器发送请求, 以百度为例:

[访问百度流程]

4.HTTP特点
  1. http协议支持客户端/服务端模式,也是一种请求/响应模式的协议。

  2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。

  3. 灵活:HTTP允许传输任意类型的数据对象。传输的类型由Content-Type加以标记。

  4. 无连接:限制每次连接只处理一个请求。服务器处理完请求,并收到客户的应答后,即断开连接,但是却不利于客户端与服务器保持会话连接,为了弥补这种不足,产生了两项记录http状态的技术,一个叫做Cookie,一个叫做Session。

  5. 无状态:无状态是指协议对于事务处理没有记忆,后续处理需要前面的信息,则必须重传。

5.URI和URL的区别

HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。

  • URI:Uniform Resource Identifier 统一资源标识

  • URL:Uniform Resource Location 统一资源定位

URI 是用来标示 一个具体的资源的,我们可以通过 URI 知道一个资源是什么。

URL 则是用来定位具体的资源的,标示了一个具体的资源位置。互联网上的每个文件都有一个唯一的URL。

6.HTTP报文组成

请求报文构成

  1. 请求行:包括请求方法、URL、协议/版本

  2. 请求头(Request Header)

  3. 请求正文

image.png

请求报文组成

响应报文构成

  1. 状态行

  2. 响应头

  3. 响应正文

image.png

响应报文组成

7.常见请求方法

  • GET:请求指定的页面信息,并返回实体主体。

  • POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。

  • HEAD:类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头

  • PUT:从客户端向服务器传送的数据取代指定的文档的内容。

  • DELETE:请求服务器删除指定的页面。

get请求

image.png

post请求

image.png

post和get的区别:

  • 都包含请求头请求行,post多了请求body。

  • get多用来查询,请求参数放在url中,不会对服务器上的内容产生作用。post用来提交,如把账号密码放入body中。

  • GET是直接添加到URL后面的,直接就可以在URL中看到内容,而POST是放在报文内部的,用户无法直接看到。

  • GET提交的数据长度是有限制的,因为URL长度有限制,具体的长度限制视浏览器而定。而POST没有。

8.响应状态码

访问一个网页时,浏览器会向web服务器发出请求。此网页所在的服务器会返回一个包含HTTP状态码的信息头用以响应浏览器的请求。

状态码分类:

  • 1XX- 信息型,服务器收到请求,需要请求者继续操作。

  • 2XX- 成功型,请求成功收到,理解并处理。

  • 3XX - 重定向,需要进一步的操作以完成请求。

  • 4XX - 客户端错误,请求包含语法错误或无法完成请求。

  • 5XX - 服务器错误,服务器在处理请求的过程中发生了错误。

常见状态码:

  • 200 OK - 客户端请求成功

  • 301 - 资源(网页等)被永久转移到其它URL

  • 302 - 临时跳转

  • 400 Bad Request - 客户端请求有语法错误,不能被服务器所理解

  • 401 Unauthorized - 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用

  • 404 - 请求资源不存在,可能是输入了错误的URL

  • 500 - 服务器内部发生了不可预期的错误

  • 503 Server Unavailable - 服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

9.为什么要用https?

实际使用中,绝大说的网站现在都采用的是https协议,这也是未来互联网发展的趋势。下面是通过wireshark抓取的一个博客网站的登录请求过程。

可以看到访问的账号密码都是明文传输, 这样客户端发出的请求很容易被不法分子截取利用,因此,HTTP协议不适合传输一些敏感信息,比如:各种账号、密码等信息,使用http协议传输隐私信息非常不安全。

一般http中存在如下问题:

  • 请求信息明文传输,容易被窃听截取。

  • 数据的完整性未校验,容易被篡改

  • 没有验证对方身份,存在冒充危险

10.什么是HTTPS?

为了解决上述HTTP存在的问题,就用到了HTTPS。

HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer):一般理解为HTTP+SSL/TLS,通过 SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。

那么SSL又是什么?

SSL(Secure Socket Layer,安全套接字层):1994年为 Netscape 所研发,SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。

TLS(Transport Layer Security,传输层安全):其前身是 SSL,它最初的几个版本(SSL 1.0、SSL 2.0、SSL 3.0)由网景公司开发,1999年从 3.1 开始被 IETF 标准化并改名,发展至今已经有 TLS 1.0、TLS 1.1、TLS 1.2 三个版本。SSL3.0和TLS1.0由于存在安全漏洞,已经很少被使用到。TLS 1.3 改动会比较大,目前还在草案阶段,目前使用最广泛的是TLS 1.1、TLS 1.2。

SSL发展史(互联网加密通信)

  • 1994年NetSpace公司设计SSL协议(Secure Sockets Layout)1.0版本,但未发布。

  • 1995年NetSpace发布SSL/2.0版本,很快发现有严重漏洞

  • 1996年发布SSL/3.0版本,得到大规模应用

  • 1999年,发布了SSL升级版TLS/1.0版本,目前应用最广泛的版本

  • 2006年和2008年,发布了TLS/1.1版本和TLS/1.2版本

11.浏览器在使用HTTPS传输数据的流程是什么?

image.png

  1. 首先客户端通过URL访问服务器建立SSL连接。

  2. 服务端收到客户端请求后,会将网站支持的证书信息(证书中包含公钥)传送一份给客户端。

  3. 客户端的服务器开始协商SSL连接的安全等级,也就是信息加密的等级。

  4. 客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。

  5. 服务器利用自己的私钥解密出会话密钥。

  6. 服务器利用会话密钥加密与客户端之间的通信。

12.HTTPS的缺点
  • HTTPS协议多次握手,导致页面的加载时间延长近50%;

  • HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗;

  • 申请SSL证书需要钱,功能越强大的证书费用越高。

  • SSL涉及到的安全算法会消耗 CPU 资源,对服务器资源消耗较大。

13.总结HTTPS和HTTP的区别
  • HTTPS是HTTP协议的安全版本,HTTP协议的数据传输是明文的,是不安全的,HTTPS使用了SSL/TLS协议进行了加密处理。

  • http和https使用连接方式不同,默认端口也不一样,http是80,https是443。

14. https2.0
1. 多路复用 (Multiplexing)

多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。在 HTTP/1.1 协议中浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制。超过限制数目的请求会被阻塞。这也是为何一些站点会有多个静态资源 CDN 域名的原因之一,拿 Twitter 为例,twimg.com, 目的就是变相的解决浏览器针对同一域名的请求限制阻塞问题。而 HTTP/2 的多路复用(Multiplexing) 则允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息。因此 HTTP/2 可以很容易的去实现多流并行而不用依赖建立多个 TCP 连接,HTTP/2 把 HTTP 协议通信的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息。并行地在同一个 TCP 连接上双向交换消息。

2. 二进制分帧

HTTP/2在 应用层(HTTP/2)和传输层(TCP or UDP)之间增加一个二进制分帧层。在不改动 HTTP/1.x 的语义、方法、状态码、URI 以及首部字段的情况下, 解决了HTTP1.1 的性能限制,改进传输性能,实现低延迟和高吞吐量。在二进制分帧层中, HTTP/2 会将所有传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码 ,其中 HTTP1.x 的首部信息会被封装到 HEADER frame,而相应的 Request Body 则封装到 DATA frame 里面。

HTTP/2 通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。在过去, HTTP 性能优化的关键并不在于高带宽,而是低延迟。TCP 连接会随着时间进行自我调谐,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调谐则被称为 TCP 慢启动。由于这种原因,让原本就具有突发性和短时性的 HTTP 连接变的十分低效。HTTP/2 通过让所有数据流共用同一个连接,可以更有效地使用 TCP 连接,让高带宽也能真正的服务于 HTTP 的性能提升。

这种单连接多资源的方式,减少服务端的链接压力,内存占用更少,连接吞吐量更大;而且由于 TCP 连接的减少而使网络拥塞状况得以改善,同时慢启动时间的减少,使拥塞和丢包恢复速度更快。

3. 首部压缩(Header Compression)

HTTP/1.1并不支持 HTTP 首部压缩,为此 SPDY 和 HTTP/2 应运而生, SPDY 使用的是通用的DEFLATE 算法,而 HTTP/2 则使用了专门为首部压缩而设计的 HPACK 算法。

4. 服务端推送(Server Push)

服务端推送是一种在客户端请求之前发送数据的机制。在 HTTP/2 中,服务器可以对客户端的一个请求发送多个响应。Server Push 让 HTTP1.x 时代使用内嵌资源的优化手段变得没有意义;如果一个请求是由你的主页发起的,服务器很可能会响应主页内容、logo 以及样式表,因为它知道客户端会用到这些东西。这相当于在一个 HTML 文档内集合了所有的资源,不过与之相比,服务器推送还有一个很大的优势:可以缓存!也让在遵循同源的情况下,不同页面之间可以共享缓存资源成为可能。

15. HTTPS为什么安全

HTTP 协议传输的数据都是未加密的, 也就是铭文的, 因此使用功能 HTTP 协议传输隐私信息非常的不安全. 为了保证这些写隐私数据能加密传输, 于是网景公司设计了 SSL(Secure Sockets Layer) 协议用于对 HTTP 协议传输的数据进行加密, 从而就诞生了 HTTPS. 现在的 HTTPS 都是用的 TLS 协议, 但是由于 SSL 出现的比较早, 并且依旧被现在的浏览器支持, 因此 SSL 依然是 HTTPS 的代名词.

HTTPS 在数据传输之前需要客户端(浏览器) 与 服务端(网站)之间进行一次握手, 在握手的过程中确立双方加密传输数据的密码信息. TLS/SSL 协议不仅仅是一套加密传输协议, TLS/SSL 中也是用了非对称加密, 对称加密 以及 HASH 算法.

握手的过程简单描述如下:

  1. 浏览器将自己支持的一套加密规则发送给网站

  2. 网站送中选出一套加密算法与 HASH 算法, 并将自己的身份信息以证书的形式发回给浏览器. 证书里面包含了 网站地址, 加密公钥 以及证书的办法即构等信息.

  3. 获取网站证书之后的浏览器要做一些的工作

  4. 验证证书的合法性(颁发机构是否合法, 证书中包含的网站地址是否与正在访问的地址一致等等), 如果证书受信任, 怎浏览器里面会显示一个小锁, 否则会显示证书不受信任的提示

  5. 如果证书受信任, 或者用户接受了不受信的证书, 浏览器会生成一串随机数的密码. 并用于证书中提供的公钥加密

  6. 使用约定好的 HASH 计算握手信息, 并使用生成的随机数随消息进行加密, 最后将之前生成的虽有信息发送给网站.

  7. 网站接收到浏览器发回来的数据之后做以下的操作:

  8. 使用自己的密钥将信息解密去除密码, 使用密码解密浏览器发来的握手信息, 并验证 HASH 是否与浏览器发来的一致.

  9. 使用密码加密一段握手信息, 发送给浏览器

  10. 浏览器解密并计算握手信息的 HASH, 如果与服务端发来的 HASH 一致, 此时握手过程结束, 之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密.

这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据。其中非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而HASH算法用于验证数据的完整性。由于浏览器生成的密码是整个数据加密的关键,因此在传输的时候使用了非对称加密算法对其加密。非对称加密算法会生成公钥和私钥,公钥只能用于加密数据,因此可以随意传输,而网站的私钥用于对数据进行解密,所以网站都会非常小心的保管自己的私钥,防止泄漏。

TLS握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。正是由于HTTPS非常的安全,攻击者无法从中找到下手的地方,于是更多的是采用了假证书的手法来欺骗客户端,从而获取明文的信息。默认HTTP的端口号为80,HTTPS的端口号为443。

参考十分钟搞懂HTTP和HTTPS协议


End