http/1.1
- 增加了新的方法
- 明确了连接管理
- 数据分块
chucked
- HOST主机托管
http/2
- 二进制流,通过流标记符标记帧是属于哪一个流的
- 头部压缩,Hpack
- 允许服务端向客户端推送数据
- 并发多个流,多路复用
特点
- HTTP 是灵活可扩展的,可以任意添加头字段实现任意功能;
- HTTP 是可靠传输协议,基于 TCP/IP 协议“尽量”保证数据的送达;
- HTTP 是应用层协议,比 FTP、SSH 等更通用功能更多,能够传输任意数据;
- HTTP 使用了请求 - 应答模式,客户端主动发起请求,服务器被动回复请求;
- HTTP 本质上是无状态的,每个请求都是互相独立、毫无关联的,协议不要求客户端或服务器记录请求相关的信息。
大文件传输
- chucked
- Transfer-Encoding: chunked
- range
- Accept-Ranges: bytes
- 206 Partial Content
- Content-Range
对称加密
目前常用的只有 AES 和 ChaCha20。对称加密的主要方式是使用固定长度的密钥加密任意长度的密文,把小秘密转换成大秘密,但是由于对称加密需要传递密钥,密钥可以窃取导致了信息泄露
非对称加密
DH、DSA、RSA、ECC
公钥和私钥有个特别的 单向 性,虽然都可以用来加密解密,但 公钥加密后只能用私钥解密 ,反过来,私钥加密后也只能用公钥解密 。
混合加密
- 使用非对称加密交换对称密钥
- 使用对称密钥来解析秘文
TLS/1.2
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
- 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_cookie
避免恶意攻击 使得sync队列 也就是半连接队列满了
大量的time_await
大部分都是代码的问题
- 没有注册服务端socket到epoll之类上去 导致不能感知事件
- 没有accept连接 自然没有调用close函数
- 没有将客户端的socket注册到epoll
- 没有执行close方法