码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 计算机网络 | 07.[HTTP篇]HTTP/1.0、HTTP/1.1和HTTP/2.0


    文章目录

    • 1. HTTP/1.1的特点
      • 1.1. 默认使用长连接
      • 1.2. 管道网络传输(解决请求的队头阻塞问题)
      • 1.3. 响应的队头阻塞
      • 1.4. 其他缺陷(性能瓶颈)
    • 2. HTTP/2.0的特点
      • 2.1.头部压缩
      • 2.2. 二进制分帧
      • 2.3. 多路复用
      • 2.4. 主动推送
    • 参考资料

    1. HTTP/1.1的特点

    总之 HTTP/1.1 的性能一般般,后续的 HTTP/2 和 HTTP/3 就是在优化 HTTP 的性能。

    1.1. 默认使用长连接

    什么是长连接和短连接?(长链接、短链接)什么时候使用长连接、短链接?

    HTTP/1.0默认使用「短连接」,如果需要改用长连接,则需要在请求头中加入 Connection: Keep-Alive,服务端收到响应后同样在响应头加上该字段。

    而HTTP/1.1默认采用「长连接」,减少了TCP连接的重复建立和断开而造成的额外开销。

    • [短连接] 可以理解为「短期有效连接」,每进行一次HTTP请求和响应,就建立一次TCP连接,并在这次HTTP操作结束后立马断开TCP连接。
    • [长连接] 可以理解为「长期有效连接」,在建立TCP连接并完成某次HTTP操作后,不会立马断开TCP连接,而是维持一段时间,在此期间如果始终没有数据交互,就会断开TCP连接。
    短连接和长连接.drawio

    1.2. 管道网络传输(解决请求的队头阻塞问题)

    指在同一个 TCP连接 中,客户端可以连续发起多个请求,只要第一个请求成功发送,不必等待它的响应,就可以继续发送第二个请求,从而 减少了「整体响应时间」,也解决了「请求的队头阻塞」问题。

    管道网络传输.drawio

    1.3. 响应的队头阻塞

    尽管管道网络传输使得请求可以连续发送(也就是解决了「请求的队头阻塞」),但响应却不一定会连续返回。

    若某一个请求的响应由于某种原因无法及时返回,队中其他请求的响应将会被阻塞,这就是HTTP/1.1「响应的队头阻塞」问题。

    响应的队头阻塞.drawio

    1.4. 其他缺陷(性能瓶颈)

    • 只能压缩body,无法压缩头部;
    • 头部冗长且需要重复发送;
    • 没有优先级控制;
    • 请求只能从客户端开始,服务端只能被动响应。

    2. HTTP/2.0的特点

    HTTP 2 是什么, 它真的能让页面打开更快么

    HTTP (原理 && 实践) HTTP2 优点

    HTTP/2 没有强制要求 TLS

    2.1.头部压缩

    客户端和服务端共同维护一张「头部信息表」,所有的头部字段都存入表中,并生成索引号。当下次请求或响应会用到同样的字段时,不再发送完整的头部文本,而是发送 该头部在表中的索引号,即「将完整的头部文本压缩成索引号」。

    HTTP2的头部压缩.drawio

    2.2. 二进制分帧

    消息:这里指HTTP/2中的请求和响应;

    帧:一个或多个「帧」组成一个「消息」;

    HTTP / 1 的请求和响应报文,都是由起始行、首部和实体正文(可选)组成,各部分之间以文本换行符分隔。 HTTP/2 将请求和响应数据分割为更小的帧,并且它们采用二进制编码。

    在HTTP/1.1中,数据传输使用「文本」的形式,在另一方接收到数据后,需要先将文本转成二进制,才能正常解析;

    在HTTP/2.0中,数据传输使用「二进制」的形式,另一方接收后可以直接解析,大幅提升速度。

    HTTP/2.0中,头信息和数据体都是二进制的,并且统称为「帧」,即「头信息帧」和「数据帧」。

    image-20220803171832054

    2.3. 多路复用

    • 一个「TCP链接」中可以有一个或多个「Stream(流)」;
    • 一个「Stream(流)」中可以有一个或多个「消息(请求/响应)」;
    • 一个「消息(请求/响应)」由多个「Frame(帧)」组成。

    多路复用,就是在同一个「TCP连接」中,将若干个「并发的消息」,拆解成若干个「二进制帧」并以不确定的顺序发送。另一方在接收到这些「二进制帧」后,按顺序将它们重新排序以得到「消息」的二进制形式,随后被直接解析。

    由于消息都被拆分成帧,即使某一个请求无法及时作出响应,也不会阻塞其他的响应,会优先将能传的传回来,仍在处理的响应会被放在之后传输。

    • 同一「流」的「帧」必须严格有序,不同「流」的帧可以乱序;

    • 客户端的流编号为奇数,服务端的流编号为偶数。

    多路复用

    2.4. 主动推送

    在HTTP/1.1中,所有的资源都必须由客户端发起请求,才能返回给客户端;

    而HTTP/2.0支持 主动推送(但又不是完全主动),比较常见的应用场景是:

    客户端首次访问页面时,会发起请求获取HTML资源,服务端将会响应体中存放HTML,同时 在此次响应中通知客户端,即将有其他的资源被一并推送过来。

    随后服务端在第二个流中,将后续即将被加载的js、css等文件发送给客户端,而客户端则会将这部分数据缓存起来,一会儿要用的时候,直接从缓存中获取。

    image-20220803222251443

    参考资料

    HTTP 2 是什么, 它真的能让页面打开更快么

    什么是长连接和短连接?(长链接、短链接)什么时候使用长连接、短链接?

    HTTP (原理 && 实践) HTTP2 优点

    HTTP/2 没有强制要求 TLS

    小林coding - HTTP/2牛逼在哪

  • 相关阅读:
    【Leetcode】1829. Maximum XOR for Each Query
    单例 懒汉式
    BVH动捕文件导入到E3D骨骼树
    【python小脚本】监听日志文件异常数据发送告警短信
    10 分钟教会你如何看懂 MySQL 执行计划
    ElasticSearch系列——Elasticsearch Java API Client
    java反序列化之URLDNS链学习
    NVIDIA 7th SkyHackathon(二)Nemo ASR
    WebSocket原理简介
    贤鱼的刷题日常(数据结构栈学习)--P1175 表达式的转换--题目详解
  • 原文地址:https://blog.csdn.net/xyxyxyxyxyxyx/article/details/126150929
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号