为什么HTTP/3要引入UDP?(快速了解QUIC)

2023-12-16 04:28
文章标签 快速 http udp 了解 引入 quic

本文主要是介绍为什么HTTP/3要引入UDP?(快速了解QUIC),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

笔者前段时间参加银行技术面时被问到了这个问题,特来整理资料以供记录分享

HTTP/3:引入UDP的原因与QUIC协议的努力

HTTP/3是HTTP协议的最新版本,它的诞生是为了解决HTTP/1和HTTP/2在性能和效率上的问题。在HTTP/3之前,HTTP协议使用的是TCP作为传输层协议。然而,随着互联网的发展,TCP的性能瓶颈逐渐显现出来。为了解决这个问题,Google提出了QUIC协议,并将其引入到了HTTP/3中。

TCP与UDP的区别

TCP是一种面向连接、可靠的传输协议,它通过三次握手建立连接,然后进行数据的可靠传输。TCP为了保证数据的可靠性,会进行数据的确认、重传等操作,但这也会导致性能的下降。

UDP则是一种无连接、不可靠的传输协议,它不会建立连接,也不会进行数据的确认和重传。UDP的优点是速度快,但缺点是不能保证数据的可靠性。

HTTP/3引入UDP的原因

HTTP/3引入UDP的原因主要有两个:
一是为了提高性能,二是为了实现更好的网络适应性。

TCP的性能瓶颈主要在于其握手过程和重传机制,而QUIC协议通过改进这些机制,实现了更高的性能。此外,UDP在网络适应性上也有优势,因为它可以更好地处理网络波动和丢包等问题。

QUIC协议在传输层的努力

QUIC协议在传输层做了很多努力,以实现可靠传输。首先,它改变了数据包的底层编码格式,使得数据包更小、更高效。其次,QUIC协议实现了快速握手和连接迁移,减少了建立连接的时间和网络延迟。此外,QUIC协议还引入了流量控制和拥塞控制机制,以应对网络拥塞的问题。最后,QUIC协议还实现了丢包恢复和重传机制,以保证数据的可靠性。

QUIC协议之所以能够提供更好的性能,其中一个重要的原因就是它实现了快速握手和连接迁移。

可靠传输

可靠传输要保证两点:

  • 完整性:发送端发出的数据包,接收端都能收到
  • 有序性:接收端能按序组装数据包,解码得到有效的数据

对于完整性的处理:通过包号(PKN)和确认应答(SACK)
对于有序行的处理:通过数据偏移量 offset

(本小节感兴趣可以看扩展阅读中的内容)

快速握手

在TCP中,建立连接需要进行三次握手。首先,客户端发送一个SYN请求给服务器,表示它想要建立一个连接。服务器收到SYN请求后,会回复一个SYN-ACK请求,表示它同意建立连接。最后,客户端再回复一个ACK请求,表示它收到了服务器的SYN-ACK请求。这样,TCP连接就建立成功了。

相比之下,QUIC协议只需要进行一次握手就可以建立连接。在QUIC中,客户端发送一个包含客户端初始信息的包给服务器,服务器收到后,会立即回复一个包含服务器初始信息的包。这样,QUIC连接就建立成功了。

连接迁移

在TCP中,如果客户端想要从一个服务器切换到另一个服务器,就需要先断开原来的连接,然后再重新建立一个新的连接。这个过程被称为“连接迁移”。

而在QUIC中,客户端可以无缝地从一个服务器切换到另一个服务器,而不需要断开原来的连接。这个过程被称为“连接迁移”。QUIC的连接迁移是通过在客户端和服务器之间维护一个全局的状态来实现的。当客户端想要切换到另一个服务器时,它会向新的服务器发送一个包含当前连接状态信息的包,新的服务器收到后,就可以立即开始处理客户端的请求。

触发场景

QUIC的连接迁移可以在以下场景中触发:

  • 服务器负载均衡:当客户端连接到一个服务器时,如果该服务器的负载过高,客户端可以自动切换到另一个负载较低的服务器。
  • 网络切换:当客户端从一个网络切换到另一个网络时,它可以无缝地切换到新的网络上,而不需要重新建立连接。
  • DNS变更:当客户端的DNS记录发生变化时,它可以自动切换到新的服务器上,而不需要重新建立连接。

总之,QUIC的快速握手和连接迁移都是通过改进TCP的握手和连接管理过程来实现的。这些改进使得QUIC能够提供更快的连接建立和更灵活的连接管理,从而提高了网络性能和用户体验。

实际应用场景与案例分析

QUIC协议在实际应用中具有广泛的前景。

例如,在游戏和实时通信领域,QUIC协议可以提供更低的网络延迟和更高的性能。在视频流和文件传输领域,QUIC协议可以提供更好的网络适应性和更高的传输效率。此外,QUIC协议还可以用于WebAssembly和Web性能优化等领域。

总结与展望

HTTP/3和QUIC协议的出现,为互联网带来了新的机遇和挑战。虽然QUIC协议目前还处于发展阶段,但它已经展现出了巨大的潜力。在未来,我们可以期待HTTP/3和QUIC协议在更多的领域中得到应用,为互联网带来更快的速度和更好的体验。


参考资料:

QUIC 协议详解

这篇关于为什么HTTP/3要引入UDP?(快速了解QUIC)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/499100

相关文章

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Python WSGI HTTP服务器Gunicorn使用详解

《PythonWSGIHTTP服务器Gunicorn使用详解》Gunicorn是Python的WSGI服务器,用于部署Flask/Django应用,性能高且稳定,支持多Worker类型与配置,可处... 目录一、什么是 Gunicorn?二、为什么需要Gunicorn?三、安装Gunicorn四、基本使用启

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c