刘沙河 刘沙河
首页
  • Go语言基础

    • 数据类型
    • 反射
    • Go指针
  • Go语言进阶

    • go泛型
    • go条件编译
    • cgo教程
    • Go协程调度原理及GPM模型
    • Go内存管理
    • Go垃圾回收机制
    • Go语言内存对齐
  • Go语言实现原理

    • channel 实现原理
    • slice 实现原理
    • map 实现原理
    • sync.Mutex 实现原理
    • 乐观锁CAS 实现原理
    • singlefight 实现原理
  • gin框架

    • gin中间件原理
    • gin路由原理
  • gorm

    • GORM介绍和使用
    • GORM_CURD操作指南
  • go测试

    • benchmark基准测试
    • pprof 性能分析
  • python进阶

    • Numpy&Pandas
    • celery分布式任务队列
  • Django

    • Django 常见命令
    • middleware中间件
    • Django缓存系统
    • Django信号系统
    • Django REST Framework
  • Flask

    • Flask基础知识总结
    • Flask-SQLAlchemy
  • 爬虫

    • aiohttp
    • scrapy框架
  • Mysql

    • Mysql存储引擎和索引
    • MySQL主从复制
    • Mysql读写分离
    • 数据库分库分表
    • Mysql锁
    • Mysql事务和MVCC原理
    • 分库分表带来的读扩散问题
  • Redis

    • redis基础和数据类型
    • redis主从架构
    • redis哨兵架构
    • redis集群模式
    • 如何保证缓存和数据库双写一致
    • redis底层数据结构
    • redis分布式锁
  • Elasticsearch

    • es基本概念
    • es基础语法
    • es倒排索引
  • etcd

    • Go操作etcd
    • Raft原理
    • etcd分布式锁
  • kafka

    • 消息队列MQ总结
    • kafka 概述及原理
    • kafka 消费问题记录
    • 零拷贝技术
    • kafka分区规范
  • RabbitMQ

    • rabbitMQ基础
    • Go操作rabbitmq
  • RocketMQ

    • 可靠消息队列 rocketMQ
  • Http&Https

    • http&https
    • TCP和UDP
    • Ping 原理
  • RPC

    • RPC初识
    • grpc初识和实现
  • gRPC

    • grpc 初识
    • grpc 上下文 metadata
    • grpc 健康检查
    • grpc keepalive
    • grpc 命名解析
    • grpc 中间件&拦截器
    • grpc 负载均衡
    • grpc 身份认证
    • grpc 超时重试
    • grpc 链路追踪
    • grpc-gw将gRPC转RESTfu api
    • grpc-gw自定义选项
  • protobuf

    • protobuf 进阶
    • protobuf 编码原理
  • Docker

    • Docker基础
    • Docker常用命令
    • Dockerfile
    • Docker-Compose
    • Docker多阶段构建
    • Docker Config 教程
    • Docker Swarm 教程
    • Docker Stack 教程
    • Docker Buildx 教程
  • k8s

    • k8s 基础概念
    • k8s 集群架构
    • k8s 工作负载
    • Pod 网络
    • Service 网络
    • 外部接入网络
    • 一张图搞懂k8s各种pod
    • k8s 存储抽象
    • mac快速启动k8s
    • 自制申威架构k8s-reloader
  • go-kit

    • go-kit初识
    • go-kit启动http服务
    • go-kit集成gin启动服务
    • go-kit集成grpc和protobuf
    • go-kit中间件
    • go-kit服务注册发现与负载均衡
    • go-kit限流和熔断
    • go-kit链路追踪
    • go-kit集成Prometheus
  • 设计模式

    • 初识设计模式
    • 创建型模式
    • 结构型模式
    • 行为模式
  • 数据结构

    • 时间轮
    • 堆、双向链表、环形队列
    • 队列:优先队列
    • 队列:延迟队列
  • 算法

    • 递归算法
    • 枚举算法
    • 动态规划
    • 回溯算法
    • 分治算法
    • 贪心算法
    • LRU和LFU
    • 一致性哈希

花开半夏,半夏花开
首页
  • Go语言基础

    • 数据类型
    • 反射
    • Go指针
  • Go语言进阶

    • go泛型
    • go条件编译
    • cgo教程
    • Go协程调度原理及GPM模型
    • Go内存管理
    • Go垃圾回收机制
    • Go语言内存对齐
  • Go语言实现原理

    • channel 实现原理
    • slice 实现原理
    • map 实现原理
    • sync.Mutex 实现原理
    • 乐观锁CAS 实现原理
    • singlefight 实现原理
  • gin框架

    • gin中间件原理
    • gin路由原理
  • gorm

    • GORM介绍和使用
    • GORM_CURD操作指南
  • go测试

    • benchmark基准测试
    • pprof 性能分析
  • python进阶

    • Numpy&Pandas
    • celery分布式任务队列
  • Django

    • Django 常见命令
    • middleware中间件
    • Django缓存系统
    • Django信号系统
    • Django REST Framework
  • Flask

    • Flask基础知识总结
    • Flask-SQLAlchemy
  • 爬虫

    • aiohttp
    • scrapy框架
  • Mysql

    • Mysql存储引擎和索引
    • MySQL主从复制
    • Mysql读写分离
    • 数据库分库分表
    • Mysql锁
    • Mysql事务和MVCC原理
    • 分库分表带来的读扩散问题
  • Redis

    • redis基础和数据类型
    • redis主从架构
    • redis哨兵架构
    • redis集群模式
    • 如何保证缓存和数据库双写一致
    • redis底层数据结构
    • redis分布式锁
  • Elasticsearch

    • es基本概念
    • es基础语法
    • es倒排索引
  • etcd

    • Go操作etcd
    • Raft原理
    • etcd分布式锁
  • kafka

    • 消息队列MQ总结
    • kafka 概述及原理
    • kafka 消费问题记录
    • 零拷贝技术
    • kafka分区规范
  • RabbitMQ

    • rabbitMQ基础
    • Go操作rabbitmq
  • RocketMQ

    • 可靠消息队列 rocketMQ
  • Http&Https

    • http&https
    • TCP和UDP
    • Ping 原理
  • RPC

    • RPC初识
    • grpc初识和实现
  • gRPC

    • grpc 初识
    • grpc 上下文 metadata
    • grpc 健康检查
    • grpc keepalive
    • grpc 命名解析
    • grpc 中间件&拦截器
    • grpc 负载均衡
    • grpc 身份认证
    • grpc 超时重试
    • grpc 链路追踪
    • grpc-gw将gRPC转RESTfu api
    • grpc-gw自定义选项
  • protobuf

    • protobuf 进阶
    • protobuf 编码原理
  • Docker

    • Docker基础
    • Docker常用命令
    • Dockerfile
    • Docker-Compose
    • Docker多阶段构建
    • Docker Config 教程
    • Docker Swarm 教程
    • Docker Stack 教程
    • Docker Buildx 教程
  • k8s

    • k8s 基础概念
    • k8s 集群架构
    • k8s 工作负载
    • Pod 网络
    • Service 网络
    • 外部接入网络
    • 一张图搞懂k8s各种pod
    • k8s 存储抽象
    • mac快速启动k8s
    • 自制申威架构k8s-reloader
  • go-kit

    • go-kit初识
    • go-kit启动http服务
    • go-kit集成gin启动服务
    • go-kit集成grpc和protobuf
    • go-kit中间件
    • go-kit服务注册发现与负载均衡
    • go-kit限流和熔断
    • go-kit链路追踪
    • go-kit集成Prometheus
  • 设计模式

    • 初识设计模式
    • 创建型模式
    • 结构型模式
    • 行为模式
  • 数据结构

    • 时间轮
    • 堆、双向链表、环形队列
    • 队列:优先队列
    • 队列:延迟队列
  • 算法

    • 递归算法
    • 枚举算法
    • 动态规划
    • 回溯算法
    • 分治算法
    • 贪心算法
    • LRU和LFU
    • 一致性哈希
  • http

    • http&https
    • TCP和UDP
    • Ping
    • keep-alive和http2的多路复用
      • http/1.0 和 http/1.1
        • 1. 区别
        • 2. 存在的问题
      • http/2
        • 1. 特点
        • 2. 与http1.1的区别
      • http/1.1 keep-alive 与 http/2 多路复用
        • 1. http/1.1 keep-alive 请求头
        • 2. http/2 多路复用
        • 3. 区别
    • SSE和textevent-stream
  • 网络
  • http
bigox
2022-12-09
目录

keep-alive和http2的多路复用

# http/1.0 和 http/1.1

# 1. 区别

  • http1.0 不能创建长连接, http1.1 使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。
  • http1.1增加了更多的缓存策略,比E-Tag、If-None-Match,http1.0使用的是last-modified、If-Modified-Since

# 2. 存在的问题

  1. 每一次传输数据都需要重新建立连接,延迟较多
  2. 传输均为明文,客户端和服务端均无法验证双方身份,存在一定的数据安全
  3. 请求的header部分内容较大,增加传输成本,且很多时候header部分是不变的
  4. 虽然http1.1有长连接的功能,但长连接使用过多也给服务端带来了更大的性能压力,特别是对于一些图片类视频类等资源型的服务器,如果长期保持长连接他是没必要的,但给服务器是大的性能浪费
  5. 请求只能从客户端开始,服务器只能被动响应。

# http/2

# 1. 特点

  • 采用二进制格式而非文本格式, http/1采用文本格式
  • HTP/2使用一个连接可实现多路复用,http/1.1 使用keepalive请求头保持连接
  • http2使用报头压缩,HTTP/2降低了开销
  • HTP/2让服务器可以将响应主动“推送”到客户端

# 2. 与http1.1的区别

相对于htto/1.1 有高健壮性、高性能、网络开销低的特点。

  • 二进制分帧传输数据。
  • 优先级排序:http/2 每个数据流都关联了数据权重和依赖关系,以标明资源优先级的关系,并且允许客户端修改
  • 首部压缩:http1.1使用文本形式传输消息头,http/2 使用HPACK算法压缩头部字段,减小头部大小。
  • 多路复用:http2创建的连接可以实现真正的复用;
  • 服务器推送:HTP/2让服务器可以将响应主动“推送”到客户端

# http/1.1 keep-alive 与 http/2 多路复用

# 1. http/1.1 keep-alive 请求头

从http/1.1开始,引入了keep-live长连接,改善了 HTTP/1.0 短连接造成的性能开销。http1.0每发送一次消息都要创建一个新的tcp连接(http1.0短连接),tcp 创建连接(三次握手四次挥手 成本很高)。

  1. http1.1默认keep-alive开启;http1.0默认关闭;
  2. keep-alive 关闭时,每发送一次消息都要创建一个新的tcp连接(http1.0短连接);keep-alive 开启时可以使tcp连接在一定时间内不断开,继续保持一段时间(timeout);在这段时间内,同一个客户端发送消息还会复用该tcp连接,并重置timeout计时器。直到一方主动发起关闭或者timeout时间结束;
  3. timeout时间到了也不会立即结束,服务器会发送一个探测报文,以后每隔75s发送一次,连续发送10个探测报文得不到回复认为客户端故障,关闭连接。
  4. keep-alive 使用管道机制,上一次请求过程中,下一个请求排队,服务端也是按照请求的顺序返回响应。

# 2. http/2 多路复用

http/2 引入数据帧和流

  1. http2是基于二进制流的,可以把http消息分为独立的帧,交错发送,然后在另外一端通过数据帧中的标识重新组装数据,从而实现多路复用。
  2. 多个请求可以同时发送,某一个请求阻塞时不会互相影响;
  3. http2在同域名下的所有通信都是在同一个连接上完成;

# 3. 区别

  1. http/1.1 keep-alive基于文本数据传输,只能整体一次性传输; http2 是基于二进制流的,可以把http消息分为独立的帧,交错发送,然后在另外一端通过数据帧中的标识重新组装数据;
  2. keep-alive 使用管道机制,消息排队顺序发送,一个tcp连接同一时间只能处理一个请求,互相之间影响较大; http/2 多路复用多个请求可以同时发送,某一个请求阻塞时不会互相影响;
  3. keep-alive为了解决队头阻塞,将同一页面的资源分散到不同域名下,开启多个tcp连接; http2在同域名下的所有通信都是在同一个连接上完成。
#网络通信
上次更新: 2023/04/16, 18:35:33
Ping
SSE和textevent-stream

← Ping SSE和textevent-stream→

最近更新
01
go与http代理
05-24
02
自制申威架构k8s-reloader
12-06
03
Docker Buildx 教程
12-01
更多文章>
Theme by Vdoing | Copyright © 2020-2024 小刘扎扎 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式