通用技术 十分钟搞懂 HTTP 和 HTTPS 协议

吾非同 · 2019年10月31日 · 最后由 Jason 回复于 2019年11月01日 · 2209 次阅读

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. 无状态:无状态是指协议对于事务处理没有记忆,后续处理需要前面的信息,则必须重传(浏览器 cookie 可以解决这个问题)。

5.URI 和 URL 的区别

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

  • URI:Uniform Resource Identifier 统一资源标识符。
  • URL:Uniform Resource Location 统一资源定位符。

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

URL 则是用来定位具体的资源的,标示了一个具体的资源位置。属于 URI 的一个子集,算是 URI 在的具体实现方式互联网上的每个文件都有一个唯一的 URL。

下面是 URL 的一个具体实例,各部分含义如下:

6.HTTP 报文组成

请求报文构成

  • 请求行:包括请求方法、URL、协议/版本
  • 请求头 (Request Header)
  • 请求正文

响应报文构成

  • 状态行
  • 响应头
  • 响应正文

img

常见响应头字段:

  • User-Agent:告知服务器客户端的相关信息,比如浏览器的类型、版本等。
  • Accept-Encoding:告知服务器,客户端支持的压缩格式。
  • Cookie: 一般都是通过 Cookie 信息头封装在请求的信息头部分。
  • Content-Type:用来告知服务器,所发送的请求主体的数据类型(数据组织格式)。如果是 POST 方法,则建议一定指定该信息头。

7.长连接与短连接

我们知道一次 HTTP 请求,需要经过 TCP 三次握手才能建立连接,如果多次请求资源开销就会很大。

HTTP/1.1 之前默认是短连接,而 HTTP/1.1 之后,就提出了一个长连接的概念,一次 TCP 连接可以进行多次 http 请求,使用 Connection 字段控制,默认开启长连接 Connection:keep-Alive。

8.常见请求方法

  • GET:获取资源,请求指定的页面信息,并返回实体主体。
  • POST:向服务器创建资源,提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立,或者对已有资源的修改。
  • HEAD:类似于 get 请求,只不过返回的响应中没有具体的内容,只获取报头。
  • PUT:从客户端向服务器传送的数据取代指定的文档的内容。
  • DELETE:请求服务器删除指定的资源。

get 请求

img

post 请求

img

post 和 get 的区别:

  • 都包含请求头请求行,post 多了请求 body。
  • get 多用来查询,请求参数放在 url 中,不会对服务器上的内容产生作用。post 用来提交,如把账号密码放入 body 中。
  • GET 是直接添加到 URL 后面的,直接就可以在 URL 中看到内容,而 POST 是放在报文内部的,用户无法直接看到。
  • GET 提交的数据长度是有限制的,因为 URL 长度有限制,具体的长度限制视浏览器而定。而 POST 没有。
  • 安全性(幂等性),安全的方法属于幂等的,get 多次请求,服务端状态不会改变,属于幂等,POST 执行多次,每次都会改变服务端状态,不具备幂等性。

9.响应状态码

访问一个网页时,浏览器会向 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 - 服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

10.为什么要用 https?

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

博客登录抓包

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

一般 http 中存在如下问题:

  • 请求信息明文传输,容易被窃听截取
  • 数据的完整性未校验,容易被篡改
  • 没有验证对方身份,存在冒充危险

11.什么是 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。

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

总体来说,https 属于混合加密,使用非对称秘钥加密密文通信的对称秘钥,使用对称秘钥进行密文通信,保证了通信的效率。

  1. 首先客户端通过 URL 访问服务器建立 SSL 连接。
  2. 服务端收到客户端请求后,会将网站支持的证书信息(证书中包含公钥)传送一份给客户端。
  3. 客户端的服务器开始协商 SSL 连接的安全等级,也就是信息加密的等级。
  4. 客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
  5. 服务器利用自己的私钥解密出会话密钥。
  6. 服务器利用会话密钥加密与客户端之间的通信。

13.HTTPS 的缺点

  • HTTPS 协议加密中多次握手,导致页面的加载时间延长近 50%;
  • HTTPS 连接缓存不如 HTTP 高效,会增加数据开销和功耗;
  • 申请 SSL 证书需要钱,功能越强大的证书费用越高。
  • SSL 涉及到的安全算法会消耗 CPU 资源,对服务器资源消耗较大。

14.总结 HTTPS 和 HTTP 的区别

  • HTTPS 是 HTTP 协议的安全版本,HTTP 协议的数据传输是明文的,是不安全的,HTTPS 使用了 SSL/TLS 协议进行了加密处理。
  • 默认端口不一样,http 是 80,https 是 443。
  • https 协议需要到 CA 申请证书,一般需要花钱获取,http 不需要。

欢迎关注公众号【吾非同】,关注测试技术、Python 知识、程序员资源、职场成长

共收到 3 条回复 时间 点赞

面试必问之一

问个问题 客户端如何验证服务端发来的证书是有效的?不是攻击者发来的呢?

点个赞,比较详细

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册