关于队头阻塞的一些笔记

news2024/11/14 15:42:28

一、队头阻塞(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.coloradmin.cn/o/564648.html

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

相关文章

【Linux高级 I/O(6)】存储映射 I/O进阶应用(附代码示例)

mprotect()函数 使用系统调用 mprotect()可以更改一个现有映射区的保护要求&#xff0c;其函数原型如下所示&#xff1a; #include <sys/mman.h>int mprotect(void *addr, size_t len, int prot);参数 prot 的取值与 mmap()函数的 prot 参数的一样&#xff0c;m…

Pycharm 配置jupyter notebook 且Windos 安装vim编辑器

请记住要想让你的python成功安装jupyter notebook &#xff0c;你的python最好使用p大于等于python3.7 最好不要在python2大版本中安装jupyternotebook 这个会报错&#xff0c;需要你改一些配置文件&#xff0c;除非你想挑战一下自己&#xff0c;不过后面我会尝试在python2大版…

NeRF-VAE:将场景看作一个分布【ICML‘2021】

文章目录 GQN网络介绍Amortized InferenceNeRF-VAE GQN网络介绍 论文标题&#xff1a;Neural scene representation and rendering 作者&#xff1a;S. M. Ali Eslami, Danilo Jimenez Rezende, et al. 期刊&#xff1a;Science 发表时间&#xff1a;2018/06/15 该文章提出…

单视觉L2市场「鲶鱼」来了,掀起数据反哺高阶新打法

作者 | 张祥威编辑 | 德新 智驾方案的降本行动仍在推进。 早年&#xff0c;单视觉L2市场的玩家以Mobileye、博世为主&#xff0c;后来国内智驾公司加入&#xff0c;共同推动 1V、1R1V、nR1V等不同的方案兴起&#xff0c;L2近乎成为车辆的必备功能。 当下&#xff0c;在行业降低…

认识linux文件系统/文件夹名字解释

linux系统因为其高效、直接的底层操作而被很多代码开发者使用&#xff0c;谈及linux&#xff0c;大家普遍的印象就是黑乎乎的终端命令行&#xff0c;后来基于linux系统开发出来的具有可视化桌面的ubuntu版本&#xff0c;让大家的使用体验兼顾了windows系统的直观性可linux系统代…

YOLOV5使用(一): docker跑通,详解TensorRT下plugin的onnx

yolov5的工程使用(以人员检测为案例) 使用ubuntu为案例 docker run --gpus all -it -p 6007:6006 -p 8889:8888 --name my_torch -v $(pwd):/app easonbob/my_torch1-pytorch:22.03-py3-yolov5-6.0使用端口映射功能也就是说打开jupyter lab的指令是 http://localhost:8889/l…

windows先的conda环境复制到linux环境

如果是迁移的环境一致&#xff1a;同是windows或同是linux直接用这个命令即可&#xff1a; conda create -n new_env_name --clone old_env_path 如果是window的环境迁移到linux这种跨环境就不能用上面的方法&#xff0c;网上这方面的资料也很多&#xff0c;记录一下我的…

小蝌蚪找妈妈:Python之作用域链与 LEGB 原则

文章目录 参考描述作用域对象全局作用域globals() 局部作用域locals() 包含作用域内置作用域builtins 模块builtins 模块与 \_\_builtins__builtins is \_\_builtins__??? \_\_builtins__ 与内置作用域赶不走的 \_\_builtins__ 作用域链作用域链 与 LEGB 原则狗急跳墙之法 参…

【Go语言从入门到实战】基础篇

Go语言从入门到实战 — 基础篇 First Go Program 编译 & 运行 基本程序结构 应用程序入口 package mainimport "fmt"func main() {fmt.Println("Hello World") }退出返回值 package mainimport ("fmt""os" )func main() {fmt.Pr…

哪个产品功能重要?KANO模型帮你

哪个产品功能重要&#xff1f;KANO模型来帮你 模型工具可以协助思考和系统化改进 KANO模型是小日本一个教授提出 趣讲大白话&#xff1a;往往&#xff0c;怎么思考&#xff0c;比思考什么重要 【趣讲信息科技175期】 **************************** 东京理工大学教授狩野纪昭(No…

【医学图像】图像分割系列.2 (diffusion)

介绍几篇使用diffusion来实现医学图像分割的论文&#xff1a;DARL&#xff08;ICLR2023&#xff09;&#xff0c;MedSegDiff&#xff08;MIDL2023&#xff09;& MedSegDiff-V2&#xff08;arXiv2023&#xff09;&#xff0c;ImgX-DiffSeg&#xff08;arXiv2023&#xff09;…

CTF 2015: Search Engine-fastbin_dup_into_stack

参考&#xff1a; [1]https://gsgx.me/posts/9447-ctf-2015-search-engine-writeup/ [2]https://blog.csdn.net/weixin_38419913/article/details/103238963(掌握利用点&#xff0c;省略各种逆向细节) [3]https://bbs.kanxue.com/thread-267876.htm&#xff08;逆向调试详解&am…

web功能测试方法大全—完整!全面!(纯干货,建议收藏哦~)

本文通过六个部分为大家梳理了web功能测试过程中&#xff0c;容易出现的遗漏的部分&#xff0c;用以发掘自己工作中的疏漏。&#xff08;纯干货&#xff0c;建议收藏哦~&#xff09; 一、输入框 1、字符型输入框 2、数值型输入框 3、日期型输入框 4、信息重复 在一些需要命…

GPT-4版Windows炸场,整个系统就是一个对话机器人,微软开建AI全宇宙

原创 智东西编辑部 智东西 Windows的GPT时刻到来&#xff0c;变革PC行业。 作者 | 智东西编辑部 今日凌晨&#xff0c;Windows迎来了GPT-4时刻&#xff01; 在2023微软Build大会上&#xff0c;微软总裁萨蒂亚纳德拉&#xff08;Satya Nadella&#xff09;宣布推出Windows Co…

实现免杀:Shellcode的AES和XOR加密策略(vt查杀率:4/70)

前言 什么是私钥和公钥 私钥和公钥是密码学中用于实现加密、解密和数字签名等功能的关键组件。 私钥是一种加密算法中的秘密密钥&#xff0c;只有密钥的拥有者可以访问和使用它。私钥通常用于数字签名和数据加密等场景中&#xff0c;它可以用于对数据进行加密&#xff0c;同…

头部效应凸显,消金行业迈入“巨头赛”?

回顾已经过去的2022年&#xff0c;消金行业面临着来自多方面的考验&#xff0c;承压前行&#xff0c;而随着进入2023年&#xff0c;相关企业也陆续展示出过去一年的发展成果&#xff0c;以此为后续发展做出指引。 当前&#xff0c;30家已开业的消金公司中&#xff0c;29家的20…

《消息队列高手课》课程笔记(三)

如何利用事务消息实现分布式事务&#xff1f; 什么是分布式事务&#xff1f; 消息队列中的“事务”&#xff0c;主要解决的是消息生产者和消息消费者的数据一致性问题。如果我们需要对若干数据进行更新操作&#xff0c;为了保证这些数据的完整性和一致性&#xff0c;我们希望…

独立站怎么搭建?搭建一个独立站的10个建议和步骤

要搭建一个独立站&#xff08;也称为个人网站或博客&#xff09;&#xff0c;以下是一些建议和步骤&#xff1a; 选择一个合适的域名&#xff1a;选择一个简洁、易记且与您网站内容相关的域名。确保域名可用&#xff0c;并注册该域名。 寻找一个合适的主机服务提供商&#xff…

【Cpp】哈希之手撕闭散列/开散列

文章目录 unorderedunordered系列关联式容器unordered_map和unordered_set概述unordered_map的文档介绍unordered_map的接口说明 底层结构 哈希哈希/散列表 概念哈希冲突哈希函数哈希函数设计原则&#xff1a;常见哈希函数 哈希冲突解决闭散列线性探测二次探测 开散列 哈希表的…

C语言数据结构——树、堆(堆排序)、TOPK问题

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;数据结构 &#x1f525;座右铭&#xff1a;“不要等到什么都没…