HTTP 1.1 比 HTTP1.0 多了什么?(详尽版)

相较于HTTP 1.0,1.1 版本增加了以上特性:

1. 新增了连接管理即 keepalive,允许持久连接。

定义:

Keepalive允许客户端和服务器在完成一次请求-响应后,保持连接处于打开状态,以便后续请求复用同一连接,而无需重新建立连接。

工作原理:

  1. 客户端通过TCP三次握手与服务器建立连接。
  2. 客户端发送HTTP请求,服务器处理后返回响应。
  3. 服务器不会立即关闭连接,而是保持空闲状态,等待后续请求。
  4. 如果客户端在预设时间内发送新的请求,服务器将复用此连接。
  5. 超过空闲时间后,服务器会关闭连接以节省资源。

优势:

  1. 减少连接开销: 避免了频繁的TCP连接建立和关闭,节省时间和带宽。
  2. 提升性能: 特别适用于需要多个小请求的场景,如加载多张图片或脚本。

2. 支持pipeline,无需等待前面的请求响应,即可发送第二次请求。

定义:

Pipeline允许客户端在一个连接中连续发送多个HTTP请求,而无需等待前一个响应。

工作原理:

  1. 客户端在同一个连接中发送多个请求。
  2. 服务器按顺序处理请求,并依次返回响应。
  3. 客户端在发送完所有请求后,等待服务器按顺序返回响应。

优势:

  • 减少延迟: 减少等待时间,尤其在高延迟网络中效果显著。
  • 提高吞吐量: 客户端可以并行发送请求,提高整体传输效率。

注意事项:

  • 服务器处理顺序: 响应必须按请求顺序返回,服务器无法重新排序。
  • 潜在问题: 管道中的任何一个请求失败可能导致后续请求处理延迟或失败。

3. 支持分块传输编码(Chunked Transfer Coding)

在HTTP协议中允许服务器将响应分成多个块发送,而无需提前知道内容的总长度。这在处理大型文件时特别有用,因为它提高了传输效率,减少了客户端等待时间。

以下是一个简明的示例:客户端请求从服务器下载一个10GB的视频文件。

传统方法(无分块传输):

  1. 客户端发送HTTP GET请求到服务器。
  2. 服务器处理请求,开始读取视频文件。
  3. 服务器计算整个文件的大小,并在响应头中设置Content-Length: 10737418240(10GB)。
  4. 服务器将整个文件一次性发送给客户端。
  5. 客户端等待接收完整个文件后,才能开始播放。

分块传输方法:

  1. 客户端发送HTTP GET请求,支持接受分块传输。
  2. 服务器开始处理请求,并将视频文件分割成多个块(例如,每块1MB)。
  3. 服务器在响应头中设置Transfer-Encoding: chunked,指示使用分块传输,不设置Content-Length。
  4. 服务器开始发送第一个块,包含块的大小(以十六进制表示)和块数据。
  5. 客户端接收到每个块后,立即开始处理(如播放视频),无需等待所有块传输完成。
  6. 服务器发送完最后一个块后,发送一个0大小的块,表示传输结束(EOF)。
  7. 客户端完成接收,处理完成。

优点:

客户端可以边下载边处理,提升用户体验。
服务器无需预先计算总长度,减少延迟。
节省内存,适用于大数据传输。

总结:

分块传输编码在处理大文件时显著提升了效率,减少了等待时间,适用于流媒体、大型文件下载等场景。

4. 新增缓存的控制和管理。

HTTP/1.1中,缓存控制和管理主要通过以下机制实现:

1. Cache-Control头部(用于控制缓存行为,如缓存有效期、缓存范围等。)

  • max-age=[seconds]:指定资源在缓存中的有效时间。
  • s-maxage=[seconds]:针对共享缓存(如CDN)的有效时间
  • no-cache:强制每次请求都验证资源是否过期。
  • no-store:禁止缓存任何内容。
  • public和private:分别允许或限制第三方缓存。

2. ETag头部(提供资源的唯一标识,用于验证资源是否更改。)

  • 工作原理:当客户端再次请求资源时,会发送If-None-Match头部,服务器通过ETag判断资源是否过期,若未变化则返回304状态码。

3. Last-Modified头部(指示资源的最后修改时间。)

  • 工作原理:客户端在请求中包含If-Modified-Since头部,服务器比较时间戳,若资源未更改则返回304状态码。

4. 缓存验证机制

  • 强缓存:直接使用缓存内容,无需服务器验证。
  • 协商缓存:客户端携带缓存验证信息(如ETag或Last-Modified),服务器确认资源是否过期后,决定是否返回新内容。

5. 缓存有效期管理

  • 过期时间:通过Cache-Control设置资源的缓存时长,过期后客户端会重新请求资源。
  • 服务器处理:服务器在接收到过期缓存请求时,会重新生成响应,确保客户端获得最新内容。

6. 缓存控制策略

  • 合理设置缓存时间:根据资源更新频率,设置适当的max-age值,平衡缓存和更新需求。
  • 使用ETag提升效率:避免频繁的全响应,通过ETag快速判断资源是否变化。
  • 灵活运用Cache-Control指令:根据资源类型(如公开或私有)选择合适的缓存策略。

通过以上机制,HTTP/1.1有效地管理了缓存,提升了资源加载速度,减少了服务器负载。合理配置这些头部和机制,可以显著优化网站性能和用户体验。

5. 加入host头

在HTTP/1.1协议中,Host头字段的作用非常重要,主要体现在以下几个方面:

标识目标服务器:

Host头字段指定了请求的目标服务器的域名和端口号(如果端口号非默认)。例如,Host: www.example.com表示请求的目标是www.example.com服务器。这使得服务器能够根据域名确定请求的来源,特别是在虚拟主机环境中,多个网站可以共享同一个IP地址,但通过不同的Host头来区分不同的域名。

支持虚拟主机:

通过Host头,服务器可以托管多个网站,每个网站使用不同的域名。当一个请求到达服务器时,服务器会解析Host头,从而确定应该将请求路由到哪个虚拟主机上,提供相应的资源。这极大提高了服务器资源的利用率。

路由和定位资源:

服务器根据Host头来确定请求的目标资源。这有助于服务器正确地路由请求,确保请求能够到达正确的应用程序或服务。例如,一个服务器可能托管多个应用程序,每个应用程序对应不同的域名,通过Host头可以实现精准的路由。

安全性:

Host头还用于防止某些类型的攻击,如HTTP头注入攻击。通过验证Host头的值,服务器可以确保请求的来源是合法的,从而增强安全性。

区分大小写:

虽然域名通常以小写显示,但Host头是区分大小写的。理论上,不同的大小写可能指向不同的资源,但大多数情况下,服务器会将大小写视为不敏感。

不包含路径信息:

Host头只包含域名和端口号,不包含请求的路径信息。路径信息在URI中指定,Host头的作用是明确请求的目标服务器,而路径则用于定位具体资源。

总结:

Host头在HTTP/1.1中起到了至关重要的作用,它不仅帮助服务器识别请求的目标,还支持虚拟主机的实现,提高资源利用率,同时增强安全性。正确配置和使用Host头是确保HTTP通信正常进行的关键。

6. 名词解释

EOF:End of File,这是一个关键的信号,用于指示文件传输的结束。

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

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

相关文章

【深度学习】PyTorch实现VGG16模型及网络层数学原理

一、Demo概述 代码已附在文末 1.1 代码功能 ✅ 实现VGG16网络结构✅ 在CIFAR10数据集上训练分类模型 1.2 环境配置 详见【深度学习】Windows系统Anaconda CUDA cuDNN Pytorch环境配置 二、各网络层概念 2.1 卷积层(nn.Conv2d) nn.Conv2d(in_cha…

解决RecyclerView在调用smoothScrollToPosition后最后一个item底部超出屏幕的问题

要解决RecyclerView在调用smoothScrollToPosition后最后一个item底部超出屏幕的问题,可以使用自定义的LinearSmoothScroller,使其底部对齐屏幕。步骤如下: 创建自定义的SmoothScroller类: 继承LinearSmoothScroller并重写getVerti…

k8s亲和力和非亲和力

在 Kubernetes 中,亲和力(Affinity)和非亲和力(Anti-Affinity)是用于控制 Pod 调度策略的机制,它们可以帮助优化资源利用率、提高应用性能和可用性。以下是亲和力和非亲和力的详细解释: 亲和力…

开发一款游戏需要哪些岗位角色参与?

常见分类 1. 游戏策划(Game Designer) 核心职责:设计游戏的玩法、规则、内容和整体体验。 具体工作: 系统设计:设计游戏的战斗、经济、成长、社交等核心系统。 数值设计:平衡角色属性、装备数值、经济系…

Asp.NET Core WebApi 创建带鉴权机制的Api

构建一个包含 JWT(JSON Web Token)鉴权的 Web API 是一种常见的做法,用于保护 API 端点并验证用户身份。以下是一个基于 ASP.NET Core 的完整示例,展示如何实现 JWT 鉴权。 1. 创建 ASP.NET Core Web API 项目 使用 .NET CLI 或 …

Jenkins 发送钉钉消息

这里不介绍 Jenkins 的安装,可以网上找到很多安装教程,重点介绍如何集成钉钉消息。 需要提前准备钉钉机器人的 webhook 地址。(网上找下,很多教程) 下面开始配置钉钉机器人,登录 Jenkins,下载 …

CentOS中离线安装DockerCompos并用其部署Rabbitmq(使用离线导入导出docker镜像方式)

场景 DockerDockerCompose实现部署jenkins,并实现jenkinsfile打包SpringBootVue流水线项目过程详解、踩坑记录(附镜像资源、离线包资源下载): DockerDockerCompose实现部署jenkins,并实现jenkinsfile打包SpringBootVue流水线项目过程详解、踩坑记录(附镜像资源、离…

stm32week11

stm32学习 八.stm32基础 2.stm32内核和芯片 F1系统架构:4个主动单元和4个被动单元 AHB是内核高性能总线,APB是外围总线 总线矩阵将总线和各个主动被动单元连到一起 ICode总线直接连接Flash接口,不需要经过总线矩阵 AHB:72MHz&am…

贪心算法:部分背包问题深度解析

简介: 该Java代码基于贪心算法实现了分数背包问题的求解,核心通过单位价值降序排序和分阶段装入策略实现最优解。首先对Product数组执行双重循环冒泡排序,按wm(价值/重量比)从高到低重新排列物品;随后分两阶段装入:循环…

13. Langchain异步处理:提升应用性能的关键技巧

引言:从"顺序等待"到"并行加速" 2025年某电商平台引入LangChain异步处理后,大促期间订单处理能力提升5倍,系统响应延迟降低70%。本文将基于LangChain的异步架构,详解如何通过并行执行流式处理,让…

ros2-rviz2控制unity仿真的6关节机械臂,探索从仿真到实际应用的过程

文章目录 前言(Introduction)搭建开发环境(Setup Development Environment)在window中安装Unity(Install Unity in window)创建Docker容器,并安装相关软件(Create Docker containers…

计算机组成原理笔记(十四)——3.4指令类型

一台计算机的指令系统可以有上百条指令,这些指令按其功能可以分成几种类型,下面分别介绍。 3.4.1数据传送类指令 一、核心概念与功能定位 数据传送类指令是计算机指令系统中最基础的指令类型,负责在 寄存器、主存、I/O设备 之间高效复制数…

各开源协议一览

在 GitHub 上,开源项目通常会使用一些常见的开源协议来定义项目的使用、修改和分发规则。以下是目前 GitHub 上最常见的几种开源协议及其差异和示例说明: TL;DR 协议宽松程度是否强制开源专利保护适用场景MIT最宽松否无希望代码被广泛使用Apache 2.0宽松…

51c自动驾驶~合集17

我自己的原文哦~ https://blog.51cto.com/whaosoft/13793157 #汇聚感知、定位、规划控制的自动驾驶系统 自动驾驶技术在应用到车辆上之后可以通过提高吞吐量来缓解道路拥堵,通过消除人为错误来提高道路安全性,并减轻驾驶员的驾驶负担,从…

小程序开发指南

小程序开发指南 目录 1. 小程序开发概述 1.1 什么是小程序1.2 小程序的优势1.3 小程序的发展历程 2. 开发准备工作 2.1 选择开发平台2.2 开发环境搭建2.3 开发模式选择 3. 小程序开发流程 3.1 项目规划3.2 界面设计3.3 代码开发3.4 基本开发示例3.5 数据存储3.6 网络请求3.7 …

Day15:关于MySQL的编程技术——基础知识

前言:先创建一个练习的数据库和数据 1.创建数据库并创建数据表的基本结构 -- 创建练习数据库 CREATE DATABASE db_programming; USE db_programming;-- 创建员工表(包含各种数据类型) CREATE TABLE employees (emp_id INT PRIMARY KEY AUTO…

批处理脚本bat丨遍历一个包含项目名称的数组,并对每个文件中的项目执行 git pull 操作 (一键拉很多文件的代码)

文章目录 前言一、操作方式二、文件展示三、分析代码结构四、代码五、需要注意的潜在问题六、改进后的代码七、改进说明八、感谢 前言 由于之前git服务部署在本地服务器,处于代码安全角度考虑。领导让我将所有的项目代码手动物理备份一份并且发给他。 这种傻傻的操…

【C++】C与C++、C++内存空间、堆与栈

C嘎嘎嘎嘎嘎~ C与C的区别与联系 C内存空间 int global_var; // 未初始化全局变量,BSS段 const char* str "Hello"; // 字符串常量text段 in数据段void func() {static int static_var; // 未初始化的静态变量,数据段int local_var; …

舵机:机器人领域的“关节革命者”

机器人的技术,每一个细微的进步都可能引领一场行业变革。而在这场变革中,舵机作为机器人关节的核心部件,正悄然上演着一场革命性的应用风暴。从简单的关节运动到复杂的姿态控制,舵机以其卓越的性能和无限的可能,重新定…

微前端的不断探索之路—— qiankun 实战与思考!

全文目录: 开篇语📝 前言🛠️ 微前端是什么?为什么需要它?💡 先从“前端痛点”说起🧐 微前端的优势 🤹‍♀️ qiankun 简介与核心概念🌟 为什么选择 qiankun?…