HTTP和HTTPS

介绍一下HTTP

背景

HTTP当初诞生的目的是提供一个统一的协议来传输不同类型的文档(文本、图片、音视频)

是什么

HTTP是一种应用层协议,用于在客户端和服务器之间传输超文本(HTML、图片、视频等)

为什么
它在现代web开发中被广泛应用, 得益于以下几个优点

HTTP是请求-响应模型, 它天然匹配Web应用

浏览器原生支持,工具链完善, 比如浏览器的开发者工具, 接口测试APIFOX, POSTMAN, 抓包工具Fiddler等

可读性强, 基于文本协议文本, 人类可读

因此HTTP的开发成本低, 能让人更多把精力放在业务上

HTTP的请求报文和响应报文

都是 首行-请求/响应头-空行-正文 结构

请求报文

首行

GET URL http/1.1

请求方法 请求资源地址 http版本号

请求头

每行都是一个键值对, 中间由":"分隔

是http标准规定的字段, 有具体的含义

也允许用户添加自定义的字段

常见的有

host 访问的域名

authorization 用户认证凭证信息, 比如token

user-agent 包含了用户客户端, 浏览器等信息

cache control 告诉服务器我要用什么样的缓存规则

空行

正文

有些请求有, 有些没有
通常POST请求会有正文, 包含发送给服务器的数据

响应报文

首行

http/1.1 200

版本号 状态码

响应头

content-type 传输数据的媒体类型

空行

正文

服务器返回客户端的信息

通常是 html/css/js/json/图片/音频等

HTTP有哪些请求方式

最常见的是POST, GET, 其他还要PUT, DELETE
他们有具体的语义
POST是提交资源
GET是获取资源
PUT是更新资源
DELETE是删除资源

GET和POST请求的区别

GET POST
本质区别 GET能用的, POST也能用 反之亦然
语义区别 获取资源 提交资源
传输数据 URL查询参数 请求体
幂等性 通常是幂等的, 多次请求的返回结果一样 没有这个要求

HTTP的状态码

2XX 成功

200 OK

3XX 重定向

301 Moved Permanently 永久重定向

302 Found 临时重定向 就是这一次转到另一个URL, 下一次访问还是原地址, 例如时进入主界面时跳转到登陆页面
304 Not Modified 资源未修改, 是从缓存中读取的

4XX 客户端错误

401 Unauthorized 未认证, 需要验证用户身份或者凭证无效

403 Forbidden 用户通过认证, 但没有权限

404 Not Found 访问资源在服务器上不存在

5XX 服务端错误

500 Internal Server Error 服务器发生了未预期的内部错误

503 Service Unavailable 服务不可用, 表示服务器当前因维护或流量过高, 无法处理请求

HTTP的缓存策略

背景

对于一些重复的请求, 比如每次请求到的数据是一样的, 可以把他们缓存在本地, 下次可以直接读取本地资源, 节省时间和资源
HTTP有两种实现方式, 分别是强制缓存和协商缓存

强制缓存

强制缓存是浏览器在缓存有效期间内不发送请求, 直接读本地, 通过 Cache-Control 的max-age控制.

协商缓存

协商缓存是浏览器每次发起请求, 带上标识If-Modified-Since或者If-None-Match, 由服务器判断资源是否变化, 没变化就返回304, 有变化就返回200和新文件.

请求流程

浏览器处理缓存的顺序是:先检查强缓存 → 如果失效,再走协商缓存

我在项目中没有配置过, 但观察过浏览器的,

输入网址时不会带 cache-control, 服务器的行为是走缓存, 返回的状态码是 200 from cache

按 F5 刷新, 会带 cache-control: max-age=0 服务器直接走协商缓存, 返回 304 或 200

Ctrl+F5, cache-control: no-cache 忽略所有缓存, 直接返回新内容

介绍一下HTTPS

背景

HTTP是明文传输, 存在安全风险

是什么

就是HTTP+TLS

就是在 HTTP 和 TCP 之间加了一层 TLS(传输层安全协议),负责加密和认证。

为什么

  1. 解决窃听 → 混合加密
    用非对称加密安全地传输一个临时密钥
    之后用对称加密传输实际数据(快)
    对称加密:同密钥,快;非对称加密:公私钥对,慢但安全。两者结合,兼顾安全和性能。

  2. 解决冒充 → 数字证书
    问题:非对称加密中,客户端如何确认收到的公钥真的属于目标服务器?
    解决方案:数字证书
    服务器把公钥等信息提交给 CA(证书颁发机构)
    CA 审核通过后,颁发数字证书(相当于服务器的身份证)
    浏览器内置了受信任的 CA 列表,自动验证证书真伪

HTTPS建立连接的过程

  1. 客户端向服务端发送建立HTTPS请求
  2. 服务端发给客户端公钥证书
  3. 客户端通过CA机构验证证书的合法性, 并验证证书的有效性
  4. 验证通过后, 生成一对随机对称加密密钥, 通过公钥加密发给服务端
  5. 服务端通过私钥解密对称加密密钥, 此时客户端服务端都拥有相同密钥
  6. 两方用对称加密密钥加密和解密数据进行通信

HTTP和HTTPS的区别

对比维度 HTTP HTTPS
传输方式 明文传输,不加密 加密传输(通常使用 SSL/TLS)
握手过程 TCP 三次握手后即可开始传输数据 TCP 三次握手后,还需进行 SSL/TLS 握手,才能传输数据
默认端口 80 443
身份验证 无服务器身份验证 需要向 CA(证书颁发机构)申请数字证书,验证服务器身份可信

HTTP的Keep-Alive是什么?TCP 的 Keepalive 和 HTTP 的 Keep-Alive 是一个东西吗?

HTTP的连接建立是通过 TCP建立连接-HTTP请求资源-响应资源-断开连接
但是每次建立连接只能响应一次资源
HTTP的keep-alive实现同一个TCP来发送和接收多个HTTP请求和应答, 减少建立和释放的开销, 这就是HTTP的长连接
通过设置HTTP头 Connection:keep-alive来实现

TCP的keep-alive是内核实现的, 称为TCP保活机制, 是一种用于在TCP连接上检测空闲连接状态的机制
在TCP连接建立后, 如果一段时间没有任何数据传输, TCP keep-alive会发送探测包检查连接是否有效

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐