当前位置: 首页 > news >正文

HTTP1.0 到 HTTP3.0 的优化

HTTP 1.0

**请求过程:**每次发起请求都新建连接,一个连接只能传输一个请求和响应,下一个请求需要等上一个请求的响应到达才能发送。

  1. 每次发起请求都要新建TCP连接
  2. 无法多路复用: 只能按顺序传输一个请求和响应,无法同时传输多个请求和响应。
  3. 队头阻塞问题: 如果上一个请求的响应没收到,后续的请求会被阻塞。

HTTP 1.1

请求过程: 新建连接,一个连接可以传输多个请求和响应,可以同时发送多个请求,但是响应是按顺序返回的,响应可以分块返回

  1. 长连接: 一个TCP连接传输多个请求和响应。
  2. 管道传输: 客户端可以同时发送多个请求,但是服务端需要按顺序响应请求,没有实质解决队头阻塞问题。
  3. 分块传输编码: 服务器不知道数据总大小时可以采用分块传输编码,此时 Content-Length 字段不会被包含在响应头中。可以通过特定的符号标识消息的结束。
  4. 虚拟主机: 在请求头添加 Host 字段,区分不同的主机。因为一台服务器可以有多个虚拟主机。
  5. 请求方式: 引入了更多的请求方式,如PUT、DELETE、OPTIONS等。
  6. 引入了更多的缓存控制选项: 引入了 Cache-Control 头部,它提供了一系列指令来控制缓存的行为,如 no-cache、no-store、max-age、public、private 等。这些指令允许更精细地控制资源是否可以被缓存以及缓存的条件。

HTTP 2.0

默认使用 HTTPS 进行传输
请求过程: 一个连接可以并行传输多个请求和响应,每个请求进行头部压缩,再将传输数据分成二进制帧,独立进行传输,接收端可以根据头部 ID 有序组装成正确信息。

  1. 多路复用: 允许同时通过一个连接并行传输多个请求和响应,解决了队头阻塞问题

  2. 二进制分帧: 将传输的数据分成一个个二进制帧,可以独立传输,每个帧的头部会携带 Stream ID 信息,所以接收端可以通过 Stream ID 有序组装成 HTTP 消息。

  3. 头部压缩: 使用 HPACK 算法对头部信息进行压缩,减少了头部信息的传输量。

    HPACK 算法:
    在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,就不用重复发送同样字段了,只发送索引号,减少数据量提高速度

  4. 服务端推送: 服务端不再是被动地响应,可以主动向客户端发送消息、推送额外的资源,比如客户端请求网页,服务端会将相关的 CSS、JavaScript 或图片文件等。

HTTP 3.0

  1. 使用基于 UDP 协议的 QUIC 协议进行传输,解决 TCP 队头阻塞和 TCP 握手延迟的问题。
  2. 将一个连接分成多个数据流,每个数据流都有独立的 ID,可以独立控制和传输数据。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux常用命令合集
  • 免费的 Mac 应用清理工具Pearcleaner v3.8.6
  • 透视表支持自定义聚合公式,新增字体管理功能,DataEase开源BI工具v2.10 LTS版本发布
  • FastAPI 深度指南:使用依赖注入处理分页和过滤逻辑
  • 深度学习的模型知识点介绍和总结
  • Anolis 8 NVME over TCP 配置使用
  • [数据集][目标检测]打电话检测数据集VOC+YOLO格式8985张1类别
  • 数据分析-埋点
  • 【Python报错已解决】No Python at ‘C:Users…Python Python39python.exe’
  • jdbc-day03
  • 1321. 餐館營業額變化增長
  • AtCoder Beginner Contest 370(A~E)
  • php转职golang第二期
  • 新学期学生资料在线收集,老师用它一分钟搞定!
  • 【Unity基础】Input中GetAxis和GetAxisRaw的区别
  • 5、React组件事件详解
  • HashMap ConcurrentHashMap
  • Java编程基础24——递归练习
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • js中的正则表达式入门
  • spring-boot List转Page
  • Terraform入门 - 1. 安装Terraform
  • vue数据传递--我有特殊的实现技巧
  • Zepto.js源码学习之二
  • 分布式熔断降级平台aegis
  • 缓存与缓冲
  • 基于游标的分页接口实现
  • 简单实现一个textarea自适应高度
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 线上 python http server profile 实践
  • 详解NodeJs流之一
  • 小而合理的前端理论:rscss和rsjs
  • 阿里云服务器如何修改远程端口?
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ###C语言程序设计-----C语言学习(6)#
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (0)Nginx 功能特性
  • (C++17) std算法之执行策略 execution
  • (C语言)fgets与fputs函数详解
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (TOJ2804)Even? Odd?
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (力扣)循环队列的实现与详解(C语言)
  • (十八)Flink CEP 详解
  • (转)C#调用WebService 基础
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (状压dp)uva 10817 Headmaster's Headache
  • *1 计算机基础和操作系统基础及几大协议
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .dwp和.webpart的区别
  • .java 9 找不到符号_java找不到符号
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .NET Core中的去虚
  • .net6使用Sejil可视化日志