关于计算机网络的一些疑问
目录
- 1. HTTP/1.x 中的“队头阻塞”(Head-of-Line Blocking)问题解释
- 什么是队头阻塞?
- 其他相关概念:
- 2. HPACK 算法是什么?
- HPACK 的作用:
- HPACK 的特点:
- HPACK 提升性能的原因:
- 3. 如何使用 HTTP/2?
- 4. 多路复用是什么?怎么实现?
- 多路复用的定义:
- 实现原理:
- 为什么多路复用提升性能?
- 多路复用技术的学习与实践
1. HTTP/1.x 中的“队头阻塞”(Head-of-Line Blocking)问题解释
什么是队头阻塞?
队头阻塞(Head-of-Line Blocking, HOL Blocking)是指一个连接中的请求因为前面的请求没有完成而被阻塞的情况。HTTP/1.x 中,主要有两种形式的队头阻塞:
-
HTTP 层的队头阻塞:
在 HTTP/1.1 中,虽然引入了“持久连接”(Persistent Connection)和“管道化”(Pipelining),但同一条 TCP 连接只能按顺序处理请求。如果一个请求因为某些原因(如服务器响应延迟)没有完成,后续请求就必须等待,无法越过前面的请求。这就导致了“队头阻塞”。例子:
- 浏览器向同一域名发送多个请求(如请求 HTML、CSS、JS 文件)。
- 如果第一个请求(HTML)未完成(可能因为服务器处理慢或网络延迟),后续的 CSS、JS 请求只能排队等待。
-
TCP 层的队头阻塞:
HTTP/1.x 使用 TCP 连接,TCP 是一个可靠的、有序的字节流协议。如果一个数据包丢失,TCP 会重传该数据包,且必须等待丢失的数据被确认后,才能继续传输后续数据。这种机制也会导致队头阻塞。
其他相关概念:
-
TCP 连接限制:
在 HTTP/1.x 中,浏览器通常限制与同一域名的 TCP 并发连接数(一般是 6 个)。如果一个网页包含大量资源(如图片、CSS、JS 等),会导致资源被排队等待新连接的建立或空闲连接的释放。 -
无状态性:
HTTP 是一个无状态协议,每个请求都是独立的,服务器不会记录之前请求的上下文。这种无状态性使得每个请求都需要携带足够的信息(如 Cookie、头部等)来完成处理,导致开销较大。
2. HPACK 算法是什么?
HPACK 的作用:
HTTP/2 中引入 HPACK 算法对头部字段进行压缩。因为 HTTP 的头部可能非常冗长(例如包含很多 Cookie、User-Agent、Accept-Encoding 等字段),如果每次请求都传输完整头部,会占用较多带宽,尤其在移动网络中性能会很差。
HPACK 的特点:
-
静态表(Static Table):
定义了一些常用的头部字段(如:method
,:status
,content-type
等)的预设编码,可以直接引用,避免重复传输。 -
动态表(Dynamic Table):
在连接期间,客户端和服务器维护一个动态的头部字段表,用于存储之前已经发送的头部字段。后续请求中,只需传输引用编号,而不需要传输完整内容。 -
头部字段的增量更新:
当某些头部字段变化(如 Cookie 值部分更新)时,只需传输变化的部分,而不需要传输完整字段。
HPACK 提升性能的原因:
- 减少了头部的冗余传输。
- 使用静态和动态表,通过索引代替字段值传输。
- 提升了带宽利用率,特别适合移动网络。
3. 如何使用 HTTP/2?
-
检查服务器是否支持 HTTP/2:
- 现代的 Web 服务器(如 Nginx、Apache、Caddy)都支持 HTTP/2。
- 需要 HTTPS(HTTP/2 强制要求 TLS 加密)。
-
配置服务器:
- Nginx 配置:
server {listen 443 ssl http2;ssl_certificate /path/to/cert.pem;ssl_certificate_key /path/to/key.pem;server_name example.com;# 配置 HTTP/2 相关优化http2_max_concurrent_streams 128;http2_idle_timeout 10s;location / {root /var/www/html;}
}
- Apache 配置:
LoadModule http2_module modules/mod_http2.so
Protocols h2 http/1.1
-
浏览器支持:
现代浏览器(Chrome、Firefox、Safari 等)都默认支持 HTTP/2。 -
验证是否启用了 HTTP/2:
- 使用浏览器的开发者工具(Network 面板)查看协议是否为 HTTP/2。
- 使用命令行工具:
curl -I --http2 https://example.com
4. 多路复用是什么?怎么实现?
多路复用的定义:
多路复用(Multiplexing)是 HTTP/2 的核心功能,它允许在一个 TCP 连接中同时传输多个并发的流(Stream)。每个流由多个帧组成,并带有唯一的标识符,可以交错发送和接收,互不干扰。
实现原理:
-
流的分帧传输:
HTTP 请求和响应被分割为多个帧,每个帧带有流 ID。不同的流交错传输,最终在接收端根据流 ID 重组为完整的请求或响应。 -
流的优先级:
HTTP/2 支持为每个流分配优先级,重要的流(如关键 CSS、JS)会优先传输。 -
TCP 连接共享:
多个请求和响应共享同一个 TCP 连接,避免了 HTTP/1.x 中每个请求占用一个连接的开销。
为什么多路复用提升性能?
- 消除了 HTTP/1.x 中的队头阻塞。
- 减少了 TCP 连接的建立和维护成本(连接建立的时间开销、内存消耗等)。
- 提升了带宽利用率,多个流可以充分利用单个连接。
多路复用技术的学习与实践
-
理解 HTTP/2 的基础知识:
- 阅读官方标准 RFC 7540。
- 探索多路复用的原理和报文结构。
-
实践多路复用:
- 使用浏览器的开发者工具,分析 HTTP/2 的多路复用行为(观察网络请求是否复用同一连接)。
- 使用工具(如 Wireshark)抓包,查看帧和流的传输细节。
-
实现 HTTP/2 客户端/服务器:
- 使用现代编程语言的 HTTP/2 库(如 Python 的
hyper
、Go 的http2
)。 - 构建一个简单的 HTTP/2 服务,测试多路复用的效果。
- 使用现代编程语言的 HTTP/2 库(如 Python 的
-
对比 HTTP/1.x 和 HTTP/2:
- 创建一个含大量资源的网页,分别在 HTTP/1.x 和 HTTP/2 环境下加载,观察网络请求和加载时间的差异。
相关文章:
关于计算机网络的一些疑问
目录 1. HTTP/1.x 中的“队头阻塞”(Head-of-Line Blocking)问题解释什么是队头阻塞?其他相关概念: 2. HPACK 算法是什么?HPACK 的作用:HPACK 的特点:HPACK 提升性能的原因: 3. 如何…...
超大规模数据场景(思路)——面试高频算法题目
目录 用4KB内存寻找重复元素 从40个亿中产生不存在的整数【位】 如果只让用10MB空间存储? 初次遍历 二次遍历 用2GB内存在20亿个整数中查找出现次数最多的数【分块】 从亿万个URL中查找问题【分块 堆】 40亿个非负整数中找出现两次的数【位 不过多个位哈】 …...
高级:性能优化面试题深度剖析
一、引言 在Java应用开发中,性能优化是确保系统高效运行的关键。面试官通过相关问题,考察候选人对性能优化的理解和实践经验。本文将深入探讨Java应用性能优化的方法,包括JVM调优、数据库优化等,结合实际开发场景,帮助…...
【软件】在 macOS 上安装和配置 Apache HTTP 服务器
在 macOS 上安装 Apache HTTP 服务器的步骤: 1.安装 Apache HTTP 服务器 macOS 系统可能已经预装了 Apache HTTP 服务器。你可以通过终端检查它是否已经安装: httpd -v如果系统提示command not found,说明 Apache 未安装。你可以通过 Home…...
数据结构之链表
定义:在计算机科学中,链表是数据元素的线性集合,其每个元素都指向下一个元素,元素存储上并不连续。 链表分类:单向链表(每个元素知道下一个元素是谁)、双向链表(每个元素知道其上一…...
基于Python的懂车帝汽车数据爬虫分析与可视化系统
【Python】基于Python的懂车帝汽车数据爬虫分析与可视化系统 (完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 🚗🔥【视频简介】🔥🚗 大家好&…...
setInterval问题以及前端如何实现精确的倒计时
一、为什么setInterval不能实现 原因有两:1、js是单线程,基于事件循环执行其他任务(这里建议读者可以多去了解一下浏览器线程与事件循环相关知识) 2、setinterval是每隔delay时间,把逻辑放到任务队列中,而…...
Python爬虫教程010:使用scrapy爬取当当网数据并保存
文章目录 3.6 爬取当当网数据3.6.1 创建项目3.6.2 查找要爬取的数据对象3.6.3 保存数据3.6 爬取当当网数据 3.6.1 创建项目 【1、创建项目】: scrapy startproject scrapy_dangdang_095【2、创建爬虫文件】 cd scrapy_dangdang_095\scrapy_dangdang_095\spiders scrapy ge…...
达芬奇预设:复古16mm胶片质感老式电影放映机转场过渡+音效
达芬奇预设:复古16mm胶片质感老式电影放映机转场过渡音效 特征: DaVinci Resolve 宏 8 过渡 幻灯片投影仪效果 可在任何帧速率和分辨率下工作 教程包括 系统要求: 达芬奇 Resolve 18.0...
Spring MVC 的请求处理流程是怎样的?
Spring MVC 请求处理流程的大致可分为以下几个步骤: 1. 请求到达 DispatcherServlet: 所有请求首先到达 DispatcherServlet(前端控制器)。DispatcherServlet 是 Spring MVC 的核心,它负责接收请求,并将请求委派给其他…...
PyTorch 实现图像版多头注意力(Multi-Head Attention)和自注意力(Self-Attention)
本文提供一个适用于图像输入的多头注意力机制(Multi-Head Attention)PyTorch 实现,适用于 ViT、MAE 等视觉 Transformer 中的注意力计算。 模块说明 输入支持图像格式 (B, C, H, W)内部转换为序列 (B, N, C),其中 N H * W多头注…...
STM32单片机入门学习——第17节: [6-5] TIM输入捕获
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.06 STM32开发板学习——第17节: [6-5] TIM输入捕获 前言开发板说明引用解答和科普一…...
P8819 [CSP-S 2022] 星战 Solution
Preface 不可以,总司令 的来源. Description 给定一张 n n n 点 m m m 边的有向图 G G G,有 q q q 次操作分四种: 1 u v:使边 u → v u\to v u→v 失活.2 u:使点 u u u 的所有入边失活.3 u v:使边…...
【spring02】Spring 管理 Bean-IOC,基于 XML 配置 bean
文章目录 🌍一. bean 创建顺序🌍二. bean 对象的单例和多例❄️1. 机制❄️2. 使用细节 🌍三. bean 的生命周期🌍四. 配置 bean 的后置处理器 【这个比较难】🌍五. 通过属性文件给 bean 注入值🌍六. 基于 X…...
Llama 4架构解析与本地部署指南:MoE模型在170亿参数下的效率突破
Meta最新发布的Llama 4系列标志着开源大语言模型(LLM)的重大演进,其采用的混合专家(MoE)架构尤为引人注目。 两大核心模型——Llama 4 Scout(170亿参数含16专家)和Llama 4 Maverick(170亿参数含128专家)——展现了Meta向高效能AI模型的战略转型,这些模型在挑战传统扩…...
`docker run --restart no,always,on-failure,unless-stopped`笔记250406
docker run --restart no,always,on-failure,unless-stopped 笔记250406 docker run --restart 用于配置容器的自动重启策略,当容器意外退出时,Docker 会根据策略自动重新启动容器。这是确保服务高可用的重要参数。 语法 docker run --restart <策略…...
stl的VS的string的内部实现,引用计数的写实拷贝,编码
本章目标 1.stl的vs的string的内部实现 2.引用计数的写实拷贝 3.编码 1.stl的string的内部实现 我们先来看一个例子 string s1; cout<<sizeof(s1)<<endl;我们知道类的内存管理也是遵循内存对齐的规则的. 我们假设当前机器的环境是32位的.string类的内部有三个成…...
Docker 从入门到进阶 (Win 环境) + Docker 常用命令
目录 引言 一、准备工作 1.1 系统要求 1.2 启用虚拟化 二、安装Docker 2.1 安装WSL 2 2.2 安装Docker Desktop 2.3检查是否安装成功 三、配置Docker 3.1 打开Docker配置中心 四、下载和管理Docker镜像 4.1 拉取镜像 4.2 查看已下载的镜像 4.3 运行容器 4.4 查看正…...
C# Winform 入门(12)之制作简单的倒计时
倒计时效果展示 控件展示 以下均是使用label来形成的 label 的 BorderStyle:Fixed3D ForeColor:Red Blackground:Black label 的属性 Name: txtyear txtmonth txtday txttime txtweek txtDays txtHour txtM…...
基于springboot+vue的漫画天堂网
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...
leetcode每日一题:最大整除子集
题目 368. 最大整除子集 给你一个由 无重复 正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对 (answer[i], answer[j]) 都应当满足: answer[i] % answer[j] 0 ,或 answer[j] % answer[i] …...
【Unity】animator检测某state动画播放完毕方法
博主对动画系统很不熟,可能使用的方法比较曲折,但是我确实没找到更有效的方法了。 unity的这个animator在我看来简直有毛病啊,为什么那么难以获取某状态动画的信息呢??? 想要知道动画播完没有只有用norma…...
玄机-应急响应-webshell查杀
题目要求: 要求获取四个flag webshell查杀: 常见的webshell: PHP: eval(), system(), exec(), shell_exec(), passthru(), assert(), base64_decode() ASP: Execute(), Eval(), CreateObject() JSP: Runtime.getRuntime().exec() websh…...
小菜Go:Ubuntu下Go语言开发环境搭建
前置要求Ubuntu环境搭建 文章推荐 此处推荐一个比较好的文章,基本按部就班就欧克~ 安装虚拟机(VMware)保姆级教程(附安装包)_vmware虚拟机-CSDN博客 安装可能遇到的问题 虚拟机安装遇到的问题如:Exception…...
多功能指示牌是否支持多语言交互?
嘿,朋友们!你们知道吗?叁仟多功能指示牌在多语言交互方面可太厉害了,下面就为大家热情介绍一些常见的实现方式和相关说明哦! 显示多语言文字:哇哦,在众多国际化的超棒场所,像那充满…...
2025ArkTS语言开发入门之前言
2025ArkTS语言开发入门之前言(一) 引言 要想学好一门语言,必先会下载对应的编辑器/集成开发环境,ArkTS也是如此,下面我带着大家去下载并安装ArkTS语言的集成开发环境——Dev Eco Studio。 下载 来到华为开发者联盟…...
Python高级爬虫+安卓逆向1.1-搭建Python开发环境
目录 引言: 1.1.1 为什么要安装Python? 1.1.2 下载Python解释器 1.1.3 安装Python解释器 1.1.4 测试是否安装成功 1.1.5 跟大神学高级爬虫安卓逆向 引言: 大神薯条老师的高级爬虫安卓逆向教程: 这套爬虫教程会系统讲解爬虫的初级&…...
深入理解MySQL:核心特性、优化与实践指南
MySQL是一个开源的关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,目前属于Oracle公司。它是目前世界上最流行的开源数据库之一,广泛应用于各种规模的Web应用和企业系统中。 目录 一、核心特点 关系型数据库: 开源免费&am…...
38常用控件_QWidget的enable属性(2)
实现用另一个按钮切换之前按钮的“可用”状态 在同一个界面中,要求不同的控件的 objectName 也是必须不同的.(不能重复) 后续就可以通过 ui->objectName 方式来获取到对应的控件对象了 ui->pushButton // 得到了第一个按钮对应的对象 ui->pushButton 2 //…...
如何单独指定 Android SDK tools 的 monitor.bat 使用特定 JDK 版本
核心概念与背景介绍 在 Android 开发过程中,Android SDK Tools 提供了许多实用工具,其中 monitor.bat 是 Windows 下用于启动 Android Device Monitor 的批处理文件。Device Monitor 可以帮助我们查看日志、内存、线程等运行信息。 JDK 与 monitor.bat …...
【代码随想录 字符串1】 344.反转字符串
自己的 class Solution {public void reverseString(char[] s) {int mid s.length /2;int j1;for (int i 0; i < mid; i) {char tem s[i];s[i] s[s.length -j];s[s.length -j] tem;j;}s.toString();} }双指针 class Solution {public void reverseString(char[] s) {…...
gogs私服对应SSH 协议配置
一、使用非特权端口(推荐) 1. 修改 Gogs 配置文件 sudo nano /home/git/gogs/custom/conf/app.ini 找到 [server] 部分,修改为: [server] START_SSH_SERVER true SSH_PORT 2222 # 改为1024以上的端口 2. 重启 Gogs sud…...
蓝桥与力扣刷题(74 搜索二维矩阵)
题目:给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则ÿ…...
多元高斯分布函数
1、 n n n元向量 假设 n n n元随机变量 X X X X [ X 1 , X 2 , ⋯ , X i , ⋯ , X n ] T μ [ μ 1 , μ 2 , ⋯ , μ i , ⋯ , μ n ] T σ [ σ 1 , σ 2 , ⋯ , σ i , ⋯ , σ n ] T X i ∼ N ( μ i , σ i 2 ) \begin{split} X&[X_1,X_2,\cdots,X_i,\cdots ,X_n…...
【PySpark大数据分析概述】02 Spark大数据技术框架
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PySpark大数据分析与应用 ⌋ ⌋ ⌋ PySpark作为Apache Spark的Python API,融合Python易用性与Spark分布式计算能力,专为大规模数据处理设计。支持批处理、流计算、机器学习 (MLlib) 和图计算 (GraphX)&am…...
JVM 参数调优指南_优化 Java 应用性能
1. 引言 1.1 什么是 JVM 参数调优 JVM 参数调优是指通过调整 Java 虚拟机的各种参数,以优化 Java 应用程序的性能和稳定性。 1.2 JVM 参数调优的重要性 提高性能:优化内存使用和垃圾回收,提升应用程序的响应速度。稳定性:减少内存溢出和垃圾回收暂停时间,提高系统的稳定…...
闭包和装饰器
什么是闭包 闭包(Closure)是 Python 中一个非常重要的概念,它是一种特殊的函数对象,通常用于封装和延迟计算某些值。以下是闭包的详细定义和解释: 1.闭包的定义 闭包是指一个函数对象,它不仅包含函数的代…...
电脑显示器选购
显示器分类 按尺寸大小 一般显示器屏幕有24寸、27寸、32寸等 按技术分类 LCD显示器 使用液晶分子作为主要材料,以液晶为显示/控制模块制造而成的显示设备。液晶显示器中的液晶体在工作时不发光,而是控制外部的光通过量。当外部光线通过液晶分子时&a…...
论伺服电机在轨道式巡检机器人中的优势及应用实践
一、引言 1.1 研究背景与意义 在现代工业生产、电力系统、轨道交通等诸多领域,保障设施设备的安全稳定运行至关重要。轨道式巡检机器人作为一种高效、智能的巡检工具,正逐渐在这些领域崭露头角。它能够沿着预设轨道,对目标区域进行全方位…...
室内指路机器人是否支持与第三方软件对接?
嘿,你知道吗?叁仟室内指路机器人可有个超厉害的技能,那就是能和第三方软件 “手牵手” 哦,接下来就带你一探究竟! 从技术魔法角度看哈:好多室内指路机器人都像拥有超能力的小魔法师,采用开放式…...
Docker 命令大全:从入门到精通
一、容器生命周期管理 1. 容器操作基础 # 运行容器 docker run -d --name my_nginx -p 8080:80 nginx:latest# 启动/停止容器 docker start my_nginx docker stop my_nginx# 重启容器 docker restart my_nginx# 删除容器 docker rm my_nginx 2. 容器状态管理 # 查看运行中的…...
【HarmonyOS Next之旅】DevEco Studio使用指南(十一)
目录 1 -> 代码实时检查 2 -> 代码快速修复 3 -> C快速修复使用演示 3.1 -> 填充switch语句 3.2 -> 使用auto替换类型 3.3 -> 用?:三元操作符替换if-else 3.4 -> 从使用处生成构造函数 3.5 -> 将变量拆分为声明和赋值 1…...
【中间件】使用ElasticSearch提供的RestClientAPI操作ES
一、简介 ElasticSearch提供了RestClient来操作ES,包括对数据的增删改查,可参照官方文档:Java High Level REST Client 二、使用步骤: 可参照官方文档操作 导包 <dependency><groupId>org.elasticsearch.client<…...
数字电子技术基础(三十九)——显示译码器
目录 1 显示译码器 1.1 显示译码器简介 1.2 七段显示译码器和八段显示译码器 1.3 BCD-七段显示译码器 1.4 多位显示译码器 1 显示译码器 1.1 显示译码器简介 显示译码器是一种数字电路,是将二进制转换为驱动显示设备所需要的信号,核心是将编码数据…...
Java学习总结-多线程-三种创建方法
什么是线程? 线程(Thread)是程序内部的一条执行流程。 程序如果只有一条执行流程,那这个程序就是单线程程序。 什么是多线程? 多线程是指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行…...
sqli-labs靶场 less 7
文章目录 sqli-labs靶场less 7 mysql文件上传拿web shell sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、…...
大模型最新面试题系列:模型部署(二)
一、如何通过unsloth的批处理(Batching)功能提升推理效率? Unsloth的批处理(Batching)功能通过整合硬件加速、内存优化和动态调度技术,显著提升大模型推理效率。以下是具体实现方法和实际应用场景的深度解…...
Python助力去中心化云计算:构建分布式计算的未来
Python助力去中心化云计算:构建分布式计算的未来 随着区块链技术和Web 3.0生态的兴起,去中心化云计算正逐步成为主流。它不仅颠覆了传统集中式云计算的架构,还为数据安全、隐私保护以及资源分配带来了新的可能性。在这一领域,Python因其简洁易用、社区庞大以及强大的工具链…...
HCIP【路由过滤技术(详解)】
目录 1 简介 2 路由过滤方法 3 路由过滤工具 3.1 静默接口 3.2 ACL 3.3 地址前缀列表 3.4 filter-policy 3.4.1 filter-policy过滤接收路由(以RIP为例) 3.4.2 filter-policy过滤接收路由(以OSPF为例) 1 简介 路由过滤技术…...
LeetCode Hot100 刷题笔记(3)—— 链表
目录 前言 1. 相交链表 2. 反转链表 3. 回文链表 4. 环形链表 5. 环形链表 II 6. 合并两个有序链表 7. 两数相加 8. 删除链表的倒数第 N 个结点 9. 两两交换链表中的节点 10. K 个一组翻转链表 11. 随机链表的复制 12. 排序链表 13. 合并 K 个升序链表 14. LRU 缓存 前言 一、…...