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还尚未普及。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初级 Vue 算法题。

题目描述 请编写一个 Vue 组件&#xff0c;实现一个简单的表单验证器。表单中有一个输入框和一个提交按钮。当用户点击提交按钮时&#xff0c;如果输入框为空&#xff0c;则显示错误提示信息&#xff1b;否则&#xff0c;显示成功提交的提示信息。 示例 <template><…

静态网页设计——喜羊羊与灰太狼(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV1Ta4y1B75m/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术&#xff1a;HTMLCSSJS 主要内容&a…

docker学习笔记04-可视化界面Portainer

1.Portainer简介 Portainer 是一款开源的容器管理工具&#xff0c;旨在帮助用户更轻松地管理 Docker 环境。无论您是 Docker 新手还是经验丰富的开发人员&#xff0c;Portainer 都提供了直观的用户界面&#xff0c;使您能够方便地创建、部署和监控容器。 安装 Portainer 非常…

用Delphi调用阿里云的OpenAPI更新动态域名解析记录

用Delphi调用阿里云的OpenAPI更新动态域名解析记录 家里一直是电信的宽带&#xff0c;虽然只是200M下行30M上行的平均水平&#xff0c;但是对于平时下载量不大的我来说已经绰绰有余了&#xff0c;很多时候需要从外网访问家里的NAS的资料&#xff0c;但是因为不是固定IP&#xf…

Spring Boot中进行分库编程

在Spring Boot中使用分库&#xff08;Sharding&#xff09;需要根据具体情况而定。分库是一种解决单数据库性能瓶颈和数据量大的解决方案&#xff0c;通过将数据分散到多个数据库中&#xff0c;可以提升数据库的读写性能和数据存储能力。但是&#xff0c;分库也会带来一些复杂性…

Java项目:109SpringBoot超市仓管系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 超市仓管系统基于SpringBootMybatis开发&#xff0c;系统使用shiro框架做权限安全控制&#xff0c;超级管理员登录系统后可根据自己的实际需求配角色&…

PostgreSQL 分区

由于大量数据存储在数据库同一张表中&#xff0c;后期性能和扩展会受到影响。所以需要进行表分区&#xff0c;因为它可以将大表分成较小的表&#xff0c;从而减少内存交换问题和表扫描&#xff0c;最终提高性能。庞大的数据集被分成更小的分区&#xff0c;更易于访问和管理。 …

入门Python数据分析最好的实战项目

本篇将继续上一篇数据分析之后进行数据挖掘建模预测&#xff0c;这两部分构成了一个简单的完整项目。结合两篇文章通过数据分析和挖掘的方法可以达到二手房屋价格预测的效果。 下面从特征工程开始讲述。 特征工程 特征工程包括的内容很多&#xff0c;有特征清洗&#xff0c;…

DevOps(9)

目录 45.如何在Linux中将一个文件附加到另一个文件&#xff1f; 46.解释如何使用终端找到文件&#xff1f; 47.解释如何使用终端创建文件夹&#xff1f; 48.解释如何使用终端查看文本文件&#xff1f; 49.解释如何在Ubuntu LAMP堆栈上启用curl&#xff1f; 50.解释如何在…

Spring Cloud Gateway 缓存区异常

目录 1、问题背景 2、分析源码过程 3、解决办法 最近在测试环境spring cloud gateway突然出现了异常&#xff0c;在这里记录一下&#xff0c;直接上干货 1、问题背景 测试环境spring cloud gateway遇到以下异常 DataBufferLimitException: Exceeded limit on max bytes t…

kali系统

概述 实际上它就是一个预安装了很多安全工具的Debian Linxu。 nmap&#xff08;Network Mapper&#xff09;扫描 nmap是一个免费开放的网络扫描和嗅探的工具包&#xff0c;也叫网络映射器。 nmap的强大之处在于简单易用。看一下nmap的基本功能&#xff1a; 探测一组主机是…

YOLOv5独家原创改进:新颖的Shape IoU结合 Inner-IoU,基于辅助边框的IoU损失的同时关注边界框本身的形状和尺度,小目标实现高效涨点

💡💡💡本文改进:一种新的Shape IoU方法结合 Inner-IoU,基于辅助边框的IoU损失的同时,更加关注边界框本身的形状和尺度来计算损失 💡💡💡对小目标检测涨点明显,在VisDrone2019、PASCAL VOC均有涨点 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/ca…

图像处理中的DCT变换

图像处理中的DCT变换 Discrete Cosine Transform&#xff0c;离散余弦变换。 来源及公式推导&#xff0c;可以查看下面链接&#xff0c;介绍的比较详细&#xff0c;这里就不再重复说明了&#xff1a; 详解离散余弦变换&#xff08;DCT&#xff09; - 知乎 (zhihu.com)DCT变换…

关于openssh 9.6 p1 版本ssh-keygen -t rsa报错解决—— 筑梦之路

背景说明 执行命令ssh-keygen -t rsa 提示unknown key type rsa 执行命令ssh-keygen -t dsa 提示unknown key type dsa 从官方文档中看到9.5以后ssh-keygen 默认使用Ed25519加密算法&#xff0c;详情请阅读&#xff1a;OpenSSH: Release Notes 从官方文档中可查&#xff0c;…

Excel如何将单元格设为文本

文章目录 一、打开excel文件二、选中单元格三、右键设置单元格格式四、设置界面选择文本后点确定五、其他问题 在caa开发过程中遇到从CATUnicodeString转成CString时&#xff0c;通过SetItemText写入将ID号写入单元格&#xff0c;无法保存ID号中的数字0&#xff0c;故将单元格格…

03 decision tree(决策树)

一、decision tree&#xff08;决策树&#xff09; 1. classification problems&#xff08;纯度&#xff09; i . entropy &#xff08;熵&#xff09; ​ 作用&#xff1a;衡量一组数据的纯度是否很纯 &#xff0c;当五五开时他的熵都是最高的&#xff0c;当全是或者都不是…

【计算机算法设计与分析】棋盘覆盖问题(C++_分治法)

文章目录 题目描述测试样例算法原理算法实现参考资料 题目描述 在一个 2 k 2 k 2^k \times 2^k 2k2k个方格组成的棋盘中&#xff0c;若恰有一个方格与其他方格不同&#xff0c;则称该方格为一个特殊方格&#xff0c;且称该棋盘为一个特殊棋盘。显然&#xff0c;特殊方格在棋…

机器视觉系统选型-线阵工业相机选型

线阵相机特点&#xff1a; 1.线阵相机使用的线扫描传感器通常只有一行感光单元&#xff08;少数彩色线阵使用三行感光单元的传感器&#xff09; 2.线阵相机每次只采集一行图像&#xff1b; 3.线阵相机每次只输出一行图像&#xff1b; 4.与传统的面阵相机相比&#xff0c;面阵扫…

mysql之CRUD和常见函数和UNION 和 UNION ALL

mysql之CRUD和常见函数和UNION 和 UNION ALL 一.CRUD1.创建&#xff08;Create&#xff09; - 插入数据2.读取&#xff08;Read&#xff09; - 查询数据3.更新&#xff08;Update&#xff09; - 修改数据4.删除&#xff08;Delete&#xff09; - 删除数据 二.函数1.字符串函数&…

并发程序设计--D4GDB调试多进程程序

使用GDB调试此程序 start后 10行进入father进程&#xff0c;接下来会一直在父进程不断执行程序 那么如何进入子进程&#xff1f; 此时杀死此程序进程 重新gdb调试&#xff0c;使用以下命令&#xff0c;再使用n&#xff0c;可进入子进程 那么如何同时调试父进程和子进程 上图可…