所有网络通信的本质目标就是进程间通信

协议

即进程通信需要遵循的规则、协议,可靠性(不能容忍数据在传输过程中被破坏)、可校验。

  • TCP:具备可靠性(利用滑动窗口、快速重传等算法,保证数据顺序),校验(三次握手四次挥手)
  • UDP:不具备可靠性(封包顺序仅为Datagram标注序号)

    分层

  • 应用层:程序需要通信时调用传输层进行通信

  • 传输层:提供通信能力、数据分块、多路复用等服务,让多个信号共用一个信道(如一个TCP连接),优势在于两点:
    • 提升吞吐量,不容易出现网络空载的情况
    • 多个信号间隔离传输
  • 网络层:负责传输,做服务、寻址
  • 数据链路层:为网络层提供链路级别传输的支持
  • 物理层:将光电信号、设备差异封装起来,为数据链路层提供二进制传输的服务(如电线、电缆、光纤、卫星、无线)

    HTTP & 123

    从网卡到操作系统

    image.png

    若请求量级超过阈值,操作系统会拒绝服务,实际上是一种保护策略,避免并发量太大而雪崩

当高并发发生时, 一般推断是线程阻塞了,试想一个所有资源都跑满了的服务器,并不会因为异步或者非阻塞模型就获得更高的吞吐量,而要使用处理 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 等。完成这些处理之后,可能还会进行读写数据库、业务逻辑计算、远程调用等

    • 为每一次处理创建一个线程(线程之间的相互影响最小)
    • 通过线程池管理线程(拥有反向压力,当系统资源不足的时候可以阻塞生产者)
    • 利用协程
      • 单线程读取所有文件描述符的数据
      • 多线程同步 I/O
      • 零拷贝技术

        公私钥体系

        类似签合同的方式,将将两份合同都存到一个双方可以信任的第三方机构,只要这个机构不监守自盗,那么合同就是相对安全的。第三方机构保管后,合同的双方,都没有办法篡改这份合同的内容。而且双方随时可以去机构取出合同的原文,进行对比
  • 摘要算法,将合同原文和摘要一起存储,产生一个唯一的散列值(如消息摘要算法MD5和安全散列算法SHA)

  • 数字签名和证书,公钥加密的数据,只有私钥才可以解密;私钥加密的数据,只有公钥才可以解密

image.png

  • 信任链,环环相扣,降低某一环的欺诈风险