关键词:
今天换一下风格,尝试用一个短小的漫画讲一个小概念。
这个概念如此重要,以至于推动了HTTP甚至TCP的不断发展。
先从1989年蒂姆·伯纳斯·李设计的HTTP协议开始。
HTTP的特点是:发一个Http Request,然后等着Http Response回来,然后再发下一个Http Request....
蒂姆·伯纳斯·李想不到的是, 几十年以后, 页面变得非常复杂
HTTP协议这种请求->等待响应的模式,引发了队头阻塞的问题
这些HTTP请求组成了一个队列,如果队列头部的请求的响应不回来,后面的都得等着。
很明显, 一个很简单的解决方案是多建立几个队列:多建立几个TCP连接
另外一个方案就是多路复用 :把每个请求和响应当成一个流(Stream) ,每个Stream都有一个ID。
每个Stream可以有多个帧(Frame),Frame中保存数据。
在同一个TCP连接上,可以有多个多个帧混合着在“流动”。
HTTP 一下子发出3个请求, 它们的Stream次序是 1, 2, 3
但是返回的Stream次序是 2,1, 3, 1 , 次序乱了。
但是没关系,有Stream ID做关联,浏览器很容易知道请求和响应的对应关系。
HTTP 升级成了 HTTP/2 。(详情参见《HTTP之大明邮差》)
问题似乎解决了 ?
不,站在TCP的角度看, 它不会意识到HTTP层有Stream的存在,一旦TCP层出现丢包,依然会出现队头阻塞的问题!
现在浏览器可以直接使用TCP#1 中的 b.js, 但是由于TCP#2丢了,按照TCP协议的要求,TCP#3中的数据是不能使用的, 虽然其中的数据是完整的h.css,还必须等待TCP#2重传。
问题的本质就是站在TCP的视角看,它看到数据是没有含义的二进制流而已。
如果修改一下TCP协议,让他理解这些“Stream”呢?
不行,TCP是在操作系统内核中实现的,想改TCP就得改操作系统,然后部署到全世界所有的网络设备上,这就难了。
所以现在只能调整一下操作系统中网络的参数而已。
既然改不了现有的TCP, 那我们就创造一个新的协议出来,让这个新协议能意识到“Stream”的存在
这个新协议,就是Google提出的QUIC!
如果浏览器收到了QUIC #1, #3, #4, 但是QUIC #2丢失了, 会发生什么情况呢?
#4 可以暂时保存,等待 #2的重新传输。
虽然QUIC不知道Stream中传输的数据到到底是什么含义,但是通过引入Stream , QUIC彻底解决了队头阻塞的问题!
当然,由于Stream的概念下移到了QUIC中,那HTTP中的Stream就不需要了。
HTTP/2就升级成了HTTP/3。
不过, QUIC是基于UDP实现的,TCP的那些优秀特性,它不得不重新实现一遍了。
QUIC不在操作系统内核中,意味着应用程序可以对它任意定制,例如轻松地控制各种拥塞算法的实现。
QUIC作为新协议,除了上面说的可以解决队头阻塞问题之外,还有很多优点:
1.减少RTT时间
2. 改善拥塞控制
3. 连接迁移
4. 集成TLS,更加安全
小结:TCP协议已经统治了世界50年,基于TCP的HTTP也30多岁了,在新的环境,它们的弊端逐渐暴露,一个突出的问题就是HTTP和TCP的队头阻塞问题,QUIC和HTTP/3有可能是解决之道。
不过想替换TCP可不是那么简单的事情,今年6月IETF 才发布了QUIC的规范RFC9000,根据w3techs的统计,至今只有5.8%的网站在使用QUIC,主要是Google的网站,QUIC任重而道远。
点击下方图片,查看更多文章吧 !
MySQL UNION ALL 太慢了
...NALL中执行相同查询至少需要10秒。而且我已经挖掘了整个互联网,包括YouTube,但不幸的是我还没有找到任何解决方案。请 查看详情
sqlmap太慢了
】sqlmap太慢了【英文标题】:sqlmapistooslow【发布时间】:2012-07-0506:46:16【问题描述】:这是一个例子。只是想列出数据库:pythonsqlmap.py-u"http://somesite.com/?id=1"--dbs[15:20:32][INFO]fetchingdatabasenames[15:20:32][INFO]fetchingnumberofdatabases[... 查看详情
for循环太慢了
】for循环太慢了【英文标题】:Forloopistooslow【发布时间】:2016-01-0113:01:38【问题描述】:我有以下代码:varCombinatorics=require(\'js-combinatorics\');varfs=require(\'fs\');cp=Combinatorics.cartesianProduct(["4","@","/\\\\","/-\\\\","^","∂","λ","α","(!" 查看详情
iPad 中的洪水填充太慢了
】iPad中的洪水填充太慢了【英文标题】:FloodfillinginiPadtooslow【发布时间】:2011-05-0901:19:28【问题描述】:我在iPad上为我的一个着色应用程序使用洪水填充。该应用程序基本上在图像的黑线内填充颜色,我可以毫无问题地做到这... 查看详情
InAppReview : SKStoreReviewController 太慢了
】InAppReview:SKStoreReviewController太慢了【英文标题】:InAppReview:SKStoreReviewControllerSoSlow【发布时间】:2017-09-2213:03:59【问题描述】:使用SKStoreReviewController进行inAppReview需要时间,直到出现提示,有什么方法可以让它显示得更快?另... 查看详情
插入 WStandardItemModel 太慢了
】插入WStandardItemModel太慢了【英文标题】:InsertinginaWStandardItemModelistooslow【发布时间】:2011-07-0417:59:53【问题描述】:我正在开发一个基于WT构建的应用程序。我们遇到了性能问题,因为它必须在与WStandardItemModel关联的WTableView中... 查看详情
Ucanaccess 太慢了
】Ucanaccess太慢了【英文标题】:Ucanaccessistooslow【发布时间】:2016-04-2708:03:07【问题描述】:我已正确添加了所有必要的JARS:Ucanaccess3.0.4commons-lang-2.6commons-logging-1.1.1hsqldbdjackcess-2.1.3我的数据库是100MB。仅使用Jacksess时,相同的查... 查看详情
为啥使用 information_schema 太慢了?
】为啥使用information_schema太慢了?【英文标题】:Whyisusinginformation_schematoomuchslow?为什么使用information_schema太慢了?【发布时间】:2017-02-2607:34:33【问题描述】:这是我的代码://dbssize$sql=\'SELECTtable_schemaDB_Name,Round(Sum(data_length+inde... 查看详情
获取数百万条记录太慢了
】获取数百万条记录太慢了【英文标题】:FetchingMillionsRecordsgoingtooslow【发布时间】:2018-07-3010:47:29【问题描述】:我正在尝试使用带有Fetching的聚集索引复制其他表中的6000万条记录。但是在2000万张唱片之后,它变得太慢了。我... 查看详情
导航到包含 ScrollView 的 ViewController 太慢了
】导航到包含ScrollView的ViewController太慢了【英文标题】:NavigatingtoViewControllercontainingScrollViewGoingtooSlow【发布时间】:2016-01-1807:55:50【问题描述】:这就是从ViewControllerA推送到ViewControllerB的方式UIStoryboard*mainStory=[UIStoryboardstoryboardW... 查看详情
呈现视图控制器太慢了
】呈现视图控制器太慢了【英文标题】:PresentingViewControlleristooslow【发布时间】:2020-05-2000:08:29【问题描述】:我已经在我的Swift应用中实现了FirebaseGoogle登录。我想在开始时检查它是否已经是登录用户。我是这样做的:overridefun... 查看详情
MySQL查询太慢了
】MySQL查询太慢了【英文标题】:MySQLquerytoomuchslow【发布时间】:2019-05-1423:21:59【问题描述】:我正在尝试查询以获取一些趋势统计数据,但基准测试真的很慢。查询执行时间约为134秒。我有一个名为table_1的MySQL表。在create语句... 查看详情
UIAlertController 在 iOS 9.3 中太慢了
】UIAlertController在iOS9.3中太慢了【英文标题】:UIAlertControlleristooslowiniOS9.3【发布时间】:2016-10-3123:35:19【问题描述】:在iOS9.3中执行任何按钮操作时,UIAlertController太慢。不确定是iOS9.3的问题还是缺少正确配置的内容。UIAlertContro... 查看详情
setFormulaArray 太慢了
】setFormulaArray太慢了【英文标题】:setFormulaArraytooslow【发布时间】:2021-06-0807:02:33【问题描述】:我正在尝试编写一个python包装器,该包装器旨在从csv(或mysql)读取多个记录并更新工作表预定义范围的值,该范围由值单元格和... 查看详情
Vscode typescript 样式的组件太慢了
】Vscodetypescript样式的组件太慢了【英文标题】:Vscodetypescriptstyledcomponenttooslow【发布时间】:2020-10-1008:32:58【问题描述】:当我使用styledcomponent时,我的vscode类型检查太慢了我已经多次搜索过这个问题,但我在hit-hub上发现了一... 查看详情
Alamofire 序列化太慢了
】Alamofire序列化太慢了【英文标题】:AlamofireSerializationisTooSlow【发布时间】:2018-02-1321:27:43【问题描述】:由于某种原因,我需要很长时间进行序列化。我正在使用Alamofire和ObjectMapper来处理请求响应并将数据反序列化为对象。... 查看详情
谷歌云部署太慢了
】谷歌云部署太慢了【英文标题】:GoogleClouddeploysoslow【发布时间】:2017-03-0504:06:30【问题描述】:我正在使用GoogleCloudNodeJS托管。当我将应用程序部署到GoogleCloud时,我感到非常惊讶。每次部署都非常慢。第一次可能会很慢,但... 查看详情
Rails Assets 预编译太慢了~12hrs
】RailsAssets预编译太慢了~12hrs【英文标题】:RailsAssetsprecompileistooslow~12hrs【发布时间】:2014-02-2406:28:11【问题描述】:我是本地预编译资产likethisRAILS_ENV=productionbundleexecrakeassets:precompile,但是12小时太慢了。我不知道会发生什么!... 查看详情