HTTP打怪升级之路

新手村

        上个世纪80年代末,有一天,Tim Berners-Lee正在工作,他需要与另一台计算机上的同事共享一个文件。他尝试使用电子邮件,但发现电子邮件不能发送二进制文件。Tim Berners-Lee意识到,他需要一种新的协议来共享二进制文件。

        这是HTTP的第一个版本,甚至于没有版本号,它非常简单,只支持GET请求,但足以方便科学家们可以在不同的计算机之间共享研究数据和文档。

1.0时代

        早期的HTTP仅支持文本,随着图片、音视频等流媒体的普及,人们对HTTP的要求也随之增加,这就有了HTTP1.0:增加了 HEAD、POST 等新方法、响应状态码,请求头和响应头等。

常见的状态码:

  • 1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。如101表示协议升级。
  • 2xx 类状态码表示服务器成功处理了客户端的请求。如200表示成功响应请求。
  • 3xx 类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源。如301表示永久重定向,302表示临时重定向。
  • 4xx 类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。如404表示资源不存在。
  • 5xx 类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。如502表示服务器网关返回错误。

常见字段:

  • Content-Length:表示消息体的字节数。
  • Accept: 客户端发送请求表明自己支持接收什么样的数据格式。如Accept: */*为接收所有格式
  • Content-Type:指示发送端发送的数据是什么样的数据格式。如Content-Type: text/html; Charset=utf-8 表示数据内容为utf-8编码的html文本格式。
  • Content-Encoding:说明数据的压缩方法,表示服务器返回数据是什么压缩格式。如Content-Encoding: gzip

1.1时代

        由于早期HTTP的特性,每次请求资源都要发起一个新的连接,所以存在很大的性能问题,为此,HTTP从1.0修炼到了1.1。

  • 支持长连接:新增Connection字段:,允许客户端或服务端告知对端,将连接持久化,如Connection: Keep-Alive,直到一端主动关闭:Connection: Close
  • 支持一台主机上部署多个服务器,新增Host字段:客户端发送请求时,用来指定服务器的域名。如Host: www.baidu.com,用以确定客户端访问的数哪个主机。
  • 支持客户端同时发送多个请求,而不必等待前一个请求的响应回来才能发送第二个。
  • 支持响应数据分块,响应数据可分多次传输,从而客户端可以优先处理先收到的这部分数据,而不必等待所有数据完成传输。

2.0时代

        由于HTTP1.1头部字段越来越多,开销越来越大,服务器响应顺序依赖客户端请求顺序,且服务端仅支持被动响应,优化随之而来。

  • 头部压缩:对于常用的协议头,在客户端和服务器分别缓存相同的映射表,头部只携带对应的映射id
  • 二进制协议:不再使用文本协议,转为二进制编码,进一步减少占用
  • 并发传输:多个stream复用一条tcp连接,支持同时传输多个请求,每个stream传输不同的请求,服务端可并发的响应而不受请求顺序的限制。
  • 服务器可主动建立stream实现主动推送数据给客户端。

3.0时代

        HTTP2.0看似有多个stream复用一条tcp连接,解决了HTTP队头阻塞的问题,实际仍然存在tcp层的队头阻塞问题。归根结底是2.0是基于tcp协议来传输数据的,而TCP 是字节流协议,上层应用读取tcp内核缓冲区数据必定是连续的,那么当前1个字节没有到达时,后收到的字节数据无法读取到。为了彻底解决这个问题,QUCI来了。

3.0基于QUIC协议实现,其有如下特点:

  • 无队头阻塞:类似2.0的多个stream复用一条连接,只不过QUIC基于UDP,所以不存在队头阻塞
  • 连接建立更快:可靠连接握手与tls安全握手合二为一,三次握手即建立安全的可靠连接
  • 连接迁移:使用连接 ID 来标识通信的两个端点,若移动端网络发生变更,如从wifi切为4G,仍持有连接ID、会话密钥等上下文,避免重新协商新连接。

缺点:由于各大运营商的转发策略限制,大部分带宽不够的场景下,优先丢弃UDP报文,导致QUIC报文有更大的概率被丢弃。

现网多数采用的仍然是1.1或2.0,3.0还尚未普及。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/293064.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch:Serarch tutorial - 使用 Python 进行搜索 (二)

这个是继上一篇文章 “Elasticsearch:Serarch tutorial - 使用 Python 进行搜索 (一)” 的续篇。在今天的文章中,我们接着来完成如何进行分页及过滤。 分页 - pagination 应用程序处理大量结果通常是不切实际的。 因此&#xff0…

【萤火虫系列教程】1/5-Adobe Firefly 注册账号

001-Adobe Firefly 注册账号 AI时代如火如荼,Adobe也不甘落后,于今年3月份发布AI创意生成工具Firefly(中文翻译:萤火虫) Adobe Firefly简介 Adobe Firefly的官方介绍为:Firefly是Adobe产品中新的创意生成…

在排序数组中查找元素的第一个和最后一个位置

在排序数组中查找元素的第一个和最后一个位置 题目解法一解法二&#xff08;二分查找&#xff09;代码展示原理剖析 题目 在排序数组中查找元素的第一个和最后一个位置 解法一 class Solution { public:vector<int> searchRange(vector<int>& nums, int targ…

CentOs搭建Kafka集群

Centos7搭建Kafka集群 一、集群规划二、环境准备三、安装kafka集群1、下载kafka安装包2、解压3、配置环境变量4、编辑配置文件①修改broker.id②配置kafka运行日志路径③配置Zookeeper集群地址 5、启动集群6、测试kafka①、创建topic②、查看当前服务器中的所有topic③、生产者…

Springcloud 微服务实战笔记 Zuul

优点 解决路由规则与服务实例维护问题。对于类似签名校验、登录校验在微服务架构中的冗余问题。 入门使用 构建网关 pom.xml引入 spring-cloud-starter-netflix-zuul <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-c…

苹果Vision Pro将于1月27日上市!

在无数期待中&#xff0c;苹果全新产品Vision Pro头显终于定下上市日期。 彭博社记者马克古曼&#xff08;Mark Gurman&#xff09;于近日在X&#xff08;前推特&#xff09;平台爆料了这一信息&#xff0c;预计苹果Vision Pro头显将于2024年1月27日率先在美国上市。 在过去看…

LeetCode 641. 设计循环双端队列

难度&#xff1a;Medium 641. 设计循环双端队列 设计实现双端队列。 实现 MyCircularDeque 类: MyCircularDeque(int k) &#xff1a;构造函数,双端队列最大为 k 。boolean insertFront()&#xff1a;将一个元素添加到双端队列头部。 如果操作成功返回 true &#xff0c;否…

Java CPU或内存使用率过高问题定位教程

简介 Spring cloud微服务广泛应用后&#xff0c;服务的监控和运维压力也与日俱增&#xff0c;经常有服务出现CPU或者内存使用率过高的告警&#xff0c;那么遇到这样的问题我们该如何排查呢&#xff1f;我们可以借助哪些工具来定位问题呢&#xff1f;本文将介绍一下遇到此类问题…

案例精选|淄博绿能燃气工程有限公司日志审计系统建设方案

淄博绿能燃气工程有限公司&#xff0c;成立于1994年&#xff0c;前身为淄博市煤气公司管道液化气分公司。公司业务主要涉及天然气、液化气等市政工程施工及城镇燃气供应等领域&#xff0c;具有市政公用工程施工总承包二级资质&#xff0c;《压力管道安装许可证》压力管道安装GB…

亚信安慧AntDB数据库:数字化时代的数据库创新引领者

AntDB数据库以其卓越的创新能力&#xff0c;集中体现在融合统一与实时处理两大关键领域。作为一款服务全国超过10亿用户的分布式数据库&#xff0c;其独特之处在于长期积累的经验、多样性的支持能力、快速响应的数据处理速度以及卓越的系统稳定性。AntDB不仅仅是一个数据库系统…

Node.js+Express+Mysql实现分页查询

接收请求代码 router.get(/api/user/page, async (req, res) > {let pageNo req.query.pageNo;let pageSize req.query.pageSize;const startIndex (pageNo - 1) * pageSize;const queryString SELECT * FROM sys_user LIMIT ${startIndex}, ${pageSize};data await …

【React系列】父子组件通信—props属性传值

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 认识组件的嵌套 组件之间存在嵌套关系&#xff1a; 在之前的案例中&#xff0c;我们只是创建了一个组件App&…

Netty实战(待完善)

Netty组件 1. Bootstrap, ServerBootstrap Netty 中 Bootstrap 类是客户端程序的启动引导类&#xff0c;ServerBootstrap 是服务端启动引导类。 2. NioEventLoop, NioEventLoopGroup NioEventLoop 中维护了一个线程和任务队列&#xff0c;支持异步提交执行任务&#xff0c;…

小梅哥Xilinx FPGA学习笔记20——无源蜂鸣器驱动设计与验证(音乐发生器设计)

目录 一&#xff1a;章节导读 二&#xff1a;无源蜂鸣器驱动原理 三&#xff1a;PWM 发生器模块设计 3.1 PWM 发生器模块框图 3.2 PWM 发生器模块接口功能描述 3.3 PWM波生成设计文件代码 3.4 测试仿真文件 3.5 测试仿真结果 3.6 板级调试与验证之顶层文件设计 四&am…

neo4j图数据库安装和测试

neo4j图数据库安装和测试 1. 下载合适的neo4j软件版本。 https://we-yun.com/doc/neo4j/ https://neo4j.com/deployment-center/#enterprise 2. 下载JAVAJDK 由于neo4j是一个用Java编写的图形数据库&#xff0c;因此在安装和运行Neo4j之前&#xff0c;需要先安装Java Developm…

【shell漫步】1 变量定义和使用

碎碎念 转眼间已经使用了一个月的shell了&#xff0c;作为一个纯小白&#xff0c;我特别理解刚入门的时候对于linux和shell一头雾水的状态&#xff0c;尤其是打算开始学&#xff0c;但是又找不到学习的“入口函数”的那种感受。所以打算整理一下shell的骨架。shell给我的感触就…

【C#】知识点实践序列之UrlEncode在线URL网址编码、解码

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是2024年第8篇文章&#xff0c;此篇文章是C#知识点实践序列文章&#xff0c; 博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 地址编码大家应该比较经常遇到和使用到&…

记一次使用mpvue开发微信小程序动画播放播放完成再播放下一个动画,实现动画队列的实战操作

微信小程序wxss支持Css的keyframes动画&#xff0c;我们想通过事件监听&#xff0c;在动画开始、动画播放阶段、动画播放结束的时候进行下一步动作。如下图&#xff0c;有一个从右飘入&#xff0c;然后从左侧出去的动画&#xff0c;我们希望的是&#xff0c;前一个出去后&#…

微众区块链观察节点的架构和原理 | 科普时间

践行区块链公共精神&#xff0c;实现更好的公众开放与监督&#xff01;2023年12月&#xff0c;微众区块链观察节点正式面向公众开放接入功能。从开放日起&#xff0c;陆续有多个观察节点在各地运行&#xff0c;同步区块链数据&#xff0c;运行区块链浏览器观察检视数据&#xf…

STM32 内部 EEPROM 读写

STM32 的某些系列 MCU 自带 EEPROM。笔者使用的 STM32L151RET6 自带 16 KB 的 EEPROM&#xff0c;可以用来存储自定义的数据。在芯片选型时&#xff0c;自带 EEPROM 也可以作为一个考量点&#xff0c;省去了在外接 EEPROM 的烦恼。 下面简单介绍下 STM32 内部 EEPROM 的读写流…