http/1.1

  • 增加了新的方法
  • 明确了连接管理
  • 数据分块chucked
  • HOST主机托管

http/2

  • 二进制流,通过流标记符标记帧是属于哪一个流的
  • 头部压缩,Hpack
  • 允许服务端向客户端推送数据
  • 并发多个流,多路复用

特点

  1. HTTP 是灵活可扩展的,可以任意添加头字段实现任意功能;
  2. HTTP 是可靠传输协议,基于 TCP/IP 协议“尽量”保证数据的送达;
  3. HTTP 是应用层协议,比 FTP、SSH 等更通用功能更多,能够传输任意数据;
  4. HTTP 使用了请求 - 应答模式,客户端主动发起请求,服务器被动回复请求;
  5. HTTP 本质上是无状态的,每个请求都是互相独立、毫无关联的,协议不要求客户端或服务器记录请求相关的信息。

大文件传输

  • chucked
    • Transfer-Encoding: chunked
  • range
    • Accept-Ranges: bytes
    • 206 Partial Content
    • Content-Range

对称加密

img

目前常用的只有 AES 和 ChaCha20。对称加密的主要方式是使用固定长度的密钥加密任意长度的密文,把小秘密转换成大秘密,但是由于对称加密需要传递密钥,密钥可以窃取导致了信息泄露

非对称加密

DH、DSA、RSA、ECC

公钥和私钥有个特别的 单向 性,虽然都可以用来加密解密,但 公钥加密后只能用私钥解密 ,反过来,私钥加密后也只能用公钥解密

混合加密

  • 使用非对称加密交换对称密钥
  • 使用对称密钥来解析秘文

TLS/1.2

img

RSA握手流程

  • client Hello
    • 随机数
    • 客户端的版本
    • 密码套件列表
  • server hello
    • 随机数
    • 使用的版本号
    • 使用的密码套件
    • 使用的证书
  • client key exchange
    • pre_master 这个是用公钥加密的密钥
  • Change Cipher Spec
    • 改用密钥传输

ECDHE握手流程

  • client hello
    • 随机数
    • 版本
    • 密码套件列表
  • server hello
    • 随机数
    • 版本
    • 证书
    • server key exchange
    • 椭圆曲线公钥
    • 自己生成的随机数
    • 使用rsa对公钥进行签名
  • client key exchange
    • 客户端计算出共享公钥
    • Change Cipher Spec
    • 把之前的数据进行一次摘要,在用对称密钥加密下让服务端验证
  • Change Cipher Spec
    • 正式握手

TLS1.3

img

  • client hello
    • 随机数
    • 密码套件
    • 支持的椭圆曲线以及椭圆曲线的公钥
  • server hello
    • 版本
    • 随机数
    • 使用的曲线
    • 公钥
    • 对上面的信息进行一次摘要,让客户端验证
  • 到这里就具有了所有的椭圆曲线的参数可以加密传输了

tcp fast open

quick

  • 基本传输单位是包和帧
  • 使用连接id来标明通信的两个端点 支持连接迁移
  • 无队头阻塞
  • http/3 帧结构
    • 帧头
      • 帧类型
      • 数据长度
    • 帧负载
      • 实际的数据
  • 由于quick没有指定端口号 在建立了http/2 的时候通过拓展帧来升级

http 优化

  • Session ID 会话复用
  • Session Ticket
  • tls1.3 Pre-shared Key 0rtt

三次握手

  • 防止历史连接初始化连接导致的浪费数据和资源开销
  • 同步双方的序列号 两次握手只能同步一方的序列号

为什么存在MSS

MSS 是为了防止ip分片丢失的时候不是一个完整的TCP包 所以使用重传的机制

避免恶意攻击 使得sync队列 也就是半连接队列满了

大量的time_await

大部分都是代码的问题

  • 没有注册服务端socket到epoll之类上去 导致不能感知事件
  • 没有accept连接 自然没有调用close函数
  • 没有将客户端的socket注册到epoll
  • 没有执行close方法