首页 > 其他分享 >HTTP和TCP协议的队头阻塞

HTTP和TCP协议的队头阻塞

时间:2023-04-20 15:45:47浏览次数:36  
标签:协议 HTTP 队头 阻塞 TCP 资源

队头阻塞(Head-of-line blocking)其实有两种,一种是 TCP 队头阻塞,另一种是 HTTP 队头阻塞,而这两者之前其实还存在一定的联系,毕竟 HTTP1/2 是建立在 TCP 协议之上的应用层协议,另外还有HTTP3对队头阻塞的解决。

 

1、HTTP/1.x 的队头阻塞

HTTP/1.x 有个问题叫队头阻塞,即一个连接同时只能有效地承载一个请求。

问题:HTTP/1.1 是一个纯文本协议,它只在有效荷载(payload)的前面附加头(headers),在资源块(resource chunks)之间不使用分隔符。它不会进一步区分单个资源与其他资源。HTTP 规定报文必须是“一发一收”,这就形成了一个先进先出的串行队列。

“请求 - 应答”模式则加剧了 HTTP 的性能问题,这就是著名的“队头阻塞”(Head-of-line blocking),当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一并被阻塞,会导致客户端迟迟收不到数据。

比如:当浏览器发送给服务器的资源包括:js(大资源块)、css(小资源块)等内容,但是服务器不能对他们进行分块解析,就会导致需要等到js块解析完毕后,才去解析css块。

 

一种解决办法,浏览器打开许多并行TCP连接,但这既不高效,也不可扩展。

 

 

2、TCP传输层队头阻塞 

TCP 是面向连接的、可靠的流协议,其为上层应用提供了可靠的传输,保证将数据有序并且准确地发送至接收端。为了做到这一点,TCP采用了“顺序控制”和“重发控制”机制,另外还使用“流量控制”和“拥塞控制”来提高网络利用率。

应用层(如HTTP)发送的数据会先传递给传输层(TCP),TCP 收到数据后并不会直接发送,而是先把数据切割成 MSS 大小的包,再按窗口大小将多个包丢给网络层(IP 协议)处理。

 

 

IP 层的作用是“实现终端节点之间的通信”,并不保证数据的可靠性和有序性,所以接收端可能会先收到窗口末端的数据,这个时候 TCP 是不会向上层应用交付数据的,它得等到前面的数据都接收到了才向上交付,所以这就出现了队头阻塞,即队头的包如果发生延迟或者丢失,队尾必须等待发送端重新发送并接收到数据后才会一起向上交付。 

即:如果一个 TCP 包丢失,所有后续的包都需要等待它的重传,即使它们包含来自不同流的无关联数据。

当然 TCP 有快重传和快恢复机制,一旦收到失序的报文段就立即发出重复确认,并且接收端在连续收到三个重复确认时,就会把慢开始门限减半,然后执行拥塞避免算法,以快速重发丢失的报文。

3、HTTP/2(基于 TCP)的队头阻塞

使用 SPDY协议 作为 HTTP/2 的起点,并使用多路复用(单个连接上可以进行并行交错的请求和响应,之间互不干扰),解决了队头阻塞的问题,不过 TCP 本身的队头阻塞是无法避免的,而且对其影响更大,因为多个同域名的请求都只会使用同一个 TCP 连接,不会有多个并行连接。

 

 

目标:回到单个 TCP 连接,正确地复用资源块,解决http队头阻塞问题。

解决方案:在资源块之前添加了数据帧(DATA frame),标识每个资源块属于哪个“流”(stream)。这些数据帧主要包含两个关键的元数据。

首先:下面的块属于哪个资源。每个资源的“字节流(bytestream)”都被分配了一个唯一的数字,即流id(stream id)。

第二:块的大小是多少。

这样报文到达服务端之后,服务端应用可以区分哪些属于同一个资源快,进而可以进行复用。即:解决了“应用层”队头阻塞。

 

4、HTTP/3(基于 QUIC)的队头阻塞

由于tcp本身的限制,难以对其进行改变,使其具有”流“的意识。

 

 

选择的替代方法是以 QUIC 的形式实现一个全新的传输层协议。它运行在不可靠的 UDP 协议之上。但它包括 TCP 的所有特性(可靠性、拥塞控制、流量控制、排序等),且集成了TLS,不允许未加密的连接。故创建了 HTTP/3,运行在QUIC协议上。

 

 

 

标签:协议,HTTP,队头,阻塞,TCP,资源
From: https://www.cnblogs.com/binyue/p/17337048.html

相关文章

  • 轻松应对同一IP被封禁的问题:HTTP代理对于爬虫的重要性
    在网络爬虫的世界里,遇到IP被封禁的问题是非常普遍的。不过,我们可以采取一些措施来应对这个问题,其中一个重要的措施就是使用HTTP代理。HTTP代理是一种能够隐藏真实IP地址并改变访问路径的技术,它可以将爬虫的请求发送到代理服务器中,再由代理服务器向目标服务器发起请求,从而避......
  • 从根源上解决反爬虫问题——HTTP代理的应用
    你是不是经常遇到在爬取网站数据时被封IP,或者访问速度过慢的情况呢?这就是因为网站为了保护自己的数据不被恶意利用,采取了反爬虫技术。但是,现在有一种解决方法——HTTP代理。HTTP代理可以将你的请求都转发到一个代理服务器上,然后由代理服务器再去访问目标网站。这样的好处在......
  • 利用HttpClient下载图片
    评:最近在项目中用到了HttpClient类库,有一个需求是下载网站中的图片,但是发现下载的图片不能打开,在网上搜索类似问题,没有找到解决的办法,无奈只得查看HttpClient的源代码,自己解决这个问题了。在HttpMethodBase中发现如下代码:java代码publicStringgetResponseBodyAsString(......
  • HttpClient下载图片
    评:需要的包:commons-httpclient.jar,commons-loggin.jar,commons-codec-1.3.jarpackagecom.db;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.text.SimpleDateFormat;importjava.util.Date;importorg.a......
  • 关于HTTP Keep-Alive的大揭密
    keep-Alive首部只是请求将连接保持在活跃状态。发出keep-alive请求之后,客户端和服务器并不一定会同意进行keep-alive会话。它们可以在任意时刻关闭空闲的keep-alive连接,并可随意限制keep-alive连接所处理事务的数量。可以用Keep-Alive通用首部中指定的、由逗号分隔的选项来调节keep......
  • C++ - TCP通信
    前言socket编程分为TCP和UDP两个模块,其中TCP是可靠的、安全的,常用于发送文件等,而UDP是不可靠的、不安全的,常用作视频通话等。如下图:头文件与库:#include<WinSock2.h>​#pragmacomment(lib,"ws2_32.lib")准备工作:创建工程后,首先右键工程,选择属性然后选择C/C++-预......
  • 安装nginx-http-concat和nginx平滑升級
    评:Nginx_concat_module是淘宝开发的基于Nginx减少HTTP请求数量的扩展模块,主要是用于合并减少前端用户Request的HTTP请求的数量下载后把它放在/usr/local/src/文件夹中,到时候nginx需要指定该目录这个需要重新编译nginx,所以顺便把nginx升级了下。下载最新版本Linux代......
  • http 前端5种请求优化方法
    1、减少请求数量:可以通过将多个资源(例如JavaScript、CSS、图像等)合并为单个文件,从而减少HTTP请求的数量。另外,使用CDN(内容分发网络)也可以减少跨地                域的请求延迟。2、缓存请求结果:对于一些不会频繁更新的资源,可以将它......
  • TCP长连接的连接池、容量控制与心跳保活
    一、长连接与短连接TCP本身并没有长短连接的区别,长短与否,完全取决于我们怎么用它。短连接:每次通信时,创建Socket;一次通信结束,调用socket.close()。这就是一般意义上的短连接,短连接的好处是管理起来比较简单,存在的连接都是可用的连接,不需要额外的控制手段。长连接:每次通信完毕......
  • fix Linux apt-get install package HTTPS error All In One
    fixLinuxapt-getinstallpackageHTTPSerrorAllInOneerrorsE:Themethoddriver/usr/libapt/methods/httpscouldnotbefound.N:Isthepackageapt-transport-httpsinstalled?solutionssymbollinksoftlink/软链接$cd/usr/lib/apt/methods#symbo......