这是我参与「 第四届青训营 」笔记创作活动的第三天
HTTP
HTTP:超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于 TCP/IP 协议传输数据
版本介绍
| 版本 | 内容 | 发展现状 |
|---|---|---|
| HTTP/0.9 | 不涉及数据包传输,规定客户端和服务器之间的通信格式,只能 GET 请求 | 没有作为正式的标准 |
| HTTP/1.0 | 传输内容格式不限制,增加 PUT、PATCH、HEAD、OPTIONS、DELETE 命令 | 正式作为标准 |
| HTTP/1.1 | 持久连接(长连接)、节约带宽、HOST 域、管道机制、分块传输编码 | 2015 年前使用最广泛 |
| HTTP/2 | 多路复用、服务器推送、头信息压缩、二进制协议等 | 逐渐覆盖市场 |
HTTP/1.1 和 HTTP/2 请求对比(可看出 HTTP/2 性能更优)
- 多路复用:通过单一的 HTTP/2 连接请求发起多重的请求-响应消息,多个请求共享一个TCP连接,实现多留并行而不是依赖建立多个TCP连接
HTTP 报文格式
请求报文
- 请求行
- 请求行分为:请求方法、请求地址和协议部分
- 请求方法:
- 请求行分为:请求方法、请求地址和协议部分
| 请求方法 | 内容 |
|---|---|
| GET | 请求一个指定资源的表示形式,使用 GET 的请求应该只被用于获取数据 |
| POST | 用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用 |
| PUT | 用请求有效载荷替换目标资源的所有当前表示 |
| DELETE | 删除指定的资源 |
| HEAD | 请求一个与 GET 请求的响应响应的响应,但没有响应体 |
| CONNECT | 建立一个到由目标资源标识的服务器的隧道 |
| OPTIONS | 用于描述目标资源的通信选项 |
| TRACE | 沿着目标资源的路径执行一个消息环回测试 |
| PATCH | 用于对资源应用部分修改 |
- 请求地址:URL:统一资源定位符
- 组成:<协议>://<主机>:<端口>/<路径>
- 请求头部
响应报文
- 状态行:
- 状态行分为:协议版本、状态码、状态码描述
- 响应报头:与请求头部相似,为响应报文添加了一些附加信息
- 常用响应头
HTTP 工作流程
- 建立了 TCP/IP 连接,客户端与服务器通过Socket三次握手进行连接
- 客户端向服务器发起HTTP请求
- 客户端发送请求头信息,请求内容,最后一行会发送空白行,标示客户端发送完毕
- 服务器做出应答,标示对于客户端请求的应答,例如 HTTP/1.1 200 OK
- 服务器向客户端发送应答头信息
- 服务器向客户端发送请求头信息后,也会发送一空白行,标示应答头信息发送完毕,接着就以 Content-Type 要求的数据格式发送数据给客户端
- 服务端关闭 TCP 连接,如果服务器或者客户端增 Connection:keep-alive 就标示客户端与服务器端继续保持连接,在下次请求时可以继续使用这次连接
HTTPS
安全的超文本传输协议,简单的说,HTTPS = HTTP + 加密(ssl/tls)+ 认证(证书)+ 完整保护
HTTPS 其实是在 HTTP 的基础上加了一层处理加密信息的模块
TLS/SSL
TLS/SSL 的功能实现主要依赖三类基本算法
- 非对称加密实现身份认证和密钥协商
- 对称加密算法采用协商的密钥对数据加密
- 散列函数验证信息的完整性,针对于密钥泄露的不安全性
基本工作方式:
- 客户端使用非对称加密与服务器进行通信,实现身份验证并协商对称加密使用的密钥
- 然后对称加密算法采用协商密钥对信息以及信息摘要进行加密通信,不同节点之间采用的对此密钥不同,从而可以保证信息只能通信双方获取
加密处理流程
- 客户端发起 HTTPS 请求
- 服务端配置
- 采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以像特定的组织申请。区别就是自己制作的需要客户端验证,才可以访问,而是用受信任公司申请的证书则不会弹出提示页面.这套证书其实就是一对公钥与私钥。简单点理解,就相当于一把钥匙和一个锁头。
- 传送证书(就是公钥)
- 客户端解析证书
- 主要验证证书是否是真实有效的数字签名认证机构认证,如果验证通过,则生成一个随机值,然后用证书对该随机值进行加密
- 传送加密信息
- 着部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后服务端和客户端的通信就可以通过这个随机值来进行加密和解密了
- 服务端加密信息
- 服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密
- 传输加密后的信息
- 服务端用私钥加密后的信息,可以在客户端被还原
- 客户端用之前生成的私钥解密服务端传过来的信息,获取到解密后的内容