漫画|google:互联网太慢了,我要替换tcp!

码农翻身 码农翻身     2022-12-18     682

关键词:

今天换一下风格,尝试用一个短小的漫画讲一个小概念。

这个概念如此重要,以至于推动了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小时太慢了。我不知道会发生什么!... 查看详情