开放系统互连(Open Systems Interconnection, OSI)模型是一个描述网络协议不同层之间关系的概念。
- 用户层 - 如 JSON、gPRC
- 应用层 - 如 HTTP、WebSocket
- 表示层 - 如 MIME、ASCII、TLS
- 会话层 - 如 Sockets
- 传输层 - 如 TCP、UDP
- 网络层 - 如 IP、ICMP
- 数据链路层 - 如 MAC、LLC
- 物理层 - 如 Ethernet
HTTP
幂等性:一个操作可以执行多次而没有副作用的风险。
比如 HTTP 方法 GET、PATCH、DELETE 都被认为是幂等操作。当出现网络故障时,客户端会认为重试相同的请求是安全的。
HTTP 是无状态的,每个 HTTP 请求都包含设置所需状态的所有信息。
但可以通过一些约定来在 HTTP 上模拟状态,比如使用 Cookie 来设置唯一的 token 。除了基本身份信息外,在 API 中要求客户端在 token 中提供别的状态是不合适的。
HTTP 通常用 gzip 来压缩响应体。因为压缩是个 CPU 密集型操作,在 Node.js 上处理压缩不太合适,通常在反向代理中自动处理 HTTP 压缩。
Transport Layer Security(TLS)是用于加密 HTTP 流量的协议。和压缩一样,TLS 也是 CPU 密集型操作,所以一般由反向代理处理。
TLS 需要成对的公钥和私钥证书(使用非对称加密),公钥可以发给客户端。通常公钥为 .cert
文件,私钥为 .key
文件。
网络中通过证书信任链来确定证书是否有效(安全)。如果要让一个证书有效,需要由另一个有效的证书为它签名,即为它担保。
在运维中如果有大量的服务器,每个服务器最好不要使用相同的证书。则可以先生成一个有效的根证书,在通过根证书为每个服务签名子证书。过程大致为:
- 仅用于证书的服务器(证书机构 CA)
- 生成私钥。
- 通过私钥生成根证书。
- 应用服务器:
- 生成私钥。
- 根据私钥创建证书签名请求文件(CSR)。
- 根据 CSR、CA 的证书、CA 的私钥来生成证书。
JSON
目前最流行的 API 是通过 JSON 来传递数据,即 JSON over HTTP 。它需要设置 Content-Type: application/json
。
Plain Old JavaScript Object(POJO)- 简单的 JS 对象。发送数据时,最好不要发送 POJO ,因为它会把一些原本服务器私有的属性也传输给客户端。可以通过 toJSON
方法来避免这个问题。
GraphQL
TODO
RPC
TODO