| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 小三上位,udp逆袭!为啥HTTP/3选择了它? -> 正文阅读 |
|
[网络协议]小三上位,udp逆袭!为啥HTTP/3选择了它? |
对网络技术有一定研究的同学一定知道, 然而,真的是这样吗?我们先把吃惊的嘴合上,一起来看一下,为什么HTTP/3可以基于UDP,并且这还是一种非常聪明的选择。 要明白这个选择,我们首先就得消除一下对于 1. UDP是最纯洁的传输层协议实际上,UDP并不是像大家想象中的那样不可信,它只是因为简单,才让你有这样的认知。从另一个角度来说,它其实是最纯洁的传输层协议。 那么UDP在网络传输中,到底处于一个什么位置呢?我们需要简单看一下典型的网络分层。 物理层和连接层
这时候网络数据包还不能逃离局域网,想要更大规模的传输,就需要网络层的帮助。 网络层为了让这些地址有意义,
如果你去看一下IP的报文,会发现它的格式是非常怪异的,中间节点在路由的时候,需要走先解包然后再封包的过程。这是由于IP协议是网络层协议,它的头信息,比如IP地址,其实是连接层协议的报文体(playload)。 到了IP协议,我们已经离UDP很近了。 传输层IP协议只是解决了计算机到计算机之间的通信问题,但我们每台机器上还会有不同的进程,如何区分它们呢?这就是 UDP和TCP协议,通过加入了端口号,来识别某一个进程。IP地址加上端口号,就是我们写代码需要面对的socket。现在的大多数网络通信,包括HTTP/1,HTTP/2等,都是基于TCP。 从协议层面来看,UDP其实是最干净的协议,它完完全全的暴露了IP协议的所有内容。相比较IP协议,它仅仅多了一个端口号,所以UDP协议拥有IP协议的所有特点。比如无序性,不保证可靠性(Best Effort)。至于拥塞机制这种更高级的流量协商控制,UDP根本就不管这些。 UDP这种没有特性的特性,使得应用面比TCP窄的多。我们通常把 我们来看一下一个典型的UDP协议。如上图,相对于IP协议,UDP协议仅仅多了两个端口,一个长度,一个checksum,确实是无与伦比的纯洁。 2. TCP作为基础协议太复杂你可能会问,TCP和UDP都是传输层协议,那为什么HTTP/3不是基于TCP呢?那是因为TCP本身就已经非常复杂了,有太多历史遗留的包袱。 为了保证信息的可靠传输,顺序传输,同时兼顾吞吐量,TCP做了大量工作。相比较UDP,我们可以看一下TCP的协议都多了哪些内容。如图,是一个wireshark抓取的,典型的TCP协议包。 我们常说的三次握手(四次合并成三次),四次挥手,就是Flags和序列号逻辑组合的结合体。如果加入了TLS安全协议,这个握手的过程会更长。 连接建立后,由于采用了一问一答的ACK确认模式,TCP的效率其实是不怎么高的。它要传输很多无用信息,还得等待。 为了提高网络传输效率,TCP使用滑动窗口来解决批量发送,同时解决顺序性问题。为了解决网络拥塞,TCP使用慢启动、拥塞避免、快速重传、快速恢复等机制,使得网络吞吐量保持在一定的水平。 我们可以看一下wikipedia上TCP协议的一张细节图,在《TCP/IP详解 卷一:协议》中,对此进行了非常详细的介绍。可以看到细节问题还是非常多的。 那什么叫做协议?协议,就是规定了大家都遵守的标准,所有协议都是利益共同体共同商定的结果。比如我的分布式数据库使用了MySQL的接入层协议,那么就要遵循MySQL协议所制定的一系列标准,否则就跑不起来。 协议越底层,对稳定性要求就越高。 TCP协议,目前已经被编码到了操作系统,不论是协议升级,还是BUG修复,都是伤筋动骨的。 3. 为什么UDP可行?为了抛开历史的包袱, 如上图所示,HTTP/3基于QUIC,而QUIC是完全基于UDP的。 但UDP不是号称无连接的么?它怎么去实现可靠性等一些额外的功能呢? 其实, 在没有数据交互的时候,server和client就是单纯的两个点。即使你拔了网线重新插上(期间无交互),它们依然可以继续相互间发送数据。 UDP号称的无连接,其实和TCP的连接没什么两样。唯一的区别是,UDP把数据包发送之后,就什么也不管了,这些信息对端可能收到了,也可能没收到。而当每次都对发送的数据进行ACK确认,它就变成了TCP。 至于这部分确认代码,是放在传输层,还是放在应用层,这都关系不大;但代码是放在操作系统,还是可以独立升级的包中,那关系可就大了。 QUIC是可以独立于操作系统发行的,避免了操作系统缓慢的更新换代问题。QUIC的实现,依然要面对消息的可靠性、滑动窗口、拥塞控制等场景,你可以认为它就是一个TCP,但它与TCP有本质的区别。 这些区别,我们对比一下HTTP的各个版本,在数据传输方面的表现就知道了了。
End了解了以上内容,相信你一定能得出结论:HTTP/3基于UDP,是非常靠谱的。它不仅实现了可靠性传输,而且能够获得较大的性能提升。我们来总结一下QUIC的这些改进:
QUIC产生的原因,主要是由于TCP的限制所引起的。连接是一种非常宝贵的资源,创建、销毁,以及其上的传输,都是非常耗时的。TCP的可靠性机制,在计算机网络发展的早期,确实是非常有效的,但随着硬件的升级,它的ACK传输模式,在效率上制约了更高性能的发展。由于TCP标准的概念深入人心,它的代码甚至直接存在于内核上,使得协议升级困难。 随着网络基础设施的提升,TCP的这种可靠传输模式,反而成了制约。如果我们的信息处理,能够全部在一条连接上完成,那就太好了。这样,在一些密集的资源传输时,比如批量小图片、视频点播、弱网传输时,就不会受到RTT的影响。另外我的数据缓存和拥塞控制等,也会更加灵活。举个极端的例子,我的内存足够大能把stream缓存起来,我甚至能够忍受某个1MB大小的文件,10秒钟后文件的第一个字节到达,而不是像TCP一样一直重传重传(因为它受限于TCP窗口)。 为什么能够这么做呢?还是得益于UDP纯洁的属性,它只是IP协议的一个编程接口,它真的是一张白纸,什么都没有。如果你愿意,你甚至可以在UDP的基础上,完全复刻TCP的所有功能,只要你能把server端和client端对应起来。这就是QUIC所做的。
推荐阅读: 3.?蓝牙如梦 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 17:36:23- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |