HTTP3是在保持QUIC稳定性的同时使用UDP来实现高速度,同时又不会牺牲TLS的安全性。
QUIC(Quick UDP Internet Connections
,快速UDP网络连接)是基于UDP的协议,利用了UDP的速度和效率,同时整合TCP、TLS和HTTP/2的优点并加以优化。用一张图可以清晰的表示他们之间的关系:
QUIC是用来替代TCP、SSL/TLS的传输层协议,在传输层之上还有应用层。我们熟知的应用层协议有HTTP、FTP、IMAP等,这些协议理论上都可以运行在QUIC上,其中运行在QUIC之上的协议被称为HTTP/3,这就是
HTTP over QUIC
即HTTP/3的含义。
因此想要了解HTTP/3, QUIC是绕不过去的,下面是几个重要的QUIC特性。
RTT: round-trip time
,仅包括请求访问来回的时间
HTTP/2的连接建立需要3 RTT,如果考虑会话复用,即把第一次握手计算出来的对称密钥缓存起来,那也需要2 RTT。更进一步的,如果TLS升级到1.3,那么HTTP/2连接需要2RTT,考虑会话复用需要1RTT。如果HTTP/2不急于HTTPS,则可以简化,但实际上几乎所有浏览器的设计都要求HTTP/2需要基于HTTPS。
HTTP/3首次连接只需要1RTT,后面的链接只需要0RTT,意味着客户端发送给服务端的第一个包就带有请求数据,其主要连接过程如下:
Inchoate Client Hello
,用于请求连接。Server Config
中再发送Rejection消息给客户端。Server Hello
发送给客户端。连同Server Hello
消息,还有HTTP返回数据。
这里使用DH密钥交换算法,DH算法的核心就是服务端生成a、g、p 3个随机数,a自己持有,g和p要传输给客户端,而客户端会生成b这1个随机数,通过DH算法客户端和服务端可以算出同样的密钥。在这过程中a和b并不参与网络传输,安全性大大提升。因为p和g是大数,所以即使在网络传输中p、g、A、B都被劫持,靠现在的算力也无法破解。
TCP连接基于四元组(源IP、源端口、目的IP、目的端口),切换网络时至少会有一个因素发生变化,导致连接发送变化。当连接发送变化时,如果还是用原来的TCP连接则会导致连接失败,就得等到原来的连接超时后重新建立连接,所以我们有时候发现切换到一个新的网络时,即使网络状况良好,但是内容还是需要加载很久。如果实现得好,当检测到网络变化时,立即建立新的TCP连接,即使这样,建立新的连接还是需要几百毫秒时间。
QUIC不受四元组的影响,当这四个元素发生变化时,原连接依然维持。原理如下:
QUIC不以四元素作为表示,而是使用一个64位的随机数,这个随机数被称为
Connection ID
,即使IP或者端口发生变化,只要Connection ID
没有变化,那么连接依然可以维持。
HTTP/1.1和HTTP/2都存在队头阻塞的问题(Head Of Line blocking
)。
TCP是个面向连接的协议,即发送请求后需要收到ACK消息,以确认对象已接收数据。如果每次请求都要在收到上次请求的ACK消息后再请求,那么效率无疑很低。后来HTTP/1.1提出了Pipeline技术,允许一个TCP连接同时发送多个请求。这样就提升了传输效率:
在这样的背景下,队头阻塞发生了。比如一个TCP连接同时传输10个请求,其中1,2,3个请求给客户端接收,但是第四个请求丢失,那么后面第5-10个请求都被阻塞。需要等第四个请求处理完毕后才能被处理,这样就浪费了带宽资源。
因此,HTTP一般又允许每个主机建立6个TCP连接,这样可以更加充分的利用带宽资源,但每个连接中队头阻塞的问题还是存在的。
HTTP/2的多路复用解决了上述的队头阻塞问题。在HTTP/2中,每个请求都被拆分为多个Frame通过一条TCP连接同时被传输,这样即使一个请求被阻塞,也不会影响其他的请求。
但是,HTTP/2虽然可以解决请求这一粒度下的阻塞,但HTTP/2的基础TCP协议本身却也存在队头阻塞的问题。HTTP/2的每个请求都会被拆分成多个Frame,不同请求的Frame组合成Stream,Stream是TCP上的逻辑传输单元,这样HTTP/2就达到了一条连接同时发送多个请求的目标,其中Stram1已经正确送达,Stram2中的第三个Frame丢失。
TCP处理数据是有严格的前后顺序,先发送的Frame要先被处理,这样就会要求发送方重新发送第三个Frame,Steam3和Steam4虽然已到达但却不能被处理,那么这时整条链路都会被阻塞。
不仅如此,由于HTTP/2必须使用HTTPS,而HTTPS使用TLS协议也存在队头阻塞问题。TLS基于Record组织数据,将一对数据放在一起加密,加密完成后又拆分成多个TCP包传输。一般每个Record 16K,包含12个TCP包,这样如果12个TCP包中有任何一个包丢失,那么整个Record都无法解密。
队头阻塞会导致HTTP/2在更容易丢包的弱网络环境下比HTTP/1.1更慢。
QUIC是如何解决队头阻塞的问题的?主要有两点:
拥塞控制的目的是避免过多的数据一下子涌入网络,导致网络超出最大负荷。QUIC的拥塞控制与TCP类似,并在此基础上做了改进。先来看看TCP的拥塞控制:
QUIC重新实现了TCP协议中的Cubic算法进行拥塞控制,下面是QUIC改进的拥塞控制的特性:
TCP中如果要修改拥塞控制策略,需要在系统层面进行操作,QUIC修改拥塞控制策略只需要在应用层操作,并且QUIC会根据不同的网络环境,用户来动态选择拥塞控制算法。
QUIC使用前向纠错(FEC,Forword Error Correction
)技术增加协议的容错性。一段数据被切分为10个包后,一次对每个包进行异或运算,运算结果会作为FEC包与数据包一起被传输,如果传输过程中有一个数据包丢失,那么就可以根据剩余9个包以及FEC包推算出丢失的那个包的数据,这样就大大增加了协议的容错性。
这是符合现阶段网络传输技术的一种方案,现阶段带宽已经不是网络传输的瓶颈,往返时间才是,所以新的网络传输协议可以适当增加数据冗余,减少重传操作。
TCP为了保证可靠性,使用Sequence Number
和ACK来确认消息是否有序到达,但这样的设计存在缺陷。
超时发生后客户端发起重传,后来接受到了ACK确认消息,但因为原始请求和重传请求接受到的ACK消息一样,所以客户端就不知道这个ACK对应的是原始请求还是重传请求,这就会造成歧义。
如果客户端认为是重传的ACK,但实际上是右图的情形,会导致RTT偏小,反之会导致RTT偏大。
QUCI解决了上面的的歧义问题,与
Sequence Number
不同,acket Number
严格单调递增,如果Packet N丢失了,那么重传时Packet的标识就不会是N,而是比N大的数字,比如N+M,这样发送方接收到确认消息时,就能方便的知道ACK对应的原始请求还是重传请求。
TCP计算RTT时没有考虑接收方接收到数据发送方确认消息之间的延迟,如下图所示,这段延迟即ACK Delay
。QUIC考虑了这段延迟,使得RTT的计算更加准确。
一般来说,接收方收到发送方的消息后都应该发送一个ACK恢复,表示收到了数据。但每收到一个数据就返回一个ACK恢复实在太麻烦,所以一般不会立即回复,而是接收到多个数据后再回复,TCP SACK
最多提供3个ACK block
,但在有些场景下,比如下载,只需要服务器返回数据就好。但按照TCP的设计,每收到三个数据包就要返回一个ACK,而QUIC最多可以捎带256个ACK block
,在丢包率比较严重的网络下,更多的ACK可以减少重传量,提升网络效率。
TCP 会对每个TCP连接进行流量控制,流量控制的意思是让发送方不要发送太快,要让接收方来得及接收,不然会导致数据溢出而丢失,TCP的流量控制主要通过滑动窗口来实现的。可以看到,拥塞控制主要是控制发送方的发送策略,但没有考虑接收方的接收能力,流量控制是对部分能力的补齐。
QUIC只需要建立一条连接,在这条连接上同时传输多条Stream,好比有一条道路,流量都分别有一个仓库,道路中有很多车辆运送物资。QUIC的流量控制有两个级别: 连接级别(Connection Level
)和Stream 级别(Stream Level
)。
对于单条的Stream的流量控制: Stream还没传输数据时,接收窗口(flow control recevice window
)就是最大接收窗口,随着接收方接收到数据后,接收窗口不断缩小。在接收到的数据中,有的数据已被处理,而有的数据还没来得及处理。如下图,蓝色块表示已处理数据,黄色块表示未被处理数据,这部分数据的到来,使得Stream的接收窗口缩小。
随着数据不断被处理,接收方就有能力处理更多数据。当满足
(flow control receivce offset - consumed bytes) < (max receive window/2)
时,接收方会发送WINDOW_UPDATE frame
告诉发送方你可以再多发送数据,这时候flow control receive offset
就会偏移,接收窗口增大,发送方可以发送更多数据到接收方。
Stream级别对防止接收端接收过多数据作用有限,更需要借助Connection级别的流量控制。理解了Stream流量那么也很好理解Connection的流控,Stream中:
接收窗口=最大接受窗口 - 已接收数据
而对于Connection来说:
接收窗口 = Stream1 接收窗口 + Stream2 接收窗口 + ... + StreamN 接收窗口
6月5日,一张券商降薪截图在社交媒体疯传。截图提到,当日上午,某中字头头部券商召开大会,除了MD外全员降薪,且降薪不只是降奖金,而是直接降底薪。按照职级不同,SA1降6K,SA3降8K,VP降8K—10K。据了解,降薪大概率整体属实,但具体幅度有所差异,且不同区域、不同业务条线目前掌握的降薪情况也不尽相同。
今日,蔚来 CEO 李斌在 2023 高通汽车技术与合作峰会上爆料,蔚来第二代技术平台的全系车型已标配第三代骁龙座舱平台。
Meta公司周一(5月22日)推出了一个开源AI语言模型——大规模多语言语音(Massively Multilingual Speech, MMS)模型,可以识别和产生1000多种语言的语音——比目前可用的模型增加了10倍。研究人员表示,他们的模型可以转换1000多种语言,但能识别4000多种语言。
歌手孙燕姿在更新动态中回应了近日引发争议的“顶流AI歌手孙燕姿”,笑称粉丝已经接受她是“冷门”歌手,而AI成为了目前的顶流。
5月31日晚,荣耀方面对澎湃新闻记者表示,上海荣耀智能科技开发有限公司是荣耀位于上海的研究所,是荣耀在中国的5个研究中心之一,重点方向在终端侧核心软件、图形算法、通信、拍照等方面研究开发工作。荣耀强调,坚持以用户为中心,开放创新,与全球合作伙伴一起为用户提供最佳产品解决方案。
据北京市市场监督管理局公示信息,5月24日,苹果电子产品商贸(北京)有限公司因发布虚假广告被北京市东城区市场监督管理局处以20万元的行政处罚。
据外媒5月24日消息,全球最大的个人电脑制造商联想表示,在2023年1-3月期间,该公司裁员了约5%,这是由于PC市场不景气导致的。
日前,有网络博主号称拍摄到了小米首款汽车MS11的高清视频。从视频中可以看出,新车依旧包裹大面积的伪装,据该博主称,他之所以确定这是小米汽车,是因为靠近观察之后,发现它的三角形大灯轮廓和其最初手绘的小米汽车假想图几乎一模一样。
超过 350 名从事人工智能工作的高管、研究人员和工程师签署了这份由非盈利组织人工智能安全中心发布的公开信,认为人工智能具备可能导致人类灭绝的风险,应当将其视为与流行病和核战争同等的社会风险。
日前,以押注“颠覆性创新”著称的ARK Invest创始人Cathie Wood在接受媒体采访时表示,软件提供商将是人工智能狂潮的下一个受益板块。英伟达每卖出1美元的硬件,软件供应商SaaS供应商就会产生8美元的收入。
据报道,阿里巴巴研究员吴翰清已于近期离职,钉钉显示其离职时间是5月19日。在阿里内部,研究员的职级为P10。据消息人士透露,吴翰清离职后,选择AI短视频赛道创业,已经close一轮融资。对于上述消息,截至发稿,阿里尚未回应。
阿里巴巴集团官微宣布,2023年六大业务集团总计需新招15000人,其中校招超过3000人。同时表示,“近日,关于淘宝天猫、阿里云、菜鸟、本地生活各个业务裁员谣言传得很厉害,但谣言就是谣言。我们的招聘正在紧锣密鼓的进行。”
“现今每一个存在的应用都将被AI 2.0重构,我觉得整个AI大模型带来的机遇和技术浪潮,会比过去Windows和安卓大10倍。”李开复表示。
苹果发布Vision Pro头显,正式宣布开启空间计算时代;苹果还发布新款MacBook Air,新款Mac Studio,并展示了iOS17、iPadOS 17、macOS Sonoma和watchOS10等新系统;Vision Pro头显售价3499美元,将于2024年初正式在美国市场发售;华尔街并不看好Vision Pro,苹果股价周一创历史新高后由涨转跌。
5月25日,长城汽车就比亚迪秦PLUS DM-i、宋PLUS DM-i采用常压油箱,涉嫌整车蒸发污染物排放不达标的问题进行举报。
近日,一个名为“贾跃亭”的抖音账号悄然出现,带有“FF创始人、合伙人、首席产品及用户生态官, LeEco 乐视创始人”等标签,IP 地址显示为美国。
近日,苹果位于天猫的Apple Store官方旗舰店挂出直播预告,表示将在5月31日晚19时开启官方直播,这也是苹果官方在电商平台的全球首次直播。
5月29日消息,继上周远超预期的财报业绩预测引得股价和市值史诗级暴涨后,今日,英伟达(NVIDIA)创始人兼CEO黄仁勋穿着标志性的皮衣,意气风发地出现在台北电脑展COMPUTEX 2023上,在主题演讲期间先是现场给自家显卡带货,然后一连公布涉及加速计算和人工智能(AI)的多项进展。
前京东集团副总裁、京东探索研究院副院长梅涛自今年初离职后,确认在 AI 领域创业,成立生成式 AI 公司 HiDream.ai。