赞
踩
https://www.smashingmagazine.com/2021/08/http3-core-concepts-part1/
HTTP/3的传输层不是TCP,而是UDP+QUIC。
为什么不用TCP?因为TCP不是按最高效率设计的,比如在传输数据前要先握手,握手要先来一个RTT,如果两端地理位置比较远,这可能要超过100ms。而且TCP传输数据时,把数据当成一个文件或者一个字节流,这意味着如果中间有数据丢失,那后面的数据也会堵住,这叫队头阻塞,HTTP/2在应用层解决了这个问题,但用了TCP,在传输层还是有这个问题。
当然TCP有也很多扩展来解决这些效率问题,比如TCP Fast Open,以前握过手的可以一开始就发数据。比如MultiPath TCP,在移动端,如果同时连着Wi-Fi和4G,那两条道道都可以用阿里传输数据。
这些都是TCP的扩展,也不是很难实现,但却很难部署。像我们的电脑、手机,可以很快更新换代,但在互联网中,还有其他中间设备,这些不容易更新。比如防火墙会拦截他不认识的拓展,除了防火墙,还要负载均衡器、路由、缓存服务器、代理等等。在实际应用中,这些很多都不支持这些新的拓展。如果选择去逐步更新这些设备,可能要用超过十年,而且人家可能还不想更新,总会有遗漏。
那能不能不做这些更新,但也更快呢?有的,用现有的UDP协议,在UDP协议上再去造一个更高效的TCP,这就是QUIC。这也是QUIC为啥不抛弃UDP的原因,抛弃UDP,还是得升级设备。
所以实际上我们是需要TCP/2,我们叫它QUIC,在HTTP/3之下,HTTP/3用了QUIC和UDP来替代传输层协议。
基于UDP,QUIC更加高效的重新实现了TCP的特性。包括可靠传输、流量控制(针对网络)、拥塞控制(针对接收者),结合了几十年的经验,用了最好的方法。
QUIC的四个主要改变(跟HTTP/2好像……):
安全且高效。
部分QUIC协议头部也加密了,不像HTTP/2,只加密了TCP的payload,攻击者能看到的更少了。头部能泄漏啥?。
深度结合,所以QUIC的握手和TLC的握手可以合一起,更快了。
但也有缺点
一个连接同时发多个流,更加高效。
在HTTP/1.1,每个文件都要开一个新的TCP连接,浏览器一般也限制每个页面6到30个连接,但资源一多,就会很慢,要下完一个才能去下载下一个,最多30个并发。
HTTP/2在一个连接里用不同流去下载多个文件解决了这个问题。但当丢包了,还是会阻塞后面已经到了的数据的处理,因为TCP层不理解这是不同流的数据,不会说这个流的丢了,就只阻塞这个流的,其他流的可以给上层处理,会全部阻塞。
QUIC区分了不同流,所以就可以只阻塞丢包的流。
Wi-Fi切4G这种切换了网络,但接收者的ip和端口没变的情况,可以复用连接,不需要重新握手,因为还是往同一个ip和端口发数据。ip确定机器,端口确定网络程序(如果有nat,那就是端口确定子网的机器+网络程序)。虽然发送者变了,但connection id没变,对接收者来说,那可以理解为还是同一个发送者,该连接还能用(连接并不是说真的有那么一条管道,只是有了握手和挥手,真的有个接收者,且接收者肯接受数据。)。但在TCP,因为没有标记区分开来,所以只能用发送者ip,那连接就不能用了,因为发送者ip肯定变了。
除了切网络,如果有NAT重绑定,端口也会变,连接也会失效。
为了防止黑客、窃听者定位一个用户(比如你在图书馆连Wi-Fi搜了一本漫画书,黑客发现这里有个二次元,然后你切4G了,黑客发现还是那个id,一看你ip,原来就是你这台手机?),QUIC在新的网络里用一个新的connection ID,那ID还是变了?是的,但client和server会提前加密协商好,比如id为a、b、c的其实都是同一个连接X,这样切网络时就从a换b。
不像TCP,一堆数据就是一个TCP包,QUIC会分为ACK帧、新CID帧、数据流帧。
这样以后QUIC拓展也方便,加一种新的帧就可以了。
分帧也是分流的基础,每个QUIC帧都带上一个CID,区分不同的流。
这样看来,QUIC需要在有丢包、切网络的情景下才能打赢TCP,不然在稳定的网络,反而因为每个帧都加密,可能更慢?
所以HTTP/3就是替换了TCP?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。