分布式通讯协议--http、https

概述

客户端和服务器端

资源

  • 文本(html)
  • word
  • 视频
  • 音频
  • 其他资源

媒体类型(MIME类型)

  • text/html
  • image/jpeg
  • application/json
  • application/xml
  • …等等

URI 和 URL

URI: web服务器资源的名字。比如:index.html
URL: 统一资源定位符。http://www.baidu.com/index.html?query#location 这是个完整的URL

URL组成:

  • schema: http/https/ftp
  • host: web服务器的ip地址或者域名
  • port: 服务端端口, http默认访问的端口是80
  • path: 资源访问路径
  • query: 查询参数
  • location 锚点

请求方法

  • GET
  • PUT
  • DELETE
  • POST
  • HEAD

报文

request


request消息结构包含三部分: (起始行、首部字段、主体)
起始行:METHOD /path http/version-number
首部字段:headerName: value
主体:request body

response


http/version-number status code message
header-name:value
body

状态码

http/1.1版本的协议里面定义了五种类型的状态码

  • 1XX 提示信息
  • 2XX 成功
  • 3XX 重定向
  • 4XX 客户端错误
  • 5XX 服务器端的错误

缓存


HTTP协议的特点

  • 无状态(多个请求之间没有任何关系,通过cookie + session实现有状态)
  • 多次请求(比如,html中包含其他js/css资源,还会去请求)
  • 基于TCP协议

HTTPS

在http的基础上多了 SSL/TLS 加密

原理、升级

使用对称加解密


密钥是公开的,所有的客户端都可以拿到

不同的客户端使用不同的密钥


问题:协商过程是没有加密的,所以还会出现被截断的问题

使用非对称加密

非对称:公钥和私钥,通过一定的算法生成不同的秘钥,公钥(每个都不一样)给到客户端,私钥自己保留【公钥加密,私钥极米 、 公钥解密,私钥加密】

问题: 客户端如何拿到公钥

  • 服务器端把公钥发送给每一个客户端。(普遍用法)
    坏叔叔依旧可以拦截这个请求,并且使用新的公钥重新生成新的请求内容,发送到服务器

  • 服务器端把公钥放到远程服务器,客户端可以请求到。(不建议)
    还要开放证书请求服务,造成服务器不必要的开销

  • 让浏览器保存所有的公钥(不现实,银行除外)

以上几种方式总结

按照上面的所有方案,公钥被调包或替换的问题按照上面的方案,永远存在。

使用第三方机构解决

通过第三方机构,使用第三方机构的私钥对我们【需要传输的公钥】进行加密

数字证书

数字证里面包含的内容:

  • 公司信息
  • 网站信息
  • 数字证书的算法
  • 公钥

请求流程

RESTful

REST:表述性状态转移,使用WEB标准来做一些准则和约束。

##基本概念

  1. 在REST中,一切的内容都被认为是一种资源
  2. 每个资源都由URI唯一标识
  3. 使用统一的接口处理资源请求(POST/GET/PUT/DELETE/HEAD)
  4. 无状态

资源和URI

  1. / 表示自愿的层级关系
  2. ? 过滤自愿
  3. 使用 _ 或者 - , 让uri的可读性更好

统一接口

  • GET 获取某个资源,幂等
  • POST 创建一个新的资源
  • PUT 替换某个已有的资源(更新操作),理论上应该不是幂等的,但是实际情况根据具体的设计
  • PATCH 更新部分资源
  • DELETE 删除某个资源,理论上应该不是幂等的,但是实际情况根据具体的设计

资源表述

  • MIME类型
  • request: Accept 例如:text/html、image/jpeg等等
  • response: Content-type 告诉客户端资源的表述形式

资源链接

超媒体即应用状态引擎

状态转移

服务器端不应该保存客户端状态和应用状态

restful最佳设计

域名需要有针对性

http://api.xxx.com
http://xxx.com/api

版本

http://api.xxx.com/v2/getUser/xxx
header 里面维护版本

路径要有意义

http://xxx.com/api/user_list // 获取用户列表
http://xxx.com/api/goods-list // 获取商品列表

过滤信息(参数)

http://xxx.com/api/user_list?pageNum=1&pageSize=10

状态码

http状态码

业务状态码