We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
经历了从HTTP/0.9到HTTP/2.0的蜕变,在实际场景大部分问题都可以得到解决,除了TCP队头阻塞这座大山还没有越过,TCP协议还存在一些其他问题
以上内容均来自李兵老师的"浏览器工作原理与实践"专栏整理出来
The text was updated successfully, but these errors were encountered:
No branches or pull requests
经历了从HTTP/0.9到HTTP/2.0的蜕变,在实际场景大部分问题都可以得到解决,除了TCP队头阻塞这座大山还没有越过,TCP协议还存在一些其他问题
简称RTT,它受物理距离影响,当建立TCP连接时,需要跟服务器进行三次握手,这个过程就会消耗1.5个RTT,当还要进行TLS连接时,因为它有1.2和1.3两个版本,大概还会消耗1-2个RTT,如果浏览器跟服务器物理距离比较近1个RTT可能在10毫秒内,如果距离大可能要消耗30-40毫秒,那整个握手过程就是300-400毫秒
之所以TCP协议存在队头阻塞没法改变,是因为有中间设备僵化因素存在, 互联网是由多个网络互联的网状结构,之间是通过搭建各种设备来保持互联,由于每种设备有很多类型,如:路由器,防火墙,NAT,交换机,他们一经使用就很少升级,如果在客户端升级了TCP协议,那当数据包经过这些设备时就会出现无法识别数据包内容而被丢弃,这是阻碍TCP更新一大障碍
另外,除了设备僵化外,操作系统也是导致TCP协议僵化原因,因为TCP协议通过操作系统内核实现,想要自由更新内核中的TCP协议也是很麻烦
解决方案
我们知道,UDP是一种无状态的传输协议,因为没有TCP的握手,重传,等机制,所以他的传输速度更快,但UDP不保证数据完整正确性和顺序,所以他并不适合所有场景
同样面临这个协调中间设备和操作系统僵化的问题
3.采取折衷方式--QUIC(UDP)
但他不是完完整整UDP协议, 加入了TCP中的多路数据流,传输可靠性等功能,我们把它称作QUIC协议
可以看到: HTTP/3.0在UDP协议和QUIC在协议中间加入了TCP多路复用功能,TLS加密减少握手时间花费的RTT个数(0-RTT或者1-RTT),有序交付,快速握手,数据可靠性等新特性
但和TCP不同在于,旧的多路复用只有一个TCP长连接,而QUIC实现了在同一物理连接上可以有多个独立的逻辑数据流,实现了数据传输的独立性,从而解决了TCP数据包级别出现的队头阻塞问题
当然,由于目前HTTP/3.0还没广泛应用在现实场景,谷歌实现QUIC的版本跟官方差异较大,且部署HTTP/3.0也存在很多问题,因为系统内核对UDP的优化远没有到达TCP的优化程度,目前QUIC协议丢包率大约在3%-7%,因为中间设备僵化导致的
但我们相信未来HTTP/3.0一定可以成为主流的接近完美协议,HTTP发展史到这里就完结了。
The text was updated successfully, but these errors were encountered: