协议
即进程通信需要遵循的规则、协议,可靠性(不能容忍数据在传输过程中被破坏)、可校验。
- TCP:具备可靠性(利用滑动窗口、快速重传等算法,保证数据顺序),校验(三次握手四次挥手)
UDP:不具备可靠性(封包顺序仅为Datagram标注序号)
分层
应用层:程序需要通信时调用传输层进行通信
- 传输层:提供通信能力、数据分块、多路复用等服务,让多个信号共用一个信道(如一个TCP连接),优势在于两点:
- 提升吞吐量,不容易出现网络空载的情况
- 多个信号间隔离传输
- 网络层:负责传输,做服务、寻址
- 数据链路层:为网络层提供链路级别传输的支持
- 物理层:将光电信号、设备差异封装起来,为数据链路层提供二进制传输的服务(如电线、电缆、光纤、卫星、无线)
HTTP & 123
从网卡到操作系统
若请求量级超过阈值,操作系统会拒绝服务,实际上是一种保护策略,避免并发量太大而雪崩
当高并发发生时, 一般推断是线程阻塞了,试想一个所有资源都跑满了的服务器,并不会因为异步或者非阻塞模型就获得更高的吞吐量,而要使用处理 I / O多路复用,如select / poll / epoll
- select / poll 模型是一种阻塞模型,内部使用线性结构存储进程关注的Socket集合
- epoll 是非阻塞模型 ,内部使用二叉搜索树(红黑树),用Socket编号作为索引
举例用epoll 模型架构一个Web服务器:(优化 Web 服务器底层是在优化 I/O 的模型;中间层是在优化处理数据、远程调用等的模型)
每一个客户端连接进来之后都是一个 Socket 文件。接下来,对于 Web 服务器而言,要处理的是文件的 I/O,以及在 I/O 结束之后进行数据、业务逻辑的处理:
- I/O:这部分的主要开销在于从 Socket 文件中读出数据到用户空间。比如说读取出 HTTP 请求的数据并把它们存储到一个缓冲区当中
处理部分(Processing):这部分的开销有很多个部分。比如说,需要将 HTTP 请求从字节的表示转化为字符串的表示,然后再解析。还需要将 HTTP 请求的字符串,分成各个部分。头部(Header)是一个 Key-Value 的映射(Map)。Body 部分,可能是 QueryString,JSON,XML 等。完成这些处理之后,可能还会进行读写数据库、业务逻辑计算、远程调用等
摘要算法,将合同原文和摘要一起存储,产生一个唯一的散列值(如消息摘要算法MD5和安全散列算法SHA)
- 数字签名和证书,公钥加密的数据,只有私钥才可以解密;私钥加密的数据,只有公钥才可以解密
- 信任链,环环相扣,降低某一环的欺诈风险