关于队头阻塞的一些笔记

news/2025/1/15 20:05:02/

一、队头阻塞(Head-of-Line Blocking,HOL)

看到队头,联想到了数据结构课程中学到的队列,队列的一个特点就是FIFO(First In First Out),即先进入队列的数据先出队列。所以,队头阻塞可以理解为,处在队头的数据没有成功退出队列,从而阻塞了之后的数据,使它们无法退出队列。

二、HTTP/1.1队头阻塞

  1. 造成队头阻塞的原因:HTTP/1.1协议规定只有上一个请求得到响应后,才允许发出下一个请求。这暗示了响应的顺序需要与请求的顺序一致。

  2. 请求阻塞
    (1)考虑以下场景:
    客户端访问某一页面时,需要script.jsstyle.css文件。客户端按照先请求script.js,后请求style.css的顺序向服务端发起HTTP请求。假设客户端发起的script.js请求为 请求一,发起的style.css请求为请求二。考虑两种情况:
    情况一: 客户端发送请求一之后,一直未收到响应,由于HTTP/1.1的规定,请求二也就无法发出,这就导致了请求二被阻塞。
    情况二: 请求一的数据很大,导致时间过长,同样导致请求二被阻塞。
    (2)解决方法:HTTP/1.1中可以应用管道技术来解决请求阻塞问题。
    管道(Pipelining)技术,在同一个TCP连接中可以发送多个HTTP请求而不用等待上一个请求返回数据后,再发送下一个请求。虽然可以同时发送多个HTTP请求,但是服务器响应是按照请求的顺序进行响应的。

  3. 响应阻塞
    (1)考虑以下场景:
    在应用管道技术解决请求的阻塞问题后,客户端发送的请求不会被阻塞,但是服务器端需要按照请求的顺序发送响应数据包,假设服务器发送的script.js响应为响应一,发送的style.css响应为响应二同样考虑两种情况:
    情况一: 服务端发送的响应一未到达客户端,那么客户端即使收到响应二也无法处理,这就导致响应二被阻塞。
    情况二: 响应一的数据过大,发送响应一的时间过长,同样导致响应二被阻塞。
    在这里插入图片描述
    (2)解决方法:可以应用多路复用(Multiplexing) 技术来解决HTTP/1.1的队头阻塞问题,但是由于HTTP/1.1中,使用Content-Length字段来确定一个HTTP数据包的开始和结束,所以HTTP/1.1无法应用多路复用技术。因此,HTTP/2诞生了。

三、HTTP/2的多路复用技术

  1. 多路复用(Multiplexing): 在同一个TCP连接中,可以发送多个HTTP请求,而且请求的响应不依赖于前一个请求。每个请求单独处理,不会出现HTTP/1.1中上一个请求没有回应便一直等待的情况。
  2. 原理: HTTP/2将每个HTTP数据包放在一条流中,并为每条流定义了一个流ID,且会记录每个TCP数据包中流数据的长度。

在这里插入图片描述

三、TCP的队头阻塞

由于上层协议对TCP是透明的,TCP无法感知上层协议数据的含义,同时,TCP有确认重传机制,这导致如果丢失一个TCP数据包,则后面的数据包就无法被接收处理,导致数据包的阻塞。为了解决TCP的队头阻塞问题,QUIC+HTTP/3诞生了。(关于QUIC的内容请查看后续文章)

参考文章

Head-of-Line Blocking in QUIC and HTTP/3: The Details


http://www.ppmy.cn/news/77810.html

相关文章

麒麟系统安装HDP【已解决】

麒麟系统安装HDP 麒麟系统安装HDP1、软件版本介绍2、文件替换3 报错解决3.1 解决KeyError: HDP-3.1(所有机器)3.2 安装smartsense-hst(所有机器)3.3 解决Non-ASCII character \xe5 in file(所有机器)3.4 解…

day8 - 使用不同的滤波核进行图像降噪

本期主要介绍用于图像平滑处理的滤波,分别是方框滤波、均值滤波、中值滤波、高斯滤波,比较不同滤波的效果;并了解自定义滤波器进行图像处理。 完成本期内容,你可以: 会使用方框滤波、均值滤波、中值滤波、高斯滤波进行…

Windows古老Bug损坏SSD/HDD,Win7到Win11全遭殃

去年微软确认了 Windows 12 将在2024年发布,Win11 的更新变为了小的功能更新。 今年3月 Win11 Moment 2 带来了包括任务栏在内的小更新,Moment 3 在这两天就会出来。 Win11 的更新明显放缓,也让用户松了口气。 因为自古以来 Windows 更新大…

随身WIFI折腾日记(三)---Docker+ssh远程访问+青龙面板

四、安装Docker 安装完Docker以后,我们便可以一键部署一些服务上去了。 sudo curl -fsSL get.docker.com -o get-docker.sh # 下载安装脚本 \&& sudo sh get-docker.sh --mirror Aliyun # 执行安装脚本 \&& sudo systemctl enable docker # 加入开…

docker安装华为gaussdb数据库

docker安装gaussdb docker镜像: http://docker.hub.com/ 这里我们使用docker hub镜像下载,该镜像下载较慢,可能有时访问不同,可以使用阿里云镜像下载,阿里云镜像配置参考《docker国内阿里云镜像加速》 拉取镜像 下载…

Python 萌新 - 花10分钟学爬虫

前言 Python 新手入门很多时候都会写个爬虫练手,本教程使用 Scrapy 框架,帮你简单快速实现爬虫,并将数据保存至数据库。在机器学习中数据挖掘也是十分重要的,我的数据科学老师曾经说过,好算法不如好数据。 Python助学…

MySQL---存储引擎

1. 存储引擎 数据库存储引擎是数据库底层软件组织,数据库管理系统使用数据引擎进行创建、查询、更新和删 除数据。 不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。不同的数据库管理系统都支持 多种不同的数据引擎。MySQL的核心就是存储引擎。 …

全网最全JAVA面试八股文,终于整理完了,堪称2023最强

当今互联网行业中,Java作为一种广泛应用的编程语言,对于求职者来说仍是一项受欢迎的技能。然而,随着市场上的开发人员数量越来越多,Java面试的竞争也愈加激烈。 目前Java面试有着以下现状: 面试难度加大 与过去相比…